@runcore-sh/runcore 0.5.6 → 0.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/dictionary.json +2 -2
  2. package/dist/.extensions/ext-byok.json +1 -0
  3. package/dist/.extensions/ext-hosted.json +1 -0
  4. package/dist/.extensions/ext-spawn.json +1 -0
  5. package/dist/agents/autonomous.d.ts.map +1 -1
  6. package/dist/agents/runtime/bus.d.ts +1 -0
  7. package/dist/agents/runtime/bus.d.ts.map +1 -1
  8. package/dist/agents/spawn.d.ts.map +1 -1
  9. package/dist/auth/middleware.d.ts.map +1 -1
  10. package/dist/auth/middleware.js +3 -2
  11. package/dist/auth/middleware.js.map +1 -1
  12. package/dist/calendar/routes.d.ts.map +1 -1
  13. package/dist/calendar/routes.js +8 -7
  14. package/dist/calendar/routes.js.map +1 -1
  15. package/dist/files/registry.d.ts +4 -5
  16. package/dist/files/registry.d.ts.map +1 -1
  17. package/dist/files/registry.js +4 -5
  18. package/dist/files/registry.js.map +1 -1
  19. package/dist/files/store.d.ts +2 -0
  20. package/dist/files/store.d.ts.map +1 -1
  21. package/dist/files/store.js +5 -1
  22. package/dist/files/store.js.map +1 -1
  23. package/dist/instance.d.ts +2 -0
  24. package/dist/instance.d.ts.map +1 -1
  25. package/dist/instance.js +2 -0
  26. package/dist/instance.js.map +1 -1
  27. package/dist/lib/paths.d.ts.map +1 -1
  28. package/dist/lib/paths.js +15 -1
  29. package/dist/lib/paths.js.map +1 -1
  30. package/dist/library/brain-shadow.d.ts.map +1 -1
  31. package/dist/library/brain-shadow.js +5 -4
  32. package/dist/library/brain-shadow.js.map +1 -1
  33. package/dist/library/routes.d.ts.map +1 -1
  34. package/dist/library/routes.js +10 -9
  35. package/dist/library/routes.js.map +1 -1
  36. package/dist/llm/cache.d.ts.map +1 -1
  37. package/dist/llm/cache.js +7 -5
  38. package/dist/llm/cache.js.map +1 -1
  39. package/dist/llm/complete.js +2 -0
  40. package/dist/llm/complete.js.map +1 -1
  41. package/dist/llm/providers/ollama.d.ts.map +1 -1
  42. package/dist/llm/providers/ollama.js +32 -7
  43. package/dist/llm/providers/ollama.js.map +1 -1
  44. package/dist/llm/providers/openrouter.d.ts.map +1 -1
  45. package/dist/llm/providers/openrouter.js +105 -12
  46. package/dist/llm/providers/openrouter.js.map +1 -1
  47. package/dist/llm/providers/types.d.ts +18 -0
  48. package/dist/llm/providers/types.d.ts.map +1 -1
  49. package/dist/llm/retry.d.ts.map +1 -1
  50. package/dist/llm/retry.js +6 -0
  51. package/dist/llm/retry.js.map +1 -1
  52. package/dist/llm/tools/handlers.d.ts +27 -0
  53. package/dist/llm/tools/handlers.d.ts.map +1 -0
  54. package/dist/llm/tools/handlers.js +842 -0
  55. package/dist/llm/tools/handlers.js.map +1 -0
  56. package/dist/llm/tools/index.d.ts +12 -0
  57. package/dist/llm/tools/index.d.ts.map +1 -0
  58. package/dist/llm/tools/index.js +10 -0
  59. package/dist/llm/tools/index.js.map +1 -0
  60. package/dist/llm/tools/loop.d.ts +47 -0
  61. package/dist/llm/tools/loop.d.ts.map +1 -0
  62. package/dist/llm/tools/loop.js +126 -0
  63. package/dist/llm/tools/loop.js.map +1 -0
  64. package/dist/llm/tools/registry.d.ts +27 -0
  65. package/dist/llm/tools/registry.d.ts.map +1 -0
  66. package/dist/llm/tools/registry.js +60 -0
  67. package/dist/llm/tools/registry.js.map +1 -0
  68. package/dist/llm/tools/schemas.d.ts +92 -0
  69. package/dist/llm/tools/schemas.d.ts.map +1 -0
  70. package/dist/llm/tools/schemas.js +154 -0
  71. package/dist/llm/tools/schemas.js.map +1 -0
  72. package/dist/llm/tools/types.d.ts +44 -0
  73. package/dist/llm/tools/types.d.ts.map +1 -0
  74. package/dist/llm/tools/types.js +9 -0
  75. package/dist/llm/tools/types.js.map +1 -0
  76. package/dist/mcp-server.d.ts +1 -1
  77. package/dist/mcp-server.js +249 -5
  78. package/dist/mcp-server.js.map +1 -1
  79. package/dist/memory/visual.d.ts.map +1 -1
  80. package/dist/memory/visual.js +3 -6
  81. package/dist/memory/visual.js.map +1 -1
  82. package/dist/openloop/foldback.js +1 -1
  83. package/dist/openloop/foldback.js.map +1 -1
  84. package/dist/openloop/resolution-scanner.d.ts.map +1 -1
  85. package/dist/openloop/resolution-scanner.js +76 -63
  86. package/dist/openloop/resolution-scanner.js.map +1 -1
  87. package/dist/plugins/github/index.d.ts +49 -0
  88. package/dist/plugins/github/index.d.ts.map +1 -0
  89. package/dist/plugins/github/index.js +153 -0
  90. package/dist/plugins/github/index.js.map +1 -0
  91. package/dist/plugins/index.d.ts +1 -2
  92. package/dist/plugins/index.d.ts.map +1 -1
  93. package/dist/plugins/index.js +79 -2
  94. package/dist/plugins/index.js.map +1 -1
  95. package/dist/plugins/slack/index.d.ts +43 -0
  96. package/dist/plugins/slack/index.d.ts.map +1 -0
  97. package/dist/plugins/slack/index.js +158 -0
  98. package/dist/plugins/slack/index.js.map +1 -0
  99. package/dist/plugins/twilio/index.d.ts +41 -0
  100. package/dist/plugins/twilio/index.d.ts.map +1 -0
  101. package/dist/plugins/twilio/index.js +102 -0
  102. package/dist/plugins/twilio/index.js.map +1 -0
  103. package/dist/pulse/tier.d.ts +1 -1
  104. package/dist/pulse/tier.js +2 -2
  105. package/dist/pulse/tier.js.map +1 -1
  106. package/dist/search/gemini.d.ts +27 -0
  107. package/dist/search/gemini.d.ts.map +1 -0
  108. package/dist/search/gemini.js +103 -0
  109. package/dist/search/gemini.js.map +1 -0
  110. package/dist/server.d.ts.map +1 -1
  111. package/dist/server.js +850 -536
  112. package/dist/server.js.map +1 -1
  113. package/dist/services/routine-patterns.d.ts.map +1 -1
  114. package/dist/services/routine-patterns.js +6 -0
  115. package/dist/services/routine-patterns.js.map +1 -1
  116. package/dist/services/traceInsights.d.ts +5 -0
  117. package/dist/services/traceInsights.d.ts.map +1 -1
  118. package/dist/services/traceInsights.js +18 -1
  119. package/dist/services/traceInsights.js.map +1 -1
  120. package/dist/settings.d.ts +1 -1
  121. package/dist/settings.d.ts.map +1 -1
  122. package/dist/types.d.ts +26 -2
  123. package/dist/types.d.ts.map +1 -1
  124. package/dist/vault/store.d.ts +1 -1
  125. package/dist/vault/store.d.ts.map +1 -1
  126. package/dist/webhooks/mount.d.ts.map +1 -1
  127. package/dist/whiteboard/store.d.ts +40 -0
  128. package/dist/whiteboard/store.d.ts.map +1 -0
  129. package/dist/whiteboard/store.js +280 -0
  130. package/dist/whiteboard/store.js.map +1 -0
  131. package/dist/whiteboard/types.d.ts +55 -0
  132. package/dist/whiteboard/types.d.ts.map +1 -0
  133. package/dist/whiteboard/types.js +9 -0
  134. package/dist/whiteboard/types.js.map +1 -0
  135. package/dist/whiteboard/weight.d.ts +23 -0
  136. package/dist/whiteboard/weight.d.ts.map +1 -0
  137. package/dist/whiteboard/weight.js +126 -0
  138. package/dist/whiteboard/weight.js.map +1 -0
  139. package/package.json +2 -2
  140. package/public/avatar/cache/0cdaf9c41eff4347.mp4 +0 -0
  141. package/public/avatar/cache/3dacc4ea1082ae36.mp4 +0 -0
  142. package/public/avatar/cache/44f5db0bfdde93c6.mp4 +0 -0
  143. package/public/avatar/cache/5628fd10fe55e529.mp4 +0 -0
  144. package/public/avatar/cache/7ee2ab1577690c8a.mp4 +0 -0
  145. package/public/avatar/cache/8c470929e814b6b0.mp4 +0 -0
  146. package/public/avatar/cache/8c908421ce52bf91.mp4 +0 -0
  147. package/public/avatar/cache/9532f8782a42a89c.mp4 +0 -0
  148. package/public/avatar/cache/9ce0dddd0cc4d7a1.mp4 +0 -0
  149. package/public/avatar/cache/a6508e00b6711143.mp4 +0 -0
  150. package/public/avatar/cache/ba61810a8915e0c7.mp4 +0 -0
  151. package/public/avatar/cache/c07bee3a10c917cf.mp4 +0 -0
  152. package/public/avatar/cache/d69175900ea4ea2a.mp4 +0 -0
  153. package/public/avatar/cache/e61039bc8d39cb93.mp4 +0 -0
  154. package/public/avatar/cache/e61c6b7047e2cbdb.mp4 +0 -0
  155. package/public/avatar/cache/efd93c9b18930cf6.mp4 +0 -0
  156. package/public/avatar/cache/f052d74f5c4abab7.mp4 +0 -0
  157. package/public/avatar/cache/f7c0be3429a4ef97.mp4 +0 -0
  158. package/public/avatar/cache/fc8e480f63fe4e35.mp4 +0 -0
  159. package/public/index.html +225 -51
  160. package/public/search-flyout.js +324 -0
  161. package/public/whiteboard.html +915 -0
  162. package/public/avatar/cache/06fa55aececcc478.mp4 +0 -0
  163. package/public/avatar/cache/07a65738ba170827.mp4 +0 -0
  164. package/public/avatar/cache/1185fd491f413406.mp4 +0 -0
  165. package/public/avatar/cache/272c004a41087de5.mp4 +0 -0
  166. package/public/avatar/cache/332384e088ca214b.mp4 +0 -0
  167. package/public/avatar/cache/5d9a960bbf71732c.mp4 +0 -0
  168. package/public/avatar/cache/5e0954401e15af89.mp4 +0 -0
  169. package/public/avatar/cache/b35f7a3d558f22cb.mp4 +0 -0
  170. package/public/avatar/cache/be89f49970672374.mp4 +0 -0
  171. package/public/avatar/cache/c900811e3382ac6d.mp4 +0 -0
  172. package/public/avatar/cache/d42a73667acf5716.mp4 +0 -0
  173. package/public/avatar/cache/e539f247a8908603.mp4 +0 -0
  174. package/public/avatar/cache/ec95af57d33b3f07.mp4 +0 -0
@@ -0,0 +1 @@
1
+ {"manifest":{"name":"ext-byok","version":"0.5.6","minCoreVersion":"0.5.6","tier":"byok","modules":[{"path":"vault/matcher.js","hash":"sha256:f5c36e9ad857a7c3f3f1463860c69e6f76cad77a38bc54412ec5702140566be5"},{"path":"vault/personal.js","hash":"sha256:1aa8b4d16d78d0e9028b4b75a591b923af0d4ab6ce9181a77826222fc6494ec1"},{"path":"vault/policy.js","hash":"sha256:dfdf46be8aba3bbb4becf03a2bd6db4eb5b9717ceabaf084fffc376736f3526f"},{"path":"vault/store.js","hash":"sha256:45f77fb0ce2dc4aaab4eb42a92b633768c2aa54c0f3bf1f410dcacab9ca36edd"},{"path":"vault/transfer.js","hash":"sha256:ea6df5ee264123579e357f98887f9c426d73910e593bf8235b784d811d5b13cf"},{"path":"notifications/channel.js","hash":"sha256:84deb75d8b1fe718ff398f1bf3d122ff9cf53a319a9cbb8e4ab749a7fa6d7d9c"},{"path":"notifications/email.js","hash":"sha256:34e3ca91f413e32c69cd7000514a7929210f9cf00860988d3261e25f349e7523"},{"path":"notifications/engine.js","hash":"sha256:aeab9b6fcfc827f08e6a5c95dcc6265cf792c317630328894bb9052f655833c4"},{"path":"notifications/index.js","hash":"sha256:2ddc1d116dd7b31f3ff48807872016cad789cdf52ac0fab21a5c4c80484ed851"},{"path":"notifications/phone.js","hash":"sha256:560ddba21a0df95bf55d5749f0d5aae0a7f521a0c91b2aa1f1d902b921a99ffe"},{"path":"notifications/sms.js","hash":"sha256:e46c8cb535a7a714050cf3aa8bbfec05d49f915579b546a721c6cdc93e4280f7"},{"path":"notifications/types.js","hash":"sha256:7b104bad97d53513b56c066cb5fd206ce13485ef3f31c7c32ab67190e87856eb"},{"path":"notifications/webhook.js","hash":"sha256:8cc9d5ea35a5004d226b8825587eed460945e1fa9f5a5defe23ead29d5843207"},{"path":"notifications/channels/adapter.js","hash":"sha256:ca33ebadbcf47d2b9be6156ac841a49e41d79b1f0aa06367436130b63b926ebb"},{"path":"notifications/channels/index.js","hash":"sha256:d4e81dae63971a0d34080ef186a5bd24120563bef9c3b02c72db016a14a841bd"},{"path":"notifications/channels/log.js","hash":"sha256:e05050a02f081c11aac7a5d7a77b36b2bc150555232cfd58e7830ec80b82840d"},{"path":"channels/whatsapp.js","hash":"sha256:194eae6f4c0a35753bf6e2dbe0f0538bb0613f7f705877bf63db9eecf6f0ef6a"},{"path":"google/auth.js","hash":"sha256:4e8b2e80bd07fef8cacb75642b7bac42d0a42d7c66d81701865e9942c6125bd1"},{"path":"google/calendar-timer.js","hash":"sha256:4f4cfbff8fc8205cf0e17695f0cb1892cb2f567713f9a185d741dd83dd51a962"},{"path":"google/calendar.js","hash":"sha256:656e1944c2bdaeaced64afe2dc19874196365db3a5189101b4db353c0b00149f"},{"path":"google/docs.js","hash":"sha256:a874bf0d5ed062d4a81ca285b1c9db5938f9a2259e70b7b0081c23c65a686aaf"},{"path":"google/gmail-send.js","hash":"sha256:e730b43863ad59ce1ed34f6ab2ecee71a54107758358aa62012828dd6980a549"},{"path":"google/gmail-timer.js","hash":"sha256:38d947ec6b4b324150204d04783d689381baf188ceca037417917f15764c8c31"},{"path":"google/gmail.js","hash":"sha256:3bad70ea13efb661852428afbb028d727c7be2dcfad1977a4bc8bb0313cd3f47"},{"path":"google/plugin.js","hash":"sha256:f933a29bd867e72bcbc2c103c2e83ef7aece574cb7e48950135f5ffaa2c2428d"},{"path":"google/tasks-timer.js","hash":"sha256:5ec4855a6ff024a94e0421d5e03fb32cd3b428bfa7d39b1f5ac641c3b2c3014d"},{"path":"google/tasks.js","hash":"sha256:f28f934933a0717a93872179da778e5e0ebcc4775b33c55edb54f65c036617f2"},{"path":"google/temporal.js","hash":"sha256:29044f545c17837d244acd0e0e30bc13bd82a6897a906aed8c37555b72f34ade"},{"path":"github/client.js","hash":"sha256:ba04f16828a8cb186308816763337e3af6c8c915080b43231f3a115b4076df9e"},{"path":"github/commit-analysis.js","hash":"sha256:16cfff318d530beb48208e3682b6d8dd6bd227ce2bbf35634b33ee0e2bad21ea"},{"path":"github/contributor-stats.js","hash":"sha256:317c7ff673468823e1cad7221a421968d5b056c64b027aa22ef87cdc9d28842b"},{"path":"github/issue-sla.js","hash":"sha256:1ae01ab65c99a30a13dc5871d9c6e6229cd782aa594fd7488042bdd11c831f5d"},{"path":"github/issue-triage.js","hash":"sha256:93d9ef7595bf6d2201cec7a1ec3895fb4e87532decbdb576bd9e688fe2480625"},{"path":"github/pr-readiness.js","hash":"sha256:db5b275f9b4697a64c87d875d715ff62bc0e3d18ebdfd7cc5cd61cc24e538f1f"},{"path":"github/pr-review.js","hash":"sha256:3e869b57633a48d94b4ca16a33b46118874db0b0d84616f31e739a7ed1e771c1"},{"path":"github/release-notes.js","hash":"sha256:bd84f53a76a3e3f140dd9af5054ad454a33972e184b207979dc6d7b7342416a3"},{"path":"github/repo-health.js","hash":"sha256:4b76c3b4309d2f29b515f77055c0498633de01421fa3c04032dfc7617f1e65d4"},{"path":"github/retry.js","hash":"sha256:c58a4f0b5db26d13bc202459423d14c8969c489fa6946015f51825ebb5423ffe"},{"path":"github/types.js","hash":"sha256:841316e966811c77786345842e0d403a24652fee0e338193dee06d4cda47c285"},{"path":"github/webhooks.js","hash":"sha256:2cbada06ad69bc6343687a5b98c2ef3089ba7ff982b4a78ea7e796b234c06ecf"},{"path":"slack/channels.js","hash":"sha256:ca6b4670612c9fc4d6091fee37429c16c1b139339e9c6552579b5b1ec82cf6e4"},{"path":"slack/client.js","hash":"sha256:1de709716140ba33008eb3f18a93df3e248d49cfb7c02159406b59bebe594b75"},{"path":"slack/retry.js","hash":"sha256:0138960d87969ae885ba502ec6c9531eed641e7e485b2e9348d176d448ace021"},{"path":"slack/types.js","hash":"sha256:ec7a33a0786a553c090d0bda9f7bfc2395dae7b5ee19ca944d58b205a14b6b5b"},{"path":"slack/webhooks.js","hash":"sha256:4b41238a4f9be685c8dfdf38df890020d2b1ea445f46867c4e39c2d004df440d"},{"path":"twilio/call.js","hash":"sha256:f8ff7dcf5fac5755624c51f52baea10eeab05aec5c5784be521b1ec813b264fa"},{"path":"resend/inbox.js","hash":"sha256:d25541b02b52137288e13d2315a858b9a02027d51320542e4ff4e2c6f7b21110"},{"path":"resend/webhooks.js","hash":"sha256:4f89f8270347ca3989620761240fe0fee233d7b1fb7b91a29b4294315c4eb1d4"},{"path":"integrations/gate.js","hash":"sha256:9e6c0656aeeab50d2e08099b477102f592d853e4c7430bfdda7492d69a865e9d"},{"path":"integrations/github.js","hash":"sha256:bedf5c758312aaa74ed5c9dd6b43d4a86a7d57084abb81c359c1a80bec7d6538"},{"path":"integrations/google-tasks.js","hash":"sha256:c19511524f30c1be893e088e1c16a113da726326a185b4f31ccaf3eaca0e766e"},{"path":"webhooks/config.js","hash":"sha256:89facd3abde531fa33d0109f34cbe78fbbbed9b9b77a986c51885d43d1cc44c1"},{"path":"webhooks/event-log.js","hash":"sha256:de7cd449cc57f5277435a359ccf7a6640b4bd7a8f97d692b5701f23f387304ea"},{"path":"webhooks/handler.js","hash":"sha256:98e693e093889c9a3e4586d64eeb9b272f05dfab9363a454677b5d65aa6fafe1"},{"path":"webhooks/handlers.js","hash":"sha256:7884d7f2531e26b2e5bd11d3adfcbf89ab10f8b72d6a7dbab0a2a13755107319"},{"path":"webhooks/index.js","hash":"sha256:638f9fba30c6738c0a1bdb191e93e6ddef683c87f6d15091e3d36d5f60a3008c"},{"path":"webhooks/mount.js","hash":"sha256:b3065a3ea1ffbe0bf02edd9f5c40c07ddd1efb4da1965205b06d5454caccbd6d"},{"path":"webhooks/registry.js","hash":"sha256:5874b9653e19aa3ebaa890207e5c485b83fe923197c9a0d303fea1ac3a814127"},{"path":"webhooks/relay.js","hash":"sha256:f78edfbd868ce0a5479f9522db2bf9a844e77644db8062ed7f9ce718b5cb8dfd"},{"path":"webhooks/retry.js","hash":"sha256:ecf1a1dee0ae246034124c9d4296ffa1607512dc678a96b8c82dd1bf3e13e1e9"},{"path":"webhooks/router.js","hash":"sha256:029b25eff73cab83d24e94acc4142a6ba793194fbb5b63f8d6093889f62b5cd9"},{"path":"webhooks/twilio.js","hash":"sha256:69b4ff6a6ed6c3ec31ecf88872a1f515deb9a1fc08a01cba55e006dcb8a400fc"},{"path":"webhooks/types.js","hash":"sha256:092d537013dce7c20568125ff2954add65f3a1f597ac2019a04c15503fdbfa85"},{"path":"webhooks/verify.js","hash":"sha256:f91be57402c67485749cf273c542becce9769cc2198483c892497818c24bd768"},{"path":"search/perplexity.js","hash":"sha256:7dba3b2a94ea3649a9d489d06184acf2684833f8bd70e62f1624d07d3853708b"},{"path":"search/browse.js","hash":"sha256:7dcffcc6e47bdc346d7027f16c635377dd7b038ff26c1377a59076ce07d392d7"},{"path":"mdns.js","hash":"sha256:211b3df05d124bcdb884a0e32dafa40b7f39bed77e4eef7923606f0f7fafe520"},{"path":"stt/client.js","hash":"sha256:a7ebe4ed10d3e4490c2c18f25b8e8fe88d605fcc794ee13bb93f73bb4130b518"},{"path":"stt/sidecar.js","hash":"sha256:a20c457073b4fce09e1b43cdad8b8ff8080af3f02099f84a6e1dababed84853d"},{"path":"tts/client.js","hash":"sha256:2509156c576eb0abbe47120878d2b8afd3d61f30e3e51c6388975bf503bccf4d"},{"path":"tts/sidecar.js","hash":"sha256:43e2db0e4cdd81d687fbc1bf111a2f456cf0af7f10025c577db3e629b626a1b4"},{"path":"avatar/client.js","hash":"sha256:d9251ed3a9654a197e055b0b306b871ed62c9d07992fe62a467162ea6262d7ed"},{"path":"avatar/sidecar.js","hash":"sha256:e422a94c9122ba5edb574ccc9bcdfafbe56230cda6afb3c3eda11019af4f3cd3"},{"path":"volumes/index.js","hash":"sha256:182d1c60162613c1caddaf05cf569c045a5cdb238b7407752514008cdc411255"},{"path":"volumes/manager.js","hash":"sha256:fc3c643acb044ee06723b79b6a9710c671fe9ea67833af8ab3df8cdaa7d84734"},{"path":"volumes/types.js","hash":"sha256:a144e6245cf29dd7859f80739aacb3d6c6d813f6c7954f4d23a5bbf43cba0441"},{"path":"credentials/store.js","hash":"sha256:f13b9f25d75f861fa26cde41b8a1e3c38068ab9aec25491c28133a77c4c9ea6a"},{"path":"files/gdrive.js","hash":"sha256:2d033df79e7db371cad845a31716cb3d2348d5adac000dbdb3ae9d794c5fb3b6"}],"dependencies":{"web-push":"^3.6.7","multicast-dns":"^7.2.5"}},"files":{"vault/matcher.js":"LyoqCiAqIEZ1enp5IGZpZWxkIG1hdGNoZXIg4oCUIG1hcHMgZm9ybSBmaWVsZCBsYWJlbHMgdG8gcGVyc29uYWwgdmF1bHQgZW50cmllcy4KICoKICogTm9ybWFsaXplcyBpbmNvbWluZyBsYWJlbHMgKGxvd2VyY2FzZWQsIHN0cmlwcGVkIG9mIHB1bmN0dWF0aW9uL3doaXRlc3BhY2UpLAogKiBjaGVja3MgZXhhY3QgbWF0Y2hlcyBmaXJzdCwgdGhlbiBhbGlhcyBtYXBwaW5ncywgdGhlbiBzdWJzdHJpbmcvdG9rZW4gb3ZlcmxhcC4KICogUmV0dXJucyBhIGNvbmZpZGVuY2Ugc2NvcmUgKDDigJMxKSBzbyBjYWxsZXJzIGNhbiB0aHJlc2hvbGQgYXV0by1maWxsIGRlY2lzaW9ucy4KICovCmltcG9ydCB7IGxpc3RQZXJzb25hbEZpZWxkcyB9IGZyb20gIi4vcGVyc29uYWwuanMiOwovLyDilIDilIAgQWxpYXMgbWFwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogTWFwcyBjb21tb24gZm9ybSBsYWJlbCB2YXJpYW50cyB0byBjYW5vbmljYWwgdmF1bHQgZmllbGQgbmFtZXMuCiAqIEtleXMgYXJlIG5vcm1hbGl6ZWQgKGxvd2VyY2FzZSwgbm8gcHVuY3R1YXRpb24pLiBWYWx1ZXMgYXJlIHZhdWx0IGZpZWxkIG5hbWVzLgogKi8KY29uc3QgQUxJQVNFUyA9IHsKICAgIC8vIElkZW50aXR5CiAgICAiZmlyc3QgbmFtZSI6ICJuYW1lLmZpcnN0IiwKICAgICJmaXJzdG5hbWUiOiAibmFtZS5maXJzdCIsCiAgICAiZm5hbWUiOiAibmFtZS5maXJzdCIsCiAgICAiZ2l2ZW4gbmFtZSI6ICJuYW1lLmZpcnN0IiwKICAgICJsYXN0IG5hbWUiOiAibmFtZS5sYXN0IiwKICAgICJsYXN0bmFtZSI6ICJuYW1lLmxhc3QiLAogICAgImxuYW1lIjogIm5hbWUubGFzdCIsCiAgICAic3VybmFtZSI6ICJuYW1lLmxhc3QiLAogICAgImZhbWlseSBuYW1lIjogIm5hbWUubGFzdCIsCiAgICAiZnVsbCBuYW1lIjogIm5hbWUuZnVsbCIsCiAgICAiZnVsbG5hbWUiOiAibmFtZS5mdWxsIiwKICAgICJuYW1lIjogIm5hbWUuZnVsbCIsCiAgICAibWlkZGxlIG5hbWUiOiAibmFtZS5taWRkbGUiLAogICAgIm1pZGRsZW5hbWUiOiAibmFtZS5taWRkbGUiLAogICAgImRhdGUgb2YgYmlydGgiOiAiZG9iIiwKICAgICJiaXJ0aGRheSI6ICJkb2IiLAogICAgImJpcnRoZGF0ZSI6ICJkb2IiLAogICAgImRvYiI6ICJkb2IiLAogICAgInNzbiI6ICJzc24iLAogICAgInNvY2lhbCBzZWN1cml0eSI6ICJzc24iLAogICAgInNvY2lhbCBzZWN1cml0eSBudW1iZXIiOiAic3NuIiwKICAgIC8vIENvbnRhY3QKICAgICJlbWFpbCI6ICJlbWFpbCIsCiAgICAiZW1haWwgYWRkcmVzcyI6ICJlbWFpbCIsCiAgICAiZS1tYWlsIjogImVtYWlsIiwKICAgICJwaG9uZSI6ICJwaG9uZSIsCiAgICAicGhvbmUgbnVtYmVyIjogInBob25lIiwKICAgICJ0ZWxlcGhvbmUiOiAicGhvbmUiLAogICAgIm1vYmlsZSI6ICJwaG9uZS5tb2JpbGUiLAogICAgIm1vYmlsZSBwaG9uZSI6ICJwaG9uZS5tb2JpbGUiLAogICAgImNlbGwiOiAicGhvbmUubW9iaWxlIiwKICAgICJjZWxsIHBob25lIjogInBob25lLm1vYmlsZSIsCiAgICAiaG9tZSBwaG9uZSI6ICJwaG9uZS5ob21lIiwKICAgICJ3b3JrIHBob25lIjogInBob25lLndvcmsiLAogICAgImFkZHJlc3MiOiAiYWRkcmVzcy5zdHJlZXQiLAogICAgInN0cmVldCBhZGRyZXNzIjogImFkZHJlc3Muc3RyZWV0IiwKICAgICJhZGRyZXNzIGxpbmUgMSI6ICJhZGRyZXNzLmxpbmUxIiwKICAgICJhZGRyZXNzIGxpbmUxIjogImFkZHJlc3MubGluZTEiLAogICAgImFkZHJlc3MxIjogImFkZHJlc3MubGluZTEiLAogICAgInN0cmVldCI6ICJhZGRyZXNzLmxpbmUxIiwKICAgICJhZGRyZXNzIGxpbmUgMiI6ICJhZGRyZXNzLmxpbmUyIiwKICAgICJhZGRyZXNzIGxpbmUyIjogImFkZHJlc3MubGluZTIiLAogICAgImFkZHJlc3MyIjogImFkZHJlc3MubGluZTIiLAogICAgImFwdCI6ICJhZGRyZXNzLmxpbmUyIiwKICAgICJhcGFydG1lbnQiOiAiYWRkcmVzcy5saW5lMiIsCiAgICAic3VpdGUiOiAiYWRkcmVzcy5saW5lMiIsCiAgICAidW5pdCI6ICJhZGRyZXNzLmxpbmUyIiwKICAgICJjaXR5IjogImFkZHJlc3MuY2l0eSIsCiAgICAic3RhdGUiOiAiYWRkcmVzcy5zdGF0ZSIsCiAgICAicHJvdmluY2UiOiAiYWRkcmVzcy5zdGF0ZSIsCiAgICAiemlwIjogImFkZHJlc3MuemlwIiwKICAgICJ6aXAgY29kZSI6ICJhZGRyZXNzLnppcCIsCiAgICAiemlwY29kZSI6ICJhZGRyZXNzLnppcCIsCiAgICAicG9zdGFsIGNvZGUiOiAiYWRkcmVzcy56aXAiLAogICAgInBvc3Rjb2RlIjogImFkZHJlc3MuemlwIiwKICAgICJjb3VudHJ5IjogImFkZHJlc3MuY291bnRyeSIsCiAgICAvLyBGaW5hbmNpYWwKICAgICJjYXJkIG51bWJlciI6ICJjYXJkLm51bWJlciIsCiAgICAiY3JlZGl0IGNhcmQiOiAiY2FyZC5udW1iZXIiLAogICAgImNyZWRpdCBjYXJkIG51bWJlciI6ICJjYXJkLm51bWJlciIsCiAgICAiY2MgbnVtYmVyIjogImNhcmQubnVtYmVyIiwKICAgICJjYXJkIGhvbGRlciI6ICJjYXJkLmhvbGRlciIsCiAgICAiY2FyZGhvbGRlciI6ICJjYXJkLmhvbGRlciIsCiAgICAiY2FyZGhvbGRlciBuYW1lIjogImNhcmQuaG9sZGVyIiwKICAgICJuYW1lIG9uIGNhcmQiOiAiY2FyZC5ob2xkZXIiLAogICAgImV4cGlyYXRpb24iOiAiY2FyZC5leHBpcnkiLAogICAgImV4cGlyYXRpb24gZGF0ZSI6ICJjYXJkLmV4cGlyeSIsCiAgICAiZXhwIGRhdGUiOiAiY2FyZC5leHBpcnkiLAogICAgImV4cGlyeSI6ICJjYXJkLmV4cGlyeSIsCiAgICAiY3Z2IjogImNhcmQuY3Z2IiwKICAgICJjdmMiOiAiY2FyZC5jdnYiLAogICAgInNlY3VyaXR5IGNvZGUiOiAiY2FyZC5jdnYiLAogICAgInJvdXRpbmcgbnVtYmVyIjogImJhbmsucm91dGluZyIsCiAgICAicm91dGluZyI6ICJiYW5rLnJvdXRpbmciLAogICAgImFjY291bnQgbnVtYmVyIjogImJhbmsuYWNjb3VudCIsCiAgICAiYmFuayBhY2NvdW50IjogImJhbmsuYWNjb3VudCIsCiAgICAvLyBDcmVkZW50aWFscwogICAgInVzZXJuYW1lIjogInVzZXJuYW1lIiwKICAgICJ1c2VyIG5hbWUiOiAidXNlcm5hbWUiLAogICAgImxvZ2luIjogInVzZXJuYW1lIiwKICAgICJwYXNzd29yZCI6ICJwYXNzd29yZCIsCiAgICAicGFzcyI6ICJwYXNzd29yZCIsCn07Ci8vIOKUgOKUgCBOb3JtYWxpemF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKiogTm9ybWFsaXplIGEgbGFiZWwgZm9yIG1hdGNoaW5nOiBsb3dlcmNhc2UsIHN0cmlwIG5vbi1hbHBoYW51bWVyaWMgKGtlZXAgc3BhY2VzKS4gKi8KZnVuY3Rpb24gbm9ybWFsaXplKGxhYmVsKSB7CiAgICByZXR1cm4gbGFiZWwKICAgICAgICAudG9Mb3dlckNhc2UoKQogICAgICAgIC5yZXBsYWNlKC9bXmEtejAtOVxzLl0vZywgIiIpCiAgICAgICAgLnJlcGxhY2UoL1xzKy9nLCAiICIpCiAgICAgICAgLnRyaW0oKTsKfQovKiogVG9rZW5pemUgYSBub3JtYWxpemVkIHN0cmluZyBpbnRvIHdvcmRzLiAqLwpmdW5jdGlvbiB0b2tlbml6ZShzKSB7CiAgICByZXR1cm4gcy5zcGxpdCgvW1xzLl0rLykuZmlsdGVyKEJvb2xlYW4pOwp9Ci8vIOKUgOKUgCBNYXRjaGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIE1hdGNoIGEgZm9ybSBmaWVsZCBsYWJlbCB0byBhIHZhdWx0IGVudHJ5LgogKgogKiBTdHJhdGVneSAoaW4gb3JkZXIpOgogKiAxLiBFeGFjdCBtYXRjaCBvbiBub3JtYWxpemVkIHZhdWx0IGZpZWxkIG5hbWUg4oaSIGNvbmZpZGVuY2UgMS4wCiAqIDIuIEFsaWFzIGxvb2t1cCDihpIgY29uZmlkZW5jZSAxLjAKICogMy4gVG9rZW4gb3ZlcmxhcCAoSmFjY2FyZC1saWtlKSDihpIgY29uZmlkZW5jZSAwLjXigJMwLjgKICoKICogUmV0dXJucyBudWxsIGlmIG5vIG1hdGNoIGZvdW5kIGFib3ZlIHRocmVzaG9sZCAoMC41KS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXRjaEZpZWxkKGxhYmVsKSB7CiAgICBjb25zdCBub3JtID0gbm9ybWFsaXplKGxhYmVsKTsKICAgIGlmICghbm9ybSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IGZpZWxkcyA9IGF3YWl0IGxpc3RQZXJzb25hbEZpZWxkcygpOwogICAgY29uc3QgZmllbGRNYXAgPSBuZXcgTWFwKGZpZWxkcy5tYXAoKGYpID0+IFtmLmZpZWxkLCBmXSkpOwogICAgLy8gMS4gRXhhY3QgbWF0Y2ggb24gdmF1bHQgZmllbGQgbmFtZQogICAgZm9yIChjb25zdCBlbnRyeSBvZiBmaWVsZHMpIHsKICAgICAgICBpZiAobm9ybWFsaXplKGVudHJ5LmZpZWxkKSA9PT0gbm9ybSkgewogICAgICAgICAgICByZXR1cm4geyBmaWVsZDogZW50cnkuZmllbGQsIGNhdGVnb3J5OiBlbnRyeS5jYXRlZ29yeSwgY29uZmlkZW5jZTogMS4wIH07CiAgICAgICAgfQogICAgfQogICAgLy8gMi4gQWxpYXMgbG9va3VwCiAgICBjb25zdCBhbGlhc1RhcmdldCA9IEFMSUFTRVNbbm9ybV07CiAgICBpZiAoYWxpYXNUYXJnZXQpIHsKICAgICAgICBjb25zdCBlbnRyeSA9IGZpZWxkTWFwLmdldChhbGlhc1RhcmdldCk7CiAgICAgICAgaWYgKGVudHJ5KSB7CiAgICAgICAgICAgIHJldHVybiB7IGZpZWxkOiBlbnRyeS5maWVsZCwgY2F0ZWdvcnk6IGVudHJ5LmNhdGVnb3J5LCBjb25maWRlbmNlOiAxLjAgfTsKICAgICAgICB9CiAgICAgICAgLy8gQWxpYXMgbWF0Y2hlZCBidXQgbm8gdmF1bHQgZW50cnkgZXhpc3RzIHlldCDigJQgc3RpbGwgcmV0dXJuIHRoZSBjYW5vbmljYWwgZmllbGQKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8vIDMuIFRva2VuIG92ZXJsYXAgc2NvcmluZwogICAgY29uc3QgbGFiZWxUb2tlbnMgPSBuZXcgU2V0KHRva2VuaXplKG5vcm0pKTsKICAgIGlmIChsYWJlbFRva2Vucy5zaXplID09PSAwKQogICAgICAgIHJldHVybiBudWxsOwogICAgbGV0IGJlc3RNYXRjaCA9IG51bGw7CiAgICBsZXQgYmVzdFNjb3JlID0gMDsKICAgIGZvciAoY29uc3QgZW50cnkgb2YgZmllbGRzKSB7CiAgICAgICAgY29uc3QgZmllbGRUb2tlbnMgPSBuZXcgU2V0KHRva2VuaXplKG5vcm1hbGl6ZShlbnRyeS5maWVsZCkpKTsKICAgICAgICBpZiAoZmllbGRUb2tlbnMuc2l6ZSA9PT0gMCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgLy8gQ291bnQgc2hhcmVkIHRva2VucwogICAgICAgIGxldCBzaGFyZWQgPSAwOwogICAgICAgIGZvciAoY29uc3QgdCBvZiBsYWJlbFRva2VucykgewogICAgICAgICAgICBpZiAoZmllbGRUb2tlbnMuaGFzKHQpKQogICAgICAgICAgICAgICAgc2hhcmVkKys7CiAgICAgICAgfQogICAgICAgIC8vIEphY2NhcmQtbGlrZTogc2hhcmVkIC8gdW5pb24KICAgICAgICBjb25zdCB1bmlvbiA9IG5ldyBTZXQoWy4uLmxhYmVsVG9rZW5zLCAuLi5maWVsZFRva2Vuc10pLnNpemU7CiAgICAgICAgY29uc3Qgc2NvcmUgPSBzaGFyZWQgLyB1bmlvbjsKICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUgJiYgc2NvcmUgPj0gMC41KSB7CiAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOwogICAgICAgICAgICBiZXN0TWF0Y2ggPSB7CiAgICAgICAgICAgICAgICBmaWVsZDogZW50cnkuZmllbGQsCiAgICAgICAgICAgICAgICBjYXRlZ29yeTogZW50cnkuY2F0ZWdvcnksCiAgICAgICAgICAgICAgICBjb25maWRlbmNlOiBNYXRoLm1pbigwLjgsIDAuNSArIHNjb3JlICogMC4zKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYmVzdE1hdGNoOwp9Ci8qKgogKiBNYXRjaCBtdWx0aXBsZSBmb3JtIGZpZWxkIGxhYmVscyBhdCBvbmNlLgogKiBSZXR1cm5zIG1hdGNoZXMgZm9yIGVhY2ggbGFiZWwgKG51bGwgZW50cmllcyBmb3IgdW5tYXRjaGVkIGxhYmVscyBhcmUgb21pdHRlZCkuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbWF0Y2hGaWVsZHMobGFiZWxzKSB7CiAgICBjb25zdCByZXN1bHRzID0gW107CiAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIGxhYmVscykgewogICAgICAgIGNvbnN0IG1hdGNoID0gYXdhaXQgbWF0Y2hGaWVsZChsYWJlbCk7CiAgICAgICAgaWYgKG1hdGNoKQogICAgICAgICAgICByZXN1bHRzLnB1c2gobWF0Y2gpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7Cn0KLyoqCiAqIEdldCB0aGUgY2Fub25pY2FsIHZhdWx0IGZpZWxkIG5hbWUgZm9yIGEgZm9ybSBsYWJlbCB2aWEgYWxpYXMgbG9va3VwLgogKiBSZXR1cm5zIHRoZSBjYW5vbmljYWwgbmFtZSBvciB0aGUgbm9ybWFsaXplZCBsYWJlbCBpZiBubyBhbGlhcyBleGlzdHMuCiAqIERvZXMgTk9UIGNoZWNrIGlmIHRoZSBmaWVsZCBleGlzdHMgaW4gdGhlIHZhdWx0LgogKi8KZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGaWVsZE5hbWUobGFiZWwpIHsKICAgIGNvbnN0IG5vcm0gPSBub3JtYWxpemUobGFiZWwpOwogICAgcmV0dXJuIEFMSUFTRVNbbm9ybV0gPz8gbm9ybTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1tYXRjaGVyLmpzLm1hcA==","vault/personal.js":"LyoqCiAqIFBlcnNvbmFsIGRhdGEgdmF1bHQg4oCUIGVuY3J5cHRlZCBKU09OTCBzdG9yZSBmb3IgZm9ybS1maWxsaW5nIGZpZWxkcy4KICoKICogU3RvcmVzIHBlcnNvbmFsIGRhdGEgKG5hbWUsIGFkZHJlc3MsIFNTTiwgZXRjLikgYXMgcGVyLWxpbmUgZW5jcnlwdGVkIEpTT05MCiAqIHZpYSBicmFpbi1pby4gRWFjaCBlbnRyeSBoYXMgYSBmaWVsZCBrZXksIHZhbHVlLCBjYXRlZ29yeSwgYW5kIHRpbWVzdGFtcC4KICoKICogU0VDVVJJVFk6CiAqIC0gQWxsIGRhdGEgZW5jcnlwdGVkIGF0IHJlc3QgdmlhIEFFUy0yNTYtR0NNIChicmFpbi1pbyBoYW5kbGVzIHRoaXMpLgogKiAtIFZhbHVlcyBhcmUgTkVWRVIgZXhwb3NlZCBpbiBsb2dzLCBwcm9tcHRzLCBvciBMTE0gY29udGV4dC4KICogLSBPbmx5IGZpZWxkIG5hbWVzIGFuZCBjYXRlZ29yaWVzIGFyZSBzdXJmYWNlZCB0byB0aGUgTExNOyByZXRyaWV2YWwKICogICBvZiBhY3R1YWwgdmFsdWVzIGhhcHBlbnMgdGhyb3VnaCBhY3Rpb24gYmxvY2tzLCBub3QgY29udGV4dCBpbmplY3Rpb24uCiAqLwppbXBvcnQgeyBqb2luIH0gZnJvbSAibm9kZTpwYXRoIjsKaW1wb3J0IHsgcmVhZEJyYWluTGluZXMsIHdyaXRlQnJhaW5MaW5lcywgYXBwZW5kQnJhaW5MaW5lLCBlbnN1cmVCcmFpbkpzb25sLCB9IGZyb20gIi4uL2xpYi9icmFpbi1pby5qcyI7CmltcG9ydCB7IEJSQUlOX0RJUiB9IGZyb20gIi4uL2xpYi9wYXRocy5qcyI7CmNvbnN0IFZBVUxUX0RJUiA9IGpvaW4oQlJBSU5fRElSLCAidmF1bHQiKTsKY29uc3QgVkFVTFRfRklMRSA9IGpvaW4oVkFVTFRfRElSLCAicGVyc29uYWwuZW5jLmpzb25sIik7CmNvbnN0IFNDSEVNQV9MSU5FID0gSlNPTi5zdHJpbmdpZnkoewogICAgX3NjaGVtYTogInBlcnNvbmFsLXZhdWx0IiwKICAgIF92ZXJzaW9uOiAiMS4wIiwKICAgIF9kZXNjcmlwdGlvbjogIkVuY3J5cHRlZCBwZXJzb25hbCBkYXRhIGZvciBmb3JtIGZpbGxpbmcuIE9uZSBKU09OIG9iamVjdCBwZXIgbGluZS4gQXBwZW5kLW9ubHkuIiwKfSk7Ci8vIOKUgOKUgCBJbi1tZW1vcnkgY2FjaGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKiBGaWVsZCDihpIgbGF0ZXN0IGVudHJ5LiBSZWJ1aWx0IG9uIGxvYWQsIHVwZGF0ZWQgb24gc2V0L2RlbGV0ZS4gKi8KbGV0IGNhY2hlID0gbmV3IE1hcCgpOwpsZXQgbG9hZGVkID0gZmFsc2U7Ci8vIOKUgOKUgCBJbnRlcm5hbCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBpc1ZhdWx0RW50cnkob2JqKSB7CiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAib2JqZWN0IikKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBlID0gb2JqOwogICAgcmV0dXJuICh0eXBlb2YgZS5maWVsZCA9PT0gInN0cmluZyIgJiYKICAgICAgICB0eXBlb2YgZS52YWx1ZSA9PT0gInN0cmluZyIgJiYKICAgICAgICB0eXBlb2YgZS5jYXRlZ29yeSA9PT0gInN0cmluZyIgJiYKICAgICAgICB0eXBlb2YgZS51cGRhdGVkQXQgPT09ICJzdHJpbmciKTsKfQovKiogTG9hZCBhbGwgZW50cmllcyBmcm9tIGRpc2ssIGRlZHVwIGJ5IGZpZWxkIChsYXRlc3Qgd2lucyksIGZpbHRlciBhcmNoaXZlZC4gKi8KYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZSgpIHsKICAgIGF3YWl0IGVuc3VyZUJyYWluSnNvbmwoVkFVTFRfRklMRSwgU0NIRU1BX0xJTkUpOwogICAgY29uc3QgbGluZXMgPSBhd2FpdCByZWFkQnJhaW5MaW5lcyhWQVVMVF9GSUxFKTsKICAgIGNhY2hlID0gbmV3IE1hcCgpOwogICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShsaW5lKTsKICAgICAgICAgICAgLy8gU2tpcCBzY2hlbWEgaGVhZGVyCiAgICAgICAgICAgIGlmIChwYXJzZWQgJiYgdHlwZW9mIHBhcnNlZCA9PT0gIm9iamVjdCIgJiYgIl9zY2hlbWEiIGluIHBhcnNlZCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoIWlzVmF1bHRFbnRyeShwYXJzZWQpKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGlmIChwYXJzZWQuc3RhdHVzID09PSAiYXJjaGl2ZWQiKSB7CiAgICAgICAgICAgICAgICBjYWNoZS5kZWxldGUocGFyc2VkLmZpZWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNhY2hlLnNldChwYXJzZWQuZmllbGQsIHBhcnNlZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAvLyBTa2lwIG1hbGZvcm1lZCBsaW5lcwogICAgICAgIH0KICAgIH0KICAgIGxvYWRlZCA9IHRydWU7Cn0KLyoqIEVuc3VyZSBjYWNoZSBpcyBoeWRyYXRlZCBiZWZvcmUgcmVhZHMuICovCmFzeW5jIGZ1bmN0aW9uIGVuc3VyZUxvYWRlZCgpIHsKICAgIGlmICghbG9hZGVkKQogICAgICAgIGF3YWl0IGh5ZHJhdGUoKTsKfQovLyDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIEluaXRpYWxpemUgdGhlIHBlcnNvbmFsIHZhdWx0LiBDYWxsIG9uY2UgYXQgc3RhcnR1cCBhZnRlciBlbmNyeXB0aW9uIGtleSBpcyBzZXQuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFBlcnNvbmFsVmF1bHQoKSB7CiAgICBhd2FpdCBoeWRyYXRlKCk7Cn0KLyoqCiAqIEdldCBhIHNpbmdsZSB2YXVsdCBlbnRyeSBieSBleGFjdCBmaWVsZCBuYW1lLgogKiBSZXR1cm5zIHRoZSBlbnRyeSAod2l0aCB2YWx1ZSkgb3IgbnVsbC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQZXJzb25hbEZpZWxkKGZpZWxkKSB7CiAgICBhd2FpdCBlbnN1cmVMb2FkZWQoKTsKICAgIHJldHVybiBjYWNoZS5nZXQoZmllbGQpID8/IG51bGw7Cn0KLyoqCiAqIFNldCAoY3JlYXRlIG9yIHVwZGF0ZSkgYSBwZXJzb25hbCBkYXRhIGZpZWxkLgogKiBBcHBlbmRzIGEgbmV3IGxpbmUgdG8gdGhlIEpTT05MIGZpbGUgKGFwcGVuZC1vbmx5KS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRQZXJzb25hbEZpZWxkKGZpZWxkLCB2YWx1ZSwgY2F0ZWdvcnkpIHsKICAgIGF3YWl0IGVuc3VyZUxvYWRlZCgpOwogICAgY29uc3QgZW50cnkgPSB7CiAgICAgICAgZmllbGQsCiAgICAgICAgdmFsdWUsCiAgICAgICAgY2F0ZWdvcnksCiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgc3RhdHVzOiAiYWN0aXZlIiwKICAgIH07CiAgICBhd2FpdCBhcHBlbmRCcmFpbkxpbmUoVkFVTFRfRklMRSwgSlNPTi5zdHJpbmdpZnkoZW50cnkpKTsKICAgIGNhY2hlLnNldChmaWVsZCwgZW50cnkpOwogICAgcmV0dXJuIGVudHJ5Owp9Ci8qKgogKiBMaXN0IGFsbCBhY3RpdmUgZW50cmllcywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBjYXRlZ29yeS4KICogUmV0dXJucyBmaWVsZCBuYW1lcyBhbmQgY2F0ZWdvcmllcyBvbmx5IOKAlCB2YWx1ZXMgYXJlIHJlZGFjdGVkLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RQZXJzb25hbEZpZWxkcyhjYXRlZ29yeSkgewogICAgYXdhaXQgZW5zdXJlTG9hZGVkKCk7CiAgICBjb25zdCByZXN1bHRzID0gW107CiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGNhY2hlLnZhbHVlcygpKSB7CiAgICAgICAgaWYgKGNhdGVnb3J5ICYmIGVudHJ5LmNhdGVnb3J5ICE9PSBjYXRlZ29yeSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgZmllbGQ6IGVudHJ5LmZpZWxkLAogICAgICAgICAgICBjYXRlZ29yeTogZW50cnkuY2F0ZWdvcnksCiAgICAgICAgICAgIHVwZGF0ZWRBdDogZW50cnkudXBkYXRlZEF0LAogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7Cn0KLyoqCiAqIFNvZnQtZGVsZXRlIGEgZmllbGQgYnkgYXBwZW5kaW5nIGFuIGFyY2hpdmVkIGVudHJ5LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVBlcnNvbmFsRmllbGQoZmllbGQpIHsKICAgIGF3YWl0IGVuc3VyZUxvYWRlZCgpOwogICAgY29uc3QgZXhpc3RpbmcgPSBjYWNoZS5nZXQoZmllbGQpOwogICAgaWYgKCFleGlzdGluZykKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICBjb25zdCB0b21ic3RvbmUgPSB7CiAgICAgICAgLi4uZXhpc3RpbmcsCiAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgc3RhdHVzOiAiYXJjaGl2ZWQiLAogICAgfTsKICAgIGF3YWl0IGFwcGVuZEJyYWluTGluZShWQVVMVF9GSUxFLCBKU09OLnN0cmluZ2lmeSh0b21ic3RvbmUpKTsKICAgIGNhY2hlLmRlbGV0ZShmaWVsZCk7CiAgICByZXR1cm4gdHJ1ZTsKfQovKioKICogR2V0IG11bHRpcGxlIGZpZWxkcyBieSBuYW1lLiBSZXR1cm5zIGEgbWFwIG9mIGZpZWxkIOKGkiB2YWx1ZS4KICogVGhpcyBpcyB0aGUgcmV0cmlldmFsIHBhdGggZm9yIGZvcm0tZmlsbGluZyDigJQgdmFsdWVzIGFyZSByZXR1cm5lZAogKiBidXQgbXVzdCBORVZFUiBiZSBmb3J3YXJkZWQgdG8gbG9ncyBvciBMTE0gY29udGV4dC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQZXJzb25hbEZpZWxkcyhmaWVsZHMpIHsKICAgIGF3YWl0IGVuc3VyZUxvYWRlZCgpOwogICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcCgpOwogICAgZm9yIChjb25zdCBmIG9mIGZpZWxkcykgewogICAgICAgIGNvbnN0IGVudHJ5ID0gY2FjaGUuZ2V0KGYpOwogICAgICAgIGlmIChlbnRyeSkKICAgICAgICAgICAgcmVzdWx0LnNldChmLCBlbnRyeS52YWx1ZSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Ci8qKgogKiBDb21wYWN0IHRoZSB2YXVsdCBmaWxlIOKAlCByZXdyaXRlIHdpdGggb25seSB0aGUgbGF0ZXN0IGFjdGl2ZSBlbnRyaWVzLgogKiBDYWxsIHBlcmlvZGljYWxseSB0byByZWNsYWltIHNwYWNlIGZyb20gYXJjaGl2ZWQvc3VwZXJzZWRlZCBlbnRyaWVzLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXBhY3RQZXJzb25hbFZhdWx0KCkgewogICAgYXdhaXQgZW5zdXJlTG9hZGVkKCk7CiAgICBjb25zdCBsaW5lcyA9IFtTQ0hFTUFfTElORV07CiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGNhY2hlLnZhbHVlcygpKSB7CiAgICAgICAgbGluZXMucHVzaChKU09OLnN0cmluZ2lmeShlbnRyeSkpOwogICAgfQogICAgYXdhaXQgd3JpdGVCcmFpbkxpbmVzKFZBVUxUX0ZJTEUsIGxpbmVzKTsKICAgIHJldHVybiBjYWNoZS5zaXplOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXBlcnNvbmFsLmpzLm1hcA==","vault/policy.js":"LyoqCiAqIFZhdWx0IFBvbGljeSBMb2FkZXIg4oCUIGNsYXNzaWZpZXMgYnJhaW4gcGF0aHMgaW50byBhY2Nlc3MgdGllcnMuCiAqCiAqIFJlYWRzIGJyYWluL3ZhdWx0LnBvbGljeS55YW1sIGFuZCBjYWNoZXMgb24gZmlyc3QgbG9hZC4KICogVGllcnM6IG9wZW4gfCBjb21tdW5pdHkgfCBzZWN1cmVkLiBEZWZhdWx0IGZyb20gYGRlZmF1bHRfdGllcmAgZmllbGQuCiAqCiAqIEhhbmQtcm9sbGVkIFlBTUwgcGFyc2VyIChubyBleHRlcm5hbCBkZXBzKS4gUmV1c2VzIHBhdHRlcm4gZnJvbQogKiBzZW5zaXRpdmUtcmVnaXN0cnkudHMuCiAqLwppbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgeyByZWFkRmlsZVN5bmMsIGV4aXN0c1N5bmMgfSBmcm9tICJub2RlOmZzIjsKaW1wb3J0IHsgam9pbiB9IGZyb20gIm5vZGU6cGF0aCI7CmltcG9ydCB7IG1hdGNoQW55R2xvYiB9IGZyb20gIi4uL2xpYi9nbG9iLW1hdGNoLmpzIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJ2YXVsdC5wb2xpY3kiKTsKaW1wb3J0IHsgQlJBSU5fRElSIH0gZnJvbSAiLi4vbGliL3BhdGhzLmpzIjsKY29uc3QgUE9MSUNZX0ZJTEUgPSBqb2luKEJSQUlOX0RJUiwgInZhdWx0LnBvbGljeS55YW1sIik7Ci8vIOKUgOKUgCBDYWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKbGV0IGNhY2hlZCA9IG51bGw7Ci8vIOKUgOKUgCBZQU1MIHBhcnNlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFBhcnNlIHRoZSB2YXVsdC5wb2xpY3kueWFtbCBmb3JtYXQuIEV4cGVjdHM6CiAqICAgb3duZXI6IDxzdHJpbmc+CiAqICAgdGllcnM6CiAqICAgICBvcGVuOgogKiAgICAgICAtIHBhdHRlcm4KICogICAgIGNvbW11bml0eToKICogICAgICAgLSBwYXR0ZXJuCiAqICAgICBzZWN1cmVkOgogKiAgICAgICAtIHBhdHRlcm4KICogICBkZWZhdWx0X3RpZXI6IDx0aWVyPgogKi8KZnVuY3Rpb24gcGFyc2VWYXVsdFBvbGljeShyYXcpIHsKICAgIGNvbnN0IGxpbmVzID0gcmF3LnNwbGl0KCJcbiIpOwogICAgbGV0IG93bmVyID0gIiI7CiAgICBsZXQgZGVmYXVsdFRpZXIgPSAiY29tbXVuaXR5IjsKICAgIGNvbnN0IHRpZXJzID0geyBvcGVuOiBbXSwgY29tbXVuaXR5OiBbXSwgc2VjdXJlZDogW10gfTsKICAgIGxldCBjdXJyZW50VGllciA9IG51bGw7CiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHsKICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltRW5kKCk7CiAgICAgICAgLy8gU2tpcCBjb21tZW50cyBhbmQgZW1wdHkgbGluZXMKICAgICAgICBpZiAoIXRyaW1tZWQgfHwgdHJpbW1lZC5tYXRjaCgvXlxzKiMvKSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgLy8gVG9wLWxldmVsIGtleTogdmFsdWUKICAgICAgICBjb25zdCB0b3BLdiA9IHRyaW1tZWQubWF0Y2goL14oXHdbXHdfXSopXHMqOlxzKiguKykkLyk7CiAgICAgICAgaWYgKHRvcEt2KSB7CiAgICAgICAgICAgIGNvbnN0IFssIGtleSwgdmFsXSA9IHRvcEt2OwogICAgICAgICAgICBjb25zdCB1bnF1b3RlZCA9IHZhbC5yZXBsYWNlKC9eWyInXXxbIiddJC9nLCAiIikudHJpbSgpOwogICAgICAgICAgICBpZiAoa2V5ID09PSAib3duZXIiKQogICAgICAgICAgICAgICAgb3duZXIgPSB1bnF1b3RlZDsKICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSAiZGVmYXVsdF90aWVyIikgewogICAgICAgICAgICAgICAgaWYgKHVucXVvdGVkID09PSAib3BlbiIgfHwgdW5xdW90ZWQgPT09ICJjb21tdW5pdHkiIHx8IHVucXVvdGVkID09PSAic2VjdXJlZCIpIHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VGllciA9IHVucXVvdGVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnRUaWVyID0gbnVsbDsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIC8vIFRpZXIgaGVhZGVyIChpbmRlbnRlZCB1bmRlciB0aWVyczopCiAgICAgICAgY29uc3QgdGllckhlYWRlciA9IHRyaW1tZWQubWF0Y2goL15ccysob3Blbnxjb21tdW5pdHl8c2VjdXJlZClccyo6XHMqJC8pOwogICAgICAgIGlmICh0aWVySGVhZGVyKSB7CiAgICAgICAgICAgIGN1cnJlbnRUaWVyID0gdGllckhlYWRlclsxXTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIC8vIExpc3QgaXRlbSB1bmRlciBhIHRpZXIKICAgICAgICBjb25zdCBsaXN0SXRlbSA9IHRyaW1tZWQubWF0Y2goL15ccystXHMrKC4rKSQvKTsKICAgICAgICBpZiAobGlzdEl0ZW0gJiYgY3VycmVudFRpZXIpIHsKICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IGxpc3RJdGVtWzFdLnJlcGxhY2UoL15bIiddfFsiJ10kL2csICIiKS50cmltKCk7CiAgICAgICAgICAgIHRpZXJzW2N1cnJlbnRUaWVyXS5wdXNoKHBhdHRlcm4pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgLy8gInRpZXJzOiIgaGVhZGVyIGxpbmUgKG5vIHZhbHVlKQogICAgICAgIGlmICh0cmltbWVkLm1hdGNoKC9edGllcnNccyo6XHMqJC8pKSB7CiAgICAgICAgICAgIGN1cnJlbnRUaWVyID0gbnVsbDsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHsgb3duZXIsIHRpZXJzLCBkZWZhdWx0VGllciB9Owp9Ci8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogTG9hZCBhbmQgY2FjaGUgdGhlIHZhdWx0IHBvbGljeS4gUmV0dXJucyBjYWNoZWQgb24gc3Vic2VxdWVudCBjYWxscy4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkVmF1bHRQb2xpY3koKSB7CiAgICBpZiAoY2FjaGVkKQogICAgICAgIHJldHVybiBjYWNoZWQ7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRGaWxlKFBPTElDWV9GSUxFLCAidXRmLTgiKTsKICAgICAgICBjYWNoZWQgPSBwYXJzZVZhdWx0UG9saWN5KHJhdyk7CiAgICAgICAgbG9nLmluZm8oIlZhdWx0IHBvbGljeSBsb2FkZWQiLCB7CiAgICAgICAgICAgIG93bmVyOiBjYWNoZWQub3duZXIsCiAgICAgICAgICAgIG9wZW46IGNhY2hlZC50aWVycy5vcGVuLmxlbmd0aCwKICAgICAgICAgICAgY29tbXVuaXR5OiBjYWNoZWQudGllcnMuY29tbXVuaXR5Lmxlbmd0aCwKICAgICAgICAgICAgc2VjdXJlZDogY2FjaGVkLnRpZXJzLnNlY3VyZWQubGVuZ3RoLAogICAgICAgIH0pOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGlmIChlcnIuY29kZSA9PT0gIkVOT0VOVCIpIHsKICAgICAgICAgICAgbG9nLndhcm4oIk5vIHZhdWx0LnBvbGljeS55YW1sIGZvdW5kIOKAlCBkZWZhdWx0aW5nIGFsbCBwYXRocyB0byBjb21tdW5pdHkiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxvZy53YXJuKCJGYWlsZWQgdG8gcGFyc2UgdmF1bHQucG9saWN5LnlhbWwiLCB7IGVycm9yOiBlcnIubWVzc2FnZSB9KTsKICAgICAgICB9CiAgICAgICAgY2FjaGVkID0geyBvd25lcjogIiIsIHRpZXJzOiB7IG9wZW46IFtdLCBjb21tdW5pdHk6IFtdLCBzZWN1cmVkOiBbXSB9LCBkZWZhdWx0VGllcjogImNvbW11bml0eSIgfTsKICAgIH0KICAgIHJldHVybiBjYWNoZWQ7Cn0KLyoqCiAqIFN5bmNocm9ub3VzIGxvYWQg4oCUIGZvciB1c2Ugd2hlcmUgYXN5bmMgaXMgbm90IGF2YWlsYWJsZS4KICovCmV4cG9ydCBmdW5jdGlvbiBsb2FkVmF1bHRQb2xpY3lTeW5jKCkgewogICAgaWYgKGNhY2hlZCkKICAgICAgICByZXR1cm4gY2FjaGVkOwogICAgdHJ5IHsKICAgICAgICBpZiAoZXhpc3RzU3luYyhQT0xJQ1lfRklMRSkpIHsKICAgICAgICAgICAgY29uc3QgcmF3ID0gcmVhZEZpbGVTeW5jKFBPTElDWV9GSUxFLCAidXRmLTgiKTsKICAgICAgICAgICAgY2FjaGVkID0gcGFyc2VWYXVsdFBvbGljeShyYXcpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY2FjaGVkID0geyBvd25lcjogIiIsIHRpZXJzOiB7IG9wZW46IFtdLCBjb21tdW5pdHk6IFtdLCBzZWN1cmVkOiBbXSB9LCBkZWZhdWx0VGllcjogImNvbW11bml0eSIgfTsKICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgY2FjaGVkID0geyBvd25lcjogIiIsIHRpZXJzOiB7IG9wZW46IFtdLCBjb21tdW5pdHk6IFtdLCBzZWN1cmVkOiBbXSB9LCBkZWZhdWx0VGllcjogImNvbW11bml0eSIgfTsKICAgIH0KICAgIHJldHVybiBjYWNoZWQ7Cn0KLyoqCiAqIEdldCB0aGUgY2FjaGVkIHBvbGljeSAobG9hZHMgc3luY2hyb25vdXNseSBpZiBub3QgeWV0IGNhY2hlZCkuCiAqLwpleHBvcnQgZnVuY3Rpb24gZ2V0VmF1bHRQb2xpY3koKSB7CiAgICBpZiAoIWNhY2hlZCkKICAgICAgICBsb2FkVmF1bHRQb2xpY3lTeW5jKCk7CiAgICByZXR1cm4gY2FjaGVkOwp9Ci8qKgogKiBDbGFzc2lmeSBhIGJyYWluLXJlbGF0aXZlIHBhdGggaW50byBhIHZhdWx0IHRpZXIuCiAqIENoZWNrcyBzZWN1cmVkIGZpcnN0IChtb3N0IHJlc3RyaWN0aXZlKSwgdGhlbiBvcGVuLCB0aGVuIGNvbW11bml0eS4KICogRmFsbHMgYmFjayB0byBkZWZhdWx0X3RpZXIgaWYgbm8gcGF0dGVybiBtYXRjaGVzLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5UGF0aChyZWxQYXRoKSB7CiAgICBjb25zdCBwb2xpY3kgPSBnZXRWYXVsdFBvbGljeSgpOwogICAgLy8gQ2hlY2sgbW9zdCByZXN0cmljdGl2ZSBmaXJzdAogICAgaWYgKG1hdGNoQW55R2xvYihwb2xpY3kudGllcnMuc2VjdXJlZCwgcmVsUGF0aCkpCiAgICAgICAgcmV0dXJuICJzZWN1cmVkIjsKICAgIGlmIChtYXRjaEFueUdsb2IocG9saWN5LnRpZXJzLm9wZW4sIHJlbFBhdGgpKQogICAgICAgIHJldHVybiAib3BlbiI7CiAgICBpZiAobWF0Y2hBbnlHbG9iKHBvbGljeS50aWVycy5jb21tdW5pdHksIHJlbFBhdGgpKQogICAgICAgIHJldHVybiAiY29tbXVuaXR5IjsKICAgIHJldHVybiBwb2xpY3kuZGVmYXVsdFRpZXI7Cn0KLyoqCiAqIEZvcmNlIHJlbG9hZCBvZiB2YXVsdCBwb2xpY3kgKGUuZy4gYWZ0ZXIgcG9saWN5IGZpbGUgY2hhbmdlcykuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVsb2FkVmF1bHRQb2xpY3koKSB7CiAgICBjYWNoZWQgPSBudWxsOwogICAgcmV0dXJuIGxvYWRWYXVsdFBvbGljeSgpOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvbGljeS5qcy5tYXA=","vault/store.js":"LyoqCiAqIEVuY3J5cHRlZCBrZXkgdmF1bHQuCiAqIFN0b3JlcyBBUEkga2V5cyBhcyBBRVMtMjU2LUdDTSBlbmNyeXB0ZWQgSlNPTiwgc2FtZSBrZXkgdXNlZCBmb3Igc2Vzc2lvbnMuCiAqIEFmdGVyIGxvYWRpbmcsIGh5ZHJhdGVzIHByb2Nlc3MuZW52IHNvIGNvbnN1bWVyIG1vZHVsZXMgbmVlZCB6ZXJvIGNoYW5nZXMuCiAqLwppbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlLCBta2RpciB9IGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgeyBqb2luIH0gZnJvbSAibm9kZTpwYXRoIjsKaW1wb3J0IHsgZW5jcnlwdCwgZGVjcnlwdCB9IGZyb20gIi4uL2F1dGgvY3J5cHRvLmpzIjsKaW1wb3J0IHsgc2hvdWxkSHlkcmF0ZUtleSB9IGZyb20gIi4uL2ludGVncmF0aW9ucy9nYXRlLmpzIjsKaW1wb3J0IHsgQlJBSU5fRElSIH0gZnJvbSAiLi4vbGliL3BhdGhzLmpzIjsKY29uc3QgVkFVTFRfRElSID0gam9pbihCUkFJTl9ESVIsICJ2YXVsdCIpOwpjb25zdCBWQVVMVF9GSUxFID0gam9pbihWQVVMVF9ESVIsICJrZXlzLmpzb24iKTsKLy8gSW4tbWVtb3J5IGNhY2hlIOKAlCBwb3B1bGF0ZWQgYnkgbG9hZFZhdWx0LCByZWFkIGJ5IGxpc3QvaHlkcmF0ZQpsZXQgdmF1bHRDYWNoZSA9IHt9OwovKioKICogTG9hZCB2YXVsdCBmcm9tIGVuY3J5cHRlZCBmaWxlLCBwb3B1bGF0ZSBjYWNoZSBhbmQgaHlkcmF0ZSBwcm9jZXNzLmVudi4KICogU2FmZSB0byBjYWxsIHdoZW4gZmlsZSBkb2Vzbid0IGV4aXN0IChzdGFydHMgZW1wdHkpLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRWYXVsdChrZXkpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUoVkFVTFRfRklMRSwgInV0Zi04Iik7CiAgICAgICAgY29uc3QgZmlsZSA9IEpTT04ucGFyc2UocmF3KTsKICAgICAgICBjb25zdCBwYXlsb2FkID0gewogICAgICAgICAgICBjaXBoZXJ0ZXh0OiBmaWxlLmNpcGhlcnRleHQsCiAgICAgICAgICAgIGl2OiBmaWxlLml2LAogICAgICAgICAgICBhdXRoVGFnOiBmaWxlLmF1dGhUYWcsCiAgICAgICAgfTsKICAgICAgICBjb25zdCBwbGFpbnRleHQgPSBkZWNyeXB0KHBheWxvYWQsIGtleSk7CiAgICAgICAgdmF1bHRDYWNoZSA9IEpTT04ucGFyc2UocGxhaW50ZXh0KTsKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICAvLyBGaWxlIG1pc3NpbmcsIGNvcnJ1cHQsIG9yIHdyb25nIGtleSDigJQgc3RhcnQgZnJlc2gKICAgICAgICB2YXVsdENhY2hlID0ge307CiAgICB9CiAgICBoeWRyYXRlRW52KCk7Cn0KLyoqCiAqIEVuY3J5cHQgYW5kIHNhdmUgdGhlIHZhdWx0IGNhY2hlIHRvIGRpc2suIEZyZXNoIElWIG9uIGV2ZXJ5IHdyaXRlLgogKi8KYXN5bmMgZnVuY3Rpb24gc2F2ZVZhdWx0KGtleSkgewogICAgYXdhaXQgbWtkaXIoVkFVTFRfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgIGNvbnN0IHBsYWludGV4dCA9IEpTT04uc3RyaW5naWZ5KHZhdWx0Q2FjaGUpOwogICAgY29uc3QgcGF5bG9hZCA9IGVuY3J5cHQocGxhaW50ZXh0LCBrZXkpOwogICAgY29uc3QgZmlsZSA9IHsKICAgICAgICB2OiAxLAogICAgICAgIGNpcGhlcnRleHQ6IHBheWxvYWQuY2lwaGVydGV4dCwKICAgICAgICBpdjogcGF5bG9hZC5pdiwKICAgICAgICBhdXRoVGFnOiBwYXlsb2FkLmF1dGhUYWcsCiAgICB9OwogICAgYXdhaXQgd3JpdGVGaWxlKFZBVUxUX0ZJTEUsIEpTT04uc3RyaW5naWZ5KGZpbGUpLCAidXRmLTgiKTsKfQovKioKICogQWRkIG9yIHVwZGF0ZSBhIGtleSBpbiB0aGUgdmF1bHQuIFBlcnNpc3RzIGltbWVkaWF0ZWx5LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFZhdWx0S2V5KG5hbWUsIHZhbHVlLCBrZXksIGxhYmVsKSB7CiAgICB2YXVsdENhY2hlW25hbWVdID0geyB2YWx1ZSwgbGFiZWwgfTsKICAgIGF3YWl0IHNhdmVWYXVsdChrZXkpOwogICAgLy8gS2VlcCBwcm9jZXNzLmVudiBpbiBzeW5jIOKAlCBidXQgcmVzcGVjdCB0aGUgaW50ZWdyYXRpb24gZ2F0ZQogICAgaWYgKHNob3VsZEh5ZHJhdGVLZXkobmFtZSkpIHsKICAgICAgICBwcm9jZXNzLmVudltuYW1lXSA9IHZhbHVlOwogICAgfQp9Ci8qKgogKiBSZW1vdmUgYSBrZXkgZnJvbSB0aGUgdmF1bHQuIFBlcnNpc3RzIGltbWVkaWF0ZWx5LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVZhdWx0S2V5KG5hbWUsIGtleSkgewogICAgZGVsZXRlIHZhdWx0Q2FjaGVbbmFtZV07CiAgICBhd2FpdCBzYXZlVmF1bHQoa2V5KTsKICAgIC8vIFJlbW92ZSBmcm9tIHByb2Nlc3MuZW52IChyZXZlcnRzIHRvIC5lbnYgdmFsdWUgb24gbmV4dCByZXN0YXJ0KQogICAgZGVsZXRlIHByb2Nlc3MuZW52W25hbWVdOwp9Ci8qKgogKiBMaXN0IHZhdWx0IGtleXMg4oCUIG5hbWVzIGFuZCBsYWJlbHMgb25seSwgbm8gdmFsdWVzLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGxpc3RWYXVsdEtleXMoKSB7CiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModmF1bHRDYWNoZSkubWFwKChbbmFtZSwgZW50cnldKSA9PiAoewogICAgICAgIG5hbWUsCiAgICAgICAgbGFiZWw6IGVudHJ5LmxhYmVsLAogICAgfSkpOwp9Ci8qKgogKiBHZXQgYWxsIHZhdWx0IGVudHJpZXMgd2l0aCB2YWx1ZXMuIFVzZWQgZm9yIG1pZ3JhdGlvbiB0byBjcmVkZW50aWFsIHN0b3JlLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGdldFZhdWx0RW50cmllcygpIHsKICAgIHJldHVybiBPYmplY3QuZW50cmllcyh2YXVsdENhY2hlKS5tYXAoKFtuYW1lLCBlbnRyeV0pID0+ICh7CiAgICAgICAgbmFtZSwKICAgICAgICB2YWx1ZTogZW50cnkudmFsdWUsCiAgICAgICAgbGFiZWw6IGVudHJ5LmxhYmVsLAogICAgfSkpOwp9Ci8qKgogKiBHZXQgdmF1bHQgZW50cmllcyB0aGF0IHRoZSBhZ2VudCAodGhlIGNoYXQgTExNKSBpcyBhbGxvd2VkIHRvIHNlZSBpbiBjb252ZXJzYXRpb24uCiAqIE9ubHkga2V5cyBzdGFydGluZyB3aXRoICJDT1JFXyIgb3IgIkRBU0hfIiBhcmUgcmV0dXJuZWQg4oCUIHRoZXNlIGFyZSBub24tc2VjcmV0IHZhbHVlcwogKiB0aGUgdXNlciBleHBsaWNpdGx5IHdhbnRzIHRoZSBhZ2VudCB0byByZWZlcmVuY2UgKGUuZy4gcHJlZmVyZW5jZXMsIG5pY2tuYW1lcykuCiAqCiAqIFNFQ1VSSVRZOiBBdXRoZW50aWNhdGlvbiBzZWNyZXRzIChQQVNTV09SRCwgUkVDT1ZFUllfUVVFU1RJT04pIGFyZSBORVZFUgogKiBleHBvc2VkIHRvIHRoZSBMTE0uIFRoZSBwYXNzd29yZCBpcyB2ZXJpZmllZCBhdCB0aGUgY3J5cHRvIGxheWVyIHZpYSBpdHMKICogU0hBLTI1NiBoYXNoIGluIGh1bWFuLmpzb24g4oCUIHRoZSBMTE0gbXVzdCBuZXZlciBrbm93IG9yIHJlcGVhdCBpdC4KICovCmNvbnN0IE5FVkVSX0VYUE9TRSA9IG5ldyBTZXQoWyJTQUZFX1dPUkQiLCAiUkVDT1ZFUllfUVVFU1RJT04iXSk7CmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0YW5jZVJlYWRhYmxlVmF1bHQoKSB7CiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModmF1bHRDYWNoZSkKICAgICAgICAuZmlsdGVyKChbbmFtZV0pID0+IChuYW1lLnN0YXJ0c1dpdGgoIkNPUkVfIikgfHwgbmFtZS5zdGFydHNXaXRoKCJEQVNIXyIpKSAmJiAhTkVWRVJfRVhQT1NFLmhhcyhuYW1lKSkKICAgICAgICAubWFwKChbbmFtZSwgZW50cnldKSA9PiAoeyBuYW1lLCB2YWx1ZTogZW50cnkudmFsdWUsIGxhYmVsOiBlbnRyeS5sYWJlbCB9KSk7Cn0KLyoqCiAqIFB1c2ggdmF1bHQgdmFsdWVzIGludG8gcHJvY2Vzcy5lbnYsIGZpbHRlcmVkIGJ5IHRoZSBpbnRlZ3JhdGlvbiBnYXRlLgogKiBEaXNhYmxlZCBpbnRlZ3JhdGlvbnMgaGF2ZSB0aGVpciBzZWNyZXRzIGFjdGl2ZWx5IHJlbW92ZWQgZnJvbSBwcm9jZXNzLmVudi4KICogQ2FsbGVkIGFmdGVyIGxvYWRWYXVsdCBzbyBjb25zdW1lciBtb2R1bGVzIChMTE0sIHNlYXJjaCkgcGljayB0aGVtIHVwLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVFbnYoKSB7CiAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXModmF1bHRDYWNoZSkpIHsKICAgICAgICBpZiAoc2hvdWxkSHlkcmF0ZUtleShuYW1lKSkgewogICAgICAgICAgICBwcm9jZXNzLmVudltuYW1lXSA9IGVudHJ5LnZhbHVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gQWN0aXZlbHkgcmVtb3ZlIGJsb2NrZWQga2V5cyDigJQgdGhleSBtYXkgaGF2ZSBiZWVuIHNldCBieSBhIHByaW9yIGh5ZHJhdGlvbgogICAgICAgICAgICBkZWxldGUgcHJvY2Vzcy5lbnZbbmFtZV07CiAgICAgICAgfQogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0b3JlLmpzLm1hcA==","vault/transfer.js":"LyoqCiAqIFZhdWx0IHBvcnRhYmxlIGV4cG9ydC9pbXBvcnQuCiAqCiAqIERQQVBJIHRpZXMgc2Vzc2lvbiBrZXlzIHRvIHRoZSBXaW5kb3dzIHVzZXIgcHJvZmlsZSwgbWFraW5nIHZhdWx0IHNlY3JldHMKICogbm9uLXBvcnRhYmxlLiBUaGlzIG1vZHVsZSBwcm92aWRlcyBwYXNzcGhyYXNlLWJhc2VkIGV4cG9ydC9pbXBvcnQgc28KICogc2VjcmV0cyBjYW4gbW92ZSBhY3Jvc3MgbWFjaGluZXMgYW5kIG9wZXJhdGluZyBzeXN0ZW1zLgogKgogKiBFeHBvcnQgZm9ybWF0OiBzZWxmLWRlc2NyaWJpbmcgSlNPTiBlbnZlbG9wZSAoLnZhdWx0KSB3aXRoIEFFUy0yNTYtR0NNCiAqIGVuY3J5cHRlZCBwYXlsb2FkLCBrZXkgZGVyaXZlZCB2aWEgUEJLREYyIGZyb20gYSBjYXNlLXNlbnNpdGl2ZSBwYXNzcGhyYXNlLgogKi8KaW1wb3J0IHsgcGJrZGYyU3luYywgcmFuZG9tQnl0ZXMsIGNyZWF0ZUhhc2ggfSBmcm9tICJub2RlOmNyeXB0byI7CmltcG9ydCB7IHdyaXRlRmlsZSwgcmVhZEZpbGUsIG1rZGlyIH0gZnJvbSAibm9kZTpmcy9wcm9taXNlcyI7CmltcG9ydCB7IGpvaW4gfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyBlbmNyeXB0LCBkZWNyeXB0IH0gZnJvbSAiLi4vYXV0aC9jcnlwdG8uanMiOwppbXBvcnQgeyBnZXRWYXVsdEVudHJpZXMsIHNldFZhdWx0S2V5IH0gZnJvbSAiLi9zdG9yZS5qcyI7CmltcG9ydCB7IHJlYWRCcmFpbkxpbmVzLCBhcHBlbmRCcmFpbkxpbmUgfSBmcm9tICIuLi9saWIvYnJhaW4taW8uanMiOwppbXBvcnQgeyBnZXRFbmNyeXB0aW9uS2V5IH0gZnJvbSAiLi4vbGliL2tleS1zdG9yZS5qcyI7CmltcG9ydCB7IGdldEluc3RhbmNlTmFtZSB9IGZyb20gIi4uL2luc3RhbmNlLmpzIjsKaW1wb3J0IHsgQlJBSU5fRElSIH0gZnJvbSAiLi4vbGliL3BhdGhzLmpzIjsKLy8g4pSA4pSAIENvbnN0YW50cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKY29uc3QgVkFVTFRfRElSID0gam9pbihCUkFJTl9ESVIsICJ2YXVsdCIpOwpjb25zdCBDUkVEX0ZJTEUgPSBqb2luKEJSQUlOX0RJUiwgInZhdWx0IiwgImNyZWRlbnRpYWxzLmVuYy5qc29ubCIpOwpjb25zdCBQRVJTT05BTF9GSUxFID0gam9pbihCUkFJTl9ESVIsICJ2YXVsdCIsICJwZXJzb25hbC5lbmMuanNvbmwiKTsKY29uc3QgRk9STUFUID0gImNvcmUtdmF1bHQtZXhwb3J0IjsKY29uc3QgVkVSU0lPTiA9IDE7CmNvbnN0IElURVJBVElPTlMgPSA2MDBfMDAwOwpjb25zdCBLRVlfTEVOR1RIID0gMzI7CmNvbnN0IFNBTFRfTEVOR1RIID0gMTY7Ci8vIOKUgOKUgCBLZXkgZGVyaXZhdGlvbiAoY2FzZS1zZW5zaXRpdmUsIHVubGlrZSBwYXNzd29yZCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIGRlcml2ZUV4cG9ydEtleShwYXNzcGhyYXNlLCBzYWx0KSB7CiAgICByZXR1cm4gcGJrZGYyU3luYyhwYXNzcGhyYXNlLCBzYWx0LCBJVEVSQVRJT05TLCBLRVlfTEVOR1RILCAic2hhMjU2Iik7Cn0KZnVuY3Rpb24gaGFzaEtleShrZXkpIHsKICAgIHJldHVybiBjcmVhdGVIYXNoKCJzaGEyNTYiKS51cGRhdGUoa2V5KS5kaWdlc3QoImhleCIpOwp9Ci8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKiogUmVhZCBKU09OTCBlbnRyaWVzLCBza2lwcGluZyBzY2hlbWEgaGVhZGVycy4gKi8KYXN5bmMgZnVuY3Rpb24gcmVhZEpzb25sRW50cmllcyhmaWxlUGF0aCkgewogICAgY29uc3QgbGluZXMgPSBhd2FpdCByZWFkQnJhaW5MaW5lcyhmaWxlUGF0aCk7CiAgICBjb25zdCBlbnRyaWVzID0gW107CiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxpbmUpOwogICAgICAgICAgICBpZiAob2JqLl9zY2hlbWEpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgZW50cmllcy5wdXNoKG9iaik7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgLy8gc2tpcCBtYWxmb3JtZWQKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZW50cmllczsKfQovKiogRGVkdXBsaWNhdGUgY3JlZGVudGlhbHMgYnkgaWQgKGxhc3Qgb2NjdXJyZW5jZSB3aW5zKSwgZmlsdGVyIGFjdGl2ZSBvbmx5LiAqLwpmdW5jdGlvbiBkZWR1cGxpY2F0ZUNyZWRlbnRpYWxzKGNyZWRzKSB7CiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IGMgb2YgY3JlZHMpIHsKICAgICAgICBpZiAoYy5pZCkKICAgICAgICAgICAgbWFwLnNldChjLmlkLCBjKTsKICAgIH0KICAgIHJldHVybiBBcnJheS5mcm9tKG1hcC52YWx1ZXMoKSkuZmlsdGVyKChjKSA9PiBjLnN0YXR1cyAhPT0gImFyY2hpdmVkIik7Cn0KLyoqIERlZHVwbGljYXRlIHBlcnNvbmFsIGZpZWxkcyBieSBmaWVsZCBuYW1lIChsYXN0IHdpbnMpLCBmaWx0ZXIgYWN0aXZlLiAqLwpmdW5jdGlvbiBkZWR1cGxpY2F0ZVBlcnNvbmFsKGVudHJpZXMpIHsKICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTsKICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7CiAgICAgICAgaWYgKGUuc3RhdHVzID09PSAiYXJjaGl2ZWQiKSB7CiAgICAgICAgICAgIG1hcC5kZWxldGUoZS5maWVsZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBtYXAuc2V0KGUuZmllbGQsIGUpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBBcnJheS5mcm9tKG1hcC52YWx1ZXMoKSk7Cn0KLy8g4pSA4pSAIEV4cG9ydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cG9ydFZhdWx0KHBhc3NwaHJhc2UsIG91dHB1dERpcikgewogICAgY29uc3Qgc2Vzc2lvbktleSA9IGdldEVuY3J5cHRpb25LZXkoKTsKICAgIGlmICghc2Vzc2lvbktleSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vdCBhdXRoZW50aWNhdGVkIOKAlCBzZXNzaW9uIGtleSBub3Qgc2V0Iik7CiAgICAvLyBDb2xsZWN0IHNlY3JldHMKICAgIGNvbnN0IHZhdWx0S2V5cyA9IGdldFZhdWx0RW50cmllcygpOwogICAgY29uc3QgcmF3Q3JlZGVudGlhbHMgPSBhd2FpdCByZWFkSnNvbmxFbnRyaWVzKENSRURfRklMRSk7CiAgICBjb25zdCBjcmVkZW50aWFscyA9IGRlZHVwbGljYXRlQ3JlZGVudGlhbHMocmF3Q3JlZGVudGlhbHMpOwogICAgY29uc3QgcmF3UGVyc29uYWwgPSBhd2FpdCByZWFkSnNvbmxFbnRyaWVzKFBFUlNPTkFMX0ZJTEUpOwogICAgY29uc3QgcGVyc29uYWxGaWVsZHMgPSBkZWR1cGxpY2F0ZVBlcnNvbmFsKHJhd1BlcnNvbmFsKTsKICAgIGNvbnN0IHBheWxvYWQgPSB7IHZhdWx0S2V5cywgY3JlZGVudGlhbHMsIHBlcnNvbmFsRmllbGRzIH07CiAgICAvLyBEZXJpdmUgZXhwb3J0IGtleSAoY2FzZS1zZW5zaXRpdmUpCiAgICBjb25zdCBzYWx0ID0gcmFuZG9tQnl0ZXMoU0FMVF9MRU5HVEgpOwogICAgY29uc3QgZXhwb3J0S2V5ID0gZGVyaXZlRXhwb3J0S2V5KHBhc3NwaHJhc2UsIHNhbHQpOwogICAgY29uc3Qga2V5SGFzaCA9IGhhc2hLZXkoZXhwb3J0S2V5KTsKICAgIC8vIEVuY3J5cHQKICAgIGNvbnN0IGVuY3J5cHRlZCA9IGVuY3J5cHQoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksIGV4cG9ydEtleSk7CiAgICBjb25zdCBlbnZlbG9wZSA9IHsKICAgICAgICBmb3JtYXQ6IEZPUk1BVCwKICAgICAgICB2ZXJzaW9uOiBWRVJTSU9OLAogICAgICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICBzb3VyY2VJbnN0YW5jZTogZ2V0SW5zdGFuY2VOYW1lKCksCiAgICAgICAgc2FsdDogc2FsdC50b1N0cmluZygiaGV4IiksCiAgICAgICAgaXRlcmF0aW9uczogSVRFUkFUSU9OUywKICAgICAgICBrZXlIYXNoLAogICAgICAgIHBheWxvYWQ6IGVuY3J5cHRlZCwKICAgIH07CiAgICAvLyBXcml0ZSBmaWxlCiAgICBjb25zdCBkaXIgPSBvdXRwdXREaXIgPz8gVkFVTFRfRElSOwogICAgYXdhaXQgbWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9bOi5dL2csICItIik7CiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZGlyLCBgZXhwb3J0LSR7dGltZXN0YW1wfS52YXVsdGApOwogICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShlbnZlbG9wZSwgbnVsbCwgMiksICJ1dGYtOCIpOwogICAgcmV0dXJuIHsKICAgICAgICBmaWxlUGF0aCwKICAgICAgICBzdGF0czogewogICAgICAgICAgICB2YXVsdEtleXM6IHZhdWx0S2V5cy5sZW5ndGgsCiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBjcmVkZW50aWFscy5sZW5ndGgsCiAgICAgICAgICAgIHBlcnNvbmFsRmllbGRzOiBwZXJzb25hbEZpZWxkcy5sZW5ndGgsCiAgICAgICAgfSwKICAgIH07Cn0KLy8g4pSA4pSAIFZlcmlmeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUV4cG9ydChmaWxlUGF0aCwgcGFzc3BocmFzZSkgewogICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGRlY3J5cHRFbnZlbG9wZShmaWxlUGF0aCwgcGFzc3BocmFzZSk7CiAgICByZXR1cm4gewogICAgICAgIG1lc3NhZ2U6ICJFeHBvcnQgdmVyaWZpZWQgc3VjY2Vzc2Z1bGx5IiwKICAgICAgICBzdGF0czogewogICAgICAgICAgICB2YXVsdEtleXM6IHBheWxvYWQudmF1bHRLZXlzLmxlbmd0aCwKICAgICAgICAgICAgY3JlZGVudGlhbHM6IHBheWxvYWQuY3JlZGVudGlhbHMubGVuZ3RoLAogICAgICAgICAgICBwZXJzb25hbEZpZWxkczogcGF5bG9hZC5wZXJzb25hbEZpZWxkcy5sZW5ndGgsCiAgICAgICAgfSwKICAgIH07Cn0KLy8g4pSA4pSAIEltcG9ydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFZhdWx0KGZpbGVQYXRoLCBwYXNzcGhyYXNlLCBzdHJhdGVneSA9ICJza2lwIiwgc2Vzc2lvbktleSkgewogICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGRlY3J5cHRFbnZlbG9wZShmaWxlUGF0aCwgcGFzc3BocmFzZSk7CiAgICBsZXQgc2tpcHBlZCA9IDA7CiAgICAvLyBJbXBvcnQgdmF1bHQga2V5cwogICAgY29uc3QgZXhpc3RpbmdLZXlzID0gbmV3IFNldChnZXRWYXVsdEVudHJpZXMoKS5tYXAoKGUpID0+IGUubmFtZSkpOwogICAgZm9yIChjb25zdCBlbnRyeSBvZiBwYXlsb2FkLnZhdWx0S2V5cykgewogICAgICAgIGlmIChleGlzdGluZ0tleXMuaGFzKGVudHJ5Lm5hbWUpKSB7CiAgICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gInNraXAiKSB7CiAgICAgICAgICAgICAgICBza2lwcGVkKys7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09ICJyZW5hbWUiKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZW5hbWVkID0gYCR7ZW50cnkubmFtZX1faW1wb3J0ZWRgOwogICAgICAgICAgICAgICAgYXdhaXQgc2V0VmF1bHRLZXkocmVuYW1lZCwgZW50cnkudmFsdWUsIHNlc3Npb25LZXksIGVudHJ5LmxhYmVsKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG92ZXJ3cml0ZSDigJQgZmFsbCB0aHJvdWdoCiAgICAgICAgfQogICAgICAgIGF3YWl0IHNldFZhdWx0S2V5KGVudHJ5Lm5hbWUsIGVudHJ5LnZhbHVlLCBzZXNzaW9uS2V5LCBlbnRyeS5sYWJlbCk7CiAgICB9CiAgICAvLyBJbXBvcnQgY3JlZGVudGlhbHMgKGFwcGVuZC1vbmx5IEpTT05MKQogICAgZm9yIChjb25zdCBjcmVkIG9mIHBheWxvYWQuY3JlZGVudGlhbHMpIHsKICAgICAgICBhd2FpdCBhcHBlbmRCcmFpbkxpbmUoQ1JFRF9GSUxFLCBKU09OLnN0cmluZ2lmeShjcmVkKSk7CiAgICB9CiAgICAvLyBJbXBvcnQgcGVyc29uYWwgZmllbGRzIChhcHBlbmQtb25seSBKU09OTCkKICAgIGZvciAoY29uc3QgZmllbGQgb2YgcGF5bG9hZC5wZXJzb25hbEZpZWxkcykgewogICAgICAgIGF3YWl0IGFwcGVuZEJyYWluTGluZShQRVJTT05BTF9GSUxFLCBKU09OLnN0cmluZ2lmeShmaWVsZCkpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBzdGF0czogewogICAgICAgICAgICB2YXVsdEtleXM6IHBheWxvYWQudmF1bHRLZXlzLmxlbmd0aCwKICAgICAgICAgICAgY3JlZGVudGlhbHM6IHBheWxvYWQuY3JlZGVudGlhbHMubGVuZ3RoLAogICAgICAgICAgICBwZXJzb25hbEZpZWxkczogcGF5bG9hZC5wZXJzb25hbEZpZWxkcy5sZW5ndGgsCiAgICAgICAgICAgIHNraXBwZWQsCiAgICAgICAgfSwKICAgIH07Cn0KLy8g4pSA4pSAIFNoYXJlZCBkZWNyeXB0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAphc3luYyBmdW5jdGlvbiBkZWNyeXB0RW52ZWxvcGUoZmlsZVBhdGgsIHBhc3NwaHJhc2UpIHsKICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoLCAidXRmLTgiKTsKICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShyYXcpOwogICAgaWYgKGVudmVsb3BlLmZvcm1hdCAhPT0gRk9STUFUKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGV4cG9ydCBmb3JtYXQ6ICR7ZW52ZWxvcGUuZm9ybWF0fWApOwogICAgfQogICAgaWYgKGVudmVsb3BlLnZlcnNpb24gIT09IFZFUlNJT04pIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGV4cG9ydCB2ZXJzaW9uOiAke2VudmVsb3BlLnZlcnNpb259YCk7CiAgICB9CiAgICBjb25zdCBzYWx0ID0gQnVmZmVyLmZyb20oZW52ZWxvcGUuc2FsdCwgImhleCIpOwogICAgY29uc3QgZXhwb3J0S2V5ID0gZGVyaXZlRXhwb3J0S2V5KHBhc3NwaHJhc2UsIHNhbHQpOwogICAgLy8gRmFzdCB3cm9uZy1wYXNzcGhyYXNlIGRldGVjdGlvbgogICAgaWYgKGhhc2hLZXkoZXhwb3J0S2V5KSAhPT0gZW52ZWxvcGUua2V5SGFzaCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiV3JvbmcgcGFzc3BocmFzZSIpOwogICAgfQogICAgY29uc3QgcGxhaW50ZXh0ID0gZGVjcnlwdChlbnZlbG9wZS5wYXlsb2FkLCBleHBvcnRLZXkpOwogICAgcmV0dXJuIEpTT04ucGFyc2UocGxhaW50ZXh0KTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD10cmFuc2Zlci5qcy5tYXA=","notifications/channel.js":"LyoqCiAqIEJhc2Ugbm90aWZpY2F0aW9uIGNoYW5uZWwgdHlwZXMgYW5kIHV0aWxpdGllcy4KICoKICogUmUtZXhwb3J0cyB0aGUgTm90aWZpY2F0aW9uQ2hhbm5lbCBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzCiAqIGEgY2hhbm5lbCByZWdpc3RyeSBmb3IgbWFuYWdpbmcgbXVsdGlwbGUgZGVsaXZlcnkgY2hhbm5lbHMuCiAqLwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoIm5vdGlmaWNhdGlvbnMiKTsKLyoqIFJlZ2lzdHJ5IHRoYXQgZGlzcGF0Y2hlcyBhbGVydHMgdG8gbXVsdGlwbGUgY2hhbm5lbHMuICovCmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25EaXNwYXRjaGVyIHsKICAgIGNoYW5uZWxzID0gbmV3IE1hcCgpOwogICAgLyoqIFJlZ2lzdGVyIGEgbm90aWZpY2F0aW9uIGNoYW5uZWwuICovCiAgICBhZGQoY2hhbm5lbCkgewogICAgICAgIHRoaXMuY2hhbm5lbHMuc2V0KGNoYW5uZWwubmFtZSwgY2hhbm5lbCk7CiAgICB9CiAgICAvKiogUmVtb3ZlIGEgY2hhbm5lbCBieSBuYW1lLiAqLwogICAgcmVtb3ZlKG5hbWUpIHsKICAgICAgICB0aGlzLmNoYW5uZWxzLmRlbGV0ZShuYW1lKTsKICAgIH0KICAgIC8qKiBHZXQgYSBjaGFubmVsIGJ5IG5hbWUuICovCiAgICBnZXQobmFtZSkgewogICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWxzLmdldChuYW1lKTsKICAgIH0KICAgIC8qKiBMaXN0IGFsbCByZWdpc3RlcmVkIGNoYW5uZWwgbmFtZXMuICovCiAgICBsaXN0KCkgewogICAgICAgIHJldHVybiBbLi4udGhpcy5jaGFubmVscy5rZXlzKCldOwogICAgfQogICAgLyoqIFNlbmQgYW4gYWxlcnQgdG8gYSBzcGVjaWZpYyBjaGFubmVsLiAqLwogICAgYXN5bmMgc2VuZFRvKGNoYW5uZWxOYW1lLCBhbGVydCkgewogICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChjaGFubmVsTmFtZSk7CiAgICAgICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmVuYWJsZWQpIHsKICAgICAgICAgICAgbG9nLndhcm4oImNoYW5uZWwgc2VuZCBza2lwcGVkIOKAlCBjaGFubmVsIG5vdCBmb3VuZCBvciBkaXNhYmxlZCIsIHsgY2hhbm5lbE5hbWUsIGFsZXJ0SWQ6IGFsZXJ0LmlkIH0pOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoYW5uZWwuc2VuZChhbGVydCk7CiAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJjaGFubmVsIHNlbmQgc3VjY2VlZGVkIiwgeyBjaGFubmVsTmFtZSwgYWxlcnRJZDogYWxlcnQuaWQsIHNldmVyaXR5OiBhbGVydC5zZXZlcml0eSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJjaGFubmVsIHNlbmQgcmV0dXJuZWQgZmFsc2UiLCB7IGNoYW5uZWxOYW1lLCBhbGVydElkOiBhbGVydC5pZCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGxvZy5lcnJvcigiY2hhbm5lbCBzZW5kIHRocmV3IGFuIGVycm9yIiwgeyBjaGFubmVsTmFtZSwgYWxlcnRJZDogYWxlcnQuaWQsIGVycm9yOiBTdHJpbmcoZXJyKSB9KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBTZW5kIGFuIGFsZXJ0IHRvIGFsbCBlbmFibGVkIGNoYW5uZWxzLiBSZXR1cm5zIG1hcCBvZiBjaGFubmVsIOKGkiBzdWNjZXNzLiAqLwogICAgYXN5bmMgYnJvYWRjYXN0KGFsZXJ0KSB7CiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHt9OwogICAgICAgIGNvbnN0IGVudHJpZXMgPSBbLi4udGhpcy5jaGFubmVscy5lbnRyaWVzKCldOwogICAgICAgIGxvZy5pbmZvKCJicm9hZGNhc3QgZGlzcGF0Y2hpbmcgYWxlcnQgdG8gY2hhbm5lbHMiLCB7CiAgICAgICAgICAgIGFsZXJ0SWQ6IGFsZXJ0LmlkLAogICAgICAgICAgICBzZXZlcml0eTogYWxlcnQuc2V2ZXJpdHksCiAgICAgICAgICAgIGNoYW5uZWxDb3VudDogZW50cmllcy5sZW5ndGgsCiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBlbnRyaWVzLm1hcChhc3luYyAoW25hbWUsIGNoYW5uZWxdKSA9PiB7CiAgICAgICAgICAgIGlmICghY2hhbm5lbC5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICBsb2cuZGVidWcoImJyb2FkY2FzdCBza2lwcGluZyBkaXNhYmxlZCBjaGFubmVsIiwgeyBjaGFubmVsOiBuYW1lLCBhbGVydElkOiBhbGVydC5pZCB9KTsKICAgICAgICAgICAgICAgIHJlc3VsdHNbbmFtZV0gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmVzdWx0c1tuYW1lXSA9IGF3YWl0IGNoYW5uZWwuc2VuZChhbGVydCk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0c1tuYW1lXSkgewogICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJicm9hZGNhc3QgY2hhbm5lbCBzZW5kIHN1Y2NlZWRlZCIsIHsgY2hhbm5lbDogbmFtZSwgYWxlcnRJZDogYWxlcnQuaWQgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiYnJvYWRjYXN0IGNoYW5uZWwgc2VuZCByZXR1cm5lZCBmYWxzZSIsIHsgY2hhbm5lbDogbmFtZSwgYWxlcnRJZDogYWxlcnQuaWQgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgbG9nLmVycm9yKCJicm9hZGNhc3QgY2hhbm5lbCBzZW5kIHRocmV3IGFuIGVycm9yIiwgeyBjaGFubmVsOiBuYW1lLCBhbGVydElkOiBhbGVydC5pZCwgZXJyb3I6IFN0cmluZyhlcnIpIH0pOwogICAgICAgICAgICAgICAgcmVzdWx0c1tuYW1lXSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKTsKICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0KfQovLyMgc291cmNlTWFwcGluZ1VSTD1jaGFubmVsLmpzLm1hcA==","notifications/email.js":"LyoqCiAqIEVtYWlsIG5vdGlmaWNhdGlvbiBjaGFubmVsLgogKgogKiBTZW5kcyBhbGVydCBub3RpZmljYXRpb25zIHZpYSBIVFRQIFBPU1QgdG8gYW4gZW1haWwgc2VydmljZSBlbmRwb2ludC4KICogRGVzaWduZWQgdG8gd29yayB3aXRoIFJlc2VuZCwgU2VuZEdyaWQsIG9yIGFueSBSRVNULWJhc2VkIGVtYWlsIEFQSS4KICovCmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigibm90aWZpY2F0aW9ucy5lbWFpbCIpOwpleHBvcnQgY2xhc3MgRW1haWxDaGFubmVsIHsKICAgIG5hbWUgPSAiZW1haWwiOwogICAgZW5hYmxlZDsKICAgIGNvbmZpZzsKICAgIGNvbnN0cnVjdG9yKGNvbmZpZykgewogICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwogICAgICAgIHRoaXMuZW5hYmxlZCA9IGNvbmZpZy5lbmFibGVkID8/IHRydWU7CiAgICB9CiAgICBhc3luYyBzZW5kKGFsZXJ0KSB7CiAgICAgICAgY29uc3Qgc3ViamVjdCA9IGBbJHthbGVydC5zZXZlcml0eS50b1VwcGVyQ2FzZSgpfV0gJHthbGVydC5tZXNzYWdlfWA7CiAgICAgICAgY29uc3QgYm9keSA9IGZvcm1hdEFsZXJ0RW1haWwoYWxlcnQpOwogICAgICAgIGxvZy5pbmZvKCJzZW5kaW5nIGVtYWlsIG5vdGlmaWNhdGlvbiIsIHsKICAgICAgICAgICAgYWxlcnRJZDogYWxlcnQuaWQsCiAgICAgICAgICAgIHNldmVyaXR5OiBhbGVydC5zZXZlcml0eSwKICAgICAgICAgICAgcmVjaXBpZW50czogdGhpcy5jb25maWcudG8ubGVuZ3RoLAogICAgICAgICAgICBzdWJqZWN0LAogICAgICAgIH0pOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHRoaXMuY29uZmlnLmVuZHBvaW50LCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5hcGlLZXl9YCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgZnJvbTogdGhpcy5jb25maWcuZnJvbSwKICAgICAgICAgICAgICAgICAgICB0bzogdGhpcy5jb25maWcudG8sCiAgICAgICAgICAgICAgICAgICAgc3ViamVjdCwKICAgICAgICAgICAgICAgICAgICBodG1sOiBib2R5LAogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzLm9rKSB7CiAgICAgICAgICAgICAgICBsb2cuaW5mbygiZW1haWwgc2VudCBzdWNjZXNzZnVsbHkiLCB7IGFsZXJ0SWQ6IGFsZXJ0LmlkLCBzdGF0dXM6IHJlcy5zdGF0dXMgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoImVtYWlsIEFQSSByZXR1cm5lZCBlcnJvciIsIHsgYWxlcnRJZDogYWxlcnQuaWQsIHN0YXR1czogcmVzLnN0YXR1cywgc3RhdHVzVGV4dDogcmVzLnN0YXR1c1RleHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlcy5vazsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICBsb2cuZXJyb3IoImVtYWlsIHNlbmQgZmFpbGVkIHdpdGggZXhjZXB0aW9uIiwgeyBhbGVydElkOiBhbGVydC5pZCwgZXJyb3I6IFN0cmluZyhlcnIpIH0pOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQp9CmZ1bmN0aW9uIGZvcm1hdEFsZXJ0RW1haWwoYWxlcnQpIHsKICAgIGNvbnN0IHN0YXRlQ29sb3IgPSBhbGVydC5zZXZlcml0eSA9PT0gImNyaXRpY2FsIiA/ICIjZGMyNjI2IiA6ICIjZjU5ZTBiIjsKICAgIHJldHVybiBgDQo8ZGl2IHN0eWxlPSJmb250LWZhbWlseTogc2Fucy1zZXJpZjsgbWF4LXdpZHRoOiA2MDBweDsgbWFyZ2luOiAwIGF1dG87Ij4NCiAgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogJHtzdGF0ZUNvbG9yfTsgY29sb3I6IHdoaXRlOyBwYWRkaW5nOiAxNnB4OyBib3JkZXItcmFkaXVzOiA4cHggOHB4IDAgMDsiPg0KICAgIDxoMiBzdHlsZT0ibWFyZ2luOiAwOyI+JHthbGVydC5zZXZlcml0eS50b1VwcGVyQ2FzZSgpfSBBbGVydDwvaDI+DQogIDwvZGl2Pg0KICA8ZGl2IHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCAjZTVlN2ViOyBib3JkZXItdG9wOiBub25lOyBwYWRkaW5nOiAxNnB4OyBib3JkZXItcmFkaXVzOiAwIDAgOHB4IDhweDsiPg0KICAgIDxwPjxzdHJvbmc+Q2hlY2s6PC9zdHJvbmc+ICR7YWxlcnQuY2hlY2tOYW1lfTwvcD4NCiAgICA8cD48c3Ryb25nPk1ldHJpYzo8L3N0cm9uZz4gJHthbGVydC5tZXRyaWN9PC9wPg0KICAgIDxwPjxzdHJvbmc+VmFsdWU6PC9zdHJvbmc+ICR7YWxlcnQudmFsdWV9ICh0aHJlc2hvbGQ6ICR7YWxlcnQudGhyZXNob2xkfSk8L3A+DQogICAgPHA+PHN0cm9uZz5NZXNzYWdlOjwvc3Ryb25nPiAke2FsZXJ0Lm1lc3NhZ2V9PC9wPg0KICAgIDxwPjxzdHJvbmc+U3RhdGU6PC9zdHJvbmc+ICR7YWxlcnQuc3RhdGV9PC9wPg0KICAgIDxwPjxzdHJvbmc+RmlyZWQgYXQ6PC9zdHJvbmc+ICR7YWxlcnQuZmlyZWRBdH08L3A+DQogICAgPHAgc3R5bGU9ImNvbG9yOiAjNmI3MjgwOyBmb250LXNpemU6IDEycHg7Ij5BbGVydCBJRDogJHthbGVydC5pZH08L3A+DQogIDwvZGl2Pg0KPC9kaXY+YC50cmltKCk7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW1haWwuanMubWFw","notifications/engine.js":"LyoqCiAqIFNtYXJ0IG5vdGlmaWNhdGlvbiBlbmdpbmUuCiAqCiAqIEV2YWx1YXRlcyBub3RpZmljYXRpb24gcnVsZXMgYWdhaW5zdCBldmVudCBjb250ZXh0LAogKiByZXNvbHZlcyBwcmlvcml0eSBhbmQgY2hhbm5lbHMsIGFuZCBkaXNwYXRjaGVzIHRocm91Z2gKICogcmVnaXN0ZXJlZCBzbWFydCBjaGFubmVscyB3aXRoIGNvb2xkb3duIHRyYWNraW5nLgogKi8KaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKaW1wb3J0IHsgUFJJT1JJVFlfT1JERVIgfSBmcm9tICIuL3R5cGVzLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJub3RpZmljYXRpb25zLmVuZ2luZSIpOwovLyDilIDilIDilIAgQ29uZGl0aW9uIGV2YWx1YXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKiBSZXNvbHZlIGEgZG90LXNlcGFyYXRlZCBmaWVsZCBwYXRoIGZyb20gYSBOb3RpZmljYXRpb25Db250ZXh0LiAqLwpmdW5jdGlvbiByZXNvbHZlRmllbGQoY3R4LCBmaWVsZCkgewogICAgY29uc3QgcGFydHMgPSBmaWVsZC5zcGxpdCgiLiIpOwogICAgbGV0IGN1cnJlbnQgPSBjdHg7CiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHsKICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsIHx8IHR5cGVvZiBjdXJyZW50ICE9PSAib2JqZWN0IikKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTsKICAgIH0KICAgIHJldHVybiBjdXJyZW50Owp9Ci8qKiBFdmFsdWF0ZSBhIHNpbmdsZSBjb25kaXRpb24gYWdhaW5zdCBhIGNvbnRleHQuICovCmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUNvbmRpdGlvbihjdHgsIGNvbmRpdGlvbikgewogICAgY29uc3QgYWN0dWFsID0gcmVzb2x2ZUZpZWxkKGN0eCwgY29uZGl0aW9uLmZpZWxkKTsKICAgIHN3aXRjaCAoY29uZGl0aW9uLm9wZXJhdG9yKSB7CiAgICAgICAgY2FzZSAiZXEiOgogICAgICAgICAgICByZXR1cm4gYWN0dWFsID09PSBjb25kaXRpb24udmFsdWU7CiAgICAgICAgY2FzZSAibmVxIjoKICAgICAgICAgICAgcmV0dXJuIGFjdHVhbCAhPT0gY29uZGl0aW9uLnZhbHVlOwogICAgICAgIGNhc2UgImluIjoKICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY29uZGl0aW9uLnZhbHVlKSAmJiBjb25kaXRpb24udmFsdWUuaW5jbHVkZXMoYWN0dWFsKTsKICAgICAgICBjYXNlICJub3RfaW4iOgogICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjb25kaXRpb24udmFsdWUpICYmICFjb25kaXRpb24udmFsdWUuaW5jbHVkZXMoYWN0dWFsKTsKICAgICAgICBjYXNlICJjb250YWlucyI6CiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFjdHVhbCkgJiYgYWN0dWFsLmluY2x1ZGVzKGNvbmRpdGlvbi52YWx1ZSk7CiAgICAgICAgY2FzZSAiZ3QiOgogICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gIm51bWJlciIgJiYgdHlwZW9mIGNvbmRpdGlvbi52YWx1ZSA9PT0gIm51bWJlciIgJiYgYWN0dWFsID4gY29uZGl0aW9uLnZhbHVlOwogICAgICAgIGNhc2UgImx0IjoKICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhY3R1YWwgPT09ICJudW1iZXIiICYmIHR5cGVvZiBjb25kaXRpb24udmFsdWUgPT09ICJudW1iZXIiICYmIGFjdHVhbCA8IGNvbmRpdGlvbi52YWx1ZTsKICAgICAgICBjYXNlICJleGlzdHMiOgogICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uLnZhbHVlID8gYWN0dWFsICE9PSB1bmRlZmluZWQgOiBhY3R1YWwgPT09IHVuZGVmaW5lZDsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0KLyoqIENoZWNrIGlmIGFsbCBjb25kaXRpb25zIG9mIGEgcnVsZSBtYXRjaCB0aGUgY29udGV4dC4gKi8KZXhwb3J0IGZ1bmN0aW9uIG1hdGNoUnVsZShjdHgsIHJ1bGUpIHsKICAgIGlmICghcnVsZS5lbmFibGVkKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBydWxlLmNvbmRpdGlvbnMuZXZlcnkoKGMpID0+IGV2YWx1YXRlQ29uZGl0aW9uKGN0eCwgYykpOwp9Ci8vIOKUgOKUgOKUgCBQcmlvcml0eSBkZXJpdmF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKiogRGVyaXZlIGEgZGVmYXVsdCBwcmlvcml0eSBmcm9tIGNvbnRleHQgd2hlbiBubyBydWxlIG92ZXJyaWRlcyBpdC4gKi8KZXhwb3J0IGZ1bmN0aW9uIGRlcml2ZVByaW9yaXR5KGN0eCkgewogICAgaWYgKGN0eC5nZWFyID09PSAiY3Jpc2lzIikKICAgICAgICByZXR1cm4gImNyaXRpY2FsIjsKICAgIGlmIChjdHgudGFncy5pbmNsdWRlcygiY3JpdGljYWwiKSkKICAgICAgICByZXR1cm4gImNyaXRpY2FsIjsKICAgIGlmIChjdHgudGFncy5pbmNsdWRlcygiaGlnaCIpKQogICAgICAgIHJldHVybiAiaGlnaCI7CiAgICBpZiAoY3R4LnRhZ3MuaW5jbHVkZXMoImxvdyIpKQogICAgICAgIHJldHVybiAibG93IjsKICAgIHJldHVybiAibm9ybWFsIjsKfQovLyDilIDilIDilIAgRW5naW5lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uRW5naW5lIHsKICAgIHJ1bGVzID0gW107CiAgICBjaGFubmVscyA9IG5ldyBNYXAoKTsKICAgIC8qKiBUcmFja3MgbGFzdCBzZW5kIHRpbWUgcGVyIGNvb2xkb3duIGtleSAocnVsZUlkOnNvdXJjZSkuICovCiAgICBjb29sZG93bnMgPSBuZXcgTWFwKCk7CiAgICAvKiogQWRkIG9yIHJlcGxhY2UgYSBydWxlLiAqLwogICAgYWRkUnVsZShydWxlKSB7CiAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5ydWxlcy5maW5kSW5kZXgoKHIpID0+IHIuaWQgPT09IHJ1bGUuaWQpOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgICB0aGlzLnJ1bGVzW2lkeF0gPSBydWxlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5ydWxlcy5wdXNoKHJ1bGUpOwogICAgICAgIH0KICAgICAgICAvLyBLZWVwIHNvcnRlZCBieSB3ZWlnaHQgZGVzY2VuZGluZyBzbyBoaWdoZXN0LXdlaWdodCBydWxlcyBldmFsdWF0ZSBmaXJzdC4KICAgICAgICB0aGlzLnJ1bGVzLnNvcnQoKGEsIGIpID0+IGIud2VpZ2h0IC0gYS53ZWlnaHQpOwogICAgfQogICAgLyoqIFJlbW92ZSBhIHJ1bGUgYnkgaWQuICovCiAgICByZW1vdmVSdWxlKGlkKSB7CiAgICAgICAgdGhpcy5ydWxlcyA9IHRoaXMucnVsZXMuZmlsdGVyKChyKSA9PiByLmlkICE9PSBpZCk7CiAgICB9CiAgICAvKiogR2V0IGFsbCByZWdpc3RlcmVkIHJ1bGVzLiAqLwogICAgZ2V0UnVsZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucnVsZXM7CiAgICB9CiAgICAvKiogUmVnaXN0ZXIgYSBzbWFydCBjaGFubmVsLiAqLwogICAgcmVnaXN0ZXJDaGFubmVsKGNoYW5uZWwpIHsKICAgICAgICB0aGlzLmNoYW5uZWxzLnNldChjaGFubmVsLm5hbWUsIGNoYW5uZWwpOwogICAgfQogICAgLyoqIFVucmVnaXN0ZXIgYSBjaGFubmVsIGJ5IG5hbWUuICovCiAgICB1bnJlZ2lzdGVyQ2hhbm5lbChuYW1lKSB7CiAgICAgICAgdGhpcy5jaGFubmVscy5kZWxldGUobmFtZSk7CiAgICB9CiAgICAvKiogRXZhbHVhdGUgYWxsIHJ1bGVzIGFnYWluc3QgYSBjb250ZXh0IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gKi8KICAgIGV2YWx1YXRlKGN0eCkgewogICAgICAgIGNvbnN0IG1hdGNoZWRSdWxlcyA9IFtdOwogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHRoaXMucnVsZXMpIHsKICAgICAgICAgICAgaWYgKCFtYXRjaFJ1bGUoY3R4LCBydWxlKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAvLyBDb29sZG93biBjaGVjawogICAgICAgICAgICBpZiAocnVsZS5hY3Rpb24uY29vbGRvd25TZWNvbmRzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBgJHtydWxlLmlkfToke2N0eC5zb3VyY2V9YDsKICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RTZW50ID0gdGhpcy5jb29sZG93bnMuZ2V0KGtleSk7CiAgICAgICAgICAgICAgICBpZiAobGFzdFNlbnQgJiYgbm93IC0gbGFzdFNlbnQgPCBydWxlLmFjdGlvbi5jb29sZG93blNlY29uZHMgKiAxMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJydWxlIHNraXBwZWQgYnkgY29vbGRvd24iLCB7IHJ1bGVJZDogcnVsZS5pZCwgc291cmNlOiBjdHguc291cmNlIH0pOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hdGNoZWRSdWxlcy5wdXNoKHJ1bGUpOwogICAgICAgICAgICBpZiAocnVsZS50ZXJtaW5hbCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLyBSZXNvbHZlIHByaW9yaXR5OiBoaWdoZXN0IGZyb20gbWF0Y2hlZCBydWxlcywgZmFsbGluZyBiYWNrIHRvIGNvbnRleHQtZGVyaXZlZAogICAgICAgIGxldCBwcmlvcml0eSA9IGRlcml2ZVByaW9yaXR5KGN0eCk7CiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIG1hdGNoZWRSdWxlcykgewogICAgICAgICAgICBpZiAocnVsZS5hY3Rpb24ucHJpb3JpdHkgJiYgUFJJT1JJVFlfT1JERVJbcnVsZS5hY3Rpb24ucHJpb3JpdHldID4gUFJJT1JJVFlfT1JERVJbcHJpb3JpdHldKSB7CiAgICAgICAgICAgICAgICBwcmlvcml0eSA9IHJ1bGUuYWN0aW9uLnByaW9yaXR5OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIENvbGxlY3QgY2hhbm5lbHMgZnJvbSBtYXRjaGVkIHJ1bGVzIChkZWR1cGxpY2F0ZWQpCiAgICAgICAgY29uc3QgY2hhbm5lbFNldCA9IG5ldyBTZXQoKTsKICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgbWF0Y2hlZFJ1bGVzKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgY2ggb2YgcnVsZS5hY3Rpb24uY2hhbm5lbHMpIHsKICAgICAgICAgICAgICAgIGNoYW5uZWxTZXQuYWRkKGNoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBjaGFubmVscyA9IFsuLi5jaGFubmVsU2V0XTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBjb250ZXh0OiBjdHgsCiAgICAgICAgICAgIG1hdGNoZWRSdWxlcywKICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgIGNoYW5uZWxzLAogICAgICAgICAgICBzaG91bGREZWxpdmVyOiBtYXRjaGVkUnVsZXMubGVuZ3RoID4gMCwKICAgICAgICB9OwogICAgfQogICAgLyoqIEV2YWx1YXRlIGFuZCBkaXNwYXRjaCBhIG5vdGlmaWNhdGlvbi4gUmV0dXJucyBwZXItY2hhbm5lbCBzdWNjZXNzIG1hcC4gKi8KICAgIGFzeW5jIGRpc3BhdGNoKGN0eCkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZXZhbHVhdGUoY3R4KTsKICAgICAgICBjb25zdCBvdXRjb21lcyA9IHt9OwogICAgICAgIGlmICghcmVzdWx0LnNob3VsZERlbGl2ZXIpIHsKICAgICAgICAgICAgbG9nLmRlYnVnKCJubyBydWxlcyBtYXRjaGVkLCBza2lwcGluZyBkaXNwYXRjaCIsIHsgc291cmNlOiBjdHguc291cmNlLCBldmVudFR5cGU6IGN0eC5ldmVudFR5cGUgfSk7CiAgICAgICAgICAgIHJldHVybiBvdXRjb21lczsKICAgICAgICB9CiAgICAgICAgbG9nLmluZm8oImRpc3BhdGNoaW5nIG5vdGlmaWNhdGlvbiIsIHsKICAgICAgICAgICAgbWF0Y2hlZFJ1bGVzOiByZXN1bHQubWF0Y2hlZFJ1bGVzLmxlbmd0aCwKICAgICAgICAgICAgcHJpb3JpdHk6IHJlc3VsdC5wcmlvcml0eSwKICAgICAgICAgICAgY2hhbm5lbHM6IHJlc3VsdC5jaGFubmVscywKICAgICAgICAgICAgZXZlbnRUeXBlOiBjdHguZXZlbnRUeXBlLAogICAgICAgIH0pOwogICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgLy8gVXBkYXRlIGNvb2xkb3ducyBmb3IgbWF0Y2hlZCBydWxlcwogICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiByZXN1bHQubWF0Y2hlZFJ1bGVzKSB7CiAgICAgICAgICAgIGlmIChydWxlLmFjdGlvbi5jb29sZG93blNlY29uZHMpIHsKICAgICAgICAgICAgICAgIHRoaXMuY29vbGRvd25zLnNldChgJHtydWxlLmlkfToke2N0eC5zb3VyY2V9YCwgbm93KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBEaXNwYXRjaCB0byBlYWNoIHJlc29sdmVkIGNoYW5uZWwKICAgICAgICBjb25zdCBzZW5kcyA9IHJlc3VsdC5jaGFubmVscy5tYXAoYXN5bmMgKGNoTmFtZSkgPT4gewogICAgICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoY2hOYW1lKTsKICAgICAgICAgICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJjaGFubmVsIHVuYXZhaWxhYmxlIG9yIGRpc2FibGVkIiwgeyBjaGFubmVsOiBjaE5hbWUgfSk7CiAgICAgICAgICAgICAgICBvdXRjb21lc1tjaE5hbWVdID0gZmFsc2U7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ2hlY2sgY2hhbm5lbCdzIG1pbmltdW0gcHJpb3JpdHkKICAgICAgICAgICAgaWYgKFBSSU9SSVRZX09SREVSW3Jlc3VsdC5wcmlvcml0eV0gPCBQUklPUklUWV9PUkRFUltjaGFubmVsLm1pblByaW9yaXR5XSkgewogICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJub3RpZmljYXRpb24gYmVsb3cgY2hhbm5lbCBtaW4gcHJpb3JpdHkiLCB7CiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogY2hOYW1lLAogICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiByZXN1bHQucHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgbWluUHJpb3JpdHk6IGNoYW5uZWwubWluUHJpb3JpdHksCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG91dGNvbWVzW2NoTmFtZV0gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgb3V0Y29tZXNbY2hOYW1lXSA9IGF3YWl0IGNoYW5uZWwuc2VuZChjdHgsIHJlc3VsdC5wcmlvcml0eSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgbG9nLmVycm9yKCJjaGFubmVsIHNlbmQgZmFpbGVkIiwgeyBjaGFubmVsOiBjaE5hbWUsIGVycm9yOiBTdHJpbmcoZXJyKSB9KTsKICAgICAgICAgICAgICAgIG91dGNvbWVzW2NoTmFtZV0gPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChzZW5kcyk7CiAgICAgICAgcmV0dXJuIG91dGNvbWVzOwogICAgfQogICAgLyoqIENsZWFyIGFsbCBjb29sZG93biBzdGF0ZSAodXNlZnVsIGZvciB0ZXN0aW5nKS4gKi8KICAgIGNsZWFyQ29vbGRvd25zKCkgewogICAgICAgIHRoaXMuY29vbGRvd25zLmNsZWFyKCk7CiAgICB9Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW5naW5lLmpzLm1hcA==","notifications/index.js":"LyoqCiAqIE5vdGlmaWNhdGlvbiBzeXN0ZW0g4oCUIGxlZ2FjeSBhbGVydCBjaGFubmVscyArIHNtYXJ0IHJ1bGUtYmFzZWQgZW5naW5lLgogKgogKiBUd28gbGF5ZXJzOgogKiAtIExlZ2FjeTogTm90aWZpY2F0aW9uRGlzcGF0Y2hlciBicm9hZGNhc3RzIEFsZXJ0IG9iamVjdHMgdG8gY2hhbm5lbHMKICogLSBTbWFydDogTm90aWZpY2F0aW9uRW5naW5lIGV2YWx1YXRlcyBydWxlcyBhZ2FpbnN0IGNvbnRleHQsIHJvdXRlcyB0byBTbWFydENoYW5uZWxzCiAqCiAqIExlZ2FjeUNoYW5uZWxBZGFwdGVyIGJyaWRnZXMgdGhlbSDigJQgZXhpc3RpbmcgZW1haWwvU01TL3dlYmhvb2sgY2hhbm5lbHMKICogd29yayB3aXRoIGJvdGggbGF5ZXJzIHdpdGhvdXQgcmV3cml0aW5nLgogKi8KLy8g4pSA4pSA4pSAIExlZ2FjeSBhbGVydC1iYXNlZCBkaXNwYXRjaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IHsgTm90aWZpY2F0aW9uRGlzcGF0Y2hlciB9IGZyb20gIi4vY2hhbm5lbC5qcyI7Ci8vIOKUgOKUgOKUgCBDb25jcmV0ZSBjaGFubmVscyAobGVnYWN5IGludGVyZmFjZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCB7IEVtYWlsQ2hhbm5lbCB9IGZyb20gIi4vZW1haWwuanMiOwpleHBvcnQgeyBTbXNDaGFubmVsIH0gZnJvbSAiLi9zbXMuanMiOwpleHBvcnQgeyBXZWJob29rQ2hhbm5lbCB9IGZyb20gIi4vd2ViaG9vay5qcyI7CmV4cG9ydCB7IFBob25lQ2hhbm5lbCB9IGZyb20gIi4vcGhvbmUuanMiOwovLyDilIDilIDilIAgU21hcnQgcnVsZS1iYXNlZCBlbmdpbmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCB7IE5vdGlmaWNhdGlvbkVuZ2luZSwgZXZhbHVhdGVDb25kaXRpb24sIG1hdGNoUnVsZSwgZGVyaXZlUHJpb3JpdHksIH0gZnJvbSAiLi9lbmdpbmUuanMiOwpleHBvcnQgeyBQUklPUklUWV9PUkRFUiB9IGZyb20gIi4vdHlwZXMuanMiOwovLyDilIDilIDilIAgU21hcnQgY2hhbm5lbCBhZGFwdGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IHsgTGVnYWN5Q2hhbm5lbEFkYXB0ZXIgfSBmcm9tICIuL2NoYW5uZWxzL2FkYXB0ZXIuanMiOwpleHBvcnQgeyBMb2dDaGFubmVsIH0gZnJvbSAiLi9jaGFubmVscy9sb2cuanMiOwovLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXA=","notifications/phone.js":"LyoqCiAqIFBob25lICh2b2ljZSBjYWxsKSBub3RpZmljYXRpb24gY2hhbm5lbC4KICoKICogUGxhY2VzIGEgVHdpbGlvIHZvaWNlIGNhbGwgZm9yIGNyaXRpY2FsIGFsZXJ0cyB1c2luZyB0aGUgZXhpc3RpbmcKICogbWFrZUNhbGwoKSBmdW5jdGlvbi4gRGVzaWduZWQgZm9yIGxhc3QtcmVzb3J0IGVzY2FsYXRpb24gb25seS4KICovCmltcG9ydCB7IGdldEluc3RhbmNlTmFtZSB9IGZyb20gIi4uL2luc3RhbmNlLmpzIjsKaW1wb3J0IHsgbWFrZUNhbGwgfSBmcm9tICIuLi90d2lsaW8vY2FsbC5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigibm90aWZpY2F0aW9ucy5waG9uZSIpOwpleHBvcnQgY2xhc3MgUGhvbmVDaGFubmVsIHsKICAgIG5hbWUgPSAicGhvbmUiOwogICAgZW5hYmxlZDsKICAgIGNvbnN0cnVjdG9yKG9wdHMpIHsKICAgICAgICB0aGlzLmVuYWJsZWQgPSBvcHRzPy5lbmFibGVkID8/IHRydWU7CiAgICB9CiAgICBhc3luYyBzZW5kKGFsZXJ0KSB7CiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGZvcm1hdEFsZXJ0Vm9pY2UoYWxlcnQpOwogICAgICAgIGxvZy5pbmZvKCJwbGFjaW5nIGNyaXRpY2FsIGFsZXJ0IHZvaWNlIGNhbGwiLCB7CiAgICAgICAgICAgIGFsZXJ0SWQ6IGFsZXJ0LmlkLAogICAgICAgICAgICBzZXZlcml0eTogYWxlcnQuc2V2ZXJpdHksCiAgICAgICAgICAgIGNoZWNrTmFtZTogYWxlcnQuY2hlY2tOYW1lLAogICAgICAgIH0pOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1ha2VDYWxsKHsgbWVzc2FnZSB9KTsKICAgICAgICBpZiAocmVzdWx0Lm9rKSB7CiAgICAgICAgICAgIGxvZy5pbmZvKCJ2b2ljZSBjYWxsIGluaXRpYXRlZCIsIHsgYWxlcnRJZDogYWxlcnQuaWQsIHNpZDogcmVzdWx0LnNpZCB9KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxvZy5lcnJvcigidm9pY2UgY2FsbCBmYWlsZWQiLCB7IGFsZXJ0SWQ6IGFsZXJ0LmlkLCBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQub2s7CiAgICB9Cn0KZnVuY3Rpb24gZm9ybWF0QWxlcnRWb2ljZShhbGVydCkgewogICAgLy8gUGFyc2UgZG9sbGFyIGFtb3VudHMgZnJvbSB0aGUgZGV0YWlsIHN0cmluZyBmb3IgcmljaGVyIHNwZWVjaAogICAgY29uc3QgcmVtYWluaW5nTWF0Y2ggPSBhbGVydC5tZXNzYWdlLm1hdGNoKC9cJChcZCtcLj9cZCopXHMrcmVtYWluaW5nLyk7CiAgICBjb25zdCByZW1haW5pbmcgPSByZW1haW5pbmdNYXRjaCA/IHJlbWFpbmluZ01hdGNoWzFdIDogbnVsbDsKICAgIGNvbnN0IHBhcnRzID0gWwogICAgICAgIGAke2dldEluc3RhbmNlTmFtZSgpfSBjcml0aWNhbCBhbGVydC5gLAogICAgICAgIGAke2FsZXJ0LmNoZWNrTmFtZS5yZXBsYWNlKC9fL2csICIgIil9IGF0ICR7YWxlcnQudmFsdWV9IHBlcmNlbnQgdXNlZC5gLAogICAgXTsKICAgIGlmIChyZW1haW5pbmcpIHsKICAgICAgICBwYXJ0cy5wdXNoKGBPbmx5ICQke3JlbWFpbmluZ30gcmVtYWluaW5nLmApOwogICAgfQogICAgcGFydHMucHVzaChgUGxlYXNlIHRha2UgYWN0aW9uIGltbWVkaWF0ZWx5LmApOwogICAgcmV0dXJuIHBhcnRzLmpvaW4oIiAiKTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1waG9uZS5qcy5tYXA=","notifications/sms.js":"LyoqCiAqIFNNUyBub3RpZmljYXRpb24gY2hhbm5lbC4KICoKICogU2VuZHMgYWxlcnQgbm90aWZpY2F0aW9ucyB2aWEgVHdpbGlvIFNNUyBBUEkuCiAqLwppbXBvcnQgeyBnZXRJbnN0YW5jZU5hbWUgfSBmcm9tICIuLi9pbnN0YW5jZS5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigibm90aWZpY2F0aW9ucy5zbXMiKTsKZXhwb3J0IGNsYXNzIFNtc0NoYW5uZWwgewogICAgbmFtZSA9ICJzbXMiOwogICAgZW5hYmxlZDsKICAgIGNvbmZpZzsKICAgIGNvbnN0cnVjdG9yKGNvbmZpZykgewogICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwogICAgICAgIHRoaXMuZW5hYmxlZCA9IGNvbmZpZy5lbmFibGVkID8/IHRydWU7CiAgICB9CiAgICBhc3luYyBzZW5kKGFsZXJ0KSB7CiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGZvcm1hdEFsZXJ0U21zKGFsZXJ0KTsKICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9hcGkudHdpbGlvLmNvbS8yMDEwLTA0LTAxL0FjY291bnRzLyR7dGhpcy5jb25maWcuYWNjb3VudFNpZH0vTWVzc2FnZXMuanNvbmA7CiAgICAgICAgY29uc3QgYXV0aCA9IEJ1ZmZlci5mcm9tKGAke3RoaXMuY29uZmlnLmFjY291bnRTaWR9OiR7dGhpcy5jb25maWcuYXV0aFRva2VufWApLnRvU3RyaW5nKCJiYXNlNjQiKTsKICAgICAgICBsb2cuaW5mbygic2VuZGluZyBTTVMgbm90aWZpY2F0aW9uIiwgewogICAgICAgICAgICBhbGVydElkOiBhbGVydC5pZCwKICAgICAgICAgICAgc2V2ZXJpdHk6IGFsZXJ0LnNldmVyaXR5LAogICAgICAgICAgICByZWNpcGllbnRDb3VudDogdGhpcy5jb25maWcudG8ubGVuZ3RoLAogICAgICAgIH0pOwogICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQodGhpcy5jb25maWcudG8ubWFwKGFzeW5jICh0bykgPT4gewogICAgICAgICAgICBsb2cuZGVidWcoInNlbmRpbmcgU01TIHRvIHJlY2lwaWVudCIsIHsgYWxlcnRJZDogYWxlcnQuaWQsIHRvIH0pOwogICAgICAgICAgICBjb25zdCBib2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7CiAgICAgICAgICAgICAgICBGcm9tOiB0aGlzLmNvbmZpZy5mcm9tLAogICAgICAgICAgICAgICAgVG86IHRvLAogICAgICAgICAgICAgICAgQm9keTogbWVzc2FnZSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgewogICAgICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7YXV0aH1gLAogICAgICAgICAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBib2R5OiBib2R5LnRvU3RyaW5nKCksCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzLm9rKSB7CiAgICAgICAgICAgICAgICBsb2cuaW5mbygiU01TIHNlbnQgc3VjY2Vzc2Z1bGx5IiwgeyBhbGVydElkOiBhbGVydC5pZCwgdG8gfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlR3aWxpbyBTTVMgQVBJIGVycm9yIiwgeyBhbGVydElkOiBhbGVydC5pZCwgdG8sIHN0YXR1czogcmVzLnN0YXR1cyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzLm9rOwogICAgICAgIH0pKTsKICAgICAgICBjb25zdCBhbnlTdWNjZXNzID0gcmVzdWx0cy5zb21lKChyKSA9PiByLnN0YXR1cyA9PT0gImZ1bGZpbGxlZCIgJiYgci52YWx1ZSA9PT0gdHJ1ZSk7CiAgICAgICAgaWYgKCFhbnlTdWNjZXNzKSB7CiAgICAgICAgICAgIGxvZy53YXJuKCJhbGwgU01TIHNlbmRzIGZhaWxlZCIsIHsgYWxlcnRJZDogYWxlcnQuaWQsIHJlY2lwaWVudENvdW50OiB0aGlzLmNvbmZpZy50by5sZW5ndGggfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbnlTdWNjZXNzOwogICAgfQp9CmZ1bmN0aW9uIGZvcm1hdEFsZXJ0U21zKGFsZXJ0KSB7CiAgICBjb25zdCBpY29uID0gYWxlcnQuc2V2ZXJpdHkgPT09ICJjcml0aWNhbCIgPyAi8J+aqCIgOiAi4pqg77iPIjsKICAgIHJldHVybiBbCiAgICAgICAgYCR7aWNvbn0gJHtnZXRJbnN0YW5jZU5hbWUoKX0gJHthbGVydC5zZXZlcml0eS50b1VwcGVyQ2FzZSgpfWAsCiAgICAgICAgYCR7YWxlcnQuY2hlY2tOYW1lfTogJHthbGVydC5tZXNzYWdlfWAsCiAgICAgICAgYFZhbHVlOiAke2FsZXJ0LnZhbHVlfSAobGltaXQ6ICR7YWxlcnQudGhyZXNob2xkfSlgLAogICAgICAgIGBBdDogJHthbGVydC5maXJlZEF0fWAsCiAgICBdLmpvaW4oIlxuIik7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9c21zLmpzLm1hcA==","notifications/types.js":"LyoqCiAqIFNtYXJ0IG5vdGlmaWNhdGlvbiBzeXN0ZW0gdHlwZXMuCiAqCiAqIERlZmluZXMgcnVsZS1iYXNlZCBub3RpZmljYXRpb24gcm91dGluZyB3aXRoIHByaW9yaXR5LAogKiBjb250ZXh0IGF3YXJlbmVzcywgYW5kIGNoYW5uZWwgcHJlZmVyZW5jZXMuCiAqLwovKiogUHJpb3JpdHkgb3JkZXJpbmcgZm9yIGNvbXBhcmlzb24uICovCmV4cG9ydCBjb25zdCBQUklPUklUWV9PUkRFUiA9IHsKICAgIGNyaXRpY2FsOiA0LAogICAgaGlnaDogMywKICAgIG5vcm1hbDogMiwKICAgIGxvdzogMSwKfTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFw","notifications/webhook.js":"LyoqCiAqIFdlYmhvb2sgbm90aWZpY2F0aW9uIGNoYW5uZWwuCiAqCiAqIFNlbmRzIGFsZXJ0IG5vdGlmaWNhdGlvbnMgYXMgSlNPTiBwYXlsb2FkcyB0byBjb25maWd1cmFibGUgSFRUUCBlbmRwb2ludHMuCiAqIENvbXBhdGlibGUgd2l0aCBTbGFjayBpbmNvbWluZyB3ZWJob29rcywgRGlzY29yZCB3ZWJob29rcywgb3IgY3VzdG9tIGVuZHBvaW50cy4KICovCmV4cG9ydCBjbGFzcyBXZWJob29rQ2hhbm5lbCB7CiAgICBuYW1lID0gIndlYmhvb2siOwogICAgZW5hYmxlZDsKICAgIGNvbmZpZzsKICAgIGNvbnN0cnVjdG9yKGNvbmZpZykgewogICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwogICAgICAgIHRoaXMuZW5hYmxlZCA9IGNvbmZpZy5lbmFibGVkID8/IHRydWU7CiAgICB9CiAgICBhc3luYyBzZW5kKGFsZXJ0KSB7CiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsKICAgICAgICAgICAgZXZlbnQ6ICJhbGVydCIsCiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBhbGVydDogewogICAgICAgICAgICAgICAgaWQ6IGFsZXJ0LmlkLAogICAgICAgICAgICAgICAgY2hlY2tOYW1lOiBhbGVydC5jaGVja05hbWUsCiAgICAgICAgICAgICAgICBtZXRyaWM6IGFsZXJ0Lm1ldHJpYywKICAgICAgICAgICAgICAgIHNldmVyaXR5OiBhbGVydC5zZXZlcml0eSwKICAgICAgICAgICAgICAgIHN0YXRlOiBhbGVydC5zdGF0ZSwKICAgICAgICAgICAgICAgIHZhbHVlOiBhbGVydC52YWx1ZSwKICAgICAgICAgICAgICAgIHRocmVzaG9sZDogYWxlcnQudGhyZXNob2xkLAogICAgICAgICAgICAgICAgbWVzc2FnZTogYWxlcnQubWVzc2FnZSwKICAgICAgICAgICAgICAgIGZpcmVkQXQ6IGFsZXJ0LmZpcmVkQXQsCiAgICAgICAgICAgICAgICBhY2tub3dsZWRnZWRBdDogYWxlcnQuYWNrbm93bGVkZ2VkQXQsCiAgICAgICAgICAgICAgICByZXNvbHZlZEF0OiBhbGVydC5yZXNvbHZlZEF0LAogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICAgICAgY29uc3QgaGVhZGVycyA9IHsKICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgLi4udGhpcy5jb25maWcuaGVhZGVycywKICAgICAgICB9OwogICAgICAgIGlmICh0aGlzLmNvbmZpZy5zZWNyZXQpIHsKICAgICAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgdGhpcy5zaWduKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTsKICAgICAgICAgICAgaGVhZGVyc1siWC1TaWduYXR1cmUtMjU2Il0gPSBzaWduYXR1cmU7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGhpcy5jb25maWcudGltZW91dE1zID8/IDEwXzAwMCk7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHRoaXMuY29uZmlnLnVybCwgewogICAgICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICAgICAgICBoZWFkZXJzLAogICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksCiAgICAgICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpOwogICAgICAgICAgICByZXR1cm4gcmVzLm9rOwogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBhc3luYyBzaWduKHBheWxvYWQpIHsKICAgICAgICBjb25zdCB7IGNyZWF0ZUhtYWMgfSA9IGF3YWl0IGltcG9ydCgibm9kZTpjcnlwdG8iKTsKICAgICAgICByZXR1cm4gKCJzaGEyNTY9IiArCiAgICAgICAgICAgIGNyZWF0ZUhtYWMoInNoYTI1NiIsIHRoaXMuY29uZmlnLnNlY3JldCkKICAgICAgICAgICAgICAgIC51cGRhdGUocGF5bG9hZCkKICAgICAgICAgICAgICAgIC5kaWdlc3QoImhleCIpKTsKICAgIH0KfQovLyMgc291cmNlTWFwcGluZ1VSTD13ZWJob29rLmpzLm1hcA==","notifications/channels/adapter.js":"LyoqCiAqIEFkYXB0ZXIgdGhhdCB3cmFwcyBsZWdhY3kgTm90aWZpY2F0aW9uQ2hhbm5lbCAoYWxlcnQtYmFzZWQpCiAqIGludG8gdGhlIFNtYXJ0Q2hhbm5lbCBpbnRlcmZhY2UgKGNvbnRleHQtYmFzZWQpLgogKgogKiBUaGlzIGFsbG93cyBleGlzdGluZyBlbWFpbCwgU01TLCBhbmQgd2ViaG9vayBjaGFubmVscyB0byB3b3JrCiAqIHdpdGggdGhlIHNtYXJ0IG5vdGlmaWNhdGlvbiBlbmdpbmUgd2l0aG91dCByZXdyaXRpbmcgdGhlbS4KICovCi8qKiBNYXAgc21hcnQgcHJpb3JpdHkgdG8gYWxlcnQgc2V2ZXJpdHkgZm9yIHRoZSBsZWdhY3kgaW50ZXJmYWNlLiAqLwpmdW5jdGlvbiBwcmlvcml0eVRvU2V2ZXJpdHkocHJpb3JpdHkpIHsKICAgIHJldHVybiBwcmlvcml0eSA9PT0gImNyaXRpY2FsIiB8fCBwcmlvcml0eSA9PT0gImhpZ2giID8gImNyaXRpY2FsIiA6ICJ3YXJuaW5nIjsKfQovKiogQnVpbGQgYSBtaW5pbWFsIEFsZXJ0IGZyb20gYSBOb3RpZmljYXRpb25Db250ZXh0IGZvciBsZWdhY3kgY2hhbm5lbHMuICovCmZ1bmN0aW9uIGNvbnRleHRUb0FsZXJ0KGN0eCwgcHJpb3JpdHkpIHsKICAgIGNvbnN0IHNldmVyaXR5ID0gcHJpb3JpdHlUb1NldmVyaXR5KHByaW9yaXR5KTsKICAgIHJldHVybiB7CiAgICAgICAgaWQ6IGBzbWFydC0ke2N0eC5zb3VyY2V9LSR7RGF0ZS5ub3coKX1gLAogICAgICAgIHRocmVzaG9sZElkOiBjdHguZXZlbnRUeXBlLAogICAgICAgIGNoZWNrTmFtZTogY3R4LnNvdXJjZSwKICAgICAgICBtZXRyaWM6IGN0eC5ldmVudFR5cGUsCiAgICAgICAgc2V2ZXJpdHksCiAgICAgICAgc3RhdGU6ICJmaXJpbmciLAogICAgICAgIHZhbHVlOiAwLAogICAgICAgIHRocmVzaG9sZDogMCwKICAgICAgICBtZXNzYWdlOiBjdHgucGF5bG9hZFsibWVzc2FnZSJdID8/IGBbJHtjdHguc291cmNlfV0gJHtjdHguZXZlbnRUeXBlfWAsCiAgICAgICAgZmlyZWRBdDogY3R4LnRpbWVzdGFtcCwKICAgIH07Cn0KLyoqCiAqIFdyYXBzIGEgbGVnYWN5IE5vdGlmaWNhdGlvbkNoYW5uZWwgYXMgYSBTbWFydENoYW5uZWwuCiAqCiAqIFVzYWdlOgogKiBgYGB0cwogKiBjb25zdCBsZWdhY3lFbWFpbCA9IG5ldyBFbWFpbENoYW5uZWwoY29uZmlnKTsKICogY29uc3Qgc21hcnRFbWFpbCA9IG5ldyBMZWdhY3lDaGFubmVsQWRhcHRlcihsZWdhY3lFbWFpbCwgIm5vcm1hbCIpOwogKiBlbmdpbmUucmVnaXN0ZXJDaGFubmVsKHNtYXJ0RW1haWwpOwogKiBgYGAKICovCmV4cG9ydCBjbGFzcyBMZWdhY3lDaGFubmVsQWRhcHRlciB7CiAgICBpbm5lcjsKICAgIG5hbWU7CiAgICBnZXQgZW5hYmxlZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbm5lci5lbmFibGVkOwogICAgfQogICAgbWluUHJpb3JpdHk7CiAgICBjb25zdHJ1Y3Rvcihpbm5lciwgbWluUHJpb3JpdHkgPSAibm9ybWFsIikgewogICAgICAgIHRoaXMuaW5uZXIgPSBpbm5lcjsKICAgICAgICB0aGlzLm5hbWUgPSBpbm5lci5uYW1lOwogICAgICAgIHRoaXMubWluUHJpb3JpdHkgPSBtaW5Qcmlvcml0eTsKICAgIH0KICAgIGFzeW5jIHNlbmQoY3R4LCBwcmlvcml0eSkgewogICAgICAgIGNvbnN0IGFsZXJ0ID0gY29udGV4dFRvQWxlcnQoY3R4LCBwcmlvcml0eSk7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXIuc2VuZChhbGVydCk7CiAgICB9Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWRhcHRlci5qcy5tYXA=","notifications/channels/index.js":"LyoqCiAqIFNtYXJ0IG5vdGlmaWNhdGlvbiBjaGFubmVsIGV4cG9ydHMuCiAqLwpleHBvcnQgeyBMZWdhY3lDaGFubmVsQWRhcHRlciB9IGZyb20gIi4vYWRhcHRlci5qcyI7CmV4cG9ydCB7IExvZ0NoYW5uZWwgfSBmcm9tICIuL2xvZy5qcyI7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcA==","notifications/channels/log.js":"LyoqCiAqIExvZyBjaGFubmVsIOKAlCB3cml0ZXMgbm90aWZpY2F0aW9ucyB0byB0aGUgc3RydWN0dXJlZCBsb2dnZXIuCiAqCiAqIFVzZWZ1bCBhcyBhIGRlZmF1bHQvZmFsbGJhY2sgY2hhbm5lbCwgZm9yIGRldmVsb3BtZW50LCBhbmQgZm9yCiAqIG1haW50YWluaW5nIGFuIGF1ZGl0IHRyYWlsIG9mIGFsbCBkaXNwYXRjaGVkIG5vdGlmaWNhdGlvbnMuCiAqLwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi8uLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoIm5vdGlmaWNhdGlvbnMubG9nLWNoYW5uZWwiKTsKZXhwb3J0IGNsYXNzIExvZ0NoYW5uZWwgewogICAgbmFtZSA9ICJsb2ciOwogICAgZW5hYmxlZCA9IHRydWU7CiAgICBtaW5Qcmlvcml0eTsKICAgIGNvbnN0cnVjdG9yKG1pblByaW9yaXR5ID0gImxvdyIpIHsKICAgICAgICB0aGlzLm1pblByaW9yaXR5ID0gbWluUHJpb3JpdHk7CiAgICB9CiAgICBhc3luYyBzZW5kKGN0eCwgcHJpb3JpdHkpIHsKICAgICAgICBsb2dnZXIuaW5mbygibm90aWZpY2F0aW9uIGRpc3BhdGNoZWQiLCB7CiAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICBzb3VyY2U6IGN0eC5zb3VyY2UsCiAgICAgICAgICAgIGV2ZW50VHlwZTogY3R4LmV2ZW50VHlwZSwKICAgICAgICAgICAgZ2VhcjogY3R4LmdlYXIsCiAgICAgICAgICAgIHRhZ3M6IGN0eC50YWdzLAogICAgICAgICAgICBhY3RvcjogY3R4LmFjdG9yLAogICAgICAgICAgICBtZXNzYWdlOiBjdHgucGF5bG9hZFsibWVzc2FnZSJdLAogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZy5qcy5tYXA=","channels/whatsapp.js":"LyoqCiAqIFdoYXRzQXBwIG1lc3NhZ2luZyBjbGllbnQgdmlhIFR3aWxpbyBBUEkuCiAqIFJhdyBmZXRjaCwgbm8gU0RLLiBGb2xsb3dzIHNyYy90d2lsaW8vY2FsbC50cyArIHNyYy9zbGFjay9jbGllbnQudHMgcGF0dGVybnMuCiAqCiAqIENyZWRlbnRpYWxzIHJlYWQgZnJvbSBwcm9jZXNzLmVudiAoaHlkcmF0ZWQgYnkgdmF1bHQpOgogKiAtIFRXSUxJT19BQ0NPVU5UX1NJRAogKiAtIFRXSUxJT19BVVRIX1RPS0VOCiAqIC0gVFdJTElPX1BIT05FX05VTUJFUiAoV2hhdHNBcHAtZW5hYmxlZCBzZW5kZXIpCiAqCiAqIE5ldmVyIHRocm93cyBpbiBwdWJsaWMgbWV0aG9kcyDigJQgcmV0dXJucyB7IG9rLCBkYXRhPywgZXJyb3I/IH0uCiAqLwppbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlLCBta2RpciB9IGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgeyBqb2luIH0gZnJvbSAibm9kZTpwYXRoIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwovLyDilIDilIAgQ29uc3RhbnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjb25zdCBSRVFVSVJFRF9WQVJTID0gWwogICAgIlRXSUxJT19BQ0NPVU5UX1NJRCIsCiAgICAiVFdJTElPX0FVVEhfVE9LRU4iLAogICAgIlRXSUxJT19QSE9ORV9OVU1CRVIiLApdOwpjb25zdCBISVNUT1JZX0RJUiA9ICJicmFpbi9jaGFubmVscy93aGF0c2FwcCI7CmNvbnN0IEhJU1RPUllfRklMRSA9ICJtZXNzYWdlcy5qc29ubCI7CmNvbnN0IENPTlRBQ1RTX0ZJTEUgPSAiY29udGFjdHMuanNvbiI7Ci8vIOKUgOKUgCBMYXp5IHNpbmdsZXRvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKbGV0IF9jbGllbnQgPSBudWxsOwpsZXQgX2xhc3RTaWQgPSAiIjsKLyoqCiAqIEdldCBvciBjcmVhdGUgdGhlIHNpbmdsZXRvbiBXaGF0c0FwcCBjbGllbnQuCiAqIFJldHVybnMgbnVsbCBpZiBUd2lsaW8gY3JlZGVudGlhbHMgYXJlIG5vdCBjb25maWd1cmVkLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGdldENsaWVudCgpIHsKICAgIGNvbnN0IHNpZCA9IHByb2Nlc3MuZW52LlRXSUxJT19BQ0NPVU5UX1NJRDsKICAgIGlmICghc2lkKQogICAgICAgIHJldHVybiBudWxsOwogICAgaWYgKHNpZCAhPT0gX2xhc3RTaWQpIHsKICAgICAgICBfY2xpZW50ID0gbmV3IFdoYXRzQXBwQ2xpZW50KCk7CiAgICAgICAgX2xhc3RTaWQgPSBzaWQ7CiAgICB9CiAgICByZXR1cm4gX2NsaWVudDsKfQovKioKICogQ2hlY2sgaWYgV2hhdHNBcHAgaXMgY29uZmlndXJlZCAoYWxsIHJlcXVpcmVkIHZhdWx0IGtleXMgcHJlc2VudCkuCiAqLwpleHBvcnQgZnVuY3Rpb24gaXNXaGF0c0FwcENvbmZpZ3VyZWQoKSB7CiAgICByZXR1cm4gUkVRVUlSRURfVkFSUy5ldmVyeSgodikgPT4gISFwcm9jZXNzLmVudlt2XSk7Cn0KLy8g4pSA4pSAIENsaWVudCBjbGFzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGNsYXNzIFdoYXRzQXBwQ2xpZW50IHsKICAgIGxhc3RFcnJvck1lc3NhZ2UgPSBudWxsOwogICAgZ2V0IGFjY291bnRTaWQoKSB7IHJldHVybiBwcm9jZXNzLmVudi5UV0lMSU9fQUNDT1VOVF9TSUQ7IH0KICAgIGdldCBhdXRoVG9rZW4oKSB7IHJldHVybiBwcm9jZXNzLmVudi5UV0lMSU9fQVVUSF9UT0tFTjsgfQogICAgZ2V0IGZyb21OdW1iZXIoKSB7IHJldHVybiBwcm9jZXNzLmVudi5UV0lMSU9fUEhPTkVfTlVNQkVSOyB9CiAgICBnZXQgYXV0aCgpIHsKICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYCR7dGhpcy5hY2NvdW50U2lkfToke3RoaXMuYXV0aFRva2VufWApLnRvU3RyaW5nKCJiYXNlNjQiKTsKICAgIH0KICAgIC8vIOKUgOKUgCBTZW5kIG1lc3NhZ2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvKioKICAgICAqIFNlbmQgYSBXaGF0c0FwcCBtZXNzYWdlIHZpYSBUd2lsaW8gQVBJLgogICAgICogUGhvbmUgbnVtYmVycyBtdXN0IGluY2x1ZGUgY291bnRyeSBjb2RlIChlLmcuLCArMTIzNDU2Nzg5MCkuCiAgICAgKi8KICAgIGFzeW5jIHNlbmRNZXNzYWdlKHRvLCBib2R5KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgbWlzc2luZyA9IFJFUVVJUkVEX1ZBUlMuZmlsdGVyKCh2KSA9PiAhcHJvY2Vzcy5lbnZbdl0pOwogICAgICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGBNaXNzaW5nIHZhdWx0IGtleXM6ICR7bWlzc2luZy5qb2luKCIsICIpfWAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9hcGkudHdpbGlvLmNvbS8yMDEwLTA0LTAxL0FjY291bnRzLyR7dGhpcy5hY2NvdW50U2lkfS9NZXNzYWdlcy5qc29uYDsKICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7CiAgICAgICAgICAgICAgICBGcm9tOiBgd2hhdHNhcHA6JHt0aGlzLmZyb21OdW1iZXJ9YCwKICAgICAgICAgICAgICAgIFRvOiBgd2hhdHNhcHA6JHt0b31gLAogICAgICAgICAgICAgICAgQm9keTogYm9keSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgewogICAgICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7dGhpcy5hdXRofWAsCiAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGJvZHk6IHBhcmFtcy50b1N0cmluZygpLAogICAgICAgICAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDE1XzAwMCksCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoIXJlcy5vaykgewogICAgICAgICAgICAgICAgY29uc3QgZXJyQm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7CiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFcnJvck1lc3NhZ2UgPSBgVHdpbGlvIGVycm9yICgke3Jlcy5zdGF0dXN9KTogJHtlcnJCb2R5fWA7CiAgICAgICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IHRoaXMubGFzdEVycm9yTWVzc2FnZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzLmpzb24oKSk7CiAgICAgICAgICAgIC8vIFN0b3JlIG91dGJvdW5kIG1lc3NhZ2UgaW4gaGlzdG9yeQogICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGVuZEhpc3RvcnkoewogICAgICAgICAgICAgICAgc2lkOiBkYXRhLnNpZCA/PyAiIiwKICAgICAgICAgICAgICAgIGZyb206IHRoaXMuZnJvbU51bWJlciwKICAgICAgICAgICAgICAgIHRvLAogICAgICAgICAgICAgICAgYm9keSwKICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogIm91dGJvdW5kIiwKICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gVXBkYXRlIGNvbnRhY3QKICAgICAgICAgICAgYXdhaXQgdGhpcy51cHNlcnRDb250YWN0KHsgcGhvbmU6IHRvLCBsYXN0TWVzc2FnZUF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSk7CiAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgIHNvdXJjZTogIndoYXRzYXBwIiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBXaGF0c0FwcCBzZW50IHRvICR7dG99OiAiJHtib2R5LnNsaWNlKDAsIDYwKX0iYCwKICAgICAgICAgICAgICAgIGRldGFpbDogYHNpZD0ke2RhdGEuc2lkfWAsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLmxhc3RFcnJvck1lc3NhZ2UgPSBudWxsOwogICAgICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgc2lkOiBkYXRhLnNpZCwgbWVzc2FnZTogYE1lc3NhZ2Ugc2VudCB0byAke3RvfWAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmxhc3RFcnJvck1lc3NhZ2UgPSBlcnIubWVzc2FnZTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgU2VuZCBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCB9OwogICAgICAgIH0KICAgIH0KICAgIC8vIOKUgOKUgCBDb250YWN0IG1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvKioKICAgICAqIExpc3QgYWxsIGtub3duIFdoYXRzQXBwIGNvbnRhY3RzLgogICAgICovCiAgICBhc3luYyBsaXN0Q29udGFjdHMoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKEhJU1RPUllfRElSLCBDT05UQUNUU19GSUxFKTsKICAgICAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICJ1dGYtOCIpOwogICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpOwogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEFkZCBvciB1cGRhdGUgYSBjb250YWN0LgogICAgICovCiAgICBhc3luYyB1cHNlcnRDb250YWN0KGNvbnRhY3QpIHsKICAgICAgICBjb25zdCBjb250YWN0cyA9IGF3YWl0IHRoaXMubGlzdENvbnRhY3RzKCk7CiAgICAgICAgY29uc3QgaWR4ID0gY29udGFjdHMuZmluZEluZGV4KChjKSA9PiBjLnBob25lID09PSBjb250YWN0LnBob25lKTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgICAgY29udGFjdHNbaWR4XSA9IHsgLi4uY29udGFjdHNbaWR4XSwgLi4uY29udGFjdCB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY29udGFjdHMucHVzaChjb250YWN0KTsKICAgICAgICB9CiAgICAgICAgYXdhaXQgbWtkaXIoSElTVE9SWV9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKEhJU1RPUllfRElSLCBDT05UQUNUU19GSUxFKSwgSlNPTi5zdHJpbmdpZnkoY29udGFjdHMsIG51bGwsIDIpKTsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlIGEgY29udGFjdCBieSBwaG9uZSBudW1iZXIuCiAgICAgKi8KICAgIGFzeW5jIHJlbW92ZUNvbnRhY3QocGhvbmUpIHsKICAgICAgICBjb25zdCBjb250YWN0cyA9IGF3YWl0IHRoaXMubGlzdENvbnRhY3RzKCk7CiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBjb250YWN0cy5maWx0ZXIoKGMpID0+IGMucGhvbmUgIT09IHBob25lKTsKICAgICAgICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSBjb250YWN0cy5sZW5ndGgpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBhd2FpdCBta2RpcihISVNUT1JZX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oSElTVE9SWV9ESVIsIENPTlRBQ1RTX0ZJTEUpLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJlZCwgbnVsbCwgMikpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLy8g4pSA4pSAIE1lc3NhZ2UgaGlzdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8qKgogICAgICogQXBwZW5kIGEgbWVzc2FnZSB0byB0aGUgSlNPTkwgaGlzdG9yeSBmaWxlLgogICAgICovCiAgICBhc3luYyBhcHBlbmRIaXN0b3J5KGVudHJ5KSB7CiAgICAgICAgYXdhaXQgbWtkaXIoSElTVE9SWV9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICAgIGNvbnN0IGxpbmUgPSBKU09OLnN0cmluZ2lmeShlbnRyeSkgKyAiXG4iOwogICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbihISVNUT1JZX0RJUiwgSElTVE9SWV9GSUxFKTsKICAgICAgICAvLyBBcHBlbmQtb25seSDigJQgbWF0Y2hlcyBicmFpbi9tZW1vcnkgSlNPTkwgcGF0dGVybgogICAgICAgIGNvbnN0IHsgYXBwZW5kRmlsZSB9ID0gYXdhaXQgaW1wb3J0KCJub2RlOmZzL3Byb21pc2VzIik7CiAgICAgICAgYXdhaXQgYXBwZW5kRmlsZShmaWxlUGF0aCwgbGluZSk7CiAgICB9CiAgICAvKioKICAgICAqIEdldCBtZXNzYWdlIGhpc3RvcnksIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgcGhvbmUgbnVtYmVyLgogICAgICogUmV0dXJucyBtb3N0IHJlY2VudCBtZXNzYWdlcyBmaXJzdC4KICAgICAqLwogICAgYXN5bmMgZ2V0SGlzdG9yeShvcHRzKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKEhJU1RPUllfRElSLCBISVNUT1JZX0ZJTEUpOwogICAgICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkRmlsZShmaWxlUGF0aCwgInV0Zi04Iik7CiAgICAgICAgICAgIGxldCBlbnRyaWVzID0gcmF3CiAgICAgICAgICAgICAgICAudHJpbSgpCiAgICAgICAgICAgICAgICAuc3BsaXQoIlxuIikKICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikKICAgICAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IEpTT04ucGFyc2UobGluZSkpOwogICAgICAgICAgICBpZiAob3B0cz8ucGhvbmUpIHsKICAgICAgICAgICAgICAgIGVudHJpZXMgPSBlbnRyaWVzLmZpbHRlcigoZSkgPT4gZS5mcm9tID09PSBvcHRzLnBob25lIHx8IGUudG8gPT09IG9wdHMucGhvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1vc3QgcmVjZW50IGZpcnN0CiAgICAgICAgICAgIGVudHJpZXMucmV2ZXJzZSgpOwogICAgICAgICAgICBpZiAob3B0cz8ubGltaXQgJiYgb3B0cy5saW1pdCA+IDApIHsKICAgICAgICAgICAgICAgIGVudHJpZXMgPSBlbnRyaWVzLnNsaWNlKDAsIG9wdHMubGltaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBlbnRyaWVzOwogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICB9CiAgICAvLyDilIDilIAgSGVhbHRoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgZ2V0SGVhbHRoKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGF2YWlsYWJsZTogaXNXaGF0c0FwcENvbmZpZ3VyZWQoKSwKICAgICAgICAgICAgbGFzdEVycm9yOiB0aGlzLmxhc3RFcnJvck1lc3NhZ2UsCiAgICAgICAgfTsKICAgIH0KfQovLyMgc291cmNlTWFwcGluZ1VSTD13aGF0c2FwcC5qcy5tYXA=","google/auth.js":"LyoqCiAqIEdvb2dsZSBPQXV0aDIgdG9rZW4gbWFuYWdlbWVudC4KICogUmF3IGZldGNoIOKAlCBubyBTREsuIENyZWRlbnRpYWxzIGZyb20gdmF1bHQgKHByb2Nlc3MuZW52KS4KICogRm9sbG93cyBzcmMvdHdpbGlvL2NhbGwudHMgcGF0dGVybjogbmV2ZXIgdGhyb3dzLCByZXR1cm5zIHsgb2ssIG1lc3NhZ2UgfS4KICoKICogU3RvcmVzIHJlZnJlc2ggdG9rZW4gaW4gdmF1bHQgYXMgR09PR0xFX1JFRlJFU0hfVE9LRU4uCiAqIEFjY2VzcyB0b2tlbnMgYXJlIGNhY2hlZCBpbiBtZW1vcnkgYW5kIGF1dG8tcmVmcmVzaGVkICh0aGV5IGV4cGlyZSBob3VybHkpLgogKi8KaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJnb29nbGUuYXV0aCIpOwpjb25zdCBHT09HTEVfQVVUSF9VUkwgPSAiaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL28vb2F1dGgyL3YyL2F1dGgiOwpjb25zdCBHT09HTEVfVE9LRU5fVVJMID0gImh0dHBzOi8vb2F1dGgyLmdvb2dsZWFwaXMuY29tL3Rva2VuIjsKLyoqIEFsbCBzY29wZXMgcmVxdWVzdGVkIHVwZnJvbnQgdG8gYXZvaWQgcmUtY29uc2VudC4gKi8KZXhwb3J0IGNvbnN0IEdPT0dMRV9TQ09QRVMgPSBbCiAgICAiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vYXV0aC9nbWFpbC5tb2RpZnkiLAogICAgImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvY2FsZW5kYXIuZXZlbnRzIiwKICAgICJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9hdXRoL2RyaXZlLmZpbGUiLAogICAgImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvdGFza3MiLApdOwpjb25zdCBSRVFVSVJFRF9WQVJTID0gWwogICAgIkdPT0dMRV9DTElFTlRfSUQiLAogICAgIkdPT0dMRV9DTElFTlRfU0VDUkVUIiwKXTsKLy8gLS0tIEluLW1lbW9yeSBhY2Nlc3MgdG9rZW4gY2FjaGUgLS0tCmxldCBjYWNoZWRBY2Nlc3NUb2tlbiA9IG51bGw7CmxldCB0b2tlbkV4cGlyZXNBdCA9IDA7IC8vIGVwb2NoIG1zCi8qKgogKiBDaGVjayBpZiBHb29nbGUgT0F1dGggaXMgY29uZmlndXJlZCAoY2xpZW50IElEICsgc2VjcmV0IGluIHZhdWx0KS4KICovCmV4cG9ydCBmdW5jdGlvbiBpc0dvb2dsZUNvbmZpZ3VyZWQoKSB7CiAgICByZXR1cm4gISFwcm9jZXNzLmVudi5HT09HTEVfQ0xJRU5UX0lEICYmICEhcHJvY2Vzcy5lbnYuR09PR0xFX0NMSUVOVF9TRUNSRVQ7Cn0KLyoqCiAqIENoZWNrIGlmIEdvb2dsZSBPQXV0aCBpcyBhdXRoZW50aWNhdGVkIChyZWZyZXNoIHRva2VuIGV4aXN0cykuCiAqIFdoZW4gZ29vZ2xlIGludGVncmF0aW9uIGlzIGRpc2FibGVkIHZpYSB0aGUgaW50ZWdyYXRpb24gZ2F0ZSwKICogR09PR0xFXyogZW52IHZhcnMgYXJlIG5ldmVyIGh5ZHJhdGVkIHNvIHRoaXMgbmF0dXJhbGx5IHJldHVybnMgZmFsc2UuCiAqLwpleHBvcnQgZnVuY3Rpb24gaXNHb29nbGVBdXRoZW50aWNhdGVkKCkgewogICAgcmV0dXJuIGlzR29vZ2xlQ29uZmlndXJlZCgpICYmICEhcHJvY2Vzcy5lbnYuR09PR0xFX1JFRlJFU0hfVE9LRU47Cn0KLyoqCiAqIEJ1aWxkIHRoZSBHb29nbGUgYXV0aG9yaXphdGlvbiBVUkwgZm9yIHRoZSBjb25zZW50IHNjcmVlbi4KICogUmVkaXJlY3RzIHRvIGxvY2FsaG9zdCBjYWxsYmFjayBhZnRlciB1c2VyIGFwcHJvdmVzLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGdldEF1dGhVcmwocmVkaXJlY3RVcmkpIHsKICAgIGNvbnN0IG1pc3NpbmcgPSBSRVFVSVJFRF9WQVJTLmZpbHRlcigodikgPT4gIXByb2Nlc3MuZW52W3ZdKTsKICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHsKICAgICAgICBsb2cud2FybigiT0F1dGggY29uZmlnIGluY29tcGxldGUg4oCUIG1pc3NpbmcgdmF1bHQga2V5cyIsIHsgbWlzc2luZyB9KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBvazogZmFsc2UsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBNaXNzaW5nIHZhdWx0IGtleXM6ICR7bWlzc2luZy5qb2luKCIsICIpfS4gQWRkIEdPT0dMRV9DTElFTlRfSUQgYW5kIEdPT0dMRV9DTElFTlRfU0VDUkVUIGluIHZhdWx0IHNldHRpbmdzLmAsCiAgICAgICAgfTsKICAgIH0KICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoewogICAgICAgIGNsaWVudF9pZDogcHJvY2Vzcy5lbnYuR09PR0xFX0NMSUVOVF9JRCwKICAgICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLAogICAgICAgIHJlc3BvbnNlX3R5cGU6ICJjb2RlIiwKICAgICAgICBzY29wZTogR09PR0xFX1NDT1BFUy5qb2luKCIgIiksCiAgICAgICAgYWNjZXNzX3R5cGU6ICJvZmZsaW5lIiwKICAgICAgICBwcm9tcHQ6ICJjb25zZW50IiwgLy8gRm9yY2UgY29uc2VudCB0byBhbHdheXMgZ2V0IHJlZnJlc2ggdG9rZW4KICAgIH0pOwogICAgbG9nLmRlYnVnKCJHZW5lcmF0ZWQgT0F1dGggYXV0aG9yaXphdGlvbiBVUkwiLCB7IHJlZGlyZWN0VXJpIH0pOwogICAgcmV0dXJuIHsKICAgICAgICBvazogdHJ1ZSwKICAgICAgICB1cmw6IGAke0dPT0dMRV9BVVRIX1VSTH0/JHtwYXJhbXMudG9TdHJpbmcoKX1gLAogICAgICAgIG1lc3NhZ2U6ICJBdXRob3JpemF0aW9uIFVSTCBnZW5lcmF0ZWQiLAogICAgfTsKfQovKioKICogRXhjaGFuZ2UgYW4gYXV0aG9yaXphdGlvbiBjb2RlIGZvciBhY2Nlc3MgKyByZWZyZXNoIHRva2Vucy4KICogUmV0dXJucyB0aGUgcmVmcmVzaCB0b2tlbiB0byBiZSBzdG9yZWQgaW4gdmF1bHQuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhjaGFuZ2VDb2RlKGNvZGUsIHJlZGlyZWN0VXJpKSB7CiAgICBjb25zdCBtaXNzaW5nID0gUkVRVUlSRURfVkFSUy5maWx0ZXIoKHYpID0+ICFwcm9jZXNzLmVudlt2XSk7CiAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgTWlzc2luZyB2YXVsdCBrZXlzOiAke21pc3Npbmcuam9pbigiLCAiKX1gIH07CiAgICB9CiAgICB0cnkgewogICAgICAgIGxvZy5kZWJ1ZygiRXhjaGFuZ2luZyBhdXRob3JpemF0aW9uIGNvZGUgZm9yIHRva2VucyIpOwogICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoewogICAgICAgICAgICBjb2RlLAogICAgICAgICAgICBjbGllbnRfaWQ6IHByb2Nlc3MuZW52LkdPT0dMRV9DTElFTlRfSUQsCiAgICAgICAgICAgIGNsaWVudF9zZWNyZXQ6IHByb2Nlc3MuZW52LkdPT0dMRV9DTElFTlRfU0VDUkVULAogICAgICAgICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLAogICAgICAgICAgICBncmFudF90eXBlOiAiYXV0aG9yaXphdGlvbl9jb2RlIiwKICAgICAgICB9KTsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChHT09HTEVfVE9LRU5fVVJMLCB7CiAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICBoZWFkZXJzOiB7ICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiB9LAogICAgICAgICAgICBib2R5OiBwYXJhbXMudG9TdHJpbmcoKSwKICAgICAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDE1XzAwMCksCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7CiAgICAgICAgICAgIGxvZy5lcnJvcigiVG9rZW4gZXhjaGFuZ2UgSFRUUCBlcnJvciIsIHsgc3RhdHVzOiByZXMuc3RhdHVzLCBib2R5IH0pOwogICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGBHb29nbGUgdG9rZW4gZXJyb3IgKCR7cmVzLnN0YXR1c30pOiAke2JvZHl9YCB9OwogICAgICAgIH0KICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpOwogICAgICAgIGlmICghZGF0YS5yZWZyZXNoX3Rva2VuKSB7CiAgICAgICAgICAgIGxvZy53YXJuKCJObyByZWZyZXNoIHRva2VuIGluIGV4Y2hhbmdlIHJlc3BvbnNlIOKAlCB1c2VyIG1heSBuZWVkIHRvIHJlLWNvbnNlbnQiKTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiAiTm8gcmVmcmVzaCB0b2tlbiByZXR1cm5lZCDigJQgdHJ5IHJldm9raW5nIGFwcCBhY2Nlc3MgaW4gR29vZ2xlIHNldHRpbmdzIGFuZCByZS1hdXRob3JpemluZyIgfTsKICAgICAgICB9CiAgICAgICAgLy8gQ2FjaGUgYWNjZXNzIHRva2VuCiAgICAgICAgY2FjaGVkQWNjZXNzVG9rZW4gPSBkYXRhLmFjY2Vzc190b2tlbiA/PyBudWxsOwogICAgICAgIHRva2VuRXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArICgoZGF0YS5leHBpcmVzX2luID8/IDM2MDApIC0gNjApICogMTAwMDsgLy8gNjBzIGJ1ZmZlcgogICAgICAgIGxvZy5pbmZvKCJPQXV0aCB0b2tlbnMgZXhjaGFuZ2VkIHN1Y2Nlc3NmdWxseSIsIHsgZXhwaXJlc0luOiBkYXRhLmV4cGlyZXNfaW4gfSk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgb2s6IHRydWUsCiAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogZGF0YS5yZWZyZXNoX3Rva2VuLAogICAgICAgICAgICBhY2Nlc3NUb2tlbjogZGF0YS5hY2Nlc3NfdG9rZW4sCiAgICAgICAgICAgIG1lc3NhZ2U6ICJUb2tlbnMgZXhjaGFuZ2VkIHN1Y2Nlc3NmdWxseSIsCiAgICAgICAgfTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cuZXJyb3IoIlRva2VuIGV4Y2hhbmdlIGZhaWxlZCIsIHsgZXJyb3I6IGVyci5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYFRva2VuIGV4Y2hhbmdlIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gIH07CiAgICB9Cn0KLyoqCiAqIEdldCBhIHZhbGlkIGFjY2VzcyB0b2tlbiwgYXV0by1yZWZyZXNoaW5nIGlmIGV4cGlyZWQuCiAqIE5ldmVyIHRocm93cyDigJQgcmV0dXJucyB7IG9rLCB0b2tlbj8sIG1lc3NhZ2UgfS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBY2Nlc3NUb2tlbigpIHsKICAgIC8vIFJldHVybiBjYWNoZWQgdG9rZW4gaWYgc3RpbGwgdmFsaWQKICAgIGlmIChjYWNoZWRBY2Nlc3NUb2tlbiAmJiBEYXRlLm5vdygpIDwgdG9rZW5FeHBpcmVzQXQpIHsKICAgICAgICBsb2cuZGVidWcoIlVzaW5nIGNhY2hlZCBhY2Nlc3MgdG9rZW4iLCB7IGV4cGlyZXNJbjogTWF0aC5yb3VuZCgodG9rZW5FeHBpcmVzQXQgLSBEYXRlLm5vdygpKSAvIDEwMDApIH0pOwogICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCB0b2tlbjogY2FjaGVkQWNjZXNzVG9rZW4sIG1lc3NhZ2U6ICJDYWNoZWQgdG9rZW4iIH07CiAgICB9CiAgICBjb25zdCByZWZyZXNoVG9rZW4gPSBwcm9jZXNzLmVudi5HT09HTEVfUkVGUkVTSF9UT0tFTjsKICAgIGlmICghcmVmcmVzaFRva2VuKSB7CiAgICAgICAgbG9nLndhcm4oIk5vIEdPT0dMRV9SRUZSRVNIX1RPS0VOIGluIHZhdWx0IOKAlCBub3QgYXV0aGVudGljYXRlZCIpOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogIk5vdCBhdXRoZW50aWNhdGVkIOKAlCBubyBHT09HTEVfUkVGUkVTSF9UT0tFTiBpbiB2YXVsdCIgfTsKICAgIH0KICAgIGNvbnN0IG1pc3NpbmcgPSBSRVFVSVJFRF9WQVJTLmZpbHRlcigodikgPT4gIXByb2Nlc3MuZW52W3ZdKTsKICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGBNaXNzaW5nIHZhdWx0IGtleXM6ICR7bWlzc2luZy5qb2luKCIsICIpfWAgfTsKICAgIH0KICAgIHRyeSB7CiAgICAgICAgbG9nLmRlYnVnKCJSZWZyZXNoaW5nIGFjY2VzcyB0b2tlbiIpOwogICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoewogICAgICAgICAgICBjbGllbnRfaWQ6IHByb2Nlc3MuZW52LkdPT0dMRV9DTElFTlRfSUQsCiAgICAgICAgICAgIGNsaWVudF9zZWNyZXQ6IHByb2Nlc3MuZW52LkdPT0dMRV9DTElFTlRfU0VDUkVULAogICAgICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4sCiAgICAgICAgICAgIGdyYW50X3R5cGU6ICJyZWZyZXNoX3Rva2VuIiwKICAgICAgICB9KTsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChHT09HTEVfVE9LRU5fVVJMLCB7CiAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICBoZWFkZXJzOiB7ICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiB9LAogICAgICAgICAgICBib2R5OiBwYXJhbXMudG9TdHJpbmcoKSwKICAgICAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDE1XzAwMCksCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7CiAgICAgICAgICAgIC8vIENsZWFyIGNhY2hlZCB0b2tlbiBvbiBhdXRoIGZhaWx1cmUKICAgICAgICAgICAgY2FjaGVkQWNjZXNzVG9rZW4gPSBudWxsOwogICAgICAgICAgICB0b2tlbkV4cGlyZXNBdCA9IDA7CiAgICAgICAgICAgIGxvZy5lcnJvcigiVG9rZW4gcmVmcmVzaCBIVFRQIGVycm9yIOKAlCBjYWNoZSBjbGVhcmVkIiwgeyBzdGF0dXM6IHJlcy5zdGF0dXMsIGJvZHkgfSk7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYFRva2VuIHJlZnJlc2ggZmFpbGVkICgke3Jlcy5zdGF0dXN9KTogJHtib2R5fWAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKTsKICAgICAgICBpZiAoIWRhdGEuYWNjZXNzX3Rva2VuKSB7CiAgICAgICAgICAgIGxvZy5lcnJvcigiTm8gYWNjZXNzIHRva2VuIGluIHJlZnJlc2ggcmVzcG9uc2UiKTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiAiTm8gYWNjZXNzIHRva2VuIGluIHJlZnJlc2ggcmVzcG9uc2UiIH07CiAgICAgICAgfQogICAgICAgIGNhY2hlZEFjY2Vzc1Rva2VuID0gZGF0YS5hY2Nlc3NfdG9rZW47CiAgICAgICAgdG9rZW5FeHBpcmVzQXQgPSBEYXRlLm5vdygpICsgKChkYXRhLmV4cGlyZXNfaW4gPz8gMzYwMCkgLSA2MCkgKiAxMDAwOwogICAgICAgIGxvZy5pbmZvKCJBY2Nlc3MgdG9rZW4gcmVmcmVzaGVkIHN1Y2Nlc3NmdWxseSIsIHsgZXhwaXJlc0luOiBkYXRhLmV4cGlyZXNfaW4gfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIHRva2VuOiBjYWNoZWRBY2Nlc3NUb2tlbiwgbWVzc2FnZTogIlRva2VuIHJlZnJlc2hlZCIgfTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cuZXJyb3IoIlRva2VuIHJlZnJlc2ggZmFpbGVkIiwgeyBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgVG9rZW4gcmVmcmVzaCBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCB9OwogICAgfQp9Ci8qKgogKiBNYWtlIGFuIGF1dGhlbnRpY2F0ZWQgR0VUIHJlcXVlc3QgdG8gYSBHb29nbGUgQVBJLgogKiBBdXRvLXJlZnJlc2hlcyB0b2tlbi4gUmV0dXJucyBwYXJzZWQgSlNPTiBvciBlcnJvci4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnb29nbGVHZXQodXJsLCBwYXJhbXMpIHsKICAgIGNvbnN0IGF1dGggPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpOwogICAgaWYgKCFhdXRoLm9rKQogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYXV0aC5tZXNzYWdlIH07CiAgICB0cnkgewogICAgICAgIGxldCBmdWxsVXJsID0gdXJsOwogICAgICAgIGlmIChwYXJhbXMpIHsKICAgICAgICAgICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7CiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbXMpKSB7CiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHZhbCkKICAgICAgICAgICAgICAgICAgICAgICAgcXMuYXBwZW5kKGtleSwgdik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBxcy5hcHBlbmQoa2V5LCB2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bGxVcmwgPSBgJHt1cmx9PyR7cXMudG9TdHJpbmcoKX1gOwogICAgICAgIH0KICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChmdWxsVXJsLCB7CiAgICAgICAgICAgIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F1dGgudG9rZW59YCB9LAogICAgICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTVfMDAwKSwKICAgICAgICB9KTsKICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAxKSB7CiAgICAgICAgICAgIC8vIFRva2VuIG1pZ2h0IGhhdmUgYmVlbiByZXZva2VkIOKAlCBjbGVhciBjYWNoZSBhbmQgcmV0cnkgb25jZQogICAgICAgICAgICBsb2cud2FybigiR0VUIHJlY2VpdmVkIDQwMSDigJQgY2xlYXJpbmcgdG9rZW4gY2FjaGUgYW5kIHJldHJ5aW5nIiwgeyB1cmwgfSk7CiAgICAgICAgICAgIGNhY2hlZEFjY2Vzc1Rva2VuID0gbnVsbDsKICAgICAgICAgICAgdG9rZW5FeHBpcmVzQXQgPSAwOwogICAgICAgICAgICBjb25zdCByZXRyeSA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7CiAgICAgICAgICAgIGlmICghcmV0cnkub2spCiAgICAgICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGBBdXRoIGZhaWxlZDogJHtyZXRyeS5tZXNzYWdlfWAgfTsKICAgICAgICAgICAgY29uc3QgcmV0cnlSZXMgPSBhd2FpdCBmZXRjaChmdWxsVXJsLCB7CiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtyZXRyeS50b2tlbn1gIH0sCiAgICAgICAgICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTVfMDAwKSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghcmV0cnlSZXMub2spIHsKICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXRyeVJlcy50ZXh0KCk7CiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkdFVCByZXRyeSBmYWlsZWQiLCB7IHVybCwgc3RhdHVzOiByZXRyeVJlcy5zdGF0dXMgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGBHb29nbGUgQVBJIGVycm9yICgke3JldHJ5UmVzLnN0YXR1c30pOiAke2JvZHl9YCB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiR0VUIHN1Y2NlZWRlZCBvbiByZXRyeSIsIHsgdXJsIH0pOwogICAgICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgZGF0YTogKGF3YWl0IHJldHJ5UmVzLmpzb24oKSksIG1lc3NhZ2U6ICJPSyAocmV0cnkpIiB9OwogICAgICAgIH0KICAgICAgICBpZiAoIXJlcy5vaykgewogICAgICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLnRleHQoKTsKICAgICAgICAgICAgbG9nLmVycm9yKCJHRVQgZmFpbGVkIiwgeyB1cmwsIHN0YXR1czogcmVzLnN0YXR1cyB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgR29vZ2xlIEFQSSBlcnJvciAoJHtyZXMuc3RhdHVzfSk6ICR7Ym9keX1gIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBkYXRhOiAoYXdhaXQgcmVzLmpzb24oKSksIG1lc3NhZ2U6ICJPSyIgfTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cuZXJyb3IoIkdFVCByZXF1ZXN0IGV4Y2VwdGlvbiIsIHsgdXJsLCBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgR29vZ2xlIEFQSSByZXF1ZXN0IGZhaWxlZDogJHtlcnIubWVzc2FnZX1gIH07CiAgICB9Cn0KLyoqCiAqIE1ha2UgYW4gYXV0aGVudGljYXRlZCBQT1NUIHJlcXVlc3QgdG8gYSBHb29nbGUgQVBJLgogKiBBdXRvLXJlZnJlc2hlcyB0b2tlbi4gUmV0dXJucyBwYXJzZWQgSlNPTiBvciBlcnJvci4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnb29nbGVQb3N0KHVybCwgYm9keSkgewogICAgY29uc3QgYXV0aCA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7CiAgICBpZiAoIWF1dGgub2spCiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBhdXRoLm1lc3NhZ2UgfTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7CiAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXV0aC50b2tlbn1gLAogICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgICAgICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxNV8wMDApLAogICAgICAgIH0pOwogICAgICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpOwogICAgICAgICAgICBsb2cuZXJyb3IoIlBPU1QgZmFpbGVkIiwgeyB1cmwsIHN0YXR1czogcmVzLnN0YXR1cyB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgR29vZ2xlIEFQSSBlcnJvciAoJHtyZXMuc3RhdHVzfSk6ICR7dGV4dH1gIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBkYXRhOiAoYXdhaXQgcmVzLmpzb24oKSksIG1lc3NhZ2U6ICJPSyIgfTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cuZXJyb3IoIlBPU1QgcmVxdWVzdCBleGNlcHRpb24iLCB7IHVybCwgZXJyb3I6IGVyci5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYEdvb2dsZSBBUEkgcmVxdWVzdCBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCB9OwogICAgfQp9Ci8qKgogKiBNYWtlIGFuIGF1dGhlbnRpY2F0ZWQgUEFUQ0ggcmVxdWVzdCB0byBhIEdvb2dsZSBBUEkuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ29vZ2xlUGF0Y2godXJsLCBib2R5KSB7CiAgICBjb25zdCBhdXRoID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTsKICAgIGlmICghYXV0aC5vaykKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGF1dGgubWVzc2FnZSB9OwogICAgdHJ5IHsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsKICAgICAgICAgICAgbWV0aG9kOiAiUEFUQ0giLAogICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXV0aC50b2tlbn1gLAogICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgICAgICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxNV8wMDApLAogICAgICAgIH0pOwogICAgICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpOwogICAgICAgICAgICBsb2cuZXJyb3IoIlBBVENIIGZhaWxlZCIsIHsgdXJsLCBzdGF0dXM6IHJlcy5zdGF0dXMgfSk7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYEdvb2dsZSBBUEkgZXJyb3IgKCR7cmVzLnN0YXR1c30pOiAke3RleHR9YCB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgZGF0YTogKGF3YWl0IHJlcy5qc29uKCkpLCBtZXNzYWdlOiAiT0siIH07CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgbG9nLmVycm9yKCJQQVRDSCByZXF1ZXN0IGV4Y2VwdGlvbiIsIHsgdXJsLCBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgR29vZ2xlIEFQSSByZXF1ZXN0IGZhaWxlZDogJHtlcnIubWVzc2FnZX1gIH07CiAgICB9Cn0KLyoqCiAqIE1ha2UgYW4gYXV0aGVudGljYXRlZCBERUxFVEUgcmVxdWVzdCB0byBhIEdvb2dsZSBBUEkuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ29vZ2xlRGVsZXRlKHVybCkgewogICAgY29uc3QgYXV0aCA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7CiAgICBpZiAoIWF1dGgub2spCiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBhdXRoLm1lc3NhZ2UgfTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7CiAgICAgICAgICAgIG1ldGhvZDogIkRFTEVURSIsCiAgICAgICAgICAgIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F1dGgudG9rZW59YCB9LAogICAgICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTVfMDAwKSwKICAgICAgICB9KTsKICAgICAgICBpZiAoIXJlcy5vaykgewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKTsKICAgICAgICAgICAgbG9nLmVycm9yKCJERUxFVEUgZmFpbGVkIiwgeyB1cmwsIHN0YXR1czogcmVzLnN0YXR1cyB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgR29vZ2xlIEFQSSBlcnJvciAoJHtyZXMuc3RhdHVzfSk6ICR7dGV4dH1gIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBtZXNzYWdlOiAiRGVsZXRlZCIgfTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cuZXJyb3IoIkRFTEVURSByZXF1ZXN0IGV4Y2VwdGlvbiIsIHsgdXJsLCBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgR29vZ2xlIEFQSSByZXF1ZXN0IGZhaWxlZDogJHtlcnIubWVzc2FnZX1gIH07CiAgICB9Cn0KLyoqCiAqIENsZWFyIHRoZSBjYWNoZWQgYWNjZXNzIHRva2VuIChlLmcuLCB3aGVuIHZhdWx0IGtleXMgY2hhbmdlKS4KICovCmV4cG9ydCBmdW5jdGlvbiBjbGVhclRva2VuQ2FjaGUoKSB7CiAgICBjYWNoZWRBY2Nlc3NUb2tlbiA9IG51bGw7CiAgICB0b2tlbkV4cGlyZXNBdCA9IDA7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXV0aC5qcy5tYXA=","google/calendar-timer.js":"LyoqCiAqIEJhY2tncm91bmQgY2FsZW5kYXIgcG9sbGluZyB0aW1lci4KICogQ2hlY2tzIGZvciB1cGNvbWluZyBldmVudHMgZXZlcnkgNSBtaW51dGVzIGZyb20gdGhlIGxvY2FsIENhbGVuZGFyU3RvcmUuCiAqIFdoZW4gYW4gZXZlbnQgaXMgPCAzMCBtaW4gYXdheSwgcHVzaGVzIGEgbm90aWZpY2F0aW9uLgogKiBBbHNvIHRyaWdnZXJzIEdvb2dsZSBzeW5jIG9uIGVhY2ggdGljayAoaWYgYXZhaWxhYmxlKS4KICogRm9sbG93cyBzcmMvZ29hbHMvdGltZXIudHMgcGF0dGVybjogbW9kdWxlLWxldmVsIHN0YXRlLCBpZGVtcG90ZW50IHN0YXJ0L3N0b3AuCiAqLwppbXBvcnQgeyBnZXRDYWxlbmRhclN0b3JlIH0gZnJvbSAiLi4vY2FsZW5kYXIvc3RvcmUuanMiOwppbXBvcnQgeyBnZXRHb29nbGVDYWxlbmRhckFkYXB0ZXIgfSBmcm9tICIuLi9jYWxlbmRhci9nb29nbGUtYWRhcHRlci5qcyI7CmltcG9ydCB7IHB1c2hOb3RpZmljYXRpb24gfSBmcm9tICIuLi9nb2Fscy9ub3RpZmljYXRpb25zLmpzIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImNhbGVuZGFyIik7CmNvbnN0IERFRkFVTFRfSU5URVJWQUxfTVMgPSA1ICogNjAgKiAxMDAwOyAvLyA1IG1pbnV0ZXMKY29uc3QgU09PTl9USFJFU0hPTERfTVMgPSAzMCAqIDYwICogMTAwMDsgLy8gMzAgbWludXRlcwpsZXQgdGltZXIgPSBudWxsOwpjb25zdCBub3RpZmllZEV2ZW50SWRzID0gbmV3IFNldCgpOyAvLyBBdm9pZCBkdXBsaWNhdGUgbm90aWZpY2F0aW9ucwovKioKICogU3RhcnQgdGhlIGNhbGVuZGFyIHBvbGxpbmcgdGltZXIuIElkZW1wb3RlbnQuCiAqLwpleHBvcnQgZnVuY3Rpb24gc3RhcnRDYWxlbmRhclRpbWVyKGludGVydmFsTXMpIHsKICAgIGlmICh0aW1lcikKICAgICAgICByZXR1cm47CiAgICBjb25zdCBpbnRlcnZhbCA9IGludGVydmFsTXMgPz8gREVGQVVMVF9JTlRFUlZBTF9NUzsKICAgIHRpbWVyID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IHN0b3JlID0gZ2V0Q2FsZW5kYXJTdG9yZSgpOwogICAgICAgIGlmICghc3RvcmUpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBTeW5jIGZyb20gR29vZ2xlIG9uIGVhY2ggdGljayAoaWYgYXZhaWxhYmxlKQogICAgICAgICAgICBjb25zdCBhZGFwdGVyID0gZ2V0R29vZ2xlQ2FsZW5kYXJBZGFwdGVyKCk7CiAgICAgICAgICAgIGlmIChhZGFwdGVyLmlzQXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgICAgIGFkYXB0ZXIuc3luYygpLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiQmFja2dyb3VuZCBHb29nbGUgQ2FsZW5kYXIgc3luYyBmYWlsZWQiLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDaGVjayB1cGNvbWluZyBldmVudHMgZnJvbSBsb2NhbCBzdG9yZQogICAgICAgICAgICBjb25zdCBldmVudHMgPSBhd2FpdCBzdG9yZS5nZXRVcGNvbWluZ0V2ZW50cygxKTsgLy8gTmV4dCBob3VyCiAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7CiAgICAgICAgICAgICAgICBpZiAobm90aWZpZWRFdmVudElkcy5oYXMoZXZlbnQuaWQpKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgY29uc3QgZXZlbnRTdGFydCA9IG5ldyBEYXRlKGV2ZW50LnN0YXJ0KS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICBjb25zdCBtaW5zQXdheSA9IE1hdGgucm91bmQoKGV2ZW50U3RhcnQgLSBub3cpIC8gNjBfMDAwKTsKICAgICAgICAgICAgICAgIGlmIChldmVudFN0YXJ0ID4gbm93ICYmIGV2ZW50U3RhcnQgLSBub3cgPD0gU09PTl9USFJFU0hPTERfTVMpIHsKICAgICAgICAgICAgICAgICAgICBub3RpZmllZEV2ZW50SWRzLmFkZChldmVudC5pZCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0ZW5kZWVTdHIgPSBldmVudC5hdHRlbmRlZXMubGVuZ3RoID4gMAogICAgICAgICAgICAgICAgICAgICAgICA/IGAgd2l0aCAke2V2ZW50LmF0dGVuZGVlcy5tYXAoKGEpID0+IGEubmFtZSA/PyBhLmVtYWlsKS5qb2luKCIsICIpfWAKICAgICAgICAgICAgICAgICAgICAgICAgOiAiIjsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgVXBjb21pbmcgaW4gJHttaW5zQXdheX0gbWluOiAke2V2ZW50LnRpdGxlfSR7YXR0ZW5kZWVTdHJ9YDsKICAgICAgICAgICAgICAgICAgICBwdXNoTm90aWZpY2F0aW9uKHsKICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogImNhbGVuZGFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbXNnLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAiY2FsZW5kYXIiLCBzdW1tYXJ5OiBtc2cgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ2xlYW4gdXAgb2xkIGV2ZW50IElEcyAoZXZlbnRzIHRoYXQgaGF2ZSBwYXNzZWQpCiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2Ygbm90aWZpZWRFdmVudElkcykgewogICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBldmVudHMuZmluZCgoZSkgPT4gZS5pZCA9PT0gaWQpOwogICAgICAgICAgICAgICAgaWYgKCFldmVudCB8fCBuZXcgRGF0ZShldmVudC5lbmQpLmdldFRpbWUoKSA8IG5vdykgewogICAgICAgICAgICAgICAgICAgIG5vdGlmaWVkRXZlbnRJZHMuZGVsZXRlKGlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJjYWxlbmRhciIsIHN1bW1hcnk6IGBQb2xsIGVycm9yOiAke21zZ31gIH0pOwogICAgICAgIH0KICAgIH0sIGludGVydmFsKTsKICAgIGNvbnN0IG1pbnMgPSBNYXRoLnJvdW5kKGludGVydmFsIC8gNjBfMDAwKTsKICAgIGxvZy5pbmZvKGBDYWxlbmRhciBwb2xsOiBldmVyeSAke21pbnN9IG1pbmApOwp9Ci8qKgogKiBTdG9wIHRoZSBjYWxlbmRhciBwb2xsaW5nIHRpbWVyLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHN0b3BDYWxlbmRhclRpbWVyKCkgewogICAgaWYgKHRpbWVyKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAgICAgdGltZXIgPSBudWxsOwogICAgfQogICAgbm90aWZpZWRFdmVudElkcy5jbGVhcigpOwp9Ci8qKgogKiBDaGVjayBpZiB0aGUgY2FsZW5kYXIgdGltZXIgaXMgcnVubmluZy4KICovCmV4cG9ydCBmdW5jdGlvbiBpc0NhbGVuZGFyVGltZXJSdW5uaW5nKCkgewogICAgcmV0dXJuIHRpbWVyICE9PSBudWxsOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhbGVuZGFyLXRpbWVyLmpzLm1hcA==","google/calendar.js":"LyoqCiAqIEdvb2dsZSBDYWxlbmRhciBBUEkgY2xpZW50LgogKiBSYXcgZmV0Y2ggdmlhIGdvb2dsZUdldC9nb29nbGVQb3N0L2dvb2dsZVBhdGNoIOKAlCBubyBTREsuCiAqIEFsbCBmdW5jdGlvbnMgcmV0dXJuIHsgb2ssIGRhdGE/LCBtZXNzYWdlIH0g4oCUIG5ldmVyIHRocm93LgogKi8KaW1wb3J0IHsgZ29vZ2xlR2V0LCBnb29nbGVQb3N0LCBnb29nbGVQYXRjaCwgZ29vZ2xlRGVsZXRlLCBpc0dvb2dsZUF1dGhlbnRpY2F0ZWQgfSBmcm9tICIuL2F1dGguanMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImdvb2dsZS5jYWxlbmRhciIpOwpjb25zdCBDQUxFTkRBUl9BUEkgPSAiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vY2FsZW5kYXIvdjMiOwovLyAtLS0gSGVscGVycyAtLS0KZnVuY3Rpb24gcGFyc2VFdmVudChlKSB7CiAgICByZXR1cm4gewogICAgICAgIGlkOiBlLmlkLAogICAgICAgIHN1bW1hcnk6IGUuc3VtbWFyeSA/PyAiKG5vIHRpdGxlKSIsCiAgICAgICAgZGVzY3JpcHRpb246IGUuZGVzY3JpcHRpb24sCiAgICAgICAgc3RhcnQ6IGUuc3RhcnQ/LmRhdGVUaW1lID8/IGUuc3RhcnQ/LmRhdGUgPz8gIiIsCiAgICAgICAgZW5kOiBlLmVuZD8uZGF0ZVRpbWUgPz8gZS5lbmQ/LmRhdGUgPz8gIiIsCiAgICAgICAgbG9jYXRpb246IGUubG9jYXRpb24sCiAgICAgICAgYXR0ZW5kZWVzOiAoZS5hdHRlbmRlZXMgPz8gW10pLm1hcCgoYSkgPT4gYS5kaXNwbGF5TmFtZSA/PyBhLmVtYWlsID8/ICJ1bmtub3duIiksCiAgICAgICAgaHRtbExpbms6IGUuaHRtbExpbmssCiAgICAgICAgc3RhdHVzOiBlLnN0YXR1cyA/PyAiY29uZmlybWVkIiwKICAgIH07Cn0KZnVuY3Rpb24gdG9JU09SYW5nZShob3VycykgewogICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTsKICAgIGNvbnN0IGxhdGVyID0gbmV3IERhdGUobm93LmdldFRpbWUoKSArIGhvdXJzICogNjAgKiA2MCAqIDEwMDApOwogICAgcmV0dXJuIHsKICAgICAgICB0aW1lTWluOiBub3cudG9JU09TdHJpbmcoKSwKICAgICAgICB0aW1lTWF4OiBsYXRlci50b0lTT1N0cmluZygpLAogICAgfTsKfQpmdW5jdGlvbiB0b2RheVJhbmdlKCkgewogICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTsKICAgIGNvbnN0IHN0YXJ0T2ZEYXkgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCksIG5vdy5nZXREYXRlKCkpOwogICAgY29uc3QgZW5kT2ZEYXkgPSBuZXcgRGF0ZShzdGFydE9mRGF5LmdldFRpbWUoKSArIDI0ICogNjAgKiA2MCAqIDEwMDApOwogICAgcmV0dXJuIHsKICAgICAgICB0aW1lTWluOiBzdGFydE9mRGF5LnRvSVNPU3RyaW5nKCksCiAgICAgICAgdGltZU1heDogZW5kT2ZEYXkudG9JU09TdHJpbmcoKSwKICAgIH07Cn0KLy8gLS0tIFB1YmxpYyBBUEkgLS0tCi8qKgogKiBDaGVjayBpZiBDYWxlbmRhciBpcyByZWFkeSAoR29vZ2xlIGF1dGhlbnRpY2F0ZWQpLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGlzQ2FsZW5kYXJBdmFpbGFibGUoKSB7CiAgICByZXR1cm4gaXNHb29nbGVBdXRoZW50aWNhdGVkKCk7Cn0KLyoqCiAqIEdldCB0b2RheSdzIGV2ZW50cyBmcm9tIHRoZSBwcmltYXJ5IGNhbGVuZGFyLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRvZGF5U2NoZWR1bGUoKSB7CiAgICBsb2cuZGVidWcoIkZldGNoaW5nIHRvZGF5J3Mgc2NoZWR1bGUiKTsKICAgIGNvbnN0IHJhbmdlID0gdG9kYXlSYW5nZSgpOwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ29vZ2xlR2V0KGAke0NBTEVOREFSX0FQSX0vY2FsZW5kYXJzL3ByaW1hcnkvZXZlbnRzYCwgewogICAgICAgIHRpbWVNaW46IHJhbmdlLnRpbWVNaW4sCiAgICAgICAgdGltZU1heDogcmFuZ2UudGltZU1heCwKICAgICAgICBzaW5nbGVFdmVudHM6ICJ0cnVlIiwKICAgICAgICBvcmRlckJ5OiAic3RhcnRUaW1lIiwKICAgICAgICBtYXhSZXN1bHRzOiAiNTAiLAogICAgfSk7CiAgICBpZiAoIXJlc3VsdC5vaykgewogICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIGZldGNoIHRvZGF5J3Mgc2NoZWR1bGUiLCB7IGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlIH07CiAgICB9CiAgICBjb25zdCBldmVudHMgPSAocmVzdWx0LmRhdGE/Lml0ZW1zID8/IFtdKQogICAgICAgIC5maWx0ZXIoKGUpID0+IGUuc3RhdHVzICE9PSAiY2FuY2VsbGVkIikKICAgICAgICAubWFwKHBhcnNlRXZlbnQpOwogICAgbG9nLmluZm8oIkZldGNoZWQgdG9kYXkncyBzY2hlZHVsZSIsIHsgY291bnQ6IGV2ZW50cy5sZW5ndGggfSk7CiAgICByZXR1cm4geyBvazogdHJ1ZSwgZXZlbnRzLCBtZXNzYWdlOiBgJHtldmVudHMubGVuZ3RofSBldmVudHMgdG9kYXlgIH07Cn0KLyoqCiAqIEdldCBldmVudHMgaW4gdGhlIG5leHQgTiBob3Vycy4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRVcGNvbWluZ0V2ZW50cyhob3VycyA9IDQpIHsKICAgIGxvZy5kZWJ1ZygiRmV0Y2hpbmcgdXBjb21pbmcgZXZlbnRzIiwgeyBob3VycyB9KTsKICAgIGNvbnN0IHJhbmdlID0gdG9JU09SYW5nZShob3Vycyk7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnb29nbGVHZXQoYCR7Q0FMRU5EQVJfQVBJfS9jYWxlbmRhcnMvcHJpbWFyeS9ldmVudHNgLCB7CiAgICAgICAgdGltZU1pbjogcmFuZ2UudGltZU1pbiwKICAgICAgICB0aW1lTWF4OiByYW5nZS50aW1lTWF4LAogICAgICAgIHNpbmdsZUV2ZW50czogInRydWUiLAogICAgICAgIG9yZGVyQnk6ICJzdGFydFRpbWUiLAogICAgICAgIG1heFJlc3VsdHM6ICIyMCIsCiAgICB9KTsKICAgIGlmICghcmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggdXBjb21pbmcgZXZlbnRzIiwgeyBob3VycywgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgfTsKICAgIH0KICAgIGNvbnN0IGV2ZW50cyA9IChyZXN1bHQuZGF0YT8uaXRlbXMgPz8gW10pCiAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5zdGF0dXMgIT09ICJjYW5jZWxsZWQiKQogICAgICAgIC5tYXAocGFyc2VFdmVudCk7CiAgICBsb2cuZGVidWcoIkZldGNoZWQgdXBjb21pbmcgZXZlbnRzIiwgeyBob3VycywgY291bnQ6IGV2ZW50cy5sZW5ndGggfSk7CiAgICByZXR1cm4geyBvazogdHJ1ZSwgZXZlbnRzLCBtZXNzYWdlOiBgJHtldmVudHMubGVuZ3RofSBldmVudHMgaW4gbmV4dCAke2hvdXJzfWhgIH07Cn0KLyoqCiAqIExpc3QgZXZlbnRzIHdpdGggZmxleGlibGUgZmlsdGVyaW5nLgogKiBAcGFyYW0gb3B0cy50aW1lTWluIC0gU3RhcnQgb2YgcmFuZ2UgKElTTyBzdHJpbmcpLiBEZWZhdWx0cyB0byBub3cuCiAqIEBwYXJhbSBvcHRzLnRpbWVNYXggLSBFbmQgb2YgcmFuZ2UgKElTTyBzdHJpbmcpLiBEZWZhdWx0cyB0byAyNGggZnJvbSB0aW1lTWluLgogKiBAcGFyYW0gb3B0cy5xdWVyeSAtIEZyZWUgdGV4dCBzZWFyY2ggKG1hdGNoZXMgc3VtbWFyeSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBhdHRlbmRlZXMpLgogKiBAcGFyYW0gb3B0cy5tYXhSZXN1bHRzIC0gTWF4aW11bSBldmVudHMgdG8gcmV0dXJuIChkZWZhdWx0IDUwKS4KICogQHBhcmFtIG9wdHMuc2hvd0RlbGV0ZWQgLSBJbmNsdWRlIGNhbmNlbGxlZCBldmVudHMgKGRlZmF1bHQgZmFsc2UpLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RFdmVudHMob3B0cykgewogICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTsKICAgIGNvbnN0IHBhcmFtcyA9IHsKICAgICAgICB0aW1lTWluOiBvcHRzPy50aW1lTWluID8/IG5vdy50b0lTT1N0cmluZygpLAogICAgICAgIHRpbWVNYXg6IG9wdHM/LnRpbWVNYXggPz8gbmV3IERhdGUobm93LmdldFRpbWUoKSArIDI0ICogNjAgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCksCiAgICAgICAgc2luZ2xlRXZlbnRzOiAidHJ1ZSIsCiAgICAgICAgb3JkZXJCeTogInN0YXJ0VGltZSIsCiAgICAgICAgbWF4UmVzdWx0czogU3RyaW5nKG9wdHM/Lm1heFJlc3VsdHMgPz8gNTApLAogICAgfTsKICAgIGlmIChvcHRzPy5xdWVyeSkKICAgICAgICBwYXJhbXMucSA9IG9wdHMucXVlcnk7CiAgICBpZiAob3B0cz8uc2hvd0RlbGV0ZWQpCiAgICAgICAgcGFyYW1zLnNob3dEZWxldGVkID0gInRydWUiOwogICAgbG9nLmRlYnVnKCJMaXN0aW5nIGV2ZW50cyIsIHsgdGltZU1pbjogcGFyYW1zLnRpbWVNaW4sIHRpbWVNYXg6IHBhcmFtcy50aW1lTWF4LCBxdWVyeTogb3B0cz8ucXVlcnkgfSk7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnb29nbGVHZXQoYCR7Q0FMRU5EQVJfQVBJfS9jYWxlbmRhcnMvcHJpbWFyeS9ldmVudHNgLCBwYXJhbXMpOwogICAgaWYgKCFyZXN1bHQub2spIHsKICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBsaXN0IGV2ZW50cyIsIHsgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgfTsKICAgIH0KICAgIGNvbnN0IGV2ZW50cyA9IChyZXN1bHQuZGF0YT8uaXRlbXMgPz8gW10pCiAgICAgICAgLmZpbHRlcigoZSkgPT4gb3B0cz8uc2hvd0RlbGV0ZWQgfHwgZS5zdGF0dXMgIT09ICJjYW5jZWxsZWQiKQogICAgICAgIC5tYXAocGFyc2VFdmVudCk7CiAgICBsb2cuZGVidWcoIkxpc3RlZCBldmVudHMiLCB7IGNvdW50OiBldmVudHMubGVuZ3RoIH0pOwogICAgcmV0dXJuIHsgb2s6IHRydWUsIGV2ZW50cywgbWVzc2FnZTogYCR7ZXZlbnRzLmxlbmd0aH0gZXZlbnRzYCB9Owp9Ci8qKgogKiBHZXQgZnJlZS9idXN5IHdpbmRvd3MgZm9yIGEgdGltZSByYW5nZS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRGcmVlQnVzeShzdGFydCwgZW5kKSB7CiAgICBsb2cuZGVidWcoIlF1ZXJ5aW5nIGZyZWUvYnVzeSIsIHsgc3RhcnQsIGVuZCB9KTsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdvb2dsZVBvc3QoYCR7Q0FMRU5EQVJfQVBJfS9mcmVlQnVzeWAsIHsKICAgICAgICB0aW1lTWluOiBzdGFydCwKICAgICAgICB0aW1lTWF4OiBlbmQsCiAgICAgICAgaXRlbXM6IFt7IGlkOiAicHJpbWFyeSIgfV0sCiAgICB9KTsKICAgIGlmICghcmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gcXVlcnkgZnJlZS9idXN5IiwgeyBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9OwogICAgfQogICAgY29uc3QgYnVzeSA9IHJlc3VsdC5kYXRhPy5jYWxlbmRhcnM/LnByaW1hcnk/LmJ1c3kgPz8gW107CiAgICBsb2cuZGVidWcoIkZyZWUvYnVzeSBxdWVyeSBjb21wbGV0ZSIsIHsgYnVzeUJsb2NrczogYnVzeS5sZW5ndGggfSk7CiAgICByZXR1cm4geyBvazogdHJ1ZSwgYnVzeSwgbWVzc2FnZTogYCR7YnVzeS5sZW5ndGh9IGJ1c3kgYmxvY2tzYCB9Owp9Ci8qKgogKiBDcmVhdGUgYSBuZXcgY2FsZW5kYXIgZXZlbnQuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRXZlbnQodGl0bGUsIHN0YXJ0LCBlbmQsIG9wdHMpIHsKICAgIGNvbnN0IGJvZHkgPSB7CiAgICAgICAgc3VtbWFyeTogdGl0bGUsCiAgICAgICAgc3RhcnQ6IHsgZGF0ZVRpbWU6IHN0YXJ0LCAuLi4ob3B0cz8udGltZVpvbmUgJiYgeyB0aW1lWm9uZTogb3B0cy50aW1lWm9uZSB9KSB9LAogICAgICAgIGVuZDogeyBkYXRlVGltZTogZW5kLCAuLi4ob3B0cz8udGltZVpvbmUgJiYgeyB0aW1lWm9uZTogb3B0cy50aW1lWm9uZSB9KSB9LAogICAgfTsKICAgIGlmIChvcHRzPy5kZXNjcmlwdGlvbikKICAgICAgICBib2R5LmRlc2NyaXB0aW9uID0gb3B0cy5kZXNjcmlwdGlvbjsKICAgIGlmIChvcHRzPy5sb2NhdGlvbikKICAgICAgICBib2R5LmxvY2F0aW9uID0gb3B0cy5sb2NhdGlvbjsKICAgIGlmIChvcHRzPy5hdHRlbmRlZXM/Lmxlbmd0aCkgewogICAgICAgIGJvZHkuYXR0ZW5kZWVzID0gb3B0cy5hdHRlbmRlZXMubWFwKChlbWFpbCkgPT4gKHsgZW1haWwgfSkpOwogICAgfQogICAgaWYgKG9wdHM/LnJlY3VycmVuY2U/Lmxlbmd0aCkKICAgICAgICBib2R5LnJlY3VycmVuY2UgPSBvcHRzLnJlY3VycmVuY2U7CiAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGNhbGVuZGFyIGV2ZW50IiwgeyB0aXRsZSwgc3RhcnQsIGVuZCB9KTsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdvb2dsZVBvc3QoYCR7Q0FMRU5EQVJfQVBJfS9jYWxlbmRhcnMvcHJpbWFyeS9ldmVudHNgLCBib2R5KTsKICAgIGlmICghcmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGNhbGVuZGFyIGV2ZW50IiwgeyB0aXRsZSwgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgfTsKICAgIH0KICAgIGxvZy5pbmZvKCJDYWxlbmRhciBldmVudCBjcmVhdGVkIiwgeyB0aXRsZSwgZXZlbnRJZDogcmVzdWx0LmRhdGEuaWQgfSk7CiAgICByZXR1cm4gewogICAgICAgIG9rOiB0cnVlLAogICAgICAgIGV2ZW50OiBwYXJzZUV2ZW50KHJlc3VsdC5kYXRhKSwKICAgICAgICBtZXNzYWdlOiBgRXZlbnQgY3JlYXRlZDogJHt0aXRsZX1gLAogICAgfTsKfQovKioKICogVXBkYXRlIGFuIGV4aXN0aW5nIGNhbGVuZGFyIGV2ZW50LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUV2ZW50KGV2ZW50SWQsIGNoYW5nZXMpIHsKICAgIGlmICghZXZlbnRJZCkKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6ICJldmVudElkIGlzIHJlcXVpcmVkIiB9OwogICAgY29uc3QgYm9keSA9IHt9OwogICAgaWYgKGNoYW5nZXMudGl0bGUgIT09IHVuZGVmaW5lZCkKICAgICAgICBib2R5LnN1bW1hcnkgPSBjaGFuZ2VzLnRpdGxlOwogICAgaWYgKGNoYW5nZXMuc3RhcnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGJvZHkuc3RhcnQgPSB7IGRhdGVUaW1lOiBjaGFuZ2VzLnN0YXJ0LCAuLi4oY2hhbmdlcy50aW1lWm9uZSAmJiB7IHRpbWVab25lOiBjaGFuZ2VzLnRpbWVab25lIH0pIH07CiAgICB9CiAgICBpZiAoY2hhbmdlcy5lbmQgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGJvZHkuZW5kID0geyBkYXRlVGltZTogY2hhbmdlcy5lbmQsIC4uLihjaGFuZ2VzLnRpbWVab25lICYmIHsgdGltZVpvbmU6IGNoYW5nZXMudGltZVpvbmUgfSkgfTsKICAgIH0KICAgIGlmIChjaGFuZ2VzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpCiAgICAgICAgYm9keS5kZXNjcmlwdGlvbiA9IGNoYW5nZXMuZGVzY3JpcHRpb247CiAgICBpZiAoY2hhbmdlcy5sb2NhdGlvbiAhPT0gdW5kZWZpbmVkKQogICAgICAgIGJvZHkubG9jYXRpb24gPSBjaGFuZ2VzLmxvY2F0aW9uOwogICAgaWYgKGNoYW5nZXMuYXR0ZW5kZWVzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBib2R5LmF0dGVuZGVlcyA9IGNoYW5nZXMuYXR0ZW5kZWVzLm1hcCgoZW1haWwpID0+ICh7IGVtYWlsIH0pKTsKICAgIH0KICAgIGlmIChjaGFuZ2VzLnJlY3VycmVuY2UgIT09IHVuZGVmaW5lZCkKICAgICAgICBib2R5LnJlY3VycmVuY2UgPSBjaGFuZ2VzLnJlY3VycmVuY2U7CiAgICBsb2cuZGVidWcoIlVwZGF0aW5nIGNhbGVuZGFyIGV2ZW50IiwgeyBldmVudElkLCBjaGFuZ2VzOiBPYmplY3Qua2V5cyhjaGFuZ2VzKSB9KTsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdvb2dsZVBhdGNoKGAke0NBTEVOREFSX0FQSX0vY2FsZW5kYXJzL3ByaW1hcnkvZXZlbnRzLyR7ZXZlbnRJZH1gLCBib2R5KTsKICAgIGlmICghcmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gdXBkYXRlIGNhbGVuZGFyIGV2ZW50IiwgeyBldmVudElkLCBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9OwogICAgfQogICAgbG9nLmluZm8oIkNhbGVuZGFyIGV2ZW50IHVwZGF0ZWQiLCB7IGV2ZW50SWQgfSk7CiAgICByZXR1cm4gewogICAgICAgIG9rOiB0cnVlLAogICAgICAgIGV2ZW50OiBwYXJzZUV2ZW50KHJlc3VsdC5kYXRhKSwKICAgICAgICBtZXNzYWdlOiBgRXZlbnQgdXBkYXRlZDogJHtldmVudElkfWAsCiAgICB9Owp9Ci8qKgogKiBEZWxldGUgYSBjYWxlbmRhciBldmVudC4KICogT3B0aW9uYWxseSBzZW5kIGNhbmNlbGxhdGlvbiBub3RpZmljYXRpb25zIHRvIGF0dGVuZGVlcy4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVFdmVudChldmVudElkLCBvcHRzKSB7CiAgICBpZiAoIWV2ZW50SWQpCiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiAiZXZlbnRJZCBpcyByZXF1aXJlZCIgfTsKICAgIGxvZy5kZWJ1ZygiRGVsZXRpbmcgY2FsZW5kYXIgZXZlbnQiLCB7IGV2ZW50SWQsIHNlbmRVcGRhdGVzOiBvcHRzPy5zZW5kVXBkYXRlcyB9KTsKICAgIGNvbnN0IHNlbmRVcGRhdGVzID0gb3B0cz8uc2VuZFVwZGF0ZXMgPz8gIm5vbmUiOwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ29vZ2xlRGVsZXRlKGAke0NBTEVOREFSX0FQSX0vY2FsZW5kYXJzL3ByaW1hcnkvZXZlbnRzLyR7ZXZlbnRJZH0/c2VuZFVwZGF0ZXM9JHtzZW5kVXBkYXRlc31gKTsKICAgIGlmICghcmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIGNhbGVuZGFyIGV2ZW50IiwgeyBldmVudElkLCBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9OwogICAgfQogICAgbG9nLmluZm8oIkNhbGVuZGFyIGV2ZW50IGRlbGV0ZWQiLCB7IGV2ZW50SWQgfSk7CiAgICByZXR1cm4geyBvazogdHJ1ZSwgbWVzc2FnZTogYEV2ZW50IGRlbGV0ZWQ6ICR7ZXZlbnRJZH1gIH07Cn0KLyoqCiAqIFNlYXJjaCBldmVudHMgYnkgdGV4dCBxdWVyeSBhY3Jvc3MgYSB3aWRlIHRpbWUgcmFuZ2UuCiAqIFNlYXJjaGVzIHN1bW1hcnksIGRlc2NyaXB0aW9uLCBsb2NhdGlvbiwgYW5kIGF0dGVuZGVlcy4KICogRGVmYXVsdHMgdG8gwrE2IG1vbnRocyBmcm9tIG5vdyBpZiBubyByYW5nZSBwcm92aWRlZC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWFyY2hFdmVudHMocXVlcnksIG9wdHMpIHsKICAgIGlmICghcXVlcnkpCiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiAicXVlcnkgaXMgcmVxdWlyZWQiIH07CiAgICBsb2cuZGVidWcoIlNlYXJjaGluZyBjYWxlbmRhciBldmVudHMiLCB7IHF1ZXJ5IH0pOwogICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTsKICAgIGNvbnN0IHNpeE1vbnRoc0FnbyA9IG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCBub3cuZ2V0TW9udGgoKSAtIDYsIG5vdy5nZXREYXRlKCkpOwogICAgY29uc3Qgc2l4TW9udGhzQWhlYWQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCkgKyA2LCBub3cuZ2V0RGF0ZSgpKTsKICAgIHJldHVybiBsaXN0RXZlbnRzKHsKICAgICAgICB0aW1lTWluOiBvcHRzPy50aW1lTWluID8/IHNpeE1vbnRoc0Fnby50b0lTT1N0cmluZygpLAogICAgICAgIHRpbWVNYXg6IG9wdHM/LnRpbWVNYXggPz8gc2l4TW9udGhzQWhlYWQudG9JU09TdHJpbmcoKSwKICAgICAgICBxdWVyeSwKICAgICAgICBtYXhSZXN1bHRzOiBvcHRzPy5tYXhSZXN1bHRzID8/IDI1LAogICAgfSk7Cn0KLyoqCiAqIEZvcm1hdCBldmVudHMgYXMgYSByZWFkYWJsZSB0ZXh0IGJsb2NrIGZvciBMTE0gY29udGV4dCBpbmplY3Rpb24uCiAqLwpleHBvcnQgZnVuY3Rpb24gZm9ybWF0RXZlbnRzRm9yQ29udGV4dChldmVudHMpIHsKICAgIGlmIChldmVudHMubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiAiTm8gZXZlbnRzLiI7CiAgICByZXR1cm4gZXZlbnRzCiAgICAgICAgLm1hcCgoZSkgPT4gewogICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGUuc3RhcnQuaW5jbHVkZXMoIlQiKQogICAgICAgICAgICA/IG5ldyBEYXRlKGUuc3RhcnQpLnRvTG9jYWxlVGltZVN0cmluZygiZW4tVVMiLCB7IGhvdXI6ICJudW1lcmljIiwgbWludXRlOiAiMi1kaWdpdCIgfSkKICAgICAgICAgICAgOiAiQWxsIGRheSI7CiAgICAgICAgY29uc3QgZW5kVGltZSA9IGUuZW5kLmluY2x1ZGVzKCJUIikKICAgICAgICAgICAgPyBuZXcgRGF0ZShlLmVuZCkudG9Mb2NhbGVUaW1lU3RyaW5nKCJlbi1VUyIsIHsgaG91cjogIm51bWVyaWMiLCBtaW51dGU6ICIyLWRpZ2l0IiB9KQogICAgICAgICAgICA6ICIiOwogICAgICAgIGNvbnN0IHRpbWVTdHIgPSBlbmRUaW1lID8gYCR7c3RhcnRUaW1lfeKAkyR7ZW5kVGltZX1gIDogc3RhcnRUaW1lOwogICAgICAgIGNvbnN0IGF0dGVuZGVlU3RyID0gZS5hdHRlbmRlZXMubGVuZ3RoID4gMCA/IGAgKHdpdGg6ICR7ZS5hdHRlbmRlZXMuam9pbigiLCAiKX0pYCA6ICIiOwogICAgICAgIGNvbnN0IGxvY2F0aW9uU3RyID0gZS5sb2NhdGlvbiA/IGAgQCAke2UubG9jYXRpb259YCA6ICIiOwogICAgICAgIHJldHVybiBgLSAke3RpbWVTdHJ9OiAke2Uuc3VtbWFyeX0ke2F0dGVuZGVlU3RyfSR7bG9jYXRpb25TdHJ9YDsKICAgIH0pCiAgICAgICAgLmpvaW4oIlxuIik7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2FsZW5kYXIuanMubWFw","google/docs.js":"LyoqCiAqIEdvb2dsZSBEb2NzICYgU2hlZXRzIGNsaWVudC4KICogUmF3IGZldGNoIHZpYSBnb29nbGVQb3N0L2dvb2dsZUdldCDigJQgbm8gU0RLLgogKiBGb2xsb3dzIHNhbWUgcGF0dGVybiBhcyBnbWFpbC50cyBhbmQgY2FsZW5kYXIudHMuCiAqCiAqIFVzZXMgZHJpdmUuZmlsZSBzY29wZSDigJQgY2FuIG9ubHkgYWNjZXNzIGZpbGVzIHRoaXMgYXBwIGNyZWF0ZXMuCiAqLwppbXBvcnQgeyBnb29nbGVQb3N0LCBnb29nbGVHZXQsIGlzR29vZ2xlQXV0aGVudGljYXRlZCB9IGZyb20gIi4vYXV0aC5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IGdldEluc3RhbmNlTmFtZSB9IGZyb20gIi4uL2luc3RhbmNlLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJnb29nbGUuZG9jcyIpOwpjb25zdCBET0NTX0FQSSA9ICJodHRwczovL2RvY3MuZ29vZ2xlYXBpcy5jb20vdjEvZG9jdW1lbnRzIjsKY29uc3QgU0hFRVRTX0FQSSA9ICJodHRwczovL3NoZWV0cy5nb29nbGVhcGlzLmNvbS92NC9zcHJlYWRzaGVldHMiOwovKioKICogQ2hlY2sgaWYgRG9jcy9TaGVldHMgY3JlYXRpb24gaXMgYXZhaWxhYmxlLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGlzRG9jc0F2YWlsYWJsZSgpIHsKICAgIHJldHVybiBpc0dvb2dsZUF1dGhlbnRpY2F0ZWQoKTsKfQovKioKICogQ3JlYXRlIGEgbmV3IEdvb2dsZSBEb2Mgd2l0aCB0aGUgZ2l2ZW4gdGl0bGUuCiAqIFJldHVybnMgdGhlIGRvY3VtZW50IElEIGFuZCBVUkwuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRG9jdW1lbnQodGl0bGUpIHsKICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgR29vZ2xlIERvYyIsIHsgdGl0bGUgfSk7CiAgICBjb25zdCByZXMgPSBhd2FpdCBnb29nbGVQb3N0KERPQ1NfQVBJLCB7IHRpdGxlIH0pOwogICAgaWYgKCFyZXMub2sgfHwgIXJlcy5kYXRhKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIEdvb2dsZSBEb2MiLCB7IHRpdGxlLCBlcnJvcjogcmVzLm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXMubWVzc2FnZSB9OwogICAgfQogICAgbG9nLmluZm8oIkdvb2dsZSBEb2MgY3JlYXRlZCIsIHsgdGl0bGUsIGRvY3VtZW50SWQ6IHJlcy5kYXRhLmRvY3VtZW50SWQgfSk7CiAgICByZXR1cm4gewogICAgICAgIG9rOiB0cnVlLAogICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgZG9jdW1lbnRJZDogcmVzLmRhdGEuZG9jdW1lbnRJZCwKICAgICAgICAgICAgdGl0bGU6IHJlcy5kYXRhLnRpdGxlLAogICAgICAgICAgICBkb2N1bWVudFVybDogYGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvJHtyZXMuZGF0YS5kb2N1bWVudElkfS9lZGl0YCwKICAgICAgICB9LAogICAgICAgIG1lc3NhZ2U6ICJEb2N1bWVudCBjcmVhdGVkIiwKICAgIH07Cn0KLyoqCiAqIEJhdGNoLXVwZGF0ZSBhIGRvY3VtZW50IHdpdGggc3RydWN0dXJlZCBjb250ZW50IHJlcXVlc3RzLgogKiBVc2VzIHRoZSBHb29nbGUgRG9jcyBiYXRjaFVwZGF0ZSBBUEkuCiAqIFJlcXVlc3RzIGFyZSBhcHBsaWVkIGluIG9yZGVyIOKAlCBpbnNlcnQgZnJvbSBib3R0b20tdXAgdG8gYXZvaWQgaW5kZXggc2hpZnRpbmcuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gYmF0Y2hVcGRhdGVEb2N1bWVudChkb2N1bWVudElkLCByZXF1ZXN0cykgewogICAgbG9nLmRlYnVnKCJCYXRjaC11cGRhdGluZyBkb2N1bWVudCIsIHsgZG9jdW1lbnRJZCwgcmVxdWVzdENvdW50OiByZXF1ZXN0cy5sZW5ndGggfSk7CiAgICBjb25zdCByZXMgPSBhd2FpdCBnb29nbGVQb3N0KGAke0RPQ1NfQVBJfS8ke2RvY3VtZW50SWR9OmJhdGNoVXBkYXRlYCwgeyByZXF1ZXN0cyB9KTsKICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgbG9nLmVycm9yKCJEb2N1bWVudCBiYXRjaCB1cGRhdGUgZmFpbGVkIiwgeyBkb2N1bWVudElkLCBlcnJvcjogcmVzLm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXMubWVzc2FnZSB9OwogICAgfQogICAgbG9nLmRlYnVnKCJEb2N1bWVudCBiYXRjaCB1cGRhdGUgY29tcGxldGUiLCB7IGRvY3VtZW50SWQgfSk7CiAgICByZXR1cm4geyBvazogdHJ1ZSwgbWVzc2FnZTogIkRvY3VtZW50IHVwZGF0ZWQiIH07Cn0KLyoqCiAqIEluc2VydCBwbGFpbiB0ZXh0IGF0IGEgZ2l2ZW4gaW5kZXggaW4gdGhlIGRvY3VtZW50LgogKi8KZnVuY3Rpb24gaW5zZXJ0VGV4dFJlcXVlc3QodGV4dCwgaW5kZXgpIHsKICAgIHJldHVybiB7CiAgICAgICAgaW5zZXJ0VGV4dDogewogICAgICAgICAgICB0ZXh0LAogICAgICAgICAgICBsb2NhdGlvbjogeyBpbmRleCB9LAogICAgICAgIH0sCiAgICB9Owp9Ci8qKgogKiBBcHBseSBwYXJhZ3JhcGggc3R5bGUgKGhlYWRpbmcsIG5vcm1hbCkgdG8gYSByYW5nZS4KICovCmZ1bmN0aW9uIHBhcmFncmFwaFN0eWxlUmVxdWVzdChzdGFydEluZGV4LCBlbmRJbmRleCwgbmFtZWRTdHlsZVR5cGUpIHsKICAgIHJldHVybiB7CiAgICAgICAgdXBkYXRlUGFyYWdyYXBoU3R5bGU6IHsKICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRJbmRleCwgZW5kSW5kZXggfSwKICAgICAgICAgICAgcGFyYWdyYXBoU3R5bGU6IHsgbmFtZWRTdHlsZVR5cGUgfSwKICAgICAgICAgICAgZmllbGRzOiAibmFtZWRTdHlsZVR5cGUiLAogICAgICAgIH0sCiAgICB9Owp9Ci8qKgogKiBBcHBseSBib2xkL2l0YWxpYyB0ZXh0IHN0eWxlIHRvIGEgcmFuZ2UuCiAqLwpmdW5jdGlvbiB0ZXh0U3R5bGVSZXF1ZXN0KHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBzdHlsZSkgewogICAgY29uc3QgZmllbGRzID0gT2JqZWN0LmtleXMoc3R5bGUpLmpvaW4oIiwiKTsKICAgIHJldHVybiB7CiAgICAgICAgdXBkYXRlVGV4dFN0eWxlOiB7CiAgICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0SW5kZXgsIGVuZEluZGV4IH0sCiAgICAgICAgICAgIHRleHRTdHlsZTogc3R5bGUsCiAgICAgICAgICAgIGZpZWxkcywKICAgICAgICB9LAogICAgfTsKfQpjb25zdCBQUklPUklUWV9MQUJFTFMgPSB7CiAgICAwOiAiTm8gcHJpb3JpdHkiLAogICAgMTogIlVyZ2VudCIsCiAgICAyOiAiSGlnaCIsCiAgICAzOiAiTWVkaXVtIiwKICAgIDQ6ICJMb3ciLAp9OwovKioKICogQ3JlYXRlIGEgR29vZ2xlIERvYyBwb3B1bGF0ZWQgd2l0aCBhIGJhY2tsb2cgcmV2aWV3LgogKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBVUkwuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQmFja2xvZ1Jldmlld0RvYyhpdGVtcykgewogICAgLy8gMS4gQ3JlYXRlIHRoZSBkb2N1bWVudAogICAgbG9nLmluZm8oIkNyZWF0aW5nIGJhY2tsb2cgcmV2aWV3IGRvY3VtZW50IiwgeyBpdGVtQ291bnQ6IGl0ZW1zLmxlbmd0aCB9KTsKICAgIGNvbnN0IGRvYyA9IGF3YWl0IGNyZWF0ZURvY3VtZW50KGAke2dldEluc3RhbmNlTmFtZSgpfSdzIE5vdGVzYCk7CiAgICBpZiAoIWRvYy5vayB8fCAhZG9jLmRhdGEpCiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBkb2MubWVzc2FnZSB9OwogICAgLy8gMi4gQnVpbGQgZG9jdW1lbnQgY29udGVudCBhcyB0ZXh0ICsgZm9ybWF0dGluZyByZXF1ZXN0cwogICAgLy8gR29vZ2xlIERvY3Mgc3RhcnRzIHdpdGggaW5kZXggMSAodGhlIGJvZHkgY29udGVudCBzdGFydCkKICAgIGNvbnN0IHJlcXVlc3RzID0gW107CiAgICBsZXQgaWR4ID0gMTsKICAgIC8vIEhlbHBlcjogYXBwZW5kIHRleHQgYW5kIHRyYWNrIGluZGV4CiAgICBmdW5jdGlvbiBhcHBlbmRUZXh0KHRleHQpIHsKICAgICAgICByZXF1ZXN0cy5wdXNoKGluc2VydFRleHRSZXF1ZXN0KHRleHQsIGlkeCkpOwogICAgICAgIGNvbnN0IHN0YXJ0ID0gaWR4OwogICAgICAgIGlkeCArPSB0ZXh0Lmxlbmd0aDsKICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kOiBpZHggfTsKICAgIH0KICAgIC8vIEhlbHBlcjogYXBwZW5kIGEgaGVhZGluZwogICAgZnVuY3Rpb24gYXBwZW5kSGVhZGluZyh0ZXh0LCBsZXZlbCkgewogICAgICAgIGNvbnN0IHJhbmdlID0gYXBwZW5kVGV4dCh0ZXh0ICsgIlxuIik7CiAgICAgICAgcmVxdWVzdHMucHVzaChwYXJhZ3JhcGhTdHlsZVJlcXVlc3QocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCwgbGV2ZWwpKTsKICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICB9CiAgICAvLyBIZWxwZXI6IGFwcGVuZCBub3JtYWwgcGFyYWdyYXBoCiAgICBmdW5jdGlvbiBhcHBlbmRQYXJhZ3JhcGgodGV4dCkgewogICAgICAgIGNvbnN0IHJhbmdlID0gYXBwZW5kVGV4dCh0ZXh0ICsgIlxuIik7CiAgICAgICAgcmVxdWVzdHMucHVzaChwYXJhZ3JhcGhTdHlsZVJlcXVlc3QocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCwgIk5PUk1BTF9URVhUIikpOwogICAgICAgIHJldHVybiByYW5nZTsKICAgIH0KICAgIC8vIEhlbHBlcjogYXBwZW5kIGJvbGQgdGV4dCB3aXRoaW4gYSBwYXJhZ3JhcGgKICAgIGZ1bmN0aW9uIGFwcGVuZEJvbGRUZXh0KHRleHQpIHsKICAgICAgICBjb25zdCByYW5nZSA9IGFwcGVuZFRleHQodGV4dCk7CiAgICAgICAgcmVxdWVzdHMucHVzaCh0ZXh0U3R5bGVSZXF1ZXN0KHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQsIHsgYm9sZDogdHJ1ZSB9KSk7CiAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgfQogICAgLy8gLS0tIERvY3VtZW50IGNvbnRlbnQgLS0tCiAgICAvLyBUaXRsZSBpcyBhbHJlYWR5IHNldCBieSBjcmVhdGVEb2N1bWVudCwgYnV0IHdlIGFkZCBhbiBpbnRybyBzZWN0aW9uCiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCkudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIsIHsKICAgICAgICB3ZWVrZGF5OiAibG9uZyIsCiAgICAgICAgeWVhcjogIm51bWVyaWMiLAogICAgICAgIG1vbnRoOiAibG9uZyIsCiAgICAgICAgZGF5OiAibnVtZXJpYyIsCiAgICB9KTsKICAgIGFwcGVuZEhlYWRpbmcoIkJhY2tsb2cgUmV2aWV3IiwgIkhFQURJTkdfMSIpOwogICAgYXBwZW5kUGFyYWdyYXBoKGBQcmVwYXJlZCBieSAke2dldEluc3RhbmNlTmFtZSgpfSBvbiAke3RvZGF5fS4gVGhpcyBkb2N1bWVudCBzdW1tYXJpemVzIGFsbCBhY3RpdmUgYmFja2xvZyBpdGVtcyBmb3IgcmV2aWV3LiBJdGVtcyBhcmUgZ3JvdXBlZCBieSBjdXJyZW50IHN0YXRlIGFuZCBzb3J0ZWQgYnkgcHJpb3JpdHkuYCk7CiAgICBhcHBlbmRUZXh0KCJcbiIpOwogICAgLy8gR3JvdXAgaXRlbXMgYnkgc3RhdGUKICAgIGNvbnN0IGdyb3VwcyA9IHt9OwogICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICAgICAgY29uc3Qgc3RhdGUgPSBpdGVtLnN0YXRlOwogICAgICAgIGlmICghZ3JvdXBzW3N0YXRlXSkKICAgICAgICAgICAgZ3JvdXBzW3N0YXRlXSA9IFtdOwogICAgICAgIGdyb3Vwc1tzdGF0ZV0ucHVzaChpdGVtKTsKICAgIH0KICAgIC8vIFNvcnQgZWFjaCBncm91cCBieSBwcmlvcml0eSAoMT11cmdlbnQgZmlyc3QpCiAgICBmb3IgKGNvbnN0IGcgb2YgT2JqZWN0LnZhbHVlcyhncm91cHMpKSB7CiAgICAgICAgZy5zb3J0KChhLCBiKSA9PiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eSk7CiAgICB9CiAgICAvLyBSZW5kZXIgb3JkZXI6IGluX3Byb2dyZXNzLCB0b2RvLCBiYWNrbG9nLCBkb25lLCBjYW5jZWxsZWQKICAgIGNvbnN0IHN0YXRlT3JkZXIgPSBbImluX3Byb2dyZXNzIiwgInRvZG8iLCAiYmFja2xvZyIsICJkb25lIiwgImNhbmNlbGxlZCJdOwogICAgY29uc3Qgc3RhdGVMYWJlbHMgPSB7CiAgICAgICAgaW5fcHJvZ3Jlc3M6ICJJbiBQcm9ncmVzcyIsCiAgICAgICAgdG9kbzogIlRvIERvIiwKICAgICAgICBiYWNrbG9nOiAiQmFja2xvZyIsCiAgICAgICAgZG9uZTogIkNvbXBsZXRlZCIsCiAgICAgICAgY2FuY2VsbGVkOiAiQ2FuY2VsbGVkIiwKICAgIH07CiAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHN0YXRlT3JkZXIpIHsKICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gZ3JvdXBzW3N0YXRlXTsKICAgICAgICBpZiAoIWdyb3VwSXRlbXMgfHwgZ3JvdXBJdGVtcy5sZW5ndGggPT09IDApCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGFwcGVuZEhlYWRpbmcoYCR7c3RhdGVMYWJlbHNbc3RhdGVdID8/IHN0YXRlfSAoJHtncm91cEl0ZW1zLmxlbmd0aH0pYCwgIkhFQURJTkdfMiIpOwogICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBncm91cEl0ZW1zKSB7CiAgICAgICAgICAgIC8vIEl0ZW0gdGl0bGUgbGluZQogICAgICAgICAgICBhcHBlbmRIZWFkaW5nKGAke2l0ZW0uaWRlbnRpZmllcn06ICR7aXRlbS50aXRsZX1gLCAiSEVBRElOR18zIik7CiAgICAgICAgICAgIC8vIFByaW9yaXR5ICYgYXNzaWduZWUKICAgICAgICAgICAgY29uc3QgcHJpb3JpdHkgPSBQUklPUklUWV9MQUJFTFNbaXRlbS5wcmlvcml0eV0gPz8gYFAke2l0ZW0ucHJpb3JpdHl9YDsKICAgICAgICAgICAgbGV0IG1ldGEgPSBgUHJpb3JpdHk6ICR7cHJpb3JpdHl9YDsKICAgICAgICAgICAgaWYgKGl0ZW0uYXNzaWduZWUpCiAgICAgICAgICAgICAgICBtZXRhICs9IGAgfCBBc3NpZ25lZTogJHtpdGVtLmFzc2lnbmVlfWA7CiAgICAgICAgICAgIGFwcGVuZFBhcmFncmFwaChtZXRhKTsKICAgICAgICAgICAgLy8gRGVzY3JpcHRpb24KICAgICAgICAgICAgaWYgKGl0ZW0uZGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIGFwcGVuZFBhcmFncmFwaChpdGVtLmRlc2NyaXB0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBOb3RlcyBmcm9tIGV4Y2hhbmdlcwogICAgICAgICAgICBpZiAoaXRlbS5leGNoYW5nZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgYXBwZW5kQm9sZFRleHQoIk5vdGVzOiAiKTsKICAgICAgICAgICAgICAgIGFwcGVuZFRleHQoaXRlbS5leGNoYW5nZXMubWFwKChlKSA9PiBlLmJvZHkpLmpvaW4oIjsgIikgKyAiXG4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcHBlbmRUZXh0KCJcbiIpOwogICAgICAgIH0KICAgIH0KICAgIC8vIFN1bW1hcnkgc2VjdGlvbgogICAgYXBwZW5kSGVhZGluZygiU3VtbWFyeSIsICJIRUFESU5HXzEiKTsKICAgIGNvbnN0IGNvdW50cyA9IHN0YXRlT3JkZXIKICAgICAgICAuZmlsdGVyKChzKSA9PiBncm91cHNbc10/Lmxlbmd0aCkKICAgICAgICAubWFwKChzKSA9PiBgJHtzdGF0ZUxhYmVsc1tzXX06ICR7Z3JvdXBzW3NdLmxlbmd0aH1gKQogICAgICAgIC5qb2luKCIgfCAiKTsKICAgIGFwcGVuZFBhcmFncmFwaChjb3VudHMpOwogICAgYXBwZW5kUGFyYWdyYXBoKGBUb3RhbCBhY3RpdmUgaXRlbXM6ICR7aXRlbXMubGVuZ3RofWApOwogICAgLy8gMy4gQXBwbHkgYWxsIHJlcXVlc3RzCiAgICBjb25zdCB1cGRhdGUgPSBhd2FpdCBiYXRjaFVwZGF0ZURvY3VtZW50KGRvYy5kYXRhLmRvY3VtZW50SWQsIHJlcXVlc3RzKTsKICAgIGlmICghdXBkYXRlLm9rKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgb2s6IGZhbHNlLAogICAgICAgICAgICBtZXNzYWdlOiBgRG9jdW1lbnQgY3JlYXRlZCBidXQgY29udGVudCBmYWlsZWQ6ICR7dXBkYXRlLm1lc3NhZ2V9LiBEb2MgVVJMOiAke2RvYy5kYXRhLmRvY3VtZW50VXJsfWAsCiAgICAgICAgfTsKICAgIH0KICAgIGxvZy5pbmZvKCJCYWNrbG9nIHJldmlldyBkb2N1bWVudCBjb21wbGV0ZSIsIHsgdXJsOiBkb2MuZGF0YS5kb2N1bWVudFVybCwgaXRlbUNvdW50OiBpdGVtcy5sZW5ndGggfSk7CiAgICByZXR1cm4geyBvazogdHJ1ZSwgdXJsOiBkb2MuZGF0YS5kb2N1bWVudFVybCwgbWVzc2FnZTogIkJhY2tsb2cgcmV2aWV3IGRvYyBjcmVhdGVkIiB9Owp9Ci8qKgogKiBDcmVhdGUgYSBuZXcgR29vZ2xlIFNoZWV0IHdpdGggb3B0aW9uYWwgZGF0YS4KICogRGF0YSBpcyBhbiBhcnJheSBvZiByb3dzLCBlYWNoIHJvdyBhbiBhcnJheSBvZiBjZWxsIHZhbHVlcy4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTcHJlYWRzaGVldCh0aXRsZSwgZGF0YSwgc2hlZXROYW1lKSB7CiAgICBjb25zdCBib2R5ID0gewogICAgICAgIHByb3BlcnRpZXM6IHsgdGl0bGUgfSwKICAgIH07CiAgICBpZiAoc2hlZXROYW1lKSB7CiAgICAgICAgYm9keS5zaGVldHMgPSBbeyBwcm9wZXJ0aWVzOiB7IHRpdGxlOiBzaGVldE5hbWUgfSB9XTsKICAgIH0KICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgc3ByZWFkc2hlZXQiLCB7IHRpdGxlLCBzaGVldE5hbWUgfSk7CiAgICBjb25zdCByZXMgPSBhd2FpdCBnb29nbGVQb3N0KFNIRUVUU19BUEksIGJvZHkpOwogICAgaWYgKCFyZXMub2sgfHwgIXJlcy5kYXRhPy5zcHJlYWRzaGVldElkKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIHNwcmVhZHNoZWV0IiwgeyB0aXRsZSwgZXJyb3I6IHJlcy5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogcmVzLm1lc3NhZ2UgfTsKICAgIH0KICAgIGNvbnN0IHNoZWV0SWQgPSByZXMuZGF0YS5zcHJlYWRzaGVldElkOwogICAgY29uc3QgdXJsID0gcmVzLmRhdGEuc3ByZWFkc2hlZXRVcmwgPz8gYGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLyR7c2hlZXRJZH0vZWRpdGA7CiAgICAvLyBXcml0ZSBkYXRhIGlmIHByb3ZpZGVkCiAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICBjb25zdCByYW5nZSA9IGAke3NoZWV0TmFtZSA/PyAiU2hlZXQxIn0hQTFgOwogICAgICAgIGNvbnN0IHdyaXRlUmVzdWx0ID0gYXdhaXQgZ29vZ2xlUG9zdChgJHtTSEVFVFNfQVBJfS8ke3NoZWV0SWR9L3ZhbHVlcy8ke2VuY29kZVVSSUNvbXBvbmVudChyYW5nZSl9OmFwcGVuZD92YWx1ZUlucHV0T3B0aW9uPVVTRVJfRU5URVJFRCZpbnNlcnREYXRhT3B0aW9uPUlOU0VSVF9ST1dTYCwgeyB2YWx1ZXM6IGRhdGEgfSk7CiAgICAgICAgaWYgKCF3cml0ZVJlc3VsdC5vaykgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgb2s6IHRydWUsCiAgICAgICAgICAgICAgICBkYXRhOiB7IHNwcmVhZHNoZWV0SWQ6IHNoZWV0SWQsIHRpdGxlLCBzcHJlYWRzaGVldFVybDogdXJsIH0sCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgU2hlZXQgY3JlYXRlZCBidXQgZGF0YSB3cml0ZSBmYWlsZWQ6ICR7d3JpdGVSZXN1bHQubWVzc2FnZX1gLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGxvZy5pbmZvKCJTcHJlYWRzaGVldCBjcmVhdGVkIiwgeyB0aXRsZSwgc3ByZWFkc2hlZXRJZDogc2hlZXRJZCB9KTsKICAgIHJldHVybiB7CiAgICAgICAgb2s6IHRydWUsCiAgICAgICAgZGF0YTogeyBzcHJlYWRzaGVldElkOiBzaGVldElkLCB0aXRsZSwgc3ByZWFkc2hlZXRVcmw6IHVybCB9LAogICAgICAgIG1lc3NhZ2U6ICJTcHJlYWRzaGVldCBjcmVhdGVkIiwKICAgIH07Cn0KLyoqCiAqIFJlYWQgZGF0YSBmcm9tIGEgR29vZ2xlIFNoZWV0LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTcHJlYWRzaGVldChzcHJlYWRzaGVldElkLCByYW5nZSkgewogICAgY29uc3QgciA9IHJhbmdlID8/ICJTaGVldDEiOwogICAgbG9nLmRlYnVnKCJSZWFkaW5nIHNwcmVhZHNoZWV0IiwgeyBzcHJlYWRzaGVldElkLCByYW5nZTogciB9KTsKICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdvb2dsZUdldChgJHtTSEVFVFNfQVBJfS8ke3NwcmVhZHNoZWV0SWR9L3ZhbHVlcy8ke2VuY29kZVVSSUNvbXBvbmVudChyKX1gKTsKICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gcmVhZCBzcHJlYWRzaGVldCIsIHsgc3ByZWFkc2hlZXRJZCwgZXJyb3I6IHJlcy5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogcmVzLm1lc3NhZ2UgfTsKICAgIH0KICAgIGNvbnN0IHJvd3MgPSByZXMuZGF0YT8udmFsdWVzID8/IFtdOwogICAgbG9nLmRlYnVnKCJTcHJlYWRzaGVldCByZWFkIGNvbXBsZXRlIiwgeyBzcHJlYWRzaGVldElkLCByb3dDb3VudDogcm93cy5sZW5ndGggfSk7CiAgICByZXR1cm4gewogICAgICAgIG9rOiB0cnVlLAogICAgICAgIGRhdGE6IHJvd3MsCiAgICAgICAgbWVzc2FnZTogYCR7cm93cy5sZW5ndGh9IHJvd3NgLAogICAgfTsKfQovKioKICogQ3JlYXRlIGEgR29vZ2xlIERvYyB3aXRoIG1hcmtkb3duLWlzaCBjb250ZW50IGluIG9uZSBjYWxsLgogKiBDb252ZW5pZW5jZSB3cmFwcGVyOiBjcmVhdGVzIGRvYyArIGluc2VydHMgZm9ybWF0dGVkIGNvbnRlbnQuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRG9jV2l0aENvbnRlbnQodGl0bGUsIGNvbnRlbnQpIHsKICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgZG9jIHdpdGggY29udGVudCIsIHsgdGl0bGUgfSk7CiAgICBjb25zdCBkb2MgPSBhd2FpdCBjcmVhdGVEb2N1bWVudCh0aXRsZSk7CiAgICBpZiAoIWRvYy5vayB8fCAhZG9jLmRhdGEpCiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBkb2MubWVzc2FnZSB9OwogICAgaWYgKGNvbnRlbnQudHJpbSgpKSB7CiAgICAgICAgY29uc3QgcmVxdWVzdHMgPSBbXTsKICAgICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQudHJpbSgpLnNwbGl0KCJcbiIpOwogICAgICAgIGxldCBpZHggPSAxOwogICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykgewogICAgICAgICAgICBjb25zdCBoZWFkaW5nTWF0Y2ggPSBsaW5lLm1hdGNoKC9eKCN7MSwzfSlccysoLispJC8pOwogICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGhlYWRpbmdNYXRjaCA/IGhlYWRpbmdNYXRjaFsyXSA6IGxpbmUpICsgIlxuIjsKICAgICAgICAgICAgcmVxdWVzdHMucHVzaChpbnNlcnRUZXh0UmVxdWVzdCh0ZXh0LCBpZHgpKTsKICAgICAgICAgICAgaWYgKGhlYWRpbmdNYXRjaCkgewogICAgICAgICAgICAgICAgY29uc3QgbGV2ZWwgPSBoZWFkaW5nTWF0Y2hbMV0ubGVuZ3RoOwogICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBsZXZlbCA9PT0gMSA/ICJIRUFESU5HXzEiIDogbGV2ZWwgPT09IDIgPyAiSEVBRElOR18yIiA6ICJIRUFESU5HXzMiOwogICAgICAgICAgICAgICAgcmVxdWVzdHMucHVzaChwYXJhZ3JhcGhTdHlsZVJlcXVlc3QoaWR4LCBpZHggKyB0ZXh0Lmxlbmd0aCwgc3R5bGUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZHggKz0gdGV4dC5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHVwZGF0ZSA9IGF3YWl0IGJhdGNoVXBkYXRlRG9jdW1lbnQoZG9jLmRhdGEuZG9jdW1lbnRJZCwgcmVxdWVzdHMpOwogICAgICAgIGlmICghdXBkYXRlLm9rKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBvazogdHJ1ZSwKICAgICAgICAgICAgICAgIHVybDogZG9jLmRhdGEuZG9jdW1lbnRVcmwsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRG9jIGNyZWF0ZWQgYnV0IGNvbnRlbnQgZmFpbGVkOiAke3VwZGF0ZS5tZXNzYWdlfWAsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgbG9nLmluZm8oIkRvYyB3aXRoIGNvbnRlbnQgY3JlYXRlZCIsIHsgdGl0bGUsIHVybDogZG9jLmRhdGEuZG9jdW1lbnRVcmwgfSk7CiAgICByZXR1cm4geyBvazogdHJ1ZSwgdXJsOiBkb2MuZGF0YS5kb2N1bWVudFVybCwgbWVzc2FnZTogYENyZWF0ZWQ6ICR7dGl0bGV9YCB9Owp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWRvY3MuanMubWFw","google/gmail-send.js":"LyoqCiAqIEdtYWlsIHNlbmQgY2xpZW50LgogKiBDb21wb3NlcyBSRkMgMjgyMiBtZXNzYWdlcyBhbmQgc2VuZHMgdmlhIEdtYWlsIEFQSS4KICogUmF3IGZldGNoIHZpYSBnb29nbGVQb3N0IOKAlCBubyBTREsuCiAqIEFsbCBmdW5jdGlvbnMgcmV0dXJuIHsgb2ssIGRhdGE/LCBtZXNzYWdlIH0g4oCUIG5ldmVyIHRocm93LgogKi8KaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICJub2RlOmZzL3Byb21pc2VzIjsKaW1wb3J0IHsgYmFzZW5hbWUgfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiwgaXNHb29nbGVBdXRoZW50aWNhdGVkIH0gZnJvbSAiLi9hdXRoLmpzIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJnb29nbGUuZ21haWwtc2VuZCIpOwpjb25zdCBHTUFJTF9BUEkgPSAiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZ21haWwvdjEvdXNlcnMvbWUiOwpjb25zdCBERUZBVUxUX0ZST00gPSBwcm9jZXNzLmVudi5HTUFJTF9GUk9NID8/ICJub3JlcGx5QGV4YW1wbGUuY29tIjsKLy8gLS0tIEhlbHBlcnMgLS0tCi8qKgogKiBFbmNvZGUgYSBCdWZmZXIgdG8gVVJMLXNhZmUgYmFzZTY0IChHbWFpbCdzIHJlcXVpcmVkIGZvcm1hdCkuCiAqLwpmdW5jdGlvbiB0b0Jhc2U2NFVybChidWYpIHsKICAgIHJldHVybiBidWYudG9TdHJpbmcoImJhc2U2NCIpLnJlcGxhY2UoL1wrL2csICItIikucmVwbGFjZSgvXC8vZywgIl8iKS5yZXBsYWNlKC89KyQvLCAiIik7Cn0KLyoqCiAqIEpvaW4gYW4gYWRkcmVzcyBsaXN0IGludG8gYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgogKi8KZnVuY3Rpb24gam9pbkFkZHJlc3NlcyhhZGRyKSB7CiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhZGRyKSA/IGFkZHIuam9pbigiLCAiKSA6IGFkZHI7Cn0KLyoqCiAqIEdlbmVyYXRlIGEgTUlNRSBib3VuZGFyeSBzdHJpbmcuCiAqLwpmdW5jdGlvbiBnZW5lcmF0ZUJvdW5kYXJ5KCkgewogICAgcmV0dXJuIGAtLS0tPV9QYXJ0XyR7RGF0ZS5ub3coKX1fJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YDsKfQovKioKICogQnVpbGQgYSBjb21wbGV0ZSBSRkMgMjgyMiBtZXNzYWdlIGFzIGEgc3RyaW5nLgogKiBTdXBwb3J0cyBwbGFpbiB0ZXh0LCBIVE1MIGFsdGVybmF0aXZlLCBhbmQgZmlsZSBhdHRhY2htZW50cy4KICovCmZ1bmN0aW9uIGJ1aWxkUmZjMjgyMihvcHRpb25zKSB7CiAgICBjb25zdCBmcm9tID0gb3B0aW9ucy5mcm9tID8/IERFRkFVTFRfRlJPTTsKICAgIGNvbnN0IHRvID0gam9pbkFkZHJlc3NlcyhvcHRpb25zLnRvKTsKICAgIGNvbnN0IGhlYWRlcnMgPSBbCiAgICAgICAgYEZyb206ICR7ZnJvbX1gLAogICAgICAgIGBUbzogJHt0b31gLAogICAgICAgIGBTdWJqZWN0OiAke29wdGlvbnMuc3ViamVjdH1gLAogICAgICAgIGBNSU1FLVZlcnNpb246IDEuMGAsCiAgICAgICAgYERhdGU6ICR7bmV3IERhdGUoKS50b1VUQ1N0cmluZygpfWAsCiAgICBdOwogICAgaWYgKG9wdGlvbnMuY2MpCiAgICAgICAgaGVhZGVycy5wdXNoKGBDYzogJHtqb2luQWRkcmVzc2VzKG9wdGlvbnMuY2MpfWApOwogICAgaWYgKG9wdGlvbnMuYmNjKQogICAgICAgIGhlYWRlcnMucHVzaChgQmNjOiAke2pvaW5BZGRyZXNzZXMob3B0aW9ucy5iY2MpfWApOwogICAgaWYgKG9wdGlvbnMuaW5SZXBseVRvKQogICAgICAgIGhlYWRlcnMucHVzaChgSW4tUmVwbHktVG86ICR7b3B0aW9ucy5pblJlcGx5VG99YCk7CiAgICBpZiAob3B0aW9ucy5yZWZlcmVuY2VzKQogICAgICAgIGhlYWRlcnMucHVzaChgUmVmZXJlbmNlczogJHtvcHRpb25zLnJlZmVyZW5jZXN9YCk7CiAgICBjb25zdCBoYXNBdHRhY2htZW50cyA9IG9wdGlvbnMuYXR0YWNobWVudHMgJiYgb3B0aW9ucy5hdHRhY2htZW50cy5sZW5ndGggPiAwOwogICAgY29uc3QgaGFzSHRtbCA9ICEhb3B0aW9ucy5odG1sQm9keTsKICAgIC8vIFNpbXBsZSBwbGFpbiB0ZXh0IOKAlCBubyBNSU1FIHBhcnRzIG5lZWRlZAogICAgaWYgKCFoYXNBdHRhY2htZW50cyAmJiAhaGFzSHRtbCkgewogICAgICAgIGhlYWRlcnMucHVzaChgQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJVVEYtOCJgKTsKICAgICAgICBoZWFkZXJzLnB1c2goYENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXRgKTsKICAgICAgICByZXR1cm4gaGVhZGVycy5qb2luKCJcclxuIikgKyAiXHJcblxyXG4iICsgb3B0aW9ucy5ib2R5OwogICAgfQogICAgLy8gV2l0aCBIVE1MIGJ1dCBubyBhdHRhY2htZW50cyDigJQgbXVsdGlwYXJ0L2FsdGVybmF0aXZlCiAgICBpZiAoIWhhc0F0dGFjaG1lbnRzICYmIGhhc0h0bWwpIHsKICAgICAgICBjb25zdCBhbHRCb3VuZGFyeSA9IGdlbmVyYXRlQm91bmRhcnkoKTsKICAgICAgICBoZWFkZXJzLnB1c2goYENvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iJHthbHRCb3VuZGFyeX0iYCk7CiAgICAgICAgY29uc3QgcGFydHMgPSBbCiAgICAgICAgICAgIGAtLSR7YWx0Qm91bmRhcnl9XHJcbkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iVVRGLTgiXHJcbkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXRcclxuXHJcbiR7b3B0aW9ucy5ib2R5fWAsCiAgICAgICAgICAgIGAtLSR7YWx0Qm91bmRhcnl9XHJcbkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PSJVVEYtOCJcclxuQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdFxyXG5cclxuJHtvcHRpb25zLmh0bWxCb2R5fWAsCiAgICAgICAgICAgIGAtLSR7YWx0Qm91bmRhcnl9LS1gLAogICAgICAgIF07CiAgICAgICAgcmV0dXJuIGhlYWRlcnMuam9pbigiXHJcbiIpICsgIlxyXG5cclxuIiArIHBhcnRzLmpvaW4oIlxyXG4iKTsKICAgIH0KICAgIC8vIFdpdGggYXR0YWNobWVudHMg4oCUIG11bHRpcGFydC9taXhlZAogICAgY29uc3QgbWl4ZWRCb3VuZGFyeSA9IGdlbmVyYXRlQm91bmRhcnkoKTsKICAgIGhlYWRlcnMucHVzaChgQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSIke21peGVkQm91bmRhcnl9ImApOwogICAgY29uc3QgcGFydHMgPSBbXTsKICAgIC8vIFRleHQgYm9keSAob3IgYWx0ZXJuYXRpdmUgdGV4dCtodG1sKQogICAgaWYgKGhhc0h0bWwpIHsKICAgICAgICBjb25zdCBhbHRCb3VuZGFyeSA9IGdlbmVyYXRlQm91bmRhcnkoKTsKICAgICAgICBwYXJ0cy5wdXNoKGAtLSR7bWl4ZWRCb3VuZGFyeX1cclxuQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSIke2FsdEJvdW5kYXJ5fSJcclxuXHJcbmAgKwogICAgICAgICAgICBgLS0ke2FsdEJvdW5kYXJ5fVxyXG5Db250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9IlVURi04IlxyXG5Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0XHJcblxyXG4ke29wdGlvbnMuYm9keX1cclxuYCArCiAgICAgICAgICAgIGAtLSR7YWx0Qm91bmRhcnl9XHJcbkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PSJVVEYtOCJcclxuQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdFxyXG5cclxuJHtvcHRpb25zLmh0bWxCb2R5fVxyXG5gICsKICAgICAgICAgICAgYC0tJHthbHRCb3VuZGFyeX0tLWApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcGFydHMucHVzaChgLS0ke21peGVkQm91bmRhcnl9XHJcbkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iVVRGLTgiXHJcbkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXRcclxuXHJcbiR7b3B0aW9ucy5ib2R5fWApOwogICAgfQogICAgLy8gQXR0YWNobWVudHMKICAgIGZvciAoY29uc3QgYXR0IG9mIG9wdGlvbnMuYXR0YWNobWVudHMpIHsKICAgICAgICBjb25zdCBlbmNvZGVkID0gYXR0LmNvbnRlbnQudG9TdHJpbmcoImJhc2U2NCIpOwogICAgICAgIHBhcnRzLnB1c2goYC0tJHttaXhlZEJvdW5kYXJ5fVxyXG5gICsKICAgICAgICAgICAgYENvbnRlbnQtVHlwZTogJHthdHQubWltZVR5cGV9OyBuYW1lPSIke2F0dC5maWxlbmFtZX0iXHJcbmAgKwogICAgICAgICAgICBgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IiR7YXR0LmZpbGVuYW1lfSJcclxuYCArCiAgICAgICAgICAgIGBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjRcclxuXHJcbmAgKwogICAgICAgICAgICBlbmNvZGVkKTsKICAgIH0KICAgIHBhcnRzLnB1c2goYC0tJHttaXhlZEJvdW5kYXJ5fS0tYCk7CiAgICByZXR1cm4gaGVhZGVycy5qb2luKCJcclxuIikgKyAiXHJcblxyXG4iICsgcGFydHMuam9pbigiXHJcbiIpOwp9Ci8vIC0tLSBQdWJsaWMgQVBJIC0tLQovKioKICogQ2hlY2sgaWYgR21haWwgc2VuZGluZyBpcyByZWFkeSAoR29vZ2xlIGF1dGhlbnRpY2F0ZWQpLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGlzR21haWxTZW5kQXZhaWxhYmxlKCkgewogICAgcmV0dXJuIGlzR29vZ2xlQXV0aGVudGljYXRlZCgpOwp9Ci8qKgogKiBTZW5kIGFuIGVtYWlsIHZpYSBHbWFpbCBBUEkuCiAqIEJ1aWxkcyBhbiBSRkMgMjgyMiBtZXNzYWdlLCBiYXNlNjR1cmwtZW5jb2RlcyBpdCwgYW5kIFBPU1RzIHRvIHRoZSBzZW5kIGVuZHBvaW50LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRFbWFpbChvcHRpb25zKSB7CiAgICBpZiAoIWlzR29vZ2xlQXV0aGVudGljYXRlZCgpKSB7CiAgICAgICAgbG9nLndhcm4oIlNlbmQgYXR0ZW1wdGVkIHdpdGhvdXQgYXV0aGVudGljYXRpb24iKTsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6ICJHb29nbGUgbm90IGF1dGhlbnRpY2F0ZWQg4oCUIGNvbm5lY3QgR29vZ2xlIGZpcnN0IiB9OwogICAgfQogICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzCiAgICBpZiAoIW9wdGlvbnMudG8gfHwgKEFycmF5LmlzQXJyYXkob3B0aW9ucy50bykgJiYgb3B0aW9ucy50by5sZW5ndGggPT09IDApKSB7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiAiTm8gcmVjaXBpZW50IHNwZWNpZmllZCIgfTsKICAgIH0KICAgIGlmICghb3B0aW9ucy5zdWJqZWN0KSB7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiAiTm8gc3ViamVjdCBzcGVjaWZpZWQiIH07CiAgICB9CiAgICBpZiAoIW9wdGlvbnMuYm9keSkgewogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogIk5vIGJvZHkgc3BlY2lmaWVkIiB9OwogICAgfQogICAgY29uc3QgdG9TdHIgPSBqb2luQWRkcmVzc2VzKG9wdGlvbnMudG8pOwogICAgbG9nLmluZm8oIlNlbmRpbmcgZW1haWwiLCB7IHRvOiB0b1N0ciwgc3ViamVjdDogb3B0aW9ucy5zdWJqZWN0LCBoYXNBdHRhY2htZW50czogISEob3B0aW9ucy5hdHRhY2htZW50cz8ubGVuZ3RoKSwgdGhyZWFkSWQ6IG9wdGlvbnMudGhyZWFkSWQgfSk7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJhdyA9IGJ1aWxkUmZjMjgyMihvcHRpb25zKTsKICAgICAgICBjb25zdCBlbmNvZGVkID0gdG9CYXNlNjRVcmwoQnVmZmVyLmZyb20ocmF3LCAidXRmLTgiKSk7CiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsgcmF3OiBlbmNvZGVkIH07CiAgICAgICAgaWYgKG9wdGlvbnMudGhyZWFkSWQpCiAgICAgICAgICAgIHBheWxvYWQudGhyZWFkSWQgPSBvcHRpb25zLnRocmVhZElkOwogICAgICAgIC8vIFVzZSByYXcgZmV0Y2ggaW5zdGVhZCBvZiBnb29nbGVQb3N0IGJlY2F1c2UgdGhlIEdtYWlsIHNlbmQgZW5kcG9pbnQKICAgICAgICAvLyByZXR1cm5zIHRoZSBjcmVhdGVkIG1lc3NhZ2UgZGlyZWN0bHkgYW5kIHdlIG5lZWQgdGlnaHQgY29udHJvbAogICAgICAgIGNvbnN0IGF1dGggPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpOwogICAgICAgIGlmICghYXV0aC5vaykKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBhdXRoLm1lc3NhZ2UgfTsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtHTUFJTF9BUEl9L21lc3NhZ2VzL3NlbmRgLCB7CiAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXV0aC50b2tlbn1gLAogICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksCiAgICAgICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgzMF8wMDApLCAvLyBMb25nZXIgdGltZW91dCBmb3IgYXR0YWNobWVudHMKICAgICAgICB9KTsKICAgICAgICBpZiAoIXJlcy5vaykgewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKTsKICAgICAgICAgICAgbG9nLmVycm9yKCJFbWFpbCBzZW5kIGZhaWxlZCIsIHsgdG86IHRvU3RyLCBzdGF0dXM6IHJlcy5zdGF0dXMsIGVycm9yOiB0ZXh0IH0pOwogICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGBHbWFpbCBzZW5kIGVycm9yICgke3Jlcy5zdGF0dXN9KTogJHt0ZXh0fWAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKTsKICAgICAgICBsb2cuaW5mbygiRW1haWwgc2VudCBzdWNjZXNzZnVsbHkiLCB7IHRvOiB0b1N0ciwgbWVzc2FnZUlkOiBkYXRhLmlkLCB0aHJlYWRJZDogZGF0YS50aHJlYWRJZCB9KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBvazogdHJ1ZSwKICAgICAgICAgICAgZGF0YTogeyBpZDogZGF0YS5pZCwgdGhyZWFkSWQ6IGRhdGEudGhyZWFkSWQsIGxhYmVsSWRzOiBkYXRhLmxhYmVsSWRzIH0sCiAgICAgICAgICAgIG1lc3NhZ2U6IGBFbWFpbCBzZW50IHRvICR7dG9TdHJ9IOKAlCBJRDogJHtkYXRhLmlkfWAsCiAgICAgICAgfTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cuZXJyb3IoIkVtYWlsIHNlbmQgZXhjZXB0aW9uIiwgeyB0bzogdG9TdHIsIGVycm9yOiBlcnIubWVzc2FnZSB9KTsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGBHbWFpbCBzZW5kIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gIH07CiAgICB9Cn0KLyoqCiAqIExvYWQgYSBmaWxlIGZyb20gZGlzayBhbmQgcmV0dXJuIGl0IGFzIGFuIEVtYWlsQXR0YWNobWVudC4KICogSW5mZXJzIE1JTUUgdHlwZSBmcm9tIGV4dGVuc2lvbi4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdHRhY2htZW50RnJvbUZpbGUoZmlsZVBhdGgpIHsKICAgIHRyeSB7CiAgICAgICAgbG9nLmRlYnVnKCJMb2FkaW5nIGF0dGFjaG1lbnQgZnJvbSBmaWxlIiwgeyBmaWxlUGF0aCB9KTsKICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgpOwogICAgICAgIGNvbnN0IGZpbGVuYW1lID0gYmFzZW5hbWUoZmlsZVBhdGgpOwogICAgICAgIGNvbnN0IG1pbWVUeXBlID0gaW5mZXJNaW1lVHlwZShmaWxlbmFtZSk7CiAgICAgICAgbG9nLmRlYnVnKCJBdHRhY2htZW50IGxvYWRlZCIsIHsgZmlsZW5hbWUsIG1pbWVUeXBlLCBzaXplQnl0ZXM6IGNvbnRlbnQubGVuZ3RoIH0pOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG9rOiB0cnVlLAogICAgICAgICAgICBhdHRhY2htZW50OiB7IGZpbGVuYW1lLCBtaW1lVHlwZSwgY29udGVudCB9LAogICAgICAgICAgICBtZXNzYWdlOiBgTG9hZGVkICR7ZmlsZW5hbWV9ICgke2NvbnRlbnQubGVuZ3RofSBieXRlcylgLAogICAgICAgIH07CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gcmVhZCBhdHRhY2htZW50IiwgeyBmaWxlUGF0aCwgZXJyb3I6IGVyci5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYEZhaWxlZCB0byByZWFkIGF0dGFjaG1lbnQ6ICR7ZXJyLm1lc3NhZ2V9YCB9OwogICAgfQp9Ci8qKgogKiBJbmZlciBNSU1FIHR5cGUgZnJvbSBmaWxlIGV4dGVuc2lvbi4KICovCmZ1bmN0aW9uIGluZmVyTWltZVR5cGUoZmlsZW5hbWUpIHsKICAgIGNvbnN0IGV4dCA9IGZpbGVuYW1lLnNwbGl0KCIuIikucG9wKCk/LnRvTG93ZXJDYXNlKCkgPz8gIiI7CiAgICBjb25zdCB0eXBlcyA9IHsKICAgICAgICBwZGY6ICJhcHBsaWNhdGlvbi9wZGYiLAogICAgICAgIGRvYzogImFwcGxpY2F0aW9uL21zd29yZCIsCiAgICAgICAgZG9jeDogImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50IiwKICAgICAgICB4bHM6ICJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwiLAogICAgICAgIHhsc3g6ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCIsCiAgICAgICAgcHB0OiAiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiLAogICAgICAgIHBwdHg6ICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uIiwKICAgICAgICBwbmc6ICJpbWFnZS9wbmciLAogICAgICAgIGpwZzogImltYWdlL2pwZWciLAogICAgICAgIGpwZWc6ICJpbWFnZS9qcGVnIiwKICAgICAgICBnaWY6ICJpbWFnZS9naWYiLAogICAgICAgIHN2ZzogImltYWdlL3N2Zyt4bWwiLAogICAgICAgIHdlYnA6ICJpbWFnZS93ZWJwIiwKICAgICAgICB0eHQ6ICJ0ZXh0L3BsYWluIiwKICAgICAgICBjc3Y6ICJ0ZXh0L2NzdiIsCiAgICAgICAgaHRtbDogInRleHQvaHRtbCIsCiAgICAgICAganNvbjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgIHppcDogImFwcGxpY2F0aW9uL3ppcCIsCiAgICAgICAgbXAzOiAiYXVkaW8vbXBlZyIsCiAgICAgICAgbXA0OiAidmlkZW8vbXA0IiwKICAgICAgICB3YXY6ICJhdWRpby93YXYiLAogICAgfTsKICAgIHJldHVybiB0eXBlc1tleHRdID8/ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWdtYWlsLXNlbmQuanMubWFw","google/gmail-timer.js":"LyoqCiAqIEJhY2tncm91bmQgaW5ib3ggcG9sbGluZyB0aW1lci4KICogQ2hlY2tzIGZvciBuZXcgbWVzc2FnZXMgZXZlcnkgNSBtaW51dGVzLgogKiBQdXNoZXMgbm90aWZpY2F0aW9ucyBmb3IgbmV3IHVucmVhZCBtZXNzYWdlcy4KICogRW1haWxzIHdpdGggdGhlIGluc3RhbmNlIG5hbWUgaW4gdGhlIHN1YmplY3QgYXJlIHByb2Nlc3NlZCBhcyBjaGF0IGFuZCByZXBsaWVkIHRvIGF1dG9tYXRpY2FsbHkuCiAqIEZvbGxvd3Mgc3JjL2dvYWxzL3RpbWVyLnRzIHBhdHRlcm46IG1vZHVsZS1sZXZlbCBzdGF0ZSwgaWRlbXBvdGVudCBzdGFydC9zdG9wLgogKi8KaW1wb3J0IHsgZ2V0UmVjZW50TWVzc2FnZXMsIGdldE1lc3NhZ2UsIGlzR21haWxBdmFpbGFibGUgfSBmcm9tICIuL2dtYWlsLmpzIjsKaW1wb3J0IHsgcHVzaE5vdGlmaWNhdGlvbiB9IGZyb20gIi4uL2dvYWxzL25vdGlmaWNhdGlvbnMuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IGdldEluc3RhbmNlTmFtZSwgZ2V0SW5zdGFuY2VOYW1lTG93ZXIgfSBmcm9tICIuLi9pbnN0YW5jZS5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiZ21haWwiKTsKY29uc3QgREVGQVVMVF9JTlRFUlZBTF9NUyA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkdNQUlMX1BPTExfSU5URVJWQUxfTVMgPz8gIiIsIDEwKSB8fCA1ICogNjAgKiAxMDAwOyAvLyBkZWZhdWx0IDUgbWluLCBvdmVycmlkZSB3aXRoIEdNQUlMX1BPTExfSU5URVJWQUxfTVMKbGV0IHRpbWVyID0gbnVsbDsKY29uc3Qgc2Vlbk1lc3NhZ2VJZHMgPSBuZXcgU2V0KCk7IC8vIFRyYWNrIHNlZW4gbWVzc2FnZXMgdG8gYXZvaWQgZHVwbGljYXRlcwpsZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKbGV0IGRhc2hFbWFpbEhhbmRsZXIgPSBudWxsOwovKiogVGhlIHN1YmplY3QtbGluZSBwYXR0ZXJuIHRoYXQgdHJpZ2dlcnMgaW5zdGFuY2UgZW1haWwgcHJvY2Vzc2luZy4gKi8KY29uc3QgREFTSF9TVUJKRUNUX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBcXGIke2dldEluc3RhbmNlTmFtZUxvd2VyKCl9XFxiYCwgImkiKTsKLyoqCiAqIFJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgaW5zdGFuY2UtYWRkcmVzc2VkIGVtYWlscy4KICogV2hlbiB0aGUgdGltZXIgZmluZHMgbmV3IHVucmVhZCBlbWFpbHMgd2l0aCB0aGUgaW5zdGFuY2UgbmFtZSBpbiB0aGUgc3ViamVjdCwKICogaXQgZmV0Y2hlcyB0aGUgZnVsbCBib2R5IGFuZCBjYWxscyB0aGlzIGhhbmRsZXIuCiAqLwpleHBvcnQgZnVuY3Rpb24gb25EYXNoRW1haWwoaGFuZGxlcikgewogICAgZGFzaEVtYWlsSGFuZGxlciA9IGhhbmRsZXI7Cn0KLyoqIEFsaWFzIGZvciBvbkRhc2hFbWFpbCDigJQgcHJlZmVycmVkIG5hbWUgZm9yIGdlbmVyaWMgaW5zdGFuY2VzLiAqLwpleHBvcnQgY29uc3Qgb25JbnN0YW5jZUVtYWlsID0gb25EYXNoRW1haWw7Ci8qKgogKiBTdGFydCB0aGUgR21haWwgcG9sbGluZyB0aW1lci4gSWRlbXBvdGVudC4KICovCmV4cG9ydCBmdW5jdGlvbiBzdGFydEdtYWlsVGltZXIoaW50ZXJ2YWxNcykgewogICAgaWYgKHRpbWVyKQogICAgICAgIHJldHVybjsKICAgIGNvbnN0IGludGVydmFsID0gaW50ZXJ2YWxNcyA/PyBERUZBVUxUX0lOVEVSVkFMX01TOwogICAgLy8gUnVuIGFuIGluaXRpYWwgY2hlY2sgdG8gc2VlZCB0aGUgc2VlbiBzZXQgKGRvbid0IG5vdGlmeSBvbiBmaXJzdCBydW4pCiAgICAoYXN5bmMgKCkgPT4gewogICAgICAgIGlmICghaXNHbWFpbEF2YWlsYWJsZSgpKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVjZW50TWVzc2FnZXMoMSk7CiAgICAgICAgICAgIGlmIChyZXN1bHQub2sgJiYgcmVzdWx0Lm1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiByZXN1bHQubWVzc2FnZXMpIHsKICAgICAgICAgICAgICAgICAgICBzZWVuTWVzc2FnZUlkcy5hZGQobXNnLmlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOyAvLyBDb250aW51ZSBldmVuIGlmIGluaXRpYWwgc2VlZCBmYWlscwogICAgICAgIH0KICAgIH0pKCk7CiAgICB0aW1lciA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHsKICAgICAgICBpZiAoIWlzR21haWxBdmFpbGFibGUoKSB8fCAhaW5pdGlhbGl6ZWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWNlbnRNZXNzYWdlcygxKTsgLy8gTGFzdCBob3VyCiAgICAgICAgICAgIGlmICghcmVzdWx0Lm9rIHx8ICFyZXN1bHQubWVzc2FnZXMpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IG5ld01lc3NhZ2VzID0gcmVzdWx0Lm1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS5pc1VucmVhZCAmJiAhc2Vlbk1lc3NhZ2VJZHMuaGFzKG0uaWQpKTsKICAgICAgICAgICAgLy8gVHJhY2sgYWxsIHNlZW4gSURzCiAgICAgICAgICAgIGZvciAoY29uc3QgbXNnIG9mIHJlc3VsdC5tZXNzYWdlcykgewogICAgICAgICAgICAgICAgc2Vlbk1lc3NhZ2VJZHMuYWRkKG1zZy5pZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5ld01lc3NhZ2VzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIC8vIFNlcGFyYXRlIGluc3RhbmNlLWFkZHJlc3NlZCBlbWFpbHMgZnJvbSByZWd1bGFyIG5vdGlmaWNhdGlvbnMKICAgICAgICAgICAgICAgIGNvbnN0IGRhc2hFbWFpbHMgPSBbXTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlZ3VsYXJFbWFpbHMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbSBvZiBuZXdNZXNzYWdlcykgewogICAgICAgICAgICAgICAgICAgIGlmIChEQVNIX1NVQkpFQ1RfUEFUVEVSTi50ZXN0KG0uc3ViamVjdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGFzaEVtYWlscy5wdXNoKG0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhckVtYWlscy5wdXNoKG0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgaW5zdGFuY2UtYWRkcmVzc2VkIGVtYWlscyAoZmV0Y2ggYm9keSwgcnVuIHRocm91Z2ggQUksIHJlcGx5KQogICAgICAgICAgICAgICAgaWYgKGRhc2hFbWFpbHMubGVuZ3RoID4gMCAmJiBkYXNoRW1haWxIYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBtIG9mIGRhc2hFbWFpbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Rhc2hFbWFpbChtKS5jYXRjaCgoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJNc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzICR7Z2V0SW5zdGFuY2VOYW1lKCl9IGVtYWlsYCwgeyBtZXNzYWdlSWQ6IG0uaWQsIGVycm9yOiBlcnJNc2cgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImdtYWlsIiwgc3VtbWFyeTogYEZhaWxlZCB0byBwcm9jZXNzICR7Z2V0SW5zdGFuY2VOYW1lKCl9IGVtYWlsIGZyb20gJHttLmZyb219OiAke2Vyck1zZ31gIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBGZXRjaCBmdWxsIGJvZHkgZm9yIHJlZ3VsYXIgZW1haWxzIGFuZCBwdXNoIHJpY2ggbm90aWZpY2F0aW9ucwogICAgICAgICAgICAgICAgaWYgKHJlZ3VsYXJFbWFpbHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbSBvZiByZWd1bGFyRW1haWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoQW5kTm90aWZ5KG0pLmNhdGNoKChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJGYWlsZWQgdG8gZmV0Y2ggZW1haWwgYm9keSBmb3Igbm90aWZpY2F0aW9uIiwgeyBtZXNzYWdlSWQ6IG0uaWQsIGVycm9yOiBlcnJNc2cgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gc25pcHBldC1vbmx5IG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaE5vdGlmaWNhdGlvbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAiZ21haWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBOZXcgZW1haWwgZnJvbSAke20uZnJvbX06ICIke20uc3ViamVjdH0iXG4ke20uc25pcHBldH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogImdtYWlsIiwKICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYCR7cmVndWxhckVtYWlscy5sZW5ndGh9IG5ldyB1bnJlYWQgZW1haWwocylgLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gU2VwYXJhdGUgbG9nIGZvciBpbnN0YW5jZS1hZGRyZXNzZWQgZW1haWxzCiAgICAgICAgICAgICAgICBpZiAoZGFzaEVtYWlscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJnbWFpbCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGAke2Rhc2hFbWFpbHMubGVuZ3RofSAke2dldEluc3RhbmNlTmFtZSgpfS1hZGRyZXNzZWQgZW1haWwocykgZGV0ZWN0ZWQg4oCUIHByb2Nlc3NpbmdgLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFBydW5lIG9sZCBzZWVuIElEcyAoa2VlcCBtYXggNTAwKQogICAgICAgICAgICBpZiAoc2Vlbk1lc3NhZ2VJZHMuc2l6ZSA+IDUwMCkgewogICAgICAgICAgICAgICAgY29uc3QgYXJyID0gWy4uLnNlZW5NZXNzYWdlSWRzXTsKICAgICAgICAgICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gYXJyLnNsaWNlKDAsIGFyci5sZW5ndGggLSA1MDApOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiB0b1JlbW92ZSkKICAgICAgICAgICAgICAgICAgICBzZWVuTWVzc2FnZUlkcy5kZWxldGUoaWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImdtYWlsIiwgc3VtbWFyeTogYFBvbGwgZXJyb3I6ICR7bXNnfWAgfSk7CiAgICAgICAgfQogICAgfSwgaW50ZXJ2YWwpOwogICAgY29uc3QgbWlucyA9IE1hdGgucm91bmQoaW50ZXJ2YWwgLyA2MF8wMDApOwogICAgbG9nLmluZm8oYEdtYWlsIHBvbGw6IGV2ZXJ5ICR7bWluc30gbWluYCk7Cn0KLyoqCiAqIEZldGNoIGZ1bGwgZW1haWwgYm9keSBhbmQgcHVzaCBhIHJpY2ggbm90aWZpY2F0aW9uIHNvIHRoZSBpbnN0YW5jZSBjYW4gcmVhc29uIGFib3V0IGl0IGluIGNoYXQuCiAqIFRydW5jYXRlcyBib2R5IHRvIGtlZXAgbm90aWZpY2F0aW9uIHNpemUgcmVhc29uYWJsZS4KICovCmFzeW5jIGZ1bmN0aW9uIGZldGNoQW5kTm90aWZ5KG0pIHsKICAgIGNvbnN0IGZ1bGwgPSBhd2FpdCBnZXRNZXNzYWdlKG0uaWQpOwogICAgY29uc3QgYm9keSA9IGZ1bGwub2sgJiYgZnVsbC5tZXNzYWdlPy5ib2R5Py50cmltKCkKICAgICAgICA/IGZ1bGwubWVzc2FnZS5ib2R5LnRyaW0oKQogICAgICAgIDogbS5zbmlwcGV0OwogICAgLy8gVHJ1bmNhdGUgYm9keSB0byB+NTAwIGNoYXJzIGZvciBub3RpZmljYXRpb24gY29udGV4dAogICAgY29uc3QgdHJ1bmNhdGVkID0gYm9keS5sZW5ndGggPiA1MDAgPyBib2R5LnNsaWNlKDAsIDUwMCkgKyAiLi4uIiA6IGJvZHk7CiAgICBjb25zdCBzZW5kZXJOYW1lID0gbS5mcm9tLnNwbGl0KCI8IilbMF0udHJpbSgpOwogICAgcHVzaE5vdGlmaWNhdGlvbih7CiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgc291cmNlOiAiZ21haWwiLAogICAgICAgIG1lc3NhZ2U6IFsKICAgICAgICAgICAgYE5ldyBlbWFpbCBmcm9tICR7c2VuZGVyTmFtZX06ICIke20uc3ViamVjdH0iIFt0aHJlYWRJZDogJHttLnRocmVhZElkfV1gLAogICAgICAgICAgICB0cnVuY2F0ZWQsCiAgICAgICAgXS5qb2luKCJcbiIpLAogICAgfSk7Cn0KLyoqCiAqIEZldGNoIGZ1bGwgZW1haWwgYm9keSBhbmQgcnVuIHRocm91Z2ggdGhlIGluc3RhbmNlIGVtYWlsIGhhbmRsZXIuCiAqLwphc3luYyBmdW5jdGlvbiBwcm9jZXNzRGFzaEVtYWlsKG0pIHsKICAgIGlmICghZGFzaEVtYWlsSGFuZGxlcikKICAgICAgICByZXR1cm47CiAgICAvLyBGZXRjaCBmdWxsIG1lc3NhZ2Ugd2l0aCBib2R5CiAgICBjb25zdCBmdWxsID0gYXdhaXQgZ2V0TWVzc2FnZShtLmlkKTsKICAgIGlmICghZnVsbC5vayB8fCAhZnVsbC5tZXNzYWdlKSB7CiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZnVsbCAke2dldEluc3RhbmNlTmFtZSgpfSBlbWFpbGAsIHsgbWVzc2FnZUlkOiBtLmlkIH0pOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGVtYWlsQm9keSA9IGZ1bGwubWVzc2FnZS5ib2R5Py50cmltKCk7CiAgICBpZiAoIWVtYWlsQm9keSkgewogICAgICAgIGxvZy53YXJuKGAke2dldEluc3RhbmNlTmFtZSgpfSBlbWFpbCBoYXMgbm8gYm9keWAsIHsgbWVzc2FnZUlkOiBtLmlkLCBzdWJqZWN0OiBtLnN1YmplY3QgfSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbG9nLmluZm8oYFByb2Nlc3NpbmcgJHtnZXRJbnN0YW5jZU5hbWUoKX0gZW1haWxgLCB7IGZyb206IG0uZnJvbSwgc3ViamVjdDogbS5zdWJqZWN0LCBib2R5TGVuZ3RoOiBlbWFpbEJvZHkubGVuZ3RoIH0pOwogICAgY29uc3QgcmVwbHkgPSBhd2FpdCBkYXNoRW1haWxIYW5kbGVyKGZ1bGwubWVzc2FnZSk7CiAgICBpZiAoIXJlcGx5KSB7CiAgICAgICAgbG9nLndhcm4oYCR7Z2V0SW5zdGFuY2VOYW1lKCl9IGVtYWlsIGhhbmRsZXIgcmV0dXJuZWQgbm8gcmVwbHlgLCB7IG1lc3NhZ2VJZDogbS5pZCB9KTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAvLyBTZW5kIHJlcGx5IHZpYSBzZW5kRW1haWwgKGltcG9ydGVkIGR5bmFtaWNhbGx5IHRvIGF2b2lkIGNpcmN1bGFyIGRlcHMpCiAgICBjb25zdCB7IHNlbmRFbWFpbCB9ID0gYXdhaXQgaW1wb3J0KCIuL2dtYWlsLXNlbmQuanMiKTsKICAgIGNvbnN0IHNlbmRlckVtYWlsID0gZXh0cmFjdEVtYWlsKG0uZnJvbSk7CiAgICBjb25zdCBzdWJqZWN0ID0gbS5zdWJqZWN0LnN0YXJ0c1dpdGgoIlJlOiIpID8gbS5zdWJqZWN0IDogYFJlOiAke20uc3ViamVjdH1gOwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VuZEVtYWlsKHsKICAgICAgICB0bzogc2VuZGVyRW1haWwsCiAgICAgICAgc3ViamVjdCwKICAgICAgICBib2R5OiByZXBseSwKICAgICAgICB0aHJlYWRJZDogbS50aHJlYWRJZCwKICAgICAgICBpblJlcGx5VG86IG0ucmZjODIyTWVzc2FnZUlkLAogICAgfSk7CiAgICBpZiAocmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nLmluZm8oYFJlcGxpZWQgdG8gJHtnZXRJbnN0YW5jZU5hbWUoKX0gZW1haWxgLCB7IHRvOiBzZW5kZXJFbWFpbCwgc3ViamVjdCB9KTsKICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogImdtYWlsIiwgc3VtbWFyeTogYCR7Z2V0SW5zdGFuY2VOYW1lKCl9IHJlcGxpZWQgdG8gZW1haWwgZnJvbSAke3NlbmRlckVtYWlsfTogIiR7bS5zdWJqZWN0fSJgLCBhY3Rpb25MYWJlbDogIkFVVE9OT01PVVMiLCByZWFzb246IGAke2dldEluc3RhbmNlTmFtZSgpfS1hZGRyZXNzZWQgZW1haWwgYXV0by1yZXBseWAgfSk7CiAgICAgICAgcHVzaE5vdGlmaWNhdGlvbih7CiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBzb3VyY2U6ICJnbWFpbCIsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBSZXBsaWVkIHRvIGVtYWlsIGZyb20gKioke20uZnJvbS5zcGxpdCgiPCIpWzBdLnRyaW0oKX0qKjogIiR7bS5zdWJqZWN0fSJgLAogICAgICAgIH0pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gcmVwbHkgdG8gJHtnZXRJbnN0YW5jZU5hbWUoKX0gZW1haWxgLCB7IHRvOiBzZW5kZXJFbWFpbCwgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pOwogICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAiZ21haWwiLCBzdW1tYXJ5OiBgRmFpbGVkIHRvIHJlcGx5IHRvICR7Z2V0SW5zdGFuY2VOYW1lKCl9IGVtYWlsOiAke3Jlc3VsdC5tZXNzYWdlfWAsIGFjdGlvbkxhYmVsOiAiQVVUT05PTU9VUyIsIHJlYXNvbjogYCR7Z2V0SW5zdGFuY2VOYW1lKCl9LWFkZHJlc3NlZCBlbWFpbCBhdXRvLXJlcGx5IGZhaWxlZGAgfSk7CiAgICB9Cn0KLyoqIEV4dHJhY3QgZW1haWwgYWRkcmVzcyBmcm9tICJOYW1lIDxlbWFpbD4iIGZvcm1hdC4gKi8KZnVuY3Rpb24gZXh0cmFjdEVtYWlsKGZyb20pIHsKICAgIGNvbnN0IG1hdGNoID0gZnJvbS5tYXRjaCgvPCguKz8pPi8pOwogICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBmcm9tLnRyaW0oKTsKfQovKioKICogU3RvcCB0aGUgR21haWwgcG9sbGluZyB0aW1lci4KICovCmV4cG9ydCBmdW5jdGlvbiBzdG9wR21haWxUaW1lcigpIHsKICAgIGlmICh0aW1lcikgewogICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgIHRpbWVyID0gbnVsbDsKICAgIH0KICAgIHNlZW5NZXNzYWdlSWRzLmNsZWFyKCk7CiAgICBpbml0aWFsaXplZCA9IGZhbHNlOwp9Ci8qKgogKiBDaGVjayBpZiB0aGUgR21haWwgdGltZXIgaXMgcnVubmluZy4KICovCmV4cG9ydCBmdW5jdGlvbiBpc0dtYWlsVGltZXJSdW5uaW5nKCkgewogICAgcmV0dXJuIHRpbWVyICE9PSBudWxsOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWdtYWlsLXRpbWVyLmpzLm1hcA==","google/gmail.js":"LyoqCiAqIEdtYWlsIEFQSSBjbGllbnQuCiAqIFJhdyBmZXRjaCB2aWEgZ29vZ2xlR2V0L2dvb2dsZVBvc3Qg4oCUIG5vIFNESy4KICogQWxsIGZ1bmN0aW9ucyByZXR1cm4geyBvaywgZGF0YT8sIG1lc3NhZ2UgfSDigJQgbmV2ZXIgdGhyb3cuCiAqLwppbXBvcnQgeyBnb29nbGVHZXQsIGdvb2dsZVBvc3QsIGlzR29vZ2xlQXV0aGVudGljYXRlZCB9IGZyb20gIi4vYXV0aC5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiZ29vZ2xlLmdtYWlsIik7CmNvbnN0IEdNQUlMX0FQSSA9ICJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9nbWFpbC92MS91c2Vycy9tZSI7Ci8vIC0tLSBIZWxwZXJzIC0tLQpmdW5jdGlvbiBnZXRIZWFkZXIobXNnLCBuYW1lKSB7CiAgICByZXR1cm4gbXNnLnBheWxvYWQ/LmhlYWRlcnM/LmZpbmQoKGgpID0+IGgubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpPy52YWx1ZSA/PyAiIjsKfQpmdW5jdGlvbiBkZWNvZGVCYXNlNjRVcmwoZGF0YSkgewogICAgLy8gR21haWwgdXNlcyBVUkwtc2FmZSBiYXNlNjQg4oCUIHJlcGxhY2UgY2hhcnMgYW5kIHBhZAogICAgY29uc3QgYmFzZTY0ID0gZGF0YS5yZXBsYWNlKC8tL2csICIrIikucmVwbGFjZSgvXy9nLCAiLyIpOwogICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJhc2U2NCwgImJhc2U2NCIpLnRvU3RyaW5nKCJ1dGYtOCIpOwp9CmZ1bmN0aW9uIGV4dHJhY3RUZXh0Qm9keShwYXJ0KSB7CiAgICBpZiAocGFydC5taW1lVHlwZSA9PT0gInRleHQvcGxhaW4iICYmIHBhcnQuYm9keT8uZGF0YSkgewogICAgICAgIHJldHVybiBkZWNvZGVCYXNlNjRVcmwocGFydC5ib2R5LmRhdGEpOwogICAgfQogICAgaWYgKHBhcnQucGFydHMpIHsKICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiBwYXJ0LnBhcnRzKSB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBleHRyYWN0VGV4dEJvZHkoc3ViKTsKICAgICAgICAgICAgaWYgKHRleHQpCiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gIiI7Cn0KZnVuY3Rpb24gcGFyc2VNZXNzYWdlKG1zZykgewogICAgY29uc3QgbGFiZWxzID0gbXNnLmxhYmVsSWRzID8/IFtdOwogICAgY29uc3QgcmZjODIyTWVzc2FnZUlkID0gZ2V0SGVhZGVyKG1zZywgIk1lc3NhZ2UtSUQiKSB8fCB1bmRlZmluZWQ7CiAgICByZXR1cm4gewogICAgICAgIGlkOiBtc2cuaWQsCiAgICAgICAgdGhyZWFkSWQ6IG1zZy50aHJlYWRJZCwKICAgICAgICBzdWJqZWN0OiBnZXRIZWFkZXIobXNnLCAiU3ViamVjdCIpIHx8ICIobm8gc3ViamVjdCkiLAogICAgICAgIGZyb206IGdldEhlYWRlcihtc2csICJGcm9tIiksCiAgICAgICAgdG86IGdldEhlYWRlcihtc2csICJUbyIpLAogICAgICAgIGRhdGU6IGdldEhlYWRlcihtc2csICJEYXRlIikgfHwgKG1zZy5pbnRlcm5hbERhdGUgPyBuZXcgRGF0ZShwYXJzZUludChtc2cuaW50ZXJuYWxEYXRlKSkudG9JU09TdHJpbmcoKSA6ICIiKSwKICAgICAgICBzbmlwcGV0OiBtc2cuc25pcHBldCA/PyAiIiwKICAgICAgICBsYWJlbHMsCiAgICAgICAgaXNVbnJlYWQ6IGxhYmVscy5pbmNsdWRlcygiVU5SRUFEIiksCiAgICAgICAgcmZjODIyTWVzc2FnZUlkLAogICAgfTsKfQpmdW5jdGlvbiBwYXJzZU1lc3NhZ2VXaXRoQm9keShtc2cpIHsKICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlTWVzc2FnZShtc2cpOwogICAgLy8gRXh0cmFjdCBwbGFpbiB0ZXh0IGJvZHkKICAgIGlmIChtc2cucGF5bG9hZCkgewogICAgICAgIGxldCBib2R5ID0gIiI7CiAgICAgICAgaWYgKG1zZy5wYXlsb2FkLmJvZHk/LmRhdGEpIHsKICAgICAgICAgICAgYm9keSA9IGRlY29kZUJhc2U2NFVybChtc2cucGF5bG9hZC5ib2R5LmRhdGEpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChtc2cucGF5bG9hZC5wYXJ0cykgewogICAgICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgbXNnLnBheWxvYWQucGFydHMpIHsKICAgICAgICAgICAgICAgIGJvZHkgPSBleHRyYWN0VGV4dEJvZHkocGFydCk7CiAgICAgICAgICAgICAgICBpZiAoYm9keSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwYXJzZWQuYm9keSA9IGJvZHk7CiAgICB9CiAgICByZXR1cm4gcGFyc2VkOwp9Ci8vIC0tLSBQdWJsaWMgQVBJIC0tLQovKioKICogQ2hlY2sgaWYgR21haWwgaXMgcmVhZHkgKEdvb2dsZSBhdXRoZW50aWNhdGVkKS4KICovCmV4cG9ydCBmdW5jdGlvbiBpc0dtYWlsQXZhaWxhYmxlKCkgewogICAgcmV0dXJuIGlzR29vZ2xlQXV0aGVudGljYXRlZCgpOwp9Ci8qKgogKiBHZXQgcmVjZW50IG1lc3NhZ2VzIGZyb20gdGhlIGxhc3QgTiBob3VycyAoaGVhZGVycyArIHNuaXBwZXQsIG5vIGJvZHkpLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlY2VudE1lc3NhZ2VzKGhvdXJzID0gMjQpIHsKICAgIGxvZy5kZWJ1ZygiRmV0Y2hpbmcgcmVjZW50IG1lc3NhZ2VzIiwgeyBob3VycyB9KTsKICAgIGNvbnN0IGFmdGVyRXBvY2ggPSBNYXRoLmZsb29yKChEYXRlLm5vdygpIC0gaG91cnMgKiA2MCAqIDYwICogMTAwMCkgLyAxMDAwKTsKICAgIGNvbnN0IHF1ZXJ5ID0gYGFmdGVyOiR7YWZ0ZXJFcG9jaH1gOwogICAgY29uc3QgbGlzdFJlc3VsdCA9IGF3YWl0IGdvb2dsZUdldChgJHtHTUFJTF9BUEl9L21lc3NhZ2VzYCwgeyBxOiBxdWVyeSwgbWF4UmVzdWx0czogIjMwIiB9KTsKICAgIGlmICghbGlzdFJlc3VsdC5vaykgewogICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIGxpc3QgcmVjZW50IG1lc3NhZ2VzIiwgeyBob3VycywgZXJyb3I6IGxpc3RSZXN1bHQubWVzc2FnZSB9KTsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGxpc3RSZXN1bHQubWVzc2FnZSB9OwogICAgfQogICAgY29uc3QgaWRzID0gbGlzdFJlc3VsdC5kYXRhPy5tZXNzYWdlcyA/PyBbXTsKICAgIGlmIChpZHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgbG9nLmRlYnVnKCJObyByZWNlbnQgbWVzc2FnZXMgZm91bmQiLCB7IGhvdXJzIH0pOwogICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBtZXNzYWdlczogW10sIG1lc3NhZ2U6ICJObyByZWNlbnQgbWVzc2FnZXMiIH07CiAgICB9CiAgICAvLyBGZXRjaCBlYWNoIG1lc3NhZ2UgbWV0YWRhdGEgKHBhcmFsbGVsLCBsaW1pdCB0byAyMCkKICAgIGNvbnN0IGZldGNoZXMgPSBpZHMuc2xpY2UoMCwgMjApLm1hcChhc3luYyAoeyBpZCB9KSA9PiB7CiAgICAgICAgY29uc3QgciA9IGF3YWl0IGdvb2dsZUdldChgJHtHTUFJTF9BUEl9L21lc3NhZ2VzLyR7aWR9YCwgeyBmb3JtYXQ6ICJtZXRhZGF0YSIsIG1ldGFkYXRhSGVhZGVyczogWyJTdWJqZWN0IiwgIkZyb20iLCAiVG8iLCAiRGF0ZSJdIH0pOwogICAgICAgIHJldHVybiByLm9rICYmIHIuZGF0YSA/IHBhcnNlTWVzc2FnZShyLmRhdGEpIDogbnVsbDsKICAgIH0pOwogICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGZldGNoZXMpOwogICAgY29uc3QgbWVzc2FnZXMgPSByZXN1bHRzLmZpbHRlcigobSkgPT4gbSAhPT0gbnVsbCk7CiAgICBsb2cuaW5mbygiRmV0Y2hlZCByZWNlbnQgbWVzc2FnZXMiLCB7IGhvdXJzLCBjb3VudDogbWVzc2FnZXMubGVuZ3RoIH0pOwogICAgcmV0dXJuIHsgb2s6IHRydWUsIG1lc3NhZ2VzLCBtZXNzYWdlOiBgJHttZXNzYWdlcy5sZW5ndGh9IG1lc3NhZ2VzIGluIGxhc3QgJHtob3Vyc31oYCB9Owp9Ci8qKgogKiBHZXQgYSBzaW5nbGUgbWVzc2FnZSB3aXRoIGZ1bGwgYm9keS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNZXNzYWdlKGlkKSB7CiAgICBsb2cuZGVidWcoIkZldGNoaW5nIG1lc3NhZ2UiLCB7IG1lc3NhZ2VJZDogaWQgfSk7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnb29nbGVHZXQoYCR7R01BSUxfQVBJfS9tZXNzYWdlcy8ke2lkfWAsIHsgZm9ybWF0OiAiZnVsbCIgfSk7CiAgICBpZiAoIXJlc3VsdC5vaykgewogICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIGZldGNoIG1lc3NhZ2UiLCB7IG1lc3NhZ2VJZDogaWQsIGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIHN0YXR1czogcmVzdWx0Lm1lc3NhZ2UgfTsKICAgIH0KICAgIGxvZy5kZWJ1ZygiTWVzc2FnZSBmZXRjaGVkIiwgeyBtZXNzYWdlSWQ6IGlkIH0pOwogICAgcmV0dXJuIHsKICAgICAgICBvazogdHJ1ZSwKICAgICAgICBtZXNzYWdlOiBwYXJzZU1lc3NhZ2VXaXRoQm9keShyZXN1bHQuZGF0YSksCiAgICAgICAgc3RhdHVzOiAiT0siLAogICAgfTsKfQovKioKICogR2V0IGEgZnVsbCBjb252ZXJzYXRpb24gdGhyZWFkLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRocmVhZCh0aHJlYWRJZCkgewogICAgbG9nLmRlYnVnKCJGZXRjaGluZyB0aHJlYWQiLCB7IHRocmVhZElkIH0pOwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ29vZ2xlR2V0KGAke0dNQUlMX0FQSX0vdGhyZWFkcy8ke3RocmVhZElkfWAsIHsgZm9ybWF0OiAiZnVsbCIgfSk7CiAgICBpZiAoIXJlc3VsdC5vaykgewogICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIGZldGNoIHRocmVhZCIsIHsgdGhyZWFkSWQsIGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlIH07CiAgICB9CiAgICBjb25zdCByYXdNZXNzYWdlcyA9IHJlc3VsdC5kYXRhPy5tZXNzYWdlcyA/PyBbXTsKICAgIGNvbnN0IG1lc3NhZ2VzID0gcmF3TWVzc2FnZXMubWFwKHBhcnNlTWVzc2FnZVdpdGhCb2R5KTsKICAgIGNvbnN0IHN1YmplY3QgPSBtZXNzYWdlc1swXT8uc3ViamVjdCA/PyAiKG5vIHN1YmplY3QpIjsKICAgIGxvZy5kZWJ1ZygiVGhyZWFkIGZldGNoZWQiLCB7IHRocmVhZElkLCBtZXNzYWdlQ291bnQ6IG1lc3NhZ2VzLmxlbmd0aCB9KTsKICAgIHJldHVybiB7CiAgICAgICAgb2s6IHRydWUsCiAgICAgICAgdGhyZWFkOiB7IGlkOiB0aHJlYWRJZCwgbWVzc2FnZXMsIHN1YmplY3QgfSwKICAgICAgICBtZXNzYWdlOiBgVGhyZWFkIHdpdGggJHttZXNzYWdlcy5sZW5ndGh9IG1lc3NhZ2VzYCwKICAgIH07Cn0KLyoqCiAqIFNlYXJjaCBtZXNzYWdlcyB1c2luZyBHbWFpbCBzZWFyY2ggc3ludGF4LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlYXJjaE1lc3NhZ2VzKHF1ZXJ5LCBtYXhSZXN1bHRzID0gMTApIHsKICAgIGxvZy5kZWJ1ZygiU2VhcmNoaW5nIG1lc3NhZ2VzIiwgeyBxdWVyeSwgbWF4UmVzdWx0cyB9KTsKICAgIGNvbnN0IGxpc3RSZXN1bHQgPSBhd2FpdCBnb29nbGVHZXQoYCR7R01BSUxfQVBJfS9tZXNzYWdlc2AsIHsgcTogcXVlcnksIG1heFJlc3VsdHM6IFN0cmluZyhtYXhSZXN1bHRzKSB9KTsKICAgIGlmICghbGlzdFJlc3VsdC5vaykgewogICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIHNlYXJjaCBtZXNzYWdlcyIsIHsgcXVlcnksIGVycm9yOiBsaXN0UmVzdWx0Lm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBsaXN0UmVzdWx0Lm1lc3NhZ2UgfTsKICAgIH0KICAgIGNvbnN0IGlkcyA9IGxpc3RSZXN1bHQuZGF0YT8ubWVzc2FnZXMgPz8gW107CiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGxvZy5kZWJ1ZygiTm8gbWVzc2FnZXMgbWF0Y2hlZCBzZWFyY2giLCB7IHF1ZXJ5IH0pOwogICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBtZXNzYWdlczogW10sIG1lc3NhZ2U6IGBObyBtZXNzYWdlcyBtYXRjaGluZzogJHtxdWVyeX1gIH07CiAgICB9CiAgICBjb25zdCBmZXRjaGVzID0gaWRzLm1hcChhc3luYyAoeyBpZCB9KSA9PiB7CiAgICAgICAgY29uc3QgciA9IGF3YWl0IGdvb2dsZUdldChgJHtHTUFJTF9BUEl9L21lc3NhZ2VzLyR7aWR9YCwgeyBmb3JtYXQ6ICJtZXRhZGF0YSIsIG1ldGFkYXRhSGVhZGVyczogWyJTdWJqZWN0IiwgIkZyb20iLCAiVG8iLCAiRGF0ZSJdIH0pOwogICAgICAgIHJldHVybiByLm9rICYmIHIuZGF0YSA/IHBhcnNlTWVzc2FnZShyLmRhdGEpIDogbnVsbDsKICAgIH0pOwogICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGZldGNoZXMpOwogICAgY29uc3QgbWVzc2FnZXMgPSByZXN1bHRzLmZpbHRlcigobSkgPT4gbSAhPT0gbnVsbCk7CiAgICBsb2cuZGVidWcoIlNlYXJjaCBjb21wbGV0ZSIsIHsgcXVlcnksIHJlc3VsdENvdW50OiBtZXNzYWdlcy5sZW5ndGggfSk7CiAgICByZXR1cm4geyBvazogdHJ1ZSwgbWVzc2FnZXMsIG1lc3NhZ2U6IGAke21lc3NhZ2VzLmxlbmd0aH0gcmVzdWx0cyBmb3I6ICR7cXVlcnl9YCB9Owp9Ci8qKgogKiBHZXQgdW5yZWFkIG1lc3NhZ2UgY291bnQuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VW5yZWFkQ291bnQoKSB7CiAgICBsb2cuZGVidWcoIkZldGNoaW5nIHVucmVhZCBjb3VudCIpOwogICAgY29uc3QgbGlzdFJlc3VsdCA9IGF3YWl0IGdvb2dsZUdldChgJHtHTUFJTF9BUEl9L21lc3NhZ2VzYCwgeyBxOiAiaXM6dW5yZWFkIiwgbWF4UmVzdWx0czogIjEiIH0pOwogICAgaWYgKCFsaXN0UmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggdW5yZWFkIGNvdW50IiwgeyBlcnJvcjogbGlzdFJlc3VsdC5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogbGlzdFJlc3VsdC5tZXNzYWdlIH07CiAgICB9CiAgICBjb25zdCBjb3VudCA9IGxpc3RSZXN1bHQuZGF0YT8ucmVzdWx0U2l6ZUVzdGltYXRlID8/IDA7CiAgICBsb2cuZGVidWcoIlVucmVhZCBjb3VudCBmZXRjaGVkIiwgeyBjb3VudCB9KTsKICAgIHJldHVybiB7CiAgICAgICAgb2s6IHRydWUsCiAgICAgICAgY291bnQsCiAgICAgICAgbWVzc2FnZTogYCR7Y291bnR9IHVucmVhZGAsCiAgICB9Owp9Ci8qKgogKiBGb3JtYXQgbWVzc2FnZXMgYXMgYSByZWFkYWJsZSB0ZXh0IGJsb2NrIGZvciBMTE0gY29udGV4dCBpbmplY3Rpb24uCiAqLwpleHBvcnQgZnVuY3Rpb24gZm9ybWF0TWVzc2FnZXNGb3JDb250ZXh0KG1lc3NhZ2VzKSB7CiAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKQogICAgICAgIHJldHVybiAiTm8gbWVzc2FnZXMuIjsKICAgIHJldHVybiBtZXNzYWdlcwogICAgICAgIC5tYXAoKG0pID0+IHsKICAgICAgICBjb25zdCB1bnJlYWQgPSBtLmlzVW5yZWFkID8gIiBbVU5SRUFEXSIgOiAiIjsKICAgICAgICBjb25zdCBkYXRlID0gbS5kYXRlCiAgICAgICAgICAgID8gbmV3IERhdGUobS5kYXRlKS50b0xvY2FsZVN0cmluZygiZW4tVVMiLCB7CiAgICAgICAgICAgICAgICBtb250aDogInNob3J0IiwKICAgICAgICAgICAgICAgIGRheTogIm51bWVyaWMiLAogICAgICAgICAgICAgICAgaG91cjogIm51bWVyaWMiLAogICAgICAgICAgICAgICAgbWludXRlOiAiMi1kaWdpdCIsCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIDogIiI7CiAgICAgICAgY29uc3QgbXNnSWQgPSBtLnJmYzgyMk1lc3NhZ2VJZCA/IGAsIG1lc3NhZ2VJZDogJHttLnJmYzgyMk1lc3NhZ2VJZH1gIDogIiI7CiAgICAgICAgcmV0dXJuIGAtICR7ZGF0ZX06ICR7bS5mcm9tfSDigJQgIiR7bS5zdWJqZWN0fSIke3VucmVhZH0gW3RocmVhZElkOiAke20udGhyZWFkSWR9JHttc2dJZH1dXG4gICR7bS5zbmlwcGV0fWA7CiAgICB9KQogICAgICAgIC5qb2luKCJcbiIpOwp9Ci8qKgogKiBNYXJrIGEgbWVzc2FnZSBhcyByZWFkIChyZW1vdmUgVU5SRUFEIGxhYmVsKS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXJrQXNSZWFkKG1lc3NhZ2VJZCkgewogICAgbG9nLmRlYnVnKCJNYXJraW5nIG1lc3NhZ2UgYXMgcmVhZCIsIHsgbWVzc2FnZUlkIH0pOwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ29vZ2xlUG9zdChgJHtHTUFJTF9BUEl9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9tb2RpZnlgLCB7IHJlbW92ZUxhYmVsSWRzOiBbIlVOUkVBRCJdIH0pOwogICAgaWYgKCFyZXN1bHQub2spIHsKICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBtYXJrIG1lc3NhZ2UgYXMgcmVhZCIsIHsgbWVzc2FnZUlkLCBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9OwogICAgfQogICAgbG9nLmRlYnVnKCJNZXNzYWdlIG1hcmtlZCBhcyByZWFkIiwgeyBtZXNzYWdlSWQgfSk7CiAgICByZXR1cm4geyBvazogdHJ1ZSwgbWVzc2FnZTogYE1hcmtlZCAke21lc3NhZ2VJZH0gYXMgcmVhZGAgfTsKfQovKioKICogTWFyayBhIG1lc3NhZ2UgYXMgdW5yZWFkIChhZGQgVU5SRUFEIGxhYmVsKS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXJrQXNVbnJlYWQobWVzc2FnZUlkKSB7CiAgICBsb2cuZGVidWcoIk1hcmtpbmcgbWVzc2FnZSBhcyB1bnJlYWQiLCB7IG1lc3NhZ2VJZCB9KTsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdvb2dsZVBvc3QoYCR7R01BSUxfQVBJfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH0vbW9kaWZ5YCwgeyBhZGRMYWJlbElkczogWyJVTlJFQUQiXSB9KTsKICAgIGlmICghcmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gbWFyayBtZXNzYWdlIGFzIHVucmVhZCIsIHsgbWVzc2FnZUlkLCBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9OwogICAgfQogICAgbG9nLmRlYnVnKCJNZXNzYWdlIG1hcmtlZCBhcyB1bnJlYWQiLCB7IG1lc3NhZ2VJZCB9KTsKICAgIHJldHVybiB7IG9rOiB0cnVlLCBtZXNzYWdlOiBgTWFya2VkICR7bWVzc2FnZUlkfSBhcyB1bnJlYWRgIH07Cn0KLyoqCiAqIEJhdGNoIG1hcmsgbXVsdGlwbGUgbWVzc2FnZXMgYXMgcmVhZC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaE1hcmtBc1JlYWQobWVzc2FnZUlkcykgewogICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKG1lc3NhZ2VJZHMubWFwKG1hcmtBc1JlYWQpKTsKICAgIGNvbnN0IHN1Y2NlZWRlZCA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiByLm9rKS5sZW5ndGg7CiAgICBjb25zdCBmYWlsZWQgPSByZXN1bHRzLmxlbmd0aCAtIHN1Y2NlZWRlZDsKICAgIHJldHVybiB7CiAgICAgICAgb2s6IGZhaWxlZCA9PT0gMCwKICAgICAgICBzdWNjZWVkZWQsCiAgICAgICAgZmFpbGVkLAogICAgICAgIG1lc3NhZ2U6IGBNYXJrZWQgJHtzdWNjZWVkZWR9LyR7cmVzdWx0cy5sZW5ndGh9IGFzIHJlYWRgLAogICAgfTsKfQovKioKICogQmF0Y2ggbWFyayBtdWx0aXBsZSBtZXNzYWdlcyBhcyB1bnJlYWQuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gYmF0Y2hNYXJrQXNVbnJlYWQobWVzc2FnZUlkcykgewogICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKG1lc3NhZ2VJZHMubWFwKG1hcmtBc1VucmVhZCkpOwogICAgY29uc3Qgc3VjY2VlZGVkID0gcmVzdWx0cy5maWx0ZXIoKHIpID0+IHIub2spLmxlbmd0aDsKICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMubGVuZ3RoIC0gc3VjY2VlZGVkOwogICAgcmV0dXJuIHsKICAgICAgICBvazogZmFpbGVkID09PSAwLAogICAgICAgIHN1Y2NlZWRlZCwKICAgICAgICBmYWlsZWQsCiAgICAgICAgbWVzc2FnZTogYE1hcmtlZCAke3N1Y2NlZWRlZH0vJHtyZXN1bHRzLmxlbmd0aH0gYXMgdW5yZWFkYCwKICAgIH07Cn0KLy8gLS0tIFNlbmRlciBjYXRlZ29yaXphdGlvbiAmIHByaW9yaXR5IGRldGVjdGlvbiAtLS0KY29uc3QgTk9SRVBMWV9QQVRURVJOUyA9IFsKICAgIC9ebm8tP3JlcGx5QC9pLAogICAgL15ub3JlcGx5QC9pLAogICAgL15kb25vdHJlcGx5QC9pLAogICAgL15kby1ub3QtcmVwbHlAL2ksCiAgICAvXm1haWxlci1kYWVtb25AL2ksCiAgICAvXm5vdGlmaWNhdGlvbnM/QC9pLAogICAgL15hbGVydChzKT9AL2ksCiAgICAvXmluZm9AL2ksCl07CmNvbnN0IFNPQ0lBTF9ET01BSU5TID0gWwogICAgImZhY2Vib29rbWFpbC5jb20iLCAibGlua2VkaW4uY29tIiwgInR3aXR0ZXIuY29tIiwgInguY29tIiwKICAgICJpbnN0YWdyYW0uY29tIiwgInRpa3Rvay5jb20iLCAicGludGVyZXN0LmNvbSIsICJyZWRkaXQuY29tIiwKICAgICJkaXNjb3JkLmNvbSIsICJzbGFjay5jb20iLCAibWVkaXVtLmNvbSIsCl07CmNvbnN0IE5FV1NMRVRURVJfUEFUVEVSTlMgPSBbCiAgICAvXm5ld3NsZXR0ZXJAL2ksCiAgICAvXmRpZ2VzdEAvaSwKICAgIC9edXBkYXRlcz9AL2ksCiAgICAvXndlZWtseUAvaSwKICAgIC9eZGFpbHlAL2ksCiAgICAvXm5ld3NAL2ksCiAgICAvXnN1YnNjcmliZUAvaSwKXTsKLyoqCiAqIEV4dHJhY3QgZW1haWwgYWRkcmVzcyBmcm9tIGEgIk5hbWUgPGVtYWlsPiIgZm9ybWF0dGVkIEZyb20gaGVhZGVyLgogKi8KZnVuY3Rpb24gZXh0cmFjdEVtYWlsKGZyb20pIHsKICAgIGNvbnN0IG1hdGNoID0gZnJvbS5tYXRjaCgvPChbXj5dKyk+Lyk7CiAgICByZXR1cm4gKG1hdGNoID8gbWF0Y2hbMV0gOiBmcm9tKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsKfQovKioKICogRXh0cmFjdCBkb21haW4gZnJvbSBhbiBlbWFpbCBhZGRyZXNzLgogKi8KZnVuY3Rpb24gZXh0cmFjdERvbWFpbihlbWFpbCkgewogICAgY29uc3QgcGFydHMgPSBlbWFpbC5zcGxpdCgiQCIpOwogICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0c1sxXSA6ICIiOwp9Ci8qKgogKiBDYXRlZ29yaXplIGEgc2VuZGVyIGJhc2VkIG9uIGVtYWlsIGFkZHJlc3MgYW5kIEdtYWlsIGxhYmVscy4KICovCmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yaXplU2VuZGVyKGZyb20sIGxhYmVscykgewogICAgLy8gR21haWwgY2F0ZWdvcnkgbGFiZWxzIHRha2UgcHJlY2VkZW5jZQogICAgaWYgKGxhYmVscy5pbmNsdWRlcygiQ0FURUdPUllfU09DSUFMIikpCiAgICAgICAgcmV0dXJuICJzb2NpYWwiOwogICAgaWYgKGxhYmVscy5pbmNsdWRlcygiQ0FURUdPUllfUFJPTU9USU9OUyIpKQogICAgICAgIHJldHVybiAicHJvbW90aW9uIjsKICAgIGlmIChsYWJlbHMuaW5jbHVkZXMoIkNBVEVHT1JZX0ZPUlVNUyIpKQogICAgICAgIHJldHVybiAiZm9ydW0iOwogICAgaWYgKGxhYmVscy5pbmNsdWRlcygiQ0FURUdPUllfVVBEQVRFUyIpKQogICAgICAgIHJldHVybiAidXBkYXRlIjsKICAgIGNvbnN0IGVtYWlsID0gZXh0cmFjdEVtYWlsKGZyb20pOwogICAgY29uc3QgZG9tYWluID0gZXh0cmFjdERvbWFpbihlbWFpbCk7CiAgICAvLyBTb2NpYWwgZG9tYWluIGNoZWNrCiAgICBpZiAoU09DSUFMX0RPTUFJTlMuc29tZSgoZCkgPT4gZG9tYWluLmVuZHNXaXRoKGQpKSkKICAgICAgICByZXR1cm4gInNvY2lhbCI7CiAgICAvLyBOZXdzbGV0dGVyIHBhdHRlcm5zCiAgICBpZiAoTkVXU0xFVFRFUl9QQVRURVJOUy5zb21lKChwKSA9PiBwLnRlc3QoZW1haWwpKSkKICAgICAgICByZXR1cm4gIm5ld3NsZXR0ZXIiOwogICAgLy8gTm9yZXBseSAvIG5vdGlmaWNhdGlvbiBwYXR0ZXJucwogICAgaWYgKE5PUkVQTFlfUEFUVEVSTlMuc29tZSgocCkgPT4gcC50ZXN0KGVtYWlsKSkpCiAgICAgICAgcmV0dXJuICJub3RpZmljYXRpb24iOwogICAgLy8gQ0FURUdPUllfUFJJTUFSWSBvciBubyBjYXRlZ29yeSBsYWJlbCDihpIgZGlyZWN0CiAgICBpZiAobGFiZWxzLmluY2x1ZGVzKCJDQVRFR09SWV9QUklNQVJZIikpCiAgICAgICAgcmV0dXJuICJkaXJlY3QiOwogICAgcmV0dXJuICJ1bmtub3duIjsKfQovKioKICogRGV0ZWN0IG1lc3NhZ2UgcHJpb3JpdHkgZnJvbSBHbWFpbCBsYWJlbHMgYW5kIGhlYWRlcnMuCiAqIEhpZ2g6IElNUE9SVEFOVCBsYWJlbCBvciBTVEFSUkVELgogKiBMb3c6ICBwcm9tb3Rpb25zLCBzb2NpYWwsIGZvcnVtcy4KICogTm9ybWFsOiBldmVyeXRoaW5nIGVsc2UuCiAqLwpleHBvcnQgZnVuY3Rpb24gZGV0ZWN0UHJpb3JpdHkobGFiZWxzLCBzZW5kZXJDYXRlZ29yeSkgewogICAgaWYgKGxhYmVscy5pbmNsdWRlcygiSU1QT1JUQU5UIikgfHwgbGFiZWxzLmluY2x1ZGVzKCJTVEFSUkVEIikpCiAgICAgICAgcmV0dXJuICJoaWdoIjsKICAgIGlmIChzZW5kZXJDYXRlZ29yeSA9PT0gInByb21vdGlvbiIgfHwgc2VuZGVyQ2F0ZWdvcnkgPT09ICJzb2NpYWwiIHx8IHNlbmRlckNhdGVnb3J5ID09PSAiZm9ydW0iKQogICAgICAgIHJldHVybiAibG93IjsKICAgIHJldHVybiAibm9ybWFsIjsKfQovKioKICogRW5yaWNoIGEgR21haWxNZXNzYWdlIHdpdGggcHJpb3JpdHkgYW5kIHNlbmRlciBjYXRlZ29yeS4KICovCmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yaXplTWVzc2FnZShtc2cpIHsKICAgIGNvbnN0IHNlbmRlckNhdGVnb3J5ID0gY2F0ZWdvcml6ZVNlbmRlcihtc2cuZnJvbSwgbXNnLmxhYmVscyk7CiAgICBjb25zdCBwcmlvcml0eSA9IGRldGVjdFByaW9yaXR5KG1zZy5sYWJlbHMsIHNlbmRlckNhdGVnb3J5KTsKICAgIHJldHVybiB7IC4uLm1zZywgcHJpb3JpdHksIHNlbmRlckNhdGVnb3J5IH07Cn0KLy8gLS0tIEJhdGNoIHRyaWFnZSBoZWxwZXJzIC0tLQovKioKICogQ2F0ZWdvcml6ZSBhbiBhcnJheSBvZiBtZXNzYWdlcyBieSBzZW5kZXIgdHlwZS4KICogUmV0dXJucyBtZXNzYWdlcyBncm91cGVkIGJ5IGNhdGVnb3J5LCBzb3J0ZWQgd2l0aCBkaXJlY3QgZmlyc3QuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY2F0ZWdvcml6ZU1lc3NhZ2VzKGhvdXJzID0gMjQpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlY2VudE1lc3NhZ2VzKGhvdXJzKTsKICAgIGlmICghcmVzdWx0Lm9rKQogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgfTsKICAgIGNvbnN0IGNhdGVnb3JpemVkID0gKHJlc3VsdC5tZXNzYWdlcyA/PyBbXSkubWFwKGNhdGVnb3JpemVNZXNzYWdlKTsKICAgIGNvbnN0IGJ5Q2F0ZWdvcnkgPSB7CiAgICAgICAgZGlyZWN0OiBbXSwgbm90aWZpY2F0aW9uOiBbXSwgbmV3c2xldHRlcjogW10sIHNvY2lhbDogW10sCiAgICAgICAgcHJvbW90aW9uOiBbXSwgZm9ydW06IFtdLCB1cGRhdGU6IFtdLCB1bmtub3duOiBbXSwKICAgIH07CiAgICBmb3IgKGNvbnN0IG1zZyBvZiBjYXRlZ29yaXplZCkgewogICAgICAgIGJ5Q2F0ZWdvcnlbbXNnLnNlbmRlckNhdGVnb3J5XS5wdXNoKG1zZyk7CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIG9rOiB0cnVlLAogICAgICAgIGNhdGVnb3JpemVkLAogICAgICAgIGJ5Q2F0ZWdvcnksCiAgICAgICAgbWVzc2FnZTogYCR7Y2F0ZWdvcml6ZWQubGVuZ3RofSBtZXNzYWdlcyBjYXRlZ29yaXplZGAsCiAgICB9Owp9Ci8qKgogKiBSZXR1cm4gbWVzc2FnZXMgc2NvcmVkIGFuZCBzb3J0ZWQgYnkgcHJpb3JpdHkgKGhpZ2gg4oaSIG5vcm1hbCDihpIgbG93KS4KICogV2l0aGluIGVhY2ggdGllciwgbWVzc2FnZXMgYXJlIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmlvcml0aXplSW5ib3goaG91cnMgPSAyNCkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVjZW50TWVzc2FnZXMoaG91cnMpOwogICAgaWYgKCFyZXN1bHQub2spCiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9OwogICAgY29uc3QgY2F0ZWdvcml6ZWQgPSAocmVzdWx0Lm1lc3NhZ2VzID8/IFtdKS5tYXAoY2F0ZWdvcml6ZU1lc3NhZ2UpOwogICAgY29uc3QgcHJpb3JpdHlPcmRlciA9IHsgaGlnaDogMCwgbm9ybWFsOiAxLCBsb3c6IDIgfTsKICAgIGNvbnN0IHNvcnRlZCA9IGNhdGVnb3JpemVkLnNvcnQoKGEsIGIpID0+IHByaW9yaXR5T3JkZXJbYS5wcmlvcml0eV0gLSBwcmlvcml0eU9yZGVyW2IucHJpb3JpdHldKTsKICAgIGNvbnN0IGNvdW50cyA9IHsgaGlnaDogMCwgbm9ybWFsOiAwLCBsb3c6IDAgfTsKICAgIGZvciAoY29uc3QgbSBvZiBzb3J0ZWQpCiAgICAgICAgY291bnRzW20ucHJpb3JpdHldKys7CiAgICByZXR1cm4gewogICAgICAgIG9rOiB0cnVlLAogICAgICAgIG1lc3NhZ2VzOiBzb3J0ZWQsCiAgICAgICAgY291bnRzLAogICAgICAgIG1lc3NhZ2U6IGAke2NvdW50cy5oaWdofSBoaWdoLCAke2NvdW50cy5ub3JtYWx9IG5vcm1hbCwgJHtjb3VudHMubG93fSBsb3cgcHJpb3JpdHlgLAogICAgfTsKfQovKioKICogQWxpYXMgZm9yIGZldGNoSW5ib3hTdW1tYXJ5IOKAlCBwcm92aWRlcyBjb21wbGV0ZSB0cmlhZ2Ugb3ZlcnZpZXcuCiAqLwpleHBvcnQgY29uc3QgZ2V0SW5ib3hTdW1tYXJ5ID0gZmV0Y2hJbmJveFN1bW1hcnk7Ci8vIC0tLSBJbmJveCBzdW1tYXJ5IC0tLQovKioKICogRmV0Y2ggYSB0cmlhZ2UtcmVhZHkgaW5ib3ggc3VtbWFyeTogdW5yZWFkIGNvdW50LCBjYXRlZ29yaXplZCByZWNlbnQgbWVzc2FnZXMsCiAqIGNhdGVnb3J5IGJyZWFrZG93biwgYW5kIGhpZ2gtcHJpb3JpdHkgaXRlbXMuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hJbmJveFN1bW1hcnkoaG91cnMgPSAyNCkgewogICAgLy8gRmV0Y2ggdW5yZWFkIGNvdW50IGFuZCByZWNlbnQgbWVzc2FnZXMgaW4gcGFyYWxsZWwKICAgIGNvbnN0IFt1bnJlYWRSZXN1bHQsIHJlY2VudFJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbCiAgICAgICAgZ2V0VW5yZWFkQ291bnQoKSwKICAgICAgICBnZXRSZWNlbnRNZXNzYWdlcyhob3VycyksCiAgICBdKTsKICAgIGlmICghdW5yZWFkUmVzdWx0Lm9rKQogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYFVucmVhZCBjb3VudCBmYWlsZWQ6ICR7dW5yZWFkUmVzdWx0Lm1lc3NhZ2V9YCB9OwogICAgaWYgKCFyZWNlbnRSZXN1bHQub2spCiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgUmVjZW50IG1lc3NhZ2VzIGZhaWxlZDogJHtyZWNlbnRSZXN1bHQubWVzc2FnZX1gIH07CiAgICBjb25zdCBjYXRlZ29yaXplZCA9IChyZWNlbnRSZXN1bHQubWVzc2FnZXMgPz8gW10pLm1hcChjYXRlZ29yaXplTWVzc2FnZSk7CiAgICAvLyBCdWlsZCBjYXRlZ29yeSBjb3VudHMKICAgIGNvbnN0IGJ5Q2F0ZWdvcnkgPSB7CiAgICAgICAgZGlyZWN0OiAwLCBub3RpZmljYXRpb246IDAsIG5ld3NsZXR0ZXI6IDAsIHNvY2lhbDogMCwKICAgICAgICBwcm9tb3Rpb246IDAsIGZvcnVtOiAwLCB1cGRhdGU6IDAsIHVua25vd246IDAsCiAgICB9OwogICAgZm9yIChjb25zdCBtc2cgb2YgY2F0ZWdvcml6ZWQpIHsKICAgICAgICBieUNhdGVnb3J5W21zZy5zZW5kZXJDYXRlZ29yeV0rKzsKICAgIH0KICAgIGNvbnN0IGhpZ2hQcmlvcml0eSA9IGNhdGVnb3JpemVkLmZpbHRlcigobSkgPT4gbS5wcmlvcml0eSA9PT0gImhpZ2giKTsKICAgIHJldHVybiB7CiAgICAgICAgb2s6IHRydWUsCiAgICAgICAgc3VtbWFyeTogewogICAgICAgICAgICB1bnJlYWRDb3VudDogdW5yZWFkUmVzdWx0LmNvdW50ID8/IDAsCiAgICAgICAgICAgIHJlY2VudE1lc3NhZ2VzOiBjYXRlZ29yaXplZCwKICAgICAgICAgICAgYnlDYXRlZ29yeSwKICAgICAgICAgICAgaGlnaFByaW9yaXR5LAogICAgICAgIH0sCiAgICAgICAgbWVzc2FnZTogYCR7dW5yZWFkUmVzdWx0LmNvdW50ID8/IDB9IHVucmVhZCwgJHtjYXRlZ29yaXplZC5sZW5ndGh9IHJlY2VudCwgJHtoaWdoUHJpb3JpdHkubGVuZ3RofSBoaWdoIHByaW9yaXR5YCwKICAgIH07Cn0KLyoqCiAqIEZvcm1hdCBhbiBpbmJveCBzdW1tYXJ5IGFzIGEgcmVhZGFibGUgdGV4dCBibG9jayBmb3IgTExNIGNvbnRleHQgaW5qZWN0aW9uLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEluYm94U3VtbWFyeUZvckNvbnRleHQoc3VtbWFyeSkgewogICAgY29uc3QgbGluZXMgPSBbXTsKICAgIGxpbmVzLnB1c2goYPCfk6wgSW5ib3g6ICR7c3VtbWFyeS51bnJlYWRDb3VudH0gdW5yZWFkYCk7CiAgICAvLyBDYXRlZ29yeSBicmVha2Rvd24gKG9ubHkgbm9uLXplcm8pCiAgICBjb25zdCBjYXRzID0gT2JqZWN0LmVudHJpZXMoc3VtbWFyeS5ieUNhdGVnb3J5KQogICAgICAgIC5maWx0ZXIoKFssIGNvdW50XSkgPT4gY291bnQgPiAwKQogICAgICAgIC5tYXAoKFtjYXQsIGNvdW50XSkgPT4gYCR7Y2F0fTogJHtjb3VudH1gKQogICAgICAgIC5qb2luKCIsICIpOwogICAgaWYgKGNhdHMpCiAgICAgICAgbGluZXMucHVzaChgQ2F0ZWdvcmllczogJHtjYXRzfWApOwogICAgLy8gSGlnaCBwcmlvcml0eQogICAgaWYgKHN1bW1hcnkuaGlnaFByaW9yaXR5Lmxlbmd0aCA+IDApIHsKICAgICAgICBsaW5lcy5wdXNoKGBcbkhpZ2ggcHJpb3JpdHkgKCR7c3VtbWFyeS5oaWdoUHJpb3JpdHkubGVuZ3RofSk6YCk7CiAgICAgICAgZm9yIChjb25zdCBtIG9mIHN1bW1hcnkuaGlnaFByaW9yaXR5KSB7CiAgICAgICAgICAgIGNvbnN0IHVucmVhZCA9IG0uaXNVbnJlYWQgPyAiIFtVTlJFQURdIiA6ICIiOwogICAgICAgICAgICBsaW5lcy5wdXNoKGAgIOKaoSAke20uZnJvbX0g4oCUICIke20uc3ViamVjdH0iJHt1bnJlYWR9YCk7CiAgICAgICAgfQogICAgfQogICAgLy8gUmVjZW50IG1lc3NhZ2VzCiAgICBpZiAoc3VtbWFyeS5yZWNlbnRNZXNzYWdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgbGluZXMucHVzaChgXG5SZWNlbnQgKCR7c3VtbWFyeS5yZWNlbnRNZXNzYWdlcy5sZW5ndGh9KTpgKTsKICAgICAgICBmb3IgKGNvbnN0IG0gb2Ygc3VtbWFyeS5yZWNlbnRNZXNzYWdlcykgewogICAgICAgICAgICBjb25zdCB1bnJlYWQgPSBtLmlzVW5yZWFkID8gIiBbVU5SRUFEXSIgOiAiIjsKICAgICAgICAgICAgY29uc3QgcHJpID0gbS5wcmlvcml0eSA9PT0gImhpZ2giID8gIuKaoSIgOiBtLnByaW9yaXR5ID09PSAibG93IiA/ICLihpMiIDogIsK3IjsKICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG0uZGF0ZQogICAgICAgICAgICAgICAgPyBuZXcgRGF0ZShtLmRhdGUpLnRvTG9jYWxlU3RyaW5nKCJlbi1VUyIsIHsKICAgICAgICAgICAgICAgICAgICBtb250aDogInNob3J0IiwKICAgICAgICAgICAgICAgICAgICBkYXk6ICJudW1lcmljIiwKICAgICAgICAgICAgICAgICAgICBob3VyOiAibnVtZXJpYyIsCiAgICAgICAgICAgICAgICAgICAgbWludXRlOiAiMi1kaWdpdCIsCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgOiAiIjsKICAgICAgICAgICAgbGluZXMucHVzaChgICAke3ByaX0gJHtkYXRlfTogJHttLmZyb219IOKAlCAiJHttLnN1YmplY3R9IiR7dW5yZWFkfSBbJHttLnNlbmRlckNhdGVnb3J5fV1gKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbGluZXMuam9pbigiXG4iKTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1nbWFpbC5qcy5tYXA=","google/plugin.js":"LyoqCiAqIEdvb2dsZSBwbHVnaW4gd3JhcHBlci4KICoKICogV3JhcHMgdGhlIGV4aXN0aW5nIEdvb2dsZSBPQXV0aCwgQ2FsZW5kYXIsIEdtYWlsLCBhbmQgVGFza3MgaW50ZWdyYXRpb25zCiAqIGJlaGluZCB0aGUgc3RhbmRhcmQgUGx1Z2luIGludGVyZmFjZSBzbyB0aGUgUGx1Z2luUmVnaXN0cnkgY2FuIG1hbmFnZQogKiB0aGUgbGlmZWN5Y2xlIHVuaWZvcm1seS4KICoKICogVGhpcyBpcyBhIFdSQVBQRVIg4oCUIGl0IGRlbGVnYXRlcyB0byBleGlzdGluZyBjb2RlIGluIGdvb2dsZS9hdXRoLnRzLAogKiBnb29nbGUvY2FsZW5kYXItdGltZXIudHMsIGdvb2dsZS9nbWFpbC10aW1lci50cywgYW5kIGdvb2dsZS90YXNrcy10aW1lci50cy4KICovCmltcG9ydCB7IGlzR29vZ2xlQ29uZmlndXJlZCwgaXNHb29nbGVBdXRoZW50aWNhdGVkLCBnZXRBY2Nlc3NUb2tlbiwgZ2V0QXV0aFVybCwgZXhjaGFuZ2VDb2RlLCBjbGVhclRva2VuQ2FjaGUsIEdPT0dMRV9TQ09QRVMsIH0gZnJvbSAiLi9hdXRoLmpzIjsKaW1wb3J0IHsgc3RhcnRDYWxlbmRhclRpbWVyLCBzdG9wQ2FsZW5kYXJUaW1lciwgaXNDYWxlbmRhclRpbWVyUnVubmluZyB9IGZyb20gIi4vY2FsZW5kYXItdGltZXIuanMiOwppbXBvcnQgeyBzdGFydEdtYWlsVGltZXIsIHN0b3BHbWFpbFRpbWVyLCBpc0dtYWlsVGltZXJSdW5uaW5nIH0gZnJvbSAiLi9nbWFpbC10aW1lci5qcyI7CmltcG9ydCB7IHN0YXJ0VGFza3NUaW1lciwgc3RvcFRhc2tzVGltZXIsIGlzVGFza3NUaW1lclJ1bm5pbmcgfSBmcm9tICIuL3Rhc2tzLXRpbWVyLmpzIjsKLy8g4pSA4pSAIE1hbmlmZXN0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjb25zdCBtYW5pZmVzdCA9IHsKICAgIG5hbWU6ICJnb29nbGUiLAogICAgdmVyc2lvbjogIjEuMC4wIiwKICAgIGRlc2NyaXB0aW9uOiAiR29vZ2xlIFdvcmtzcGFjZSBpbnRlZ3JhdGlvbiDigJQgQ2FsZW5kYXIsIEdtYWlsLCBUYXNrcywgYW5kIERyaXZlLiIsCiAgICBhdXRoVHlwZTogIm9hdXRoMiIsCiAgICByZXF1aXJlZENvbmZpZzogWyJHT09HTEVfQ0xJRU5UX0lEIiwgIkdPT0dMRV9DTElFTlRfU0VDUkVUIl0sCiAgICBvcHRpb25hbENvbmZpZzogWyJHT09HTEVfUkVGUkVTSF9UT0tFTiJdLAogICAgc2NvcGVzOiBHT09HTEVfU0NPUEVTLAogICAgY29udGV4dEtleXdvcmRzOiAvXGIoY2FsZW5kYXJ8c2NoZWR1bGV8bWVldGluZ3xldmVudHxlbWFpbHxnbWFpbHxpbmJveHx0YXNrfHRhc2tzKVxiL2ksCiAgICBjYXBhYmlsaXRpZXM6IFsicmVhZCIsICJ3cml0ZSIsICJwb2xsIiwgImNvbnRleHQiLCAib2F1dGgiXSwKfTsKLy8g4pSA4pSAIEF1dGggUHJvdmlkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNsYXNzIEdvb2dsZUF1dGhQcm92aWRlciB7CiAgICBpc0NvbmZpZ3VyZWQoKSB7CiAgICAgICAgcmV0dXJuIGlzR29vZ2xlQ29uZmlndXJlZCgpOwogICAgfQogICAgaXNBdXRoZW50aWNhdGVkKCkgewogICAgICAgIHJldHVybiBpc0dvb2dsZUF1dGhlbnRpY2F0ZWQoKTsKICAgIH0KICAgIGdldEF1dGhVcmwocmVkaXJlY3RVcmkpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSBnZXRBdXRoVXJsKHJlZGlyZWN0VXJpKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBvazogcmVzdWx0Lm9rLAogICAgICAgICAgICBkYXRhOiByZXN1bHQudXJsLAogICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSwKICAgICAgICB9OwogICAgfQogICAgYXN5bmMgZXhjaGFuZ2VDb2RlKGNvZGUsIHJlZGlyZWN0VXJpKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhjaGFuZ2VDb2RlKGNvZGUsIHJlZGlyZWN0VXJpKTsKICAgICAgICBjb25zdCBjcmVkZW50aWFscyA9IHt9OwogICAgICAgIGlmIChyZXN1bHQucmVmcmVzaFRva2VuKQogICAgICAgICAgICBjcmVkZW50aWFscy5HT09HTEVfUkVGUkVTSF9UT0tFTiA9IHJlc3VsdC5yZWZyZXNoVG9rZW47CiAgICAgICAgaWYgKHJlc3VsdC5hY2Nlc3NUb2tlbikKICAgICAgICAgICAgY3JlZGVudGlhbHMuR09PR0xFX0FDQ0VTU19UT0tFTiA9IHJlc3VsdC5hY2Nlc3NUb2tlbjsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBvazogcmVzdWx0Lm9rLAogICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSwKICAgICAgICAgICAgY3JlZGVudGlhbHM6IE9iamVjdC5rZXlzKGNyZWRlbnRpYWxzKS5sZW5ndGggPiAwID8gY3JlZGVudGlhbHMgOiB1bmRlZmluZWQsCiAgICAgICAgfTsKICAgIH0KICAgIGFzeW5jIGdldEFjY2Vzc1Rva2VuKCkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgb2s6IHJlc3VsdC5vaywKICAgICAgICAgICAgZGF0YTogcmVzdWx0LnRva2VuLAogICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSwKICAgICAgICB9OwogICAgfQogICAgY2xlYXJDcmVkZW50aWFscygpIHsKICAgICAgICBjbGVhclRva2VuQ2FjaGUoKTsKICAgIH0KfQovLyDilIDilIAgQ2xpZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjbGFzcyBHb29nbGVDbGllbnQgewogICAgcGx1Z2luTmFtZSA9ICJnb29nbGUiOwogICAgbGFzdEVycm9yID0gbnVsbDsKICAgIGxhc3RFcnJvckF0ID0gbnVsbDsKICAgIGlzQXZhaWxhYmxlKCkgewogICAgICAgIHJldHVybiBpc0dvb2dsZUF1dGhlbnRpY2F0ZWQoKTsKICAgIH0KICAgIGdldEhlYWx0aCgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBhdmFpbGFibGU6IHRoaXMuaXNBdmFpbGFibGUoKSwKICAgICAgICAgICAgbGFzdEVycm9yOiB0aGlzLmxhc3RFcnJvciwKICAgICAgICAgICAgbGFzdEVycm9yQXQ6IHRoaXMubGFzdEVycm9yQXQsCiAgICAgICAgfTsKICAgIH0KICAgIC8qKiBSZWNvcmQgYW4gZXJyb3IgKGNhbGxlZCBpbnRlcm5hbGx5IGlmIG5lZWRlZCkuICovCiAgICByZWNvcmRFcnJvcihtZXNzYWdlKSB7CiAgICAgICAgdGhpcy5sYXN0RXJyb3IgPSBtZXNzYWdlOwogICAgICAgIHRoaXMubGFzdEVycm9yQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICB9Cn0KLy8g4pSA4pSAIFRpbWVyIFByb3ZpZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjbGFzcyBHb29nbGVUaW1lclByb3ZpZGVyIHsKICAgIHN0YXJ0VGltZXIoaW50ZXJ2YWxNcykgewogICAgICAgIHN0YXJ0Q2FsZW5kYXJUaW1lcihpbnRlcnZhbE1zKTsKICAgICAgICBzdGFydEdtYWlsVGltZXIoaW50ZXJ2YWxNcyk7CiAgICAgICAgc3RhcnRUYXNrc1RpbWVyKGludGVydmFsTXMpOwogICAgfQogICAgc3RvcFRpbWVyKCkgewogICAgICAgIHN0b3BDYWxlbmRhclRpbWVyKCk7CiAgICAgICAgc3RvcEdtYWlsVGltZXIoKTsKICAgICAgICBzdG9wVGFza3NUaW1lcigpOwogICAgfQogICAgaXNUaW1lclJ1bm5pbmcoKSB7CiAgICAgICAgcmV0dXJuIGlzQ2FsZW5kYXJUaW1lclJ1bm5pbmcoKSB8fCBpc0dtYWlsVGltZXJSdW5uaW5nKCkgfHwgaXNUYXNrc1RpbWVyUnVubmluZygpOwogICAgfQp9Ci8vIOKUgOKUgCBDb250ZXh0IFByb3ZpZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjbGFzcyBHb29nbGVDb250ZXh0UHJvdmlkZXIgewogICAgY29udGV4dEtleXdvcmRzID0gL1xiKGNhbGVuZGFyfHNjaGVkdWxlfG1lZXRpbmd8ZXZlbnR8ZW1haWx8Z21haWx8aW5ib3h8dGFza3x0YXNrcylcYi9pOwogICAgYXN5bmMgZ2V0Q29udGV4dChfdXNlck1lc3NhZ2UpIHsKICAgICAgICAvLyBUaGUgZXhpc3RpbmcgY29udGV4dCBpbmplY3Rpb24gaW4gc2VydmVyLnRzIGhhbmRsZXMgR29vZ2xlIGNvbnRleHQuCiAgICAgICAgLy8gVGhpcyBpcyBhIGZ1dHVyZSBtaWdyYXRpb24gcGF0aCDigJQgZm9yIG5vdywgcmV0dXJuIG51bGwuCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KLy8g4pSA4pSAIFBsdWdpbiBJbXBsZW1lbnRhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKY2xhc3MgR29vZ2xlUGx1Z2luIHsKICAgIG1hbmlmZXN0ID0gbWFuaWZlc3Q7CiAgICBhdXRoID0gbmV3IEdvb2dsZUF1dGhQcm92aWRlcigpOwogICAgY2xpZW50ID0gbmV3IEdvb2dsZUNsaWVudCgpOwogICAgY29udGV4dCA9IG5ldyBHb29nbGVDb250ZXh0UHJvdmlkZXIoKTsKICAgIHRpbWVyID0gbmV3IEdvb2dsZVRpbWVyUHJvdmlkZXIoKTsKICAgIGFzeW5jIGluaXQoY3R4KSB7CiAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCByZXF1aXJlZCBjb25maWcga2V5cyBleGlzdAogICAgICAgIGNvbnN0IG1pc3NpbmcgPSBtYW5pZmVzdC5yZXF1aXJlZENvbmZpZy5maWx0ZXIoKGtleSkgPT4gIWN0eC5nZXRWYXVsdEtleShrZXkpKTsKICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGN0eC5sb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJnb29nbGUiLAogICAgICAgICAgICAgICAgc3VtbWFyeTogYFBsdWdpbiBpbml0OiBtaXNzaW5nIGNvbmZpZyBrZXlzOiAke21pc3Npbmcuam9pbigiLCAiKX1gLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICBhc3luYyBhdXRoZW50aWNhdGUoY3R4KSB7CiAgICAgICAgaWYgKCF0aGlzLmF1dGguaXNDb25maWd1cmVkKCkpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG9rOiBmYWxzZSwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJHb29nbGUgT0F1dGggbm90IGNvbmZpZ3VyZWQg4oCUIG1pc3NpbmcgR09PR0xFX0NMSUVOVF9JRCBvciBHT09HTEVfQ0xJRU5UX1NFQ1JFVCIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmF1dGguaXNBdXRoZW50aWNhdGVkKCkpIHsKICAgICAgICAgICAgY3R4LmxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgIHNvdXJjZTogImdvb2dsZSIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiAiUGx1Z2luIGF1dGhlbnRpY2F0ZWQgKHJlZnJlc2ggdG9rZW4gcHJlc2VudCkiLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIG1lc3NhZ2U6ICJBbHJlYWR5IGF1dGhlbnRpY2F0ZWQiIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG9rOiBmYWxzZSwKICAgICAgICAgICAgbWVzc2FnZTogIk5vdCBhdXRoZW50aWNhdGVkIOKAlCBubyBHT09HTEVfUkVGUkVTSF9UT0tFTi4gQ29tcGxldGUgT0F1dGggZmxvdyBmaXJzdC4iLAogICAgICAgIH07CiAgICB9CiAgICBhc3luYyBzdGFydChjdHgpIHsKICAgICAgICB0aGlzLnRpbWVyLnN0YXJ0VGltZXIoKTsKICAgICAgICBjdHgubG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJnb29nbGUiLAogICAgICAgICAgICBzdW1tYXJ5OiAiUGx1Z2luIHN0YXJ0ZWQg4oCUIENhbGVuZGFyLCBHbWFpbCwgYW5kIFRhc2tzIHRpbWVycyBydW5uaW5nIiwKICAgICAgICB9KTsKICAgIH0KICAgIGFzeW5jIHN0b3AoKSB7CiAgICAgICAgdGhpcy50aW1lci5zdG9wVGltZXIoKTsKICAgIH0KfQovLyDilIDilIAgRmFjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIENyZWF0ZSBhIEdvb2dsZSBwbHVnaW4gaW5zdGFuY2UuCiAqIFVzZSB3aXRoIHRoZSBQbHVnaW5SZWdpc3RyeTogYHJlZ2lzdHJ5LnJlZ2lzdGVyKGNyZWF0ZUdvb2dsZVBsdWdpbigpLCBjdHgpYAogKi8KZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUdvb2dsZVBsdWdpbigpIHsKICAgIHJldHVybiBuZXcgR29vZ2xlUGx1Z2luKCk7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGx1Z2luLmpzLm1hcA==","google/tasks-timer.js":"LyoqCiAqIEJhY2tncm91bmQgdGFza3MgcG9sbGluZyB0aW1lci4KICogQ2hlY2tzIGZvciB0YXNrcyBkdWUgc29vbiBldmVyeSAxNSBtaW51dGVzLgogKiBXaGVuIGEgdGFzayBpcyBkdWUgd2l0aGluIDYwIG1pbiwgcHVzaGVzIGEgbm90aWZpY2F0aW9uLgogKiBXaGVuIGEgdGFzayBpcyBvdmVyZHVlLCBwdXNoZXMgYSBub3RpZmljYXRpb24uCiAqIEZvbGxvd3MgY2FsZW5kYXItdGltZXIudHMgcGF0dGVybjogbW9kdWxlLWxldmVsIHN0YXRlLCBpZGVtcG90ZW50IHN0YXJ0L3N0b3AuCiAqLwppbXBvcnQgeyBsaXN0VGFza3MsIGlzVGFza3NBdmFpbGFibGUgfSBmcm9tICIuL3Rhc2tzLmpzIjsKaW1wb3J0IHsgcHVzaE5vdGlmaWNhdGlvbiB9IGZyb20gIi4uL2dvYWxzL25vdGlmaWNhdGlvbnMuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigidGFza3MiKTsKY29uc3QgREVGQVVMVF9JTlRFUlZBTF9NUyA9IDE1ICogNjAgKiAxMDAwOyAvLyAxNSBtaW51dGVzCmNvbnN0IERVRV9TT09OX1RIUkVTSE9MRF9NUyA9IDYwICogNjAgKiAxMDAwOyAvLyA2MCBtaW51dGVzCmxldCB0aW1lciA9IG51bGw7CmNvbnN0IG5vdGlmaWVkVGFza0lkcyA9IG5ldyBTZXQoKTsgLy8gQXZvaWQgZHVwbGljYXRlIG5vdGlmaWNhdGlvbnMKLyoqCiAqIFN0YXJ0IHRoZSB0YXNrcyBwb2xsaW5nIHRpbWVyLiBJZGVtcG90ZW50LgogKi8KZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0VGFza3NUaW1lcihpbnRlcnZhbE1zKSB7CiAgICBpZiAodGltZXIpCiAgICAgICAgcmV0dXJuOwogICAgY29uc3QgaW50ZXJ2YWwgPSBpbnRlcnZhbE1zID8/IERFRkFVTFRfSU5URVJWQUxfTVM7CiAgICB0aW1lciA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHsKICAgICAgICBpZiAoIWlzVGFza3NBdmFpbGFibGUoKSkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIEZldGNoIGluY29tcGxldGUgdGFza3MgZHVlIHdpdGhpbiB0aGUgbmV4dCAyNCBob3VycwogICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICBjb25zdCB0b21vcnJvdyA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyAyNCAqIDYwICogNjAgKiAxMDAwKTsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbGlzdFRhc2tzKCJAZGVmYXVsdCIsIHsKICAgICAgICAgICAgICAgIHNob3dDb21wbGV0ZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgZHVlTWF4OiB0b21vcnJvdy50b0lTT1N0cmluZygpLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKCFyZXN1bHQub2sgfHwgIXJlc3VsdC5kYXRhKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgcmVzdWx0LmRhdGEpIHsKICAgICAgICAgICAgICAgIGlmIChub3RpZmllZFRhc2tJZHMuaGFzKHRhc2suaWQpKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgaWYgKCF0YXNrLmR1ZSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBkdWUgZGF0ZSBzYWZlbHkgKGV4dHJhY3QgWVlZWS1NTS1ERCB0byBhdm9pZCBVVEMgc2hpZnQpCiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRhc2suZHVlLm1hdGNoKC9eKFxkezR9KS0oXGR7Mn0pLShcZHsyfSkvKTsKICAgICAgICAgICAgICAgIGlmICghbWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAvLyBEdWUgZGF0ZSBpcyBkYXRlLW9ubHkgKG5vIHRpbWUpLCBzbyB0cmVhdCBhcyBlbmQtb2YtZGF5IGxvY2FsCiAgICAgICAgICAgICAgICBjb25zdCBkdWVEYXRlID0gbmV3IERhdGUocGFyc2VJbnQobWF0Y2hbMV0pLCBwYXJzZUludChtYXRjaFsyXSkgLSAxLCBwYXJzZUludChtYXRjaFszXSksIDIzLCA1OSwgNTkpOwogICAgICAgICAgICAgICAgY29uc3QgbXNVbnRpbER1ZSA9IGR1ZURhdGUuZ2V0VGltZSgpIC0gbm93LmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIGlmIChtc1VudGlsRHVlIDwgMCkgewogICAgICAgICAgICAgICAgICAgIC8vIE92ZXJkdWUKICAgICAgICAgICAgICAgICAgICBub3RpZmllZFRhc2tJZHMuYWRkKHRhc2suaWQpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBPdmVyZHVlIHRhc2s6ICR7dGFzay50aXRsZX1gOwogICAgICAgICAgICAgICAgICAgIHB1c2hOb3RpZmljYXRpb24oewogICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAidGFza3MiLAogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBtc2csCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJ0YXNrcyIsIHN1bW1hcnk6IG1zZyB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1zVW50aWxEdWUgPD0gRFVFX1NPT05fVEhSRVNIT0xEX01TKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRHVlIHNvb24KICAgICAgICAgICAgICAgICAgICBub3RpZmllZFRhc2tJZHMuYWRkKHRhc2suaWQpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbnNBd2F5ID0gTWF0aC5yb3VuZChtc1VudGlsRHVlIC8gNjBfMDAwKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBtaW5zQXdheSA+IDAKICAgICAgICAgICAgICAgICAgICAgICAgPyBgVGFzayBkdWUgaW4gJHttaW5zQXdheX0gbWluOiAke3Rhc2sudGl0bGV9YAogICAgICAgICAgICAgICAgICAgICAgICA6IGBUYXNrIGR1ZSBub3c6ICR7dGFzay50aXRsZX1gOwogICAgICAgICAgICAgICAgICAgIHB1c2hOb3RpZmljYXRpb24oewogICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAidGFza3MiLAogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBtc2csCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJ0YXNrcyIsIHN1bW1hcnk6IG1zZyB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBQcnVuZSBvbGQgbm90aWZpY2F0aW9uIElEcyAoa2VlcCBtYXggMjAwKQogICAgICAgICAgICBpZiAobm90aWZpZWRUYXNrSWRzLnNpemUgPiAyMDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IFsuLi5ub3RpZmllZFRhc2tJZHNdOwogICAgICAgICAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBhcnIuc2xpY2UoMCwgYXJyLmxlbmd0aCAtIDIwMCk7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHRvUmVtb3ZlKQogICAgICAgICAgICAgICAgICAgIG5vdGlmaWVkVGFza0lkcy5kZWxldGUoaWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogInRhc2tzIiwgc3VtbWFyeTogYFBvbGwgZXJyb3I6ICR7bXNnfWAgfSk7CiAgICAgICAgfQogICAgfSwgaW50ZXJ2YWwpOwogICAgY29uc3QgbWlucyA9IE1hdGgucm91bmQoaW50ZXJ2YWwgLyA2MF8wMDApOwogICAgbG9nLmluZm8oYFRhc2tzIHBvbGw6IGV2ZXJ5ICR7bWluc30gbWluYCk7Cn0KLyoqCiAqIFN0b3AgdGhlIHRhc2tzIHBvbGxpbmcgdGltZXIuCiAqLwpleHBvcnQgZnVuY3Rpb24gc3RvcFRhc2tzVGltZXIoKSB7CiAgICBpZiAodGltZXIpIHsKICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICB9CiAgICBub3RpZmllZFRhc2tJZHMuY2xlYXIoKTsKfQovKioKICogQ2hlY2sgaWYgdGhlIHRhc2tzIHRpbWVyIGlzIHJ1bm5pbmcuCiAqLwpleHBvcnQgZnVuY3Rpb24gaXNUYXNrc1RpbWVyUnVubmluZygpIHsKICAgIHJldHVybiB0aW1lciAhPT0gbnVsbDsKfQovLyMgc291cmNlTWFwcGluZ1VSTD10YXNrcy10aW1lci5qcy5tYXA=","google/tasks.js":"LyoqCiAqIEdvb2dsZSBUYXNrcyBBUEkgY2xpZW50LgogKiBSYXcgZmV0Y2ggdmlhIGdvb2dsZUdldC9nb29nbGVQb3N0L2dvb2dsZVBhdGNoL2dvb2dsZURlbGV0ZSDigJQgbm8gU0RLLgogKiBBbGwgZnVuY3Rpb25zIHJldHVybiB7IG9rLCBkYXRhPywgbWVzc2FnZSB9IOKAlCBuZXZlciB0aHJvdy4KICovCmltcG9ydCB7IGdvb2dsZUdldCwgZ29vZ2xlUG9zdCwgZ29vZ2xlUGF0Y2gsIGdvb2dsZURlbGV0ZSwgaXNHb29nbGVBdXRoZW50aWNhdGVkIH0gZnJvbSAiLi9hdXRoLmpzIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJnb29nbGUudGFza3MiKTsKY29uc3QgVEFTS1NfQVBJID0gImh0dHBzOi8vdGFza3MuZ29vZ2xlYXBpcy5jb20vdGFza3MvdjEiOwovLyAtLS0gSGVscGVycyAtLS0KZnVuY3Rpb24gcGFyc2VUYXNrTGlzdCh0bCkgewogICAgcmV0dXJuIHsKICAgICAgICBpZDogdGwuaWQsCiAgICAgICAgdGl0bGU6IHRsLnRpdGxlID8/ICIodW50aXRsZWQpIiwKICAgICAgICB1cGRhdGVkOiB0bC51cGRhdGVkID8/ICIiLAogICAgfTsKfQpmdW5jdGlvbiBwYXJzZVRhc2sodCkgewogICAgcmV0dXJuIHsKICAgICAgICBpZDogdC5pZCwKICAgICAgICB0aXRsZTogdC50aXRsZSA/PyAiKHVudGl0bGVkKSIsCiAgICAgICAgbm90ZXM6IHQubm90ZXMsCiAgICAgICAgc3RhdHVzOiB0LnN0YXR1cyA9PT0gImNvbXBsZXRlZCIgPyAiY29tcGxldGVkIiA6ICJuZWVkc0FjdGlvbiIsCiAgICAgICAgZHVlOiB0LmR1ZSwKICAgICAgICBjb21wbGV0ZWQ6IHQuY29tcGxldGVkLAogICAgICAgIHBhcmVudDogdC5wYXJlbnQsCiAgICAgICAgcG9zaXRpb246IHQucG9zaXRpb24gPz8gIjAiLAogICAgICAgIHVwZGF0ZWQ6IHQudXBkYXRlZCA/PyAiIiwKICAgIH07Cn0KLyoqCiAqIENvbnZlcnQgYSBEYXRlIG9yIElTTyBzdHJpbmcgdG8gR29vZ2xlIFRhc2tzIGR1ZSBkYXRlIGZvcm1hdC4KICogR29vZ2xlIFRhc2tzIGV4cGVjdHMgUkZDIDMzMzkgd2l0aCB0aW1lIHNldCB0byAwMDowMDowMC4wMDBaLgogKgogKiBVc2VzIHN0cmluZyBleHRyYWN0aW9uIGZvciBJU08gc3RyaW5ncyB0byBhdm9pZCB0aGUgVVRDLW1pZG5pZ2h0LXRvLWxvY2FsLXRpbWUKICogc2hpZnQgYnVnOiBuZXcgRGF0ZSgnMjAyNi0wMy0wNCcpIHBhcnNlcyBhcyBVVEMgbWlkbmlnaHQsIGJ1dCBnZXREYXRlKCkgcmV0dXJucwogKiBsb2NhbCB0aW1lLCB3aGljaCBjYW4gc2hpZnQgdGhlIGRhdGUgYmFja3dhcmQgaW4gdGltZXpvbmVzIGJlaGluZCBVVEMuCiAqIEZpeCBmb3IgdHNfdGVtcG9yYWxfbWlzbWF0Y2hfMDEuCiAqLwpmdW5jdGlvbiB0b0R1ZURhdGUoZGF0ZSkgewogICAgaWYgKHR5cGVvZiBkYXRlID09PSAic3RyaW5nIikgewogICAgICAgIC8vIEV4dHJhY3QgWVlZWS1NTS1ERCBkaXJlY3RseSBmcm9tIHRoZSBzdHJpbmcgdG8gYXZvaWQgdGltZXpvbmUgc2hpZnQKICAgICAgICBjb25zdCBtYXRjaCA9IGRhdGUubWF0Y2goL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KS8pOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICByZXR1cm4gYCR7bWF0Y2hbMV19LSR7bWF0Y2hbMl19LSR7bWF0Y2hbM119VDAwOjAwOjAwLjAwMFpgOwogICAgICAgIH0KICAgIH0KICAgIC8vIEZvciBEYXRlIG9iamVjdHMgb3Igbm9uLUlTTyBzdHJpbmdzLCB1c2UgbG9jYWwtdGltZSBnZXR0ZXJzCiAgICAvLyAoRGF0ZSBvYmplY3RzIHdlcmUgY29uc3RydWN0ZWQgd2l0aCBsb2NhbCBpbnRlbnQpCiAgICBjb25zdCBkID0gdHlwZW9mIGRhdGUgPT09ICJzdHJpbmciID8gbmV3IERhdGUoZGF0ZSkgOiBkYXRlOwogICAgY29uc3QgeXl5eSA9IGQuZ2V0RnVsbFllYXIoKTsKICAgIGNvbnN0IG1tID0gU3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICIwIik7CiAgICBjb25zdCBkZCA9IFN0cmluZyhkLmdldERhdGUoKSkucGFkU3RhcnQoMiwgIjAiKTsKICAgIHJldHVybiBgJHt5eXl5fS0ke21tfS0ke2RkfVQwMDowMDowMC4wMDBaYDsKfQovLyAtLS0gUHVibGljIEFQSSAtLS0KLyoqCiAqIENoZWNrIGlmIFRhc2tzIGlzIHJlYWR5IChHb29nbGUgYXV0aGVudGljYXRlZCkuCiAqLwpleHBvcnQgZnVuY3Rpb24gaXNUYXNrc0F2YWlsYWJsZSgpIHsKICAgIHJldHVybiBpc0dvb2dsZUF1dGhlbnRpY2F0ZWQoKTsKfQovLyA9PT09PT09PT09PT09PT09PT09PSBUYXNrIExpc3RzID09PT09PT09PT09PT09PT09PT09Ci8qKgogKiBMaXN0IGFsbCB0YXNrIGxpc3RzIGZvciB0aGUgYXV0aGVudGljYXRlZCB1c2VyLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RUYXNrTGlzdHMoKSB7CiAgICBsb2cuZGVidWcoIkxpc3RpbmcgdGFzayBsaXN0cyIpOwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ29vZ2xlR2V0KGAke1RBU0tTX0FQSX0vdXNlcnMvQG1lL2xpc3RzYCwgeyBtYXhSZXN1bHRzOiAiMTAwIiB9KTsKICAgIGlmICghcmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gbGlzdCB0YXNrIGxpc3RzIiwgeyBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9OwogICAgfQogICAgY29uc3QgbGlzdHMgPSAocmVzdWx0LmRhdGE/Lml0ZW1zID8/IFtdKS5tYXAocGFyc2VUYXNrTGlzdCk7CiAgICBsb2cuZGVidWcoIlRhc2sgbGlzdHMgZmV0Y2hlZCIsIHsgY291bnQ6IGxpc3RzLmxlbmd0aCB9KTsKICAgIHJldHVybiB7IG9rOiB0cnVlLCBkYXRhOiBsaXN0cywgbWVzc2FnZTogYCR7bGlzdHMubGVuZ3RofSB0YXNrIGxpc3RzYCB9Owp9Ci8qKgogKiBDcmVhdGUgYSBuZXcgdGFzayBsaXN0LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRhc2tMaXN0KHRpdGxlKSB7CiAgICBpZiAoIXRpdGxlKQogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogIlRpdGxlIGlzIHJlcXVpcmVkIiB9OwogICAgbG9nLmRlYnVnKCJDcmVhdGluZyB0YXNrIGxpc3QiLCB7IHRpdGxlIH0pOwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ29vZ2xlUG9zdChgJHtUQVNLU19BUEl9L3VzZXJzL0BtZS9saXN0c2AsIHsgdGl0bGUgfSk7CiAgICBpZiAoIXJlc3VsdC5vayB8fCAhcmVzdWx0LmRhdGEpIHsKICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgdGFzayBsaXN0IiwgeyB0aXRsZSwgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgfTsKICAgIH0KICAgIGxvZy5pbmZvKCJUYXNrIGxpc3QgY3JlYXRlZCIsIHsgdGl0bGUsIHRhc2tMaXN0SWQ6IHJlc3VsdC5kYXRhLmlkIH0pOwogICAgcmV0dXJuIHsKICAgICAgICBvazogdHJ1ZSwKICAgICAgICBkYXRhOiBwYXJzZVRhc2tMaXN0KHJlc3VsdC5kYXRhKSwKICAgICAgICBtZXNzYWdlOiBgVGFzayBsaXN0IGNyZWF0ZWQ6ICR7dGl0bGV9YCwKICAgIH07Cn0KLyoqCiAqIFVwZGF0ZSBhIHRhc2sgbGlzdCdzIHRpdGxlLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVRhc2tMaXN0KHRhc2tMaXN0SWQsIHRpdGxlKSB7CiAgICBsb2cuZGVidWcoIlVwZGF0aW5nIHRhc2sgbGlzdCIsIHsgdGFza0xpc3RJZCwgdGl0bGUgfSk7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnb29nbGVQYXRjaChgJHtUQVNLU19BUEl9L3VzZXJzL0BtZS9saXN0cy8ke3Rhc2tMaXN0SWR9YCwgeyB0aXRsZSB9KTsKICAgIGlmICghcmVzdWx0Lm9rIHx8ICFyZXN1bHQuZGF0YSkgewogICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIHVwZGF0ZSB0YXNrIGxpc3QiLCB7IHRhc2tMaXN0SWQsIGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlIH07CiAgICB9CiAgICBsb2cuaW5mbygiVGFzayBsaXN0IHVwZGF0ZWQiLCB7IHRhc2tMaXN0SWQsIHRpdGxlIH0pOwogICAgcmV0dXJuIHsKICAgICAgICBvazogdHJ1ZSwKICAgICAgICBkYXRhOiBwYXJzZVRhc2tMaXN0KHJlc3VsdC5kYXRhKSwKICAgICAgICBtZXNzYWdlOiBgVGFzayBsaXN0IHVwZGF0ZWQ6ICR7dGl0bGV9YCwKICAgIH07Cn0KLyoqCiAqIERlbGV0ZSBhIHRhc2sgbGlzdC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVUYXNrTGlzdCh0YXNrTGlzdElkKSB7CiAgICBsb2cuZGVidWcoIkRlbGV0aW5nIHRhc2sgbGlzdCIsIHsgdGFza0xpc3RJZCB9KTsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdvb2dsZURlbGV0ZShgJHtUQVNLU19BUEl9L3VzZXJzL0BtZS9saXN0cy8ke3Rhc2tMaXN0SWR9YCk7CiAgICBpZiAoIXJlc3VsdC5vaykgewogICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIGRlbGV0ZSB0YXNrIGxpc3QiLCB7IHRhc2tMaXN0SWQsIGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGxvZy5pbmZvKCJUYXNrIGxpc3QgZGVsZXRlZCIsIHsgdGFza0xpc3RJZCB9KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KLy8gPT09PT09PT09PT09PT09PT09PT0gVGFza3MgPT09PT09PT09PT09PT09PT09PT0KLyoqCiAqIExpc3QgdGFza3MgaW4gYSB0YXNrIGxpc3QuCiAqIEBwYXJhbSB0YXNrTGlzdElkIC0gVGFzayBsaXN0IElEIChkZWZhdWx0OiAiQGRlZmF1bHQiIGZvciB0aGUgdXNlcidzIGRlZmF1bHQgbGlzdCkKICogQHBhcmFtIHNob3dDb21wbGV0ZWQgLSBJbmNsdWRlIGNvbXBsZXRlZCB0YXNrcyAoZGVmYXVsdDogZmFsc2UpCiAqIEBwYXJhbSBzaG93SGlkZGVuIC0gSW5jbHVkZSBoaWRkZW4vZGVsZXRlZCB0YXNrcyAoZGVmYXVsdDogZmFsc2UpCiAqIEBwYXJhbSBkdWVNaW4gLSBPbmx5IHRhc2tzIGR1ZSBhZnRlciB0aGlzIGRhdGUgKElTTyBzdHJpbmcpCiAqIEBwYXJhbSBkdWVNYXggLSBPbmx5IHRhc2tzIGR1ZSBiZWZvcmUgdGhpcyBkYXRlIChJU08gc3RyaW5nKQogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RUYXNrcyh0YXNrTGlzdElkID0gIkBkZWZhdWx0Iiwgb3B0cykgewogICAgY29uc3QgcGFyYW1zID0gewogICAgICAgIG1heFJlc3VsdHM6IFN0cmluZyhvcHRzPy5tYXhSZXN1bHRzID8/IDEwMCksCiAgICAgICAgc2hvd0NvbXBsZXRlZDogU3RyaW5nKG9wdHM/LnNob3dDb21wbGV0ZWQgPz8gZmFsc2UpLAogICAgICAgIHNob3dIaWRkZW46IFN0cmluZyhvcHRzPy5zaG93SGlkZGVuID8/IGZhbHNlKSwKICAgIH07CiAgICBpZiAob3B0cz8uZHVlTWluKQogICAgICAgIHBhcmFtcy5kdWVNaW4gPSB0b0R1ZURhdGUob3B0cy5kdWVNaW4pOwogICAgaWYgKG9wdHM/LmR1ZU1heCkKICAgICAgICBwYXJhbXMuZHVlTWF4ID0gdG9EdWVEYXRlKG9wdHMuZHVlTWF4KTsKICAgIGxvZy5kZWJ1ZygiTGlzdGluZyB0YXNrcyIsIHsgdGFza0xpc3RJZCwgc2hvd0NvbXBsZXRlZDogb3B0cz8uc2hvd0NvbXBsZXRlZCB9KTsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdvb2dsZUdldChgJHtUQVNLU19BUEl9L2xpc3RzLyR7dGFza0xpc3RJZH0vdGFza3NgLCBwYXJhbXMpOwogICAgaWYgKCFyZXN1bHQub2spIHsKICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBsaXN0IHRhc2tzIiwgeyB0YXNrTGlzdElkLCBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9OwogICAgfQogICAgY29uc3QgdGFza3MgPSAocmVzdWx0LmRhdGE/Lml0ZW1zID8/IFtdKS5tYXAocGFyc2VUYXNrKTsKICAgIGxvZy5kZWJ1ZygiVGFza3MgbGlzdGVkIiwgeyB0YXNrTGlzdElkLCBjb3VudDogdGFza3MubGVuZ3RoIH0pOwogICAgcmV0dXJuIHsgb2s6IHRydWUsIGRhdGE6IHRhc2tzLCBtZXNzYWdlOiBgJHt0YXNrcy5sZW5ndGh9IHRhc2tzYCB9Owp9Ci8qKgogKiBHZXQgYSBzaW5nbGUgdGFzayBieSBJRC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRUYXNrKHRhc2tMaXN0SWQsIHRhc2tJZCkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ29vZ2xlR2V0KGAke1RBU0tTX0FQSX0vbGlzdHMvJHt0YXNrTGlzdElkfS90YXNrcy8ke3Rhc2tJZH1gKTsKICAgIGlmICghcmVzdWx0Lm9rIHx8ICFyZXN1bHQuZGF0YSkKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlIH07CiAgICByZXR1cm4geyBvazogdHJ1ZSwgZGF0YTogcGFyc2VUYXNrKHJlc3VsdC5kYXRhKSwgbWVzc2FnZTogIk9LIiB9Owp9Ci8qKgogKiBDcmVhdGUgYSBuZXcgdGFzay4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUYXNrKHRhc2tMaXN0SWQsIHRhc2spIHsKICAgIGlmICghdGFzay50aXRsZSkKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6ICJUaXRsZSBpcyByZXF1aXJlZCIgfTsKICAgIGNvbnN0IGJvZHkgPSB7IHRpdGxlOiB0YXNrLnRpdGxlIH07CiAgICBpZiAodGFzay5ub3RlcykKICAgICAgICBib2R5Lm5vdGVzID0gdGFzay5ub3RlczsKICAgIGlmICh0YXNrLmR1ZSkKICAgICAgICBib2R5LmR1ZSA9IHRvRHVlRGF0ZSh0YXNrLmR1ZSk7CiAgICBsZXQgdXJsID0gYCR7VEFTS1NfQVBJfS9saXN0cy8ke3Rhc2tMaXN0SWR9L3Rhc2tzYDsKICAgIGlmICh0YXNrLnBhcmVudCkKICAgICAgICB1cmwgKz0gYD9wYXJlbnQ9JHt0YXNrLnBhcmVudH1gOwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ29vZ2xlUG9zdCh1cmwsIGJvZHkpOwogICAgaWYgKCFyZXN1bHQub2sgfHwgIXJlc3VsdC5kYXRhKQogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgfTsKICAgIHJldHVybiB7CiAgICAgICAgb2s6IHRydWUsCiAgICAgICAgZGF0YTogcGFyc2VUYXNrKHJlc3VsdC5kYXRhKSwKICAgICAgICBtZXNzYWdlOiBgVGFzayBjcmVhdGVkOiAke3Rhc2sudGl0bGV9YCwKICAgIH07Cn0KLyoqCiAqIFVwZGF0ZSBhbiBleGlzdGluZyB0YXNrLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVRhc2sodGFza0xpc3RJZCwgdGFza0lkLCBjaGFuZ2VzKSB7CiAgICBjb25zdCBib2R5ID0ge307CiAgICBpZiAoY2hhbmdlcy50aXRsZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIGJvZHkudGl0bGUgPSBjaGFuZ2VzLnRpdGxlOwogICAgaWYgKGNoYW5nZXMubm90ZXMgIT09IHVuZGVmaW5lZCkKICAgICAgICBib2R5Lm5vdGVzID0gY2hhbmdlcy5ub3RlczsKICAgIGlmIChjaGFuZ2VzLmR1ZSAhPT0gdW5kZWZpbmVkKQogICAgICAgIGJvZHkuZHVlID0gdG9EdWVEYXRlKGNoYW5nZXMuZHVlKTsKICAgIGlmIChjaGFuZ2VzLnN0YXR1cyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgYm9keS5zdGF0dXMgPSBjaGFuZ2VzLnN0YXR1czsKICAgICAgICBpZiAoY2hhbmdlcy5zdGF0dXMgPT09ICJjb21wbGV0ZWQiKSB7CiAgICAgICAgICAgIGJvZHkuY29tcGxldGVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gQ2xlYXJpbmcgY29tcGxldGVkIHJlc2V0cyB0aGUgdGFzayB0byBuZWVkc0FjdGlvbgogICAgICAgICAgICBib2R5LmNvbXBsZXRlZCA9IG51bGw7CiAgICAgICAgfQogICAgfQogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ29vZ2xlUGF0Y2goYCR7VEFTS1NfQVBJfS9saXN0cy8ke3Rhc2tMaXN0SWR9L3Rhc2tzLyR7dGFza0lkfWAsIGJvZHkpOwogICAgaWYgKCFyZXN1bHQub2sgfHwgIXJlc3VsdC5kYXRhKQogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgfTsKICAgIHJldHVybiB7CiAgICAgICAgb2s6IHRydWUsCiAgICAgICAgZGF0YTogcGFyc2VUYXNrKHJlc3VsdC5kYXRhKSwKICAgICAgICBtZXNzYWdlOiBgVGFzayB1cGRhdGVkOiAke3Rhc2tJZH1gLAogICAgfTsKfQovKioKICogTWFyayBhIHRhc2sgYXMgY29tcGxldGVkLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXBsZXRlVGFzayh0YXNrTGlzdElkLCB0YXNrSWQpIHsKICAgIHJldHVybiB1cGRhdGVUYXNrKHRhc2tMaXN0SWQsIHRhc2tJZCwgeyBzdGF0dXM6ICJjb21wbGV0ZWQiIH0pOwp9Ci8qKgogKiBNYXJrIGEgdGFzayBhcyBpbmNvbXBsZXRlIChyZW9wZW4pLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVuY29tcGxldGVUYXNrKHRhc2tMaXN0SWQsIHRhc2tJZCkgewogICAgcmV0dXJuIHVwZGF0ZVRhc2sodGFza0xpc3RJZCwgdGFza0lkLCB7IHN0YXR1czogIm5lZWRzQWN0aW9uIiB9KTsKfQovKioKICogRGVsZXRlIGEgdGFzay4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVUYXNrKHRhc2tMaXN0SWQsIHRhc2tJZCkgewogICAgcmV0dXJuIGdvb2dsZURlbGV0ZShgJHtUQVNLU19BUEl9L2xpc3RzLyR7dGFza0xpc3RJZH0vdGFza3MvJHt0YXNrSWR9YCk7Cn0KLyoqCiAqIENyZWF0ZSByZWN1cnJpbmcgd2Vla2x5IHRhc2tzIGJ5IGdlbmVyYXRpbmcgaW5kaXZpZHVhbCB0YXNrcyB3aXRoIGR1ZSBkYXRlcwogKiBmb3IgdGhlIG5leHQgTiB3ZWVrcy4gR29vZ2xlIFRhc2tzIEFQSSBkb2Vzbid0IHN1cHBvcnQgbmF0aXZlIHJlY3VycmVuY2UsCiAqIHNvIHdlIGNyZWF0ZSBjb25jcmV0ZSBmdXR1cmUgdGFza3MuCiAqCiAqIEV4YW1wbGU6IGNyZWF0ZVJlY3VycmluZ1dlZWtseVRhc2tzKHsKICogICB0aXRsZTogIlN0YXR1cyBSZXBvcnQiLAogKiAgIGRheU9mV2VlazogNSwgLy8gRnJpZGF5CiAqICAgaG91cjogMTYsICAgICAvLyA0IFBNCiAqICAgd2Vla3NBaGVhZDogNCwKICogfSkKICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVSZWN1cnJpbmdXZWVrbHlUYXNrcyhjb25maWcpIHsKICAgIGNvbnN0IHsgdGl0bGUsIG5vdGVzLCB0YXNrTGlzdElkID0gIkBkZWZhdWx0IiwgZGF5T2ZXZWVrLCBob3VyLCBtaW51dGUgPSAwLCB3ZWVrc0FoZWFkID0gNCwgfSA9IGNvbmZpZzsKICAgIGlmIChkYXlPZldlZWsgPCAwIHx8IGRheU9mV2VlayA+IDYpIHsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6ICJkYXlPZldlZWsgbXVzdCBiZSAwIChTdW5kYXkpIHRocm91Z2ggNiAoU2F0dXJkYXkpIiB9OwogICAgfQogICAgLy8gRmluZCB0aGUgbmV4dCBvY2N1cnJlbmNlIG9mIHRoZSBnaXZlbiBkYXkgb2Ygd2VlawogICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTsKICAgIGNvbnN0IGN1cnJlbnREYXkgPSBub3cuZ2V0RGF5KCk7CiAgICBsZXQgZGF5c1VudGlsTmV4dCA9IGRheU9mV2VlayAtIGN1cnJlbnREYXk7CiAgICBpZiAoZGF5c1VudGlsTmV4dCA8IDApCiAgICAgICAgZGF5c1VudGlsTmV4dCArPSA3OwogICAgaWYgKGRheXNVbnRpbE5leHQgPT09IDApIHsKICAgICAgICAvLyBJZiB0b2RheSBpcyB0aGUgdGFyZ2V0IGRheSwgY2hlY2sgaWYgdGhlIHRpbWUgaGFzIHBhc3NlZAogICAgICAgIGNvbnN0IHRhcmdldFRvZGF5ID0gbmV3IERhdGUobm93KTsKICAgICAgICB0YXJnZXRUb2RheS5zZXRIb3Vycyhob3VyLCBtaW51dGUsIDAsIDApOwogICAgICAgIGlmIChub3cgPiB0YXJnZXRUb2RheSkKICAgICAgICAgICAgZGF5c1VudGlsTmV4dCA9IDc7CiAgICB9CiAgICBjb25zdCBkYXlOYW1lcyA9IFsiU3VuZGF5IiwgIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiXTsKICAgIGNvbnN0IGRheU5hbWUgPSBkYXlOYW1lc1tkYXlPZldlZWtdOwogICAgY29uc3QgdGltZVN0ciA9IGAke1N0cmluZyhob3VyKS5wYWRTdGFydCgyLCAiMCIpfToke1N0cmluZyhtaW51dGUpLnBhZFN0YXJ0KDIsICIwIil9YDsKICAgIGNvbnN0IGNyZWF0ZWQgPSBbXTsKICAgIGNvbnN0IGVycm9ycyA9IFtdOwogICAgZm9yIChsZXQgd2VlayA9IDA7IHdlZWsgPCB3ZWVrc0FoZWFkOyB3ZWVrKyspIHsKICAgICAgICBjb25zdCBkdWVEYXRlID0gbmV3IERhdGUobm93KTsKICAgICAgICBkdWVEYXRlLnNldERhdGUobm93LmdldERhdGUoKSArIGRheXNVbnRpbE5leHQgKyB3ZWVrICogNyk7CiAgICAgICAgZHVlRGF0ZS5zZXRIb3Vycyhob3VyLCBtaW51dGUsIDAsIDApOwogICAgICAgIGNvbnN0IGRhdGVMYWJlbCA9IGR1ZURhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIsIHsKICAgICAgICAgICAgbW9udGg6ICJzaG9ydCIsCiAgICAgICAgICAgIGRheTogIm51bWVyaWMiLAogICAgICAgIH0pOwogICAgICAgIGNvbnN0IHRhc2tUaXRsZSA9IGAke3RpdGxlfSDigJQgJHtkYXlOYW1lfSAke2RhdGVMYWJlbH0gJHt0aW1lU3RyfWA7CiAgICAgICAgY29uc3QgdGFza05vdGVzID0gbm90ZXMKICAgICAgICAgICAgPyBgJHtub3Rlc31cblxuUmVjdXJyaW5nOiBldmVyeSAke2RheU5hbWV9IGF0ICR7dGltZVN0cn1gCiAgICAgICAgICAgIDogYFJlY3VycmluZzogZXZlcnkgJHtkYXlOYW1lfSBhdCAke3RpbWVTdHJ9YDsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUYXNrKHRhc2tMaXN0SWQsIHsKICAgICAgICAgICAgdGl0bGU6IHRhc2tUaXRsZSwKICAgICAgICAgICAgbm90ZXM6IHRhc2tOb3RlcywKICAgICAgICAgICAgZHVlOiBkdWVEYXRlLnRvSVNPU3RyaW5nKCksCiAgICAgICAgfSk7CiAgICAgICAgaWYgKHJlc3VsdC5vayAmJiByZXN1bHQuZGF0YSkgewogICAgICAgICAgICBjcmVhdGVkLnB1c2gocmVzdWx0LmRhdGEpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZXJyb3JzLnB1c2goYFdlZWsgJHt3ZWVrICsgMX06ICR7cmVzdWx0Lm1lc3NhZ2V9YCk7CiAgICAgICAgfQogICAgfQogICAgaWYgKGNyZWF0ZWQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgRmFpbGVkIHRvIGNyZWF0ZSBhbnkgdGFza3M6ICR7ZXJyb3JzLmpvaW4oIjsgIil9YCB9OwogICAgfQogICAgY29uc3QgbXNnID0gZXJyb3JzLmxlbmd0aCA+IDAKICAgICAgICA/IGBDcmVhdGVkICR7Y3JlYXRlZC5sZW5ndGh9LyR7d2Vla3NBaGVhZH0gdGFza3MgKCR7ZXJyb3JzLmxlbmd0aH0gZmFpbGVkKWAKICAgICAgICA6IGBDcmVhdGVkICR7Y3JlYXRlZC5sZW5ndGh9IHJlY3VycmluZyB0YXNrczogJHt0aXRsZX0gZXZlcnkgJHtkYXlOYW1lfSBhdCAke3RpbWVTdHJ9YDsKICAgIHJldHVybiB7IG9rOiB0cnVlLCBkYXRhOiBjcmVhdGVkLCBtZXNzYWdlOiBtc2cgfTsKfQovLyA9PT09PT09PT09PT09PT09PT09PSBDb250ZXh0IGZvcm1hdHRpbmcgPT09PT09PT09PT09PT09PT09PT0KLyoqCiAqIEZvcm1hdCB0YXNrcyBhcyBhIHJlYWRhYmxlIHRleHQgYmxvY2sgZm9yIExMTSBjb250ZXh0IGluamVjdGlvbi4KICovCmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRUYXNrc0ZvckNvbnRleHQodGFza3MpIHsKICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuICJObyB0YXNrcy4iOwogICAgcmV0dXJuIHRhc2tzCiAgICAgICAgLm1hcCgodCkgPT4gewogICAgICAgIGNvbnN0IGNoZWNrID0gdC5zdGF0dXMgPT09ICJjb21wbGV0ZWQiID8gIlt4XSIgOiAiWyBdIjsKICAgICAgICBsZXQgZHVlU3RyID0gIiI7CiAgICAgICAgaWYgKHQuZHVlKSB7CiAgICAgICAgICAgIC8vIEV4dHJhY3QgWVlZWS1NTS1ERCBkaXJlY3RseSB0byBhdm9pZCBVVEMtbWlkbmlnaHQtdG8tbG9jYWwgc2hpZnQgKHRzX3RlbXBvcmFsX21pc21hdGNoXzAxKQogICAgICAgICAgICBjb25zdCBtID0gdC5kdWUubWF0Y2goL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KS8pOwogICAgICAgICAgICBpZiAobSkgewogICAgICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKHBhcnNlSW50KG1bMV0pLCBwYXJzZUludChtWzJdKSAtIDEsIHBhcnNlSW50KG1bM10pKTsKICAgICAgICAgICAgICAgIGR1ZVN0ciA9IGAgKGR1ZTogJHtkLnRvTG9jYWxlRGF0ZVN0cmluZygiZW4tVVMiLCB7IG1vbnRoOiAic2hvcnQiLCBkYXk6ICJudW1lcmljIiB9KX0pYDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGR1ZVN0ciA9IGAgKGR1ZTogJHtuZXcgRGF0ZSh0LmR1ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIsIHsgbW9udGg6ICJzaG9ydCIsIGRheTogIm51bWVyaWMiIH0pfSlgOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IG5vdGVzU3RyID0gdC5ub3RlcyA/IGAg4oCUICR7dC5ub3Rlcy5zcGxpdCgiXG4iKVswXX1gIDogIiI7CiAgICAgICAgcmV0dXJuIGAtICR7Y2hlY2t9ICR7dC50aXRsZX0ke2R1ZVN0cn0ke25vdGVzU3RyfWA7CiAgICB9KQogICAgICAgIC5qb2luKCJcbiIpOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXRhc2tzLmpzLm1hcA==","google/temporal.js":"LyoqCiAqIFRlbXBvcmFsIHZhbGlkYXRpb24gbGF5ZXIuCiAqIENhdGNoZXMgZGF5LW9mLXdlZWsgbWlzbWF0Y2hlcyBiZWZvcmUgY2FsZW5kYXIgZW50cmllcyBhcmUgY3JlYXRlZC4KICogRml4ZXMgdHNfdGVtcG9yYWxfbWlzbWF0Y2hfMDE6IE1hcmNoIDQsIDIwMjYgaXMgV2VkbmVzZGF5LCBub3QgVHVlc2RheS4KICoKICogUm9vdCBjYXVzZTogbmV3IERhdGUoJzIwMjYtMDMtMDQnKSBwYXJzZXMgYXMgVVRDIG1pZG5pZ2h0LgogKiBnZXREYXkoKSByZXR1cm5zIGxvY2FsLXRpbWV6b25lIGRheSwgd2hpY2ggY2FuIHNoaWZ0IGJhY2t3YXJkIGJ5IDEKICogaW4gdGltZXpvbmVzIGJlaGluZCBVVEMuIEFsbCBkYXRlIG1hdGggbXVzdCB1c2UgVVRDIG1ldGhvZHMgb24KICogVVRDLXBhcnNlZCBzdHJpbmdzLCBvciBsb2NhbCBtZXRob2RzIG9uIGxvY2FsbHktY29uc3RydWN0ZWQgZGF0ZXMuCiAqLwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImdvb2dsZS50ZW1wb3JhbCIpOwpjb25zdCBEQVlfTkFNRVMgPSBbCiAgICAic3VuZGF5IiwgIm1vbmRheSIsICJ0dWVzZGF5IiwgIndlZG5lc2RheSIsCiAgICAidGh1cnNkYXkiLCAiZnJpZGF5IiwgInNhdHVyZGF5IiwKXTsKLyoqCiAqIFBhcnNlIGEgZGF0ZSBzdHJpbmcgaW50byB5ZWFyL21vbnRoL2RheSB3aXRob3V0IHRpbWV6b25lIGFtYmlndWl0eS4KICogRXh0cmFjdHMgdGhlIGRhdGUgcG9ydGlvbiBhbmQgY29uc3RydWN0cyB1c2luZyBsb2NhbC10aW1lIGNvbnN0cnVjdG9yCiAqIHRvIGF2b2lkIHRoZSBVVEMtbWlkbmlnaHQtc2hpZnRzLXRvLXByZXZpb3VzLWRheSBidWcuCiAqLwpleHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRlU2FmZShkYXRlU3RyKSB7CiAgICAvLyBFeHRyYWN0IFlZWVktTU0tREQgZnJvbSBhbnkgSVNPIHN0cmluZyBvciBkYXRlLW9ubHkgc3RyaW5nCiAgICBjb25zdCBtYXRjaCA9IGRhdGVTdHIubWF0Y2goL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KS8pOwogICAgaWYgKCFtYXRjaCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIGRhdGUgZnJvbTogJHtkYXRlU3RyfWApOwogICAgfQogICAgY29uc3QgWywgeWVhciwgbW9udGgsIGRheV0gPSBtYXRjaDsKICAgIC8vIFVzZSB0aGUgKHllYXIsIG1vbnRoSW5kZXgsIGRheSkgY29uc3RydWN0b3Ig4oCUIHRoaXMgdXNlcyBMT0NBTCB0aW1lLAogICAgLy8gc28gZ2V0RGF5KCkgd2lsbCBtYXRjaCB0aGUgY2FsZW5kYXIgZGF0ZSB0aGUgdXNlciBpbnRlbmRlZC4KICAgIHJldHVybiBuZXcgRGF0ZShwYXJzZUludCh5ZWFyKSwgcGFyc2VJbnQobW9udGgpIC0gMSwgcGFyc2VJbnQoZGF5KSk7Cn0KLyoqCiAqIEdldCB0aGUgZGF5LW9mLXdlZWsgbmFtZSBmb3IgYSBkYXRlIHN0cmluZywgY29ycmVjdGx5LgogKiBVc2VzIHBhcnNlRGF0ZVNhZmUgdG8gYXZvaWQgVVRDL2xvY2FsIHRpbWV6b25lIG1pc21hdGNoLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGdldERheU9mV2VlayhkYXRlU3RyKSB7CiAgICBjb25zdCBkID0gcGFyc2VEYXRlU2FmZShkYXRlU3RyKTsKICAgIHJldHVybiBEQVlfTkFNRVNbZC5nZXREYXkoKV07Cn0KLyoqCiAqIEdldCB0aGUgZGF5LW9mLXdlZWsgaW5kZXggKDA9U3VuZGF5LCA2PVNhdHVyZGF5KSBmb3IgYSBkYXRlIHN0cmluZy4KICovCmV4cG9ydCBmdW5jdGlvbiBnZXREYXlPZldlZWtJbmRleChkYXRlU3RyKSB7CiAgICByZXR1cm4gcGFyc2VEYXRlU2FmZShkYXRlU3RyKS5nZXREYXkoKTsKfQovKioKICogTm9ybWFsaXplIGEgZGF5IG5hbWUgdG8gbG93ZXJjYXNlIGZvciBjb21wYXJpc29uLgogKiBBY2NlcHRzIGZ1bGwgbmFtZXMgKCJXZWRuZXNkYXkiKSBhbmQgYWJicmV2aWF0aW9ucyAoIldlZCIpLgogKi8KZnVuY3Rpb24gbm9ybWFsaXplRGF5TmFtZShuYW1lKSB7CiAgICBjb25zdCBsb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKS50cmltKCk7CiAgICAvLyBFeGFjdCBtYXRjaAogICAgY29uc3QgZXhhY3QgPSBEQVlfTkFNRVMuZmluZCgoZCkgPT4gZCA9PT0gbG93ZXIpOwogICAgaWYgKGV4YWN0KQogICAgICAgIHJldHVybiBleGFjdDsKICAgIC8vIFByZWZpeCBtYXRjaCAoYXQgbGVhc3QgMyBjaGFyczogIm1vbiIsICJ0dWUiLCAid2VkIiwgZXRjLikKICAgIGlmIChsb3dlci5sZW5ndGggPj0gMykgewogICAgICAgIGNvbnN0IHByZWZpeCA9IERBWV9OQU1FUy5maW5kKChkKSA9PiBkLnN0YXJ0c1dpdGgobG93ZXIpKTsKICAgICAgICBpZiAocHJlZml4KQogICAgICAgICAgICByZXR1cm4gcHJlZml4OwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIFZhbGlkYXRlIHRoYXQgYSBkYXRlIHN0cmluZyBmYWxscyBvbiB0aGUgZXhwZWN0ZWQgZGF5LW9mLXdlZWsuCiAqCiAqIEBwYXJhbSBkYXRlU3RyIC0gSVNPIGRhdGUgb3IgZGF0ZXRpbWUgc3RyaW5nIChlLmcuLCAiMjAyNi0wMy0wNCIgb3IgIjIwMjYtMDMtMDRUMTE6MDA6MDAiKQogKiBAcGFyYW0gZXhwZWN0ZWREYXkgLSBFeHBlY3RlZCBkYXkgbmFtZSAoZS5nLiwgIlR1ZXNkYXkiLCAiV2VkIikKICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBhY3R1YWwgdnMgZXhwZWN0ZWQgZGF5CiAqCiAqIEBleGFtcGxlCiAqIHZhbGlkYXRlRGF5T2ZXZWVrKCIyMDI2LTAzLTA0IiwgIlR1ZXNkYXkiKQogKiAvLyB7IHZhbGlkOiBmYWxzZSwgYWN0dWFsRGF5OiAid2VkbmVzZGF5IiwgZXhwZWN0ZWREYXk6ICJ0dWVzZGF5IiwgZGF0ZTogIjIwMjYtMDMtMDQiLAogKiAvLyAgIG1pc21hdGNoOiAiMjAyNi0wMy0wNCBpcyB3ZWRuZXNkYXksIG5vdCB0dWVzZGF5IiB9CiAqCiAqIHZhbGlkYXRlRGF5T2ZXZWVrKCIyMDI2LTAzLTA0IiwgIldlZG5lc2RheSIpCiAqIC8vIHsgdmFsaWQ6IHRydWUsIGFjdHVhbERheTogIndlZG5lc2RheSIsIGV4cGVjdGVkRGF5OiAid2VkbmVzZGF5IiwgZGF0ZTogIjIwMjYtMDMtMDQiIH0KICovCmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZURheU9mV2VlayhkYXRlU3RyLCBleHBlY3RlZERheSkgewogICAgY29uc3QgbWF0Y2ggPSBkYXRlU3RyLm1hdGNoKC9eKFxkezR9LVxkezJ9LVxkezJ9KS8pOwogICAgaWYgKCFtYXRjaCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHZhbGlkOiBmYWxzZSwKICAgICAgICAgICAgYWN0dWFsRGF5OiAidW5rbm93biIsCiAgICAgICAgICAgIGV4cGVjdGVkRGF5OiBleHBlY3RlZERheS50b0xvd2VyQ2FzZSgpLAogICAgICAgICAgICBkYXRlOiBkYXRlU3RyLAogICAgICAgICAgICBtaXNtYXRjaDogYENhbm5vdCBwYXJzZSBkYXRlIGZyb206ICR7ZGF0ZVN0cn1gLAogICAgICAgIH07CiAgICB9CiAgICBjb25zdCBkYXRlT25seSA9IG1hdGNoWzFdOwogICAgY29uc3QgYWN0dWFsRGF5ID0gZ2V0RGF5T2ZXZWVrKGRhdGVTdHIpOwogICAgY29uc3Qgbm9ybWFsaXplZEV4cGVjdGVkID0gbm9ybWFsaXplRGF5TmFtZShleHBlY3RlZERheSk7CiAgICBpZiAoIW5vcm1hbGl6ZWRFeHBlY3RlZCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHZhbGlkOiBmYWxzZSwKICAgICAgICAgICAgYWN0dWFsRGF5LAogICAgICAgICAgICBleHBlY3RlZERheTogZXhwZWN0ZWREYXkudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgZGF0ZTogZGF0ZU9ubHksCiAgICAgICAgICAgIG1pc21hdGNoOiBgVW5yZWNvZ25pemVkIGRheSBuYW1lOiAke2V4cGVjdGVkRGF5fWAsCiAgICAgICAgfTsKICAgIH0KICAgIGNvbnN0IHZhbGlkID0gYWN0dWFsRGF5ID09PSBub3JtYWxpemVkRXhwZWN0ZWQ7CiAgICByZXR1cm4gewogICAgICAgIHZhbGlkLAogICAgICAgIGFjdHVhbERheSwKICAgICAgICBleHBlY3RlZERheTogbm9ybWFsaXplZEV4cGVjdGVkLAogICAgICAgIGRhdGU6IGRhdGVPbmx5LAogICAgICAgIC4uLih2YWxpZCA/IHt9IDogewogICAgICAgICAgICBtaXNtYXRjaDogYCR7ZGF0ZU9ubHl9IGlzICR7YWN0dWFsRGF5fSwgbm90ICR7bm9ybWFsaXplZEV4cGVjdGVkfWAsCiAgICAgICAgfSksCiAgICB9Owp9Ci8qKgogKiBWYWxpZGF0ZSBhIGNhbGVuZGFyIGV2ZW50J3Mgc3RhcnQgZGF0ZSBiZWZvcmUgY3JlYXRpb24uCiAqIElmIGV4cGVjdGVkRGF5T2ZXZWVrIGlzIHByb3ZpZGVkIChmcm9tIHVzZXIgaW5wdXQgb3IgTExNIHBhcnNpbmcpLAogKiBjcm9zcy1jaGVja3MgaXQgYWdhaW5zdCB0aGUgYWN0dWFsIGNhbGVuZGFyIGRhdGUuCiAqCiAqIFJldHVybnMgeyBvazogdHJ1ZSB9IGlmIHZhbGlkLCBvciB7IG9rOiBmYWxzZSwgbWVzc2FnZSwgc3VnZ2VzdGlvbiB9IGlmIG1pc21hdGNoZWQuCiAqLwpleHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDYWxlbmRhckVudHJ5KHN0YXJ0RGF0ZVN0ciwgZXhwZWN0ZWREYXlPZldlZWspIHsKICAgIGlmICghZXhwZWN0ZWREYXlPZldlZWspCiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUgfTsKICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlRGF5T2ZXZWVrKHN0YXJ0RGF0ZVN0ciwgZXhwZWN0ZWREYXlPZldlZWspOwogICAgaWYgKHJlc3VsdC52YWxpZCkKICAgICAgICByZXR1cm4geyBvazogdHJ1ZSB9OwogICAgLy8gRmluZCB0aGUgY29ycmVjdCBkYXRlIGZvciB0aGUgZXhwZWN0ZWQgZGF5IHdpdGhpbiDCsTMgZGF5cwogICAgY29uc3Qgc3VnZ2VzdGlvbiA9IGZpbmRDb3JyZWN0RGF0ZShzdGFydERhdGVTdHIsIGV4cGVjdGVkRGF5T2ZXZWVrKTsKICAgIHJldHVybiB7CiAgICAgICAgb2s6IGZhbHNlLAogICAgICAgIG1lc3NhZ2U6IGBUZW1wb3JhbCBtaXNtYXRjaDogJHtyZXN1bHQubWlzbWF0Y2h9YCwKICAgICAgICBzdWdnZXN0aW9uLAogICAgfTsKfQovKioKICogR2l2ZW4gYSBkYXRlIGFuZCB0aGUgaW50ZW5kZWQgZGF5LW9mLXdlZWssIGZpbmQgdGhlIG5lYXJlc3QgZGF0ZQogKiB0aGF0IGFjdHVhbGx5IGZhbGxzIG9uIHRoYXQgZGF5ICh3aXRoaW4gwrEzIGRheXMpLgogKi8KZnVuY3Rpb24gZmluZENvcnJlY3REYXRlKGRhdGVTdHIsIGludGVuZGVkRGF5KSB7CiAgICBjb25zdCB0YXJnZXQgPSBub3JtYWxpemVEYXlOYW1lKGludGVuZGVkRGF5KTsKICAgIGlmICghdGFyZ2V0KQogICAgICAgIHJldHVybiBgQ291bGQgbm90IHJlc29sdmUgZGF5IG5hbWU6ICR7aW50ZW5kZWREYXl9YDsKICAgIGNvbnN0IHRhcmdldEluZGV4ID0gREFZX05BTUVTLmluZGV4T2YodGFyZ2V0KTsKICAgIGNvbnN0IGJhc2UgPSBwYXJzZURhdGVTYWZlKGRhdGVTdHIpOwogICAgZm9yIChsZXQgb2Zmc2V0ID0gLTM7IG9mZnNldCA8PSAzOyBvZmZzZXQrKykgewogICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5ldyBEYXRlKGJhc2UpOwogICAgICAgIGNhbmRpZGF0ZS5zZXREYXRlKGJhc2UuZ2V0RGF0ZSgpICsgb2Zmc2V0KTsKICAgICAgICBpZiAoY2FuZGlkYXRlLmdldERheSgpID09PSB0YXJnZXRJbmRleCkgewogICAgICAgICAgICBjb25zdCB5eXl5ID0gY2FuZGlkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgICAgIGNvbnN0IG1tID0gU3RyaW5nKGNhbmRpZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgIjAiKTsKICAgICAgICAgICAgY29uc3QgZGQgPSBTdHJpbmcoY2FuZGlkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgIjAiKTsKICAgICAgICAgICAgcmV0dXJuIGBEaWQgeW91IG1lYW4gJHt0YXJnZXR9ICR7eXl5eX0tJHttbX0tJHtkZH0/YDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYE5vICR7dGFyZ2V0fSBmb3VuZCB3aXRoaW4gwrEzIGRheXMgb2YgJHtkYXRlU3RyfWA7Cn0KLyoqCiAqIFNhZmUgY29udmVyc2lvbiB0byBHb29nbGUgVGFza3MgZHVlIGRhdGUgZm9ybWF0LgogKiBFeHRyYWN0cyBZWVlZLU1NLUREIGZyb20gdGhlIHN0cmluZyBkaXJlY3RseSwgYXZvaWRpbmcgdGhlCiAqIFVUQy1taWRuaWdodC10by1sb2NhbC10aW1lIHNoaWZ0IGJ1ZyBpbiB0b0R1ZURhdGUuCiAqLwpleHBvcnQgZnVuY3Rpb24gdG9TYWZlRHVlRGF0ZShkYXRlKSB7CiAgICBpZiAodHlwZW9mIGRhdGUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBkYXRlLm1hdGNoKC9eKFxkezR9KS0oXGR7Mn0pLShcZHsyfSkvKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0dXJuIGAke21hdGNoWzFdfS0ke21hdGNoWzJdfS0ke21hdGNoWzNdfVQwMDowMDowMC4wMDBaYDsKICAgICAgICB9CiAgICB9CiAgICAvLyBGb3IgRGF0ZSBvYmplY3RzIG9yIG5vbi1JU08gc3RyaW5ncywgdXNlIGxvY2FsLXRpbWUgZ2V0dGVycwogICAgY29uc3QgZCA9IHR5cGVvZiBkYXRlID09PSAic3RyaW5nIiA/IG5ldyBEYXRlKGRhdGUpIDogZGF0ZTsKICAgIGNvbnN0IHl5eXkgPSBkLmdldEZ1bGxZZWFyKCk7CiAgICBjb25zdCBtbSA9IFN0cmluZyhkLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAiMCIpOwogICAgY29uc3QgZGQgPSBTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICIwIik7CiAgICByZXR1cm4gYCR7eXl5eX0tJHttbX0tJHtkZH1UMDA6MDA6MDAuMDAwWmA7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVtcG9yYWwuanMubWFw","github/client.js":"LyoqCiAqIEdpdEh1YiBSRVNUIEFQSSBjbGllbnQg4oCUIGZldGNoLWJhc2VkLCBubyBTREsgZGVwZW5kZW5jeS4KICogUmVhZHMgR0lUSFVCX1RPS0VOIGZyb20gcHJvY2Vzcy5lbnYgKGh5ZHJhdGVkIGJ5IHZhdWx0KS4KICoKICogQWxsIG1ldGhvZHMgdXNlIHJldHJ5IHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBmb3IgdHJhbnNpZW50IGZhaWx1cmVzLgogKiBBdXRoIGVycm9ycyBhcmUgc3VyZmFjZWQgaW1tZWRpYXRlbHkuIFBlcm1hbmVudCBlcnJvcnMgcmV0dXJuIG51bGwuCiAqLwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwppbXBvcnQgeyB3aXRoUmV0cnksIGNsYXNzaWZ5RXJyb3IsIEdpdEh1YkFwaUVycm9yIH0gZnJvbSAiLi9yZXRyeS5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiZ2l0aHViIik7CmNvbnN0IERFRkFVTFRfQVBJX0JBU0UgPSAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbSI7Ci8vIOKUgOKUgCBMYXp5IHNpbmdsZXRvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKbGV0IGNhY2hlZFRva2VuID0gIiI7CmxldCBhcGlCYXNlID0gREVGQVVMVF9BUElfQkFTRTsKZnVuY3Rpb24gZ2V0VG9rZW4oKSB7CiAgICBjb25zdCB0b2tlbiA9IHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTjsKICAgIGlmICghdG9rZW4pCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICBpZiAodG9rZW4gIT09IGNhY2hlZFRva2VuKSB7CiAgICAgICAgY2FjaGVkVG9rZW4gPSB0b2tlbjsKICAgIH0KICAgIHJldHVybiBjYWNoZWRUb2tlbjsKfQpleHBvcnQgZnVuY3Rpb24gc2V0QXBpQmFzZSh1cmwpIHsKICAgIGFwaUJhc2UgPSB1cmwucmVwbGFjZSgvXC8rJC8sICIiKTsKfQovLyDilIDilIAgSFRUUCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAphc3luYyBmdW5jdGlvbiBnaEZldGNoKHBhdGgsIG9wdHMpIHsKICAgIGNvbnN0IHRva2VuID0gb3B0cz8udG9rZW4gPz8gZ2V0VG9rZW4oKTsKICAgIGlmICghdG9rZW4pIHsKICAgICAgICB0aHJvdyBuZXcgR2l0SHViQXBpRXJyb3IoIkdJVEhVQl9UT0tFTiBub3Qgc2V0IiwgImF1dGgiKTsKICAgIH0KICAgIGNvbnN0IHVybCA9IHBhdGguc3RhcnRzV2l0aCgiaHR0cCIpID8gcGF0aCA6IGAke2FwaUJhc2V9JHtwYXRofWA7CiAgICBjb25zdCBoZWFkZXJzID0gewogICAgICAgIEFjY2VwdDogImFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIsCiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsCiAgICAgICAgIlgtR2l0SHViLUFwaS1WZXJzaW9uIjogIjIwMjItMTEtMjgiLAogICAgfTsKICAgIGlmIChvcHRzPy5ib2R5KSB7CiAgICAgICAgaGVhZGVyc1siQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24vanNvbiI7CiAgICB9CiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgewogICAgICAgIG1ldGhvZDogb3B0cz8ubWV0aG9kID8/ICJHRVQiLAogICAgICAgIGhlYWRlcnMsCiAgICAgICAgYm9keTogb3B0cz8uYm9keSA/IEpTT04uc3RyaW5naWZ5KG9wdHMuYm9keSkgOiB1bmRlZmluZWQsCiAgICB9KTsKICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpLmNhdGNoKCgpID0+ICIiKTsKICAgICAgICBjb25zdCBtc2cgPSBgR2l0SHViIEFQSSAke3Jlc3BvbnNlLnN0YXR1c306ICR7dGV4dC5zbGljZSgwLCAyMDApfWA7CiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBHaXRIdWJBcGlFcnJvcihtc2csICJhdXRoIiwgcmVzcG9uc2Uuc3RhdHVzKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5IHx8IHJlc3BvbnNlLnN0YXR1cyA+PSA1MDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEdpdEh1YkFwaUVycm9yKG1zZywgInRyYW5zaWVudCIsIHJlc3BvbnNlLnN0YXR1cyk7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBHaXRIdWJBcGlFcnJvcihtc2csICJwZXJtYW5lbnQiLCByZXNwb25zZS5zdGF0dXMpOwogICAgfQogICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KQogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpOwp9Ci8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKiogTGFzdCBlcnJvciB0cmFja2luZyBmb3IgaGVhbHRoIHJlcG9ydGluZy4gKi8KbGV0IGxhc3RFcnJvcktpbmQgPSBudWxsOwpsZXQgbGFzdEVycm9yTWVzc2FnZSA9IG51bGw7CmZ1bmN0aW9uIGNsZWFyRXJyb3IoKSB7CiAgICBsYXN0RXJyb3JLaW5kID0gbnVsbDsKICAgIGxhc3RFcnJvck1lc3NhZ2UgPSBudWxsOwp9CmZ1bmN0aW9uIHJlY29yZEVycm9yKGVycikgewogICAgbGFzdEVycm9yS2luZCA9IGNsYXNzaWZ5RXJyb3IoZXJyKTsKICAgIGxhc3RFcnJvck1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7Cn0KLy8g4pSA4pSAIEF2YWlsYWJpbGl0eSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGZ1bmN0aW9uIGlzQXZhaWxhYmxlKCkgewogICAgcmV0dXJuICEhcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOOwp9Ci8qKiBWYWxpZGF0ZSB0aGUgdG9rZW4gYnkgY2FsbGluZyAvdXNlci4gKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aCgpIHsKICAgIGlmICghZ2V0VG9rZW4oKSkKICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAiR0lUSFVCX1RPS0VOIG5vdCBzZXQiIH07CiAgICB0cnkgewogICAgICAgIGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnaEZldGNoKCIvdXNlciIpLCB7IGxhYmVsOiAidmFsaWRhdGVBdXRoIiwgbWF4QXR0ZW1wdHM6IDIgfSk7CiAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmVjb3JkRXJyb3IoZXJyKTsKICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfTsKICAgIH0KfQovLyDilIDilIAgVXNlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEF1dGhlbnRpY2F0ZWRVc2VyKCkgewogICAgdHJ5IHsKICAgICAgICAvLyBVc2UgcmVkdWNlZCByZXRyaWVzIGFuZCBzaG9ydGVyIHRpbWVvdXQgZm9yIHVzZXIgbG9va3VwLgogICAgICAgIC8vIEF1dGggZXJyb3JzIGFscmVhZHkgZmFpbCBpbW1lZGlhdGVseSAobm8gcmV0cnkpOyB0aGlzIGxpbWl0cyBuZXR3b3JrLXRpbWVvdXQgZXhwb3N1cmUKICAgICAgICAvLyBmcm9tIHRoZSBkZWZhdWx0IDPDlzE1cyA9IDQ1cyBkb3duIHRvIDLDlzEwcyA9IDIwcyB3b3JzdCBjYXNlLgogICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB3aXRoUmV0cnkoKCkgPT4gZ2hGZXRjaCgiL3VzZXIiKSwgewogICAgICAgICAgICBsYWJlbDogImdldFVzZXIiLAogICAgICAgICAgICBtYXhBdHRlbXB0czogMiwKICAgICAgICAgICAgdGltZW91dE1zOiAxMF8wMDAsCiAgICAgICAgfSk7CiAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgIHJldHVybiB1c2VyOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIHJlY29yZEVycm9yKGVycik7CiAgICAgICAgbG9nLmVycm9yKGBnZXRBdXRoZW50aWNhdGVkVXNlciBmYWlsZWQ6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8vIOKUgOKUgCBSZXBvcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlcG8ob3duZXIsIHJlcG8pIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnaEZldGNoKGAvcmVwb3MvJHtvd25lcn0vJHtyZXBvfWApLCB7IGxhYmVsOiAiZ2V0UmVwbyIgfSk7CiAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIHJlY29yZEVycm9yKGVycik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KLy8g4pSA4pSAIElzc3VlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RJc3N1ZXMob3duZXIsIHJlcG8sIG9wdHMpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpOwogICAgICAgIGlmIChvcHRzPy5zdGF0ZSkKICAgICAgICAgICAgcGFyYW1zLnNldCgic3RhdGUiLCBvcHRzLnN0YXRlKTsKICAgICAgICBpZiAob3B0cz8ubGFiZWxzKQogICAgICAgICAgICBwYXJhbXMuc2V0KCJsYWJlbHMiLCBvcHRzLmxhYmVscyk7CiAgICAgICAgaWYgKG9wdHM/LnNpbmNlKQogICAgICAgICAgICBwYXJhbXMuc2V0KCJzaW5jZSIsIG9wdHMuc2luY2UpOwogICAgICAgIHBhcmFtcy5zZXQoInBlcl9wYWdlIiwgU3RyaW5nKG9wdHM/LnBlcl9wYWdlID8/IDMwKSk7CiAgICAgICAgY29uc3QgcXMgPSBwYXJhbXMudG9TdHJpbmcoKTsKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgd2l0aFJldHJ5KCgpID0+IGdoRmV0Y2goYC9yZXBvcy8ke293bmVyfS8ke3JlcG99L2lzc3Vlcz8ke3FzfWApLCB7IGxhYmVsOiAibGlzdElzc3VlcyIgfSk7CiAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIHJlY29yZEVycm9yKGVycik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldElzc3VlKG93bmVyLCByZXBvLCBudW1iZXIpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnaEZldGNoKGAvcmVwb3MvJHtvd25lcn0vJHtyZXBvfS9pc3N1ZXMvJHtudW1iZXJ9YCksIHsgbGFiZWw6ICJnZXRJc3N1ZSIgfSk7CiAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIHJlY29yZEVycm9yKGVycik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZElzc3VlTGFiZWxzKG93bmVyLCByZXBvLCBudW1iZXIsIGxhYmVscykgewogICAgdHJ5IHsKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgd2l0aFJldHJ5KCgpID0+IGdoRmV0Y2goYC9yZXBvcy8ke293bmVyfS8ke3JlcG99L2lzc3Vlcy8ke251bWJlcn0vbGFiZWxzYCwgewogICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgYm9keTogeyBsYWJlbHMgfSwKICAgICAgICB9KSwgeyBsYWJlbDogImFkZElzc3VlTGFiZWxzIiB9KTsKICAgICAgICBjbGVhckVycm9yKCk7CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmVjb3JkRXJyb3IoZXJyKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQpleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkSXNzdWVDb21tZW50KG93bmVyLCByZXBvLCBudW1iZXIsIGJvZHkpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnaEZldGNoKGAvcmVwb3MvJHtvd25lcn0vJHtyZXBvfS9pc3N1ZXMvJHtudW1iZXJ9L2NvbW1lbnRzYCwgewogICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgYm9keTogeyBib2R5IH0sCiAgICAgICAgfSksIHsgbGFiZWw6ICJhZGRJc3N1ZUNvbW1lbnQiIH0pOwogICAgICAgIGNsZWFyRXJyb3IoKTsKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICByZWNvcmRFcnJvcihlcnIpOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9CmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRJc3N1ZUFzc2lnbmVlcyhvd25lciwgcmVwbywgbnVtYmVyLCBhc3NpZ25lZXMpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnaEZldGNoKGAvcmVwb3MvJHtvd25lcn0vJHtyZXBvfS9pc3N1ZXMvJHtudW1iZXJ9L2Fzc2lnbmVlc2AsIHsKICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICAgIGJvZHk6IHsgYXNzaWduZWVzIH0sCiAgICAgICAgfSksIHsgbGFiZWw6ICJhZGRJc3N1ZUFzc2lnbmVlcyIgfSk7CiAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIHJlY29yZEVycm9yKGVycik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KLy8g4pSA4pSAIFB1bGwgUmVxdWVzdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0UHVsbFJlcXVlc3RzKG93bmVyLCByZXBvLCBvcHRzKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTsKICAgICAgICBpZiAob3B0cz8uc3RhdGUpCiAgICAgICAgICAgIHBhcmFtcy5zZXQoInN0YXRlIiwgb3B0cy5zdGF0ZSk7CiAgICAgICAgcGFyYW1zLnNldCgicGVyX3BhZ2UiLCBTdHJpbmcob3B0cz8ucGVyX3BhZ2UgPz8gMzApKTsKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgd2l0aFJldHJ5KCgpID0+IGdoRmV0Y2goYC9yZXBvcy8ke293bmVyfS8ke3JlcG99L3B1bGxzPyR7cGFyYW1zfWApLCB7IGxhYmVsOiAibGlzdFB1bGxSZXF1ZXN0cyIgfSk7CiAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIHJlY29yZEVycm9yKGVycik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFB1bGxSZXF1ZXN0KG93bmVyLCByZXBvLCBudW1iZXIpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnaEZldGNoKGAvcmVwb3MvJHtvd25lcn0vJHtyZXBvfS9wdWxscy8ke251bWJlcn1gKSwgeyBsYWJlbDogImdldFB1bGxSZXF1ZXN0IiB9KTsKICAgICAgICBjbGVhckVycm9yKCk7CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmVjb3JkRXJyb3IoZXJyKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UFJGaWxlcyhvd25lciwgcmVwbywgbnVtYmVyKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB3aXRoUmV0cnkoKCkgPT4gZ2hGZXRjaChgL3JlcG9zLyR7b3duZXJ9LyR7cmVwb30vcHVsbHMvJHtudW1iZXJ9L2ZpbGVzP3Blcl9wYWdlPTEwMGApLCB7IGxhYmVsOiAiZ2V0UFJGaWxlcyIgfSk7CiAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIHJlY29yZEVycm9yKGVycik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBSUmV2aWV3cyhvd25lciwgcmVwbywgbnVtYmVyKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB3aXRoUmV0cnkoKCkgPT4gZ2hGZXRjaChgL3JlcG9zLyR7b3duZXJ9LyR7cmVwb30vcHVsbHMvJHtudW1iZXJ9L3Jldmlld3NgKSwgeyBsYWJlbDogImdldFBSUmV2aWV3cyIgfSk7CiAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIHJlY29yZEVycm9yKGVycik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVBSUmV2aWV3KG93bmVyLCByZXBvLCBudW1iZXIsIG9wdHMpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnaEZldGNoKGAvcmVwb3MvJHtvd25lcn0vJHtyZXBvfS9wdWxscy8ke251bWJlcn0vcmV2aWV3c2AsIHsKICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICAgIGJvZHk6IHsgYm9keTogb3B0cy5ib2R5LCBldmVudDogb3B0cy5ldmVudCB9LAogICAgICAgIH0pLCB7IGxhYmVsOiAiY3JlYXRlUFJSZXZpZXciIH0pOwogICAgICAgIGNsZWFyRXJyb3IoKTsKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICByZWNvcmRFcnJvcihlcnIpOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8vIOKUgOKUgCBDb21taXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdENvbW1pdHMob3duZXIsIHJlcG8sIG9wdHMpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpOwogICAgICAgIGlmIChvcHRzPy5zaGEpCiAgICAgICAgICAgIHBhcmFtcy5zZXQoInNoYSIsIG9wdHMuc2hhKTsKICAgICAgICBpZiAob3B0cz8uc2luY2UpCiAgICAgICAgICAgIHBhcmFtcy5zZXQoInNpbmNlIiwgb3B0cy5zaW5jZSk7CiAgICAgICAgaWYgKG9wdHM/LnVudGlsKQogICAgICAgICAgICBwYXJhbXMuc2V0KCJ1bnRpbCIsIG9wdHMudW50aWwpOwogICAgICAgIHBhcmFtcy5zZXQoInBlcl9wYWdlIiwgU3RyaW5nKG9wdHM/LnBlcl9wYWdlID8/IDMwKSk7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnaEZldGNoKGAvcmVwb3MvJHtvd25lcn0vJHtyZXBvfS9jb21taXRzPyR7cGFyYW1zfWApLCB7IGxhYmVsOiAibGlzdENvbW1pdHMiIH0pOwogICAgICAgIGNsZWFyRXJyb3IoKTsKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICByZWNvcmRFcnJvcihlcnIpOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9CmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDb21taXQob3duZXIsIHJlcG8sIHNoYSkgewogICAgdHJ5IHsKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgd2l0aFJldHJ5KCgpID0+IGdoRmV0Y2goYC9yZXBvcy8ke293bmVyfS8ke3JlcG99L2NvbW1pdHMvJHtzaGF9YCksIHsgbGFiZWw6ICJnZXRDb21taXQiIH0pOwogICAgICAgIGNsZWFyRXJyb3IoKTsKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICByZWNvcmRFcnJvcihlcnIpOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8vIOKUgOKUgCBMYWJlbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0TGFiZWxzKG93bmVyLCByZXBvKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB3aXRoUmV0cnkoKCkgPT4gZ2hGZXRjaChgL3JlcG9zLyR7b3duZXJ9LyR7cmVwb30vbGFiZWxzP3Blcl9wYWdlPTEwMGApLCB7IGxhYmVsOiAibGlzdExhYmVscyIgfSk7CiAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIHJlY29yZEVycm9yKGVycik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUxhYmVsKG93bmVyLCByZXBvLCBvcHRzKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB3aXRoUmV0cnkoKCkgPT4gZ2hGZXRjaChgL3JlcG9zLyR7b3duZXJ9LyR7cmVwb30vbGFiZWxzYCwgewogICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgYm9keTogb3B0cywKICAgICAgICB9KSwgeyBsYWJlbDogImNyZWF0ZUxhYmVsIiB9KTsKICAgICAgICBjbGVhckVycm9yKCk7CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmVjb3JkRXJyb3IoZXJyKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQovLyDilIDilIAgV29ya2Zsb3cgUnVucyAoR2l0SHViIEFjdGlvbnMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFdvcmtmbG93UnVucyhvd25lciwgcmVwbywgb3B0cykgewogICAgdHJ5IHsKICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7CiAgICAgICAgaWYgKG9wdHM/LnN0YXR1cykKICAgICAgICAgICAgcGFyYW1zLnNldCgic3RhdHVzIiwgb3B0cy5zdGF0dXMpOwogICAgICAgIGlmIChvcHRzPy5jcmVhdGVkKQogICAgICAgICAgICBwYXJhbXMuc2V0KCJjcmVhdGVkIiwgb3B0cy5jcmVhdGVkKTsKICAgICAgICBwYXJhbXMuc2V0KCJwZXJfcGFnZSIsIFN0cmluZyhvcHRzPy5wZXJfcGFnZSA/PyAzMCkpOwogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB3aXRoUmV0cnkoKCkgPT4gZ2hGZXRjaChgL3JlcG9zLyR7b3duZXJ9LyR7cmVwb30vYWN0aW9ucy9ydW5zPyR7cGFyYW1zfWApLCB7IGxhYmVsOiAibGlzdFdvcmtmbG93UnVucyIgfSk7CiAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIHJlY29yZEVycm9yKGVycik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KLy8g4pSA4pSAIENoZWNrIFJ1bnMgKENJIFN0YXR1cykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0Q2hlY2tSdW5zKG93bmVyLCByZXBvLCByZWYpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnaEZldGNoKGAvcmVwb3MvJHtvd25lcn0vJHtyZXBvfS9jb21taXRzLyR7cmVmfS9jaGVjay1ydW5zYCksIHsgbGFiZWw6ICJsaXN0Q2hlY2tSdW5zIiB9KTsKICAgICAgICBjbGVhckVycm9yKCk7CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmVjb3JkRXJyb3IoZXJyKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQovLyDilIDilIAgQnJhbmNoIENvbXBhcmlzb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21wYXJlQnJhbmNoZXMob3duZXIsIHJlcG8sIGJhc2UsIGhlYWQpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnaEZldGNoKGAvcmVwb3MvJHtvd25lcn0vJHtyZXBvfS9jb21wYXJlLyR7YmFzZX0uLi4ke2hlYWR9YCksIHsgbGFiZWw6ICJjb21wYXJlQnJhbmNoZXMiIH0pOwogICAgICAgIGNsZWFyRXJyb3IoKTsKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICByZWNvcmRFcnJvcihlcnIpOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8vIOKUgOKUgCBUYWdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFRhZ3Mob3duZXIsIHJlcG8sIG9wdHMpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpOwogICAgICAgIHBhcmFtcy5zZXQoInBlcl9wYWdlIiwgU3RyaW5nKG9wdHM/LnBlcl9wYWdlID8/IDMwKSk7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiBnaEZldGNoKGAvcmVwb3MvJHtvd25lcn0vJHtyZXBvfS90YWdzPyR7cGFyYW1zfWApLCB7IGxhYmVsOiAibGlzdFRhZ3MiIH0pOwogICAgICAgIGNsZWFyRXJyb3IoKTsKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICByZWNvcmRFcnJvcihlcnIpOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8vIOKUgOKUgCBJc3N1ZSBFdmVudHMgKGZvciBTTEEgdHJhY2tpbmcpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdElzc3VlRXZlbnRzKG93bmVyLCByZXBvLCBpc3N1ZU51bWJlcikgewogICAgdHJ5IHsKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgd2l0aFJldHJ5KCgpID0+IGdoRmV0Y2goYC9yZXBvcy8ke293bmVyfS8ke3JlcG99L2lzc3Vlcy8ke2lzc3VlTnVtYmVyfS9ldmVudHNgKSwgeyBsYWJlbDogImxpc3RJc3N1ZUV2ZW50cyIgfSk7CiAgICAgICAgY2xlYXJFcnJvcigpOwogICAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIHJlY29yZEVycm9yKGVycik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KLy8g4pSA4pSAIElzc3VlIENvbW1lbnRzIChmb3IgU0xBIGZpcnN0IHJlc3BvbnNlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RJc3N1ZUNvbW1lbnRzKG93bmVyLCByZXBvLCBpc3N1ZU51bWJlciwgb3B0cykgewogICAgdHJ5IHsKICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7CiAgICAgICAgcGFyYW1zLnNldCgicGVyX3BhZ2UiLCBTdHJpbmcob3B0cz8ucGVyX3BhZ2UgPz8gMzApKTsKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgd2l0aFJldHJ5KCgpID0+IGdoRmV0Y2goYC9yZXBvcy8ke293bmVyfS8ke3JlcG99L2lzc3Vlcy8ke2lzc3VlTnVtYmVyfS9jb21tZW50cz8ke3BhcmFtc31gKSwgeyBsYWJlbDogImxpc3RJc3N1ZUNvbW1lbnRzIiB9KTsKICAgICAgICBjbGVhckVycm9yKCk7CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmVjb3JkRXJyb3IoZXJyKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQovLyDilIDilIAgSGVhbHRoIHJlcG9ydGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWx0aCgpIHsKICAgIHJldHVybiB7CiAgICAgICAgYXZhaWxhYmxlOiBpc0F2YWlsYWJsZSgpLAogICAgICAgIGxhc3RFcnJvcjogbGFzdEVycm9yS2luZCwKICAgICAgICBsYXN0RXJyb3JNZXNzYWdlLAogICAgfTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1jbGllbnQuanMubWFw","github/commit-analysis.js":"LyoqCiAqIENvbW1pdCBhbmFseXNpcyDigJQgc2NhbiBjb21taXRzIGZvciBwYXR0ZXJucywgcXVhbGl0eSBtZXRyaWNzLCBhbmQgaXNzdWVzLgogKgogKiBDaGVja3M6IGNvbnZlbnRpb25hbCBjb21taXQgZm9ybWF0LCBtZXNzYWdlIHF1YWxpdHksIGNvbW1pdCBzaXplLAogKiBjby1hdXRob3JzLCBicmVha2luZyBjaGFuZ2VzLCBhbmQgY29tbW9uIGFudGktcGF0dGVybnMuCiAqLwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCAqIGFzIGNsaWVudCBmcm9tICIuL2NsaWVudC5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiZ2l0aHViLmNvbW1pdC1hbmFseXNpcyIpOwovLyDilIDilIAgQ29udmVudGlvbmFsIGNvbW1pdCBwYXJzaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjb25zdCBDT05WRU5USU9OQUxfUEFUVEVSTiA9IC9eKGZlYXR8Zml4fGRvY3N8c3R5bGV8cmVmYWN0b3J8cGVyZnx0ZXN0fGJ1aWxkfGNpfGNob3JlfHJldmVydCkoXCguKz9cKSk/KCEpPzpccy87CmNvbnN0IFBBVFRFUk5fTUFQID0gewogICAgZmVhdDogImZlYXR1cmUiLAogICAgZml4OiAiYnVnZml4IiwKICAgIGRvY3M6ICJkb2NzIiwKICAgIHN0eWxlOiAic3R5bGUiLAogICAgcmVmYWN0b3I6ICJyZWZhY3RvciIsCiAgICBwZXJmOiAicGVyZiIsCiAgICB0ZXN0OiAidGVzdCIsCiAgICBidWlsZDogImNob3JlIiwKICAgIGNpOiAiY2kiLAogICAgY2hvcmU6ICJjaG9yZSIsCiAgICByZXZlcnQ6ICJyZXZlcnQiLAp9OwovLyDilIDilIAgQW5hbHlzaXMgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gZGV0ZWN0UGF0dGVybnMobWVzc2FnZSkgewogICAgY29uc3QgbG93ZXIgPSBtZXNzYWdlLnRvTG93ZXJDYXNlKCk7CiAgICBjb25zdCBmaXJzdExpbmUgPSBtZXNzYWdlLnNwbGl0KCJcbiIpWzBdOwogICAgY29uc3QgcGF0dGVybnMgPSBbXTsKICAgIC8vIENoZWNrIGNvbnZlbnRpb25hbCBjb21taXQgZm9ybWF0IGZpcnN0CiAgICBjb25zdCBtYXRjaCA9IGZpcnN0TGluZS5tYXRjaChDT05WRU5USU9OQUxfUEFUVEVSTik7CiAgICBpZiAobWF0Y2gpIHsKICAgICAgICBjb25zdCBtYXBwZWQgPSBQQVRURVJOX01BUFttYXRjaFsxXV07CiAgICAgICAgaWYgKG1hcHBlZCkKICAgICAgICAgICAgcGF0dGVybnMucHVzaChtYXBwZWQpOwogICAgICAgIHJldHVybiBwYXR0ZXJuczsKICAgIH0KICAgIC8vIE1lcmdlIGNvbW1pdAogICAgaWYgKGxvd2VyLnN0YXJ0c1dpdGgoIm1lcmdlICIpKSB7CiAgICAgICAgcGF0dGVybnMucHVzaCgibWVyZ2UiKTsKICAgICAgICByZXR1cm4gcGF0dGVybnM7CiAgICB9CiAgICAvLyBIZXVyaXN0aWMgZGV0ZWN0aW9uCiAgICBpZiAoL1xid2lwXGIvaS50ZXN0KGZpcnN0TGluZSkpCiAgICAgICAgcGF0dGVybnMucHVzaCgid2lwIik7CiAgICBpZiAoL1xiKGZpeHxidWd8cGF0Y2h8aG90Zml4KVxiL2kudGVzdChmaXJzdExpbmUpKQogICAgICAgIHBhdHRlcm5zLnB1c2goImJ1Z2ZpeCIpOwogICAgaWYgKC9cYihhZGR8ZmVhdHxmZWF0dXJlfGltcGxlbWVudHxuZXcpXGIvaS50ZXN0KGZpcnN0TGluZSkpCiAgICAgICAgcGF0dGVybnMucHVzaCgiZmVhdHVyZSIpOwogICAgaWYgKC9cYihyZWZhY3RvcnxyZXN0cnVjdHVyZXxyZW9yZ2FuaXplfGNsZWFuXHM/dXApXGIvaS50ZXN0KGZpcnN0TGluZSkpCiAgICAgICAgcGF0dGVybnMucHVzaCgicmVmYWN0b3IiKTsKICAgIGlmICgvXGIodGVzdHxzcGVjfGNvdmVyYWdlKVxiL2kudGVzdChmaXJzdExpbmUpKQogICAgICAgIHBhdHRlcm5zLnB1c2goInRlc3QiKTsKICAgIGlmICgvXGIoZG9jfHJlYWRtZXxjaGFuZ2Vsb2cpXGIvaS50ZXN0KGZpcnN0TGluZSkpCiAgICAgICAgcGF0dGVybnMucHVzaCgiZG9jcyIpOwogICAgaWYgKC9cYihjaXxwaXBlbGluZXx3b3JrZmxvd3xnaXRodWIuYWN0aW9ucylcYi9pLnRlc3QoZmlyc3RMaW5lKSkKICAgICAgICBwYXR0ZXJucy5wdXNoKCJjaSIpOwogICAgaWYgKC9cYihwZXJmfG9wdGltaXplfHNwZWVkfGZhc3QpXGIvaS50ZXN0KGZpcnN0TGluZSkpCiAgICAgICAgcGF0dGVybnMucHVzaCgicGVyZiIpOwogICAgaWYgKC9cYnJldmVydFxiL2kudGVzdChmaXJzdExpbmUpKQogICAgICAgIHBhdHRlcm5zLnB1c2goInJldmVydCIpOwogICAgaWYgKHBhdHRlcm5zLmxlbmd0aCA9PT0gMCkKICAgICAgICBwYXR0ZXJucy5wdXNoKCJjaG9yZSIpOwogICAgcmV0dXJuIHBhdHRlcm5zOwp9CmZ1bmN0aW9uIGFzc2Vzc01lc3NhZ2VRdWFsaXR5KG1lc3NhZ2UpIHsKICAgIGNvbnN0IGZpcnN0TGluZSA9IG1lc3NhZ2Uuc3BsaXQoIlxuIilbMF0udHJpbSgpOwogICAgLy8gUG9vcjogdmVyeSBzaG9ydCwgbm8gY29udGV4dAogICAgaWYgKGZpcnN0TGluZS5sZW5ndGggPCAxMCkKICAgICAgICByZXR1cm4gInBvb3IiOwogICAgLy8gUG9vcjogZ2VuZXJpYyBtZXNzYWdlcwogICAgaWYgKC9eKGZpeHx1cGRhdGV8Y2hhbmdlfHdpcHxzdHVmZnx0ZXN0fGFzZGZ8dG1wKSQvaS50ZXN0KGZpcnN0TGluZSkpCiAgICAgICAgcmV0dXJuICJwb29yIjsKICAgIC8vIEZhaXI6IGRlY2VudCBsZW5ndGggYnV0IG5vIGNvbnZlbnRpb25hbCBmb3JtYXQgb3Igc3RydWN0dXJlCiAgICBpZiAoZmlyc3RMaW5lLmxlbmd0aCA8IDMwICYmICFDT05WRU5USU9OQUxfUEFUVEVSTi50ZXN0KGZpcnN0TGluZSkpCiAgICAgICAgcmV0dXJuICJmYWlyIjsKICAgIC8vIEdvb2Q6IGNvbnZlbnRpb25hbCBmb3JtYXQgb3IgZGVzY3JpcHRpdmUKICAgIGlmIChDT05WRU5USU9OQUxfUEFUVEVSTi50ZXN0KGZpcnN0TGluZSkpCiAgICAgICAgcmV0dXJuICJnb29kIjsKICAgIGlmIChmaXJzdExpbmUubGVuZ3RoID49IDMwKQogICAgICAgIHJldHVybiAiZ29vZCI7CiAgICByZXR1cm4gImZhaXIiOwp9CmZ1bmN0aW9uIGNhdGVnb3JpemVTaXplRnJvbVN0YXRzKGFkZGl0aW9ucywgZGVsZXRpb25zKSB7CiAgICBjb25zdCB0b3RhbCA9IGFkZGl0aW9ucyArIGRlbGV0aW9uczsKICAgIGlmICh0b3RhbCA8PSAxMCkKICAgICAgICByZXR1cm4gInRpbnkiOwogICAgaWYgKHRvdGFsIDw9IDUwKQogICAgICAgIHJldHVybiAic21hbGwiOwogICAgaWYgKHRvdGFsIDw9IDIwMCkKICAgICAgICByZXR1cm4gIm1lZGl1bSI7CiAgICBpZiAodG90YWwgPD0gNTAwKQogICAgICAgIHJldHVybiAibGFyZ2UiOwogICAgcmV0dXJuICJodWdlIjsKfQpmdW5jdGlvbiBkZXRlY3RJc3N1ZXMobWVzc2FnZSwgYWRkaXRpb25zLCBkZWxldGlvbnMpIHsKICAgIGNvbnN0IGlzc3VlcyA9IFtdOwogICAgY29uc3QgZmlyc3RMaW5lID0gbWVzc2FnZS5zcGxpdCgiXG4iKVswXS50cmltKCk7CiAgICAvLyBNZXNzYWdlIHF1YWxpdHkgaXNzdWVzCiAgICBpZiAoZmlyc3RMaW5lLmxlbmd0aCA8IDUpIHsKICAgICAgICBpc3N1ZXMucHVzaCh7IHNldmVyaXR5OiAid2FybmluZyIsIG1lc3NhZ2U6ICJDb21taXQgbWVzc2FnZSBpcyB0b28gc2hvcnQgdG8gYmUgbWVhbmluZ2Z1bC4iIH0pOwogICAgfQogICAgaWYgKGZpcnN0TGluZS5sZW5ndGggPiA3MikgewogICAgICAgIGlzc3Vlcy5wdXNoKHsgc2V2ZXJpdHk6ICJpbmZvIiwgbWVzc2FnZTogIkZpcnN0IGxpbmUgZXhjZWVkcyA3MiBjaGFyYWN0ZXJzIChjb252ZW50aW9uYWwgbGltaXQpLiIgfSk7CiAgICB9CiAgICBpZiAoL15bYS16XS8udGVzdChmaXJzdExpbmUpICYmICFDT05WRU5USU9OQUxfUEFUVEVSTi50ZXN0KGZpcnN0TGluZSkpIHsKICAgICAgICBpc3N1ZXMucHVzaCh7IHNldmVyaXR5OiAiaW5mbyIsIG1lc3NhZ2U6ICJGaXJzdCBsaW5lIHN0YXJ0cyB3aXRoIGxvd2VyY2FzZSAobm90IGNvbnZlbnRpb25hbCBmb3JtYXQpLiIgfSk7CiAgICB9CiAgICBpZiAoZmlyc3RMaW5lLmVuZHNXaXRoKCIuIikpIHsKICAgICAgICBpc3N1ZXMucHVzaCh7IHNldmVyaXR5OiAiaW5mbyIsIG1lc3NhZ2U6ICJTdWJqZWN0IGxpbmUgZW5kcyB3aXRoIGEgcGVyaW9kIChjb252ZW50aW9uIHNheXMgZG9uJ3QpLiIgfSk7CiAgICB9CiAgICAvLyBTaXplIGlzc3VlcwogICAgY29uc3QgdG90YWwgPSBhZGRpdGlvbnMgKyBkZWxldGlvbnM7CiAgICBpZiAodG90YWwgPiAxMDAwKSB7CiAgICAgICAgaXNzdWVzLnB1c2goeyBzZXZlcml0eTogIndhcm5pbmciLCBtZXNzYWdlOiBgVmVyeSBsYXJnZSBjb21taXQgKCR7dG90YWx9IGxpbmVzKS4gQ29uc2lkZXIgc21hbGxlciwgYXRvbWljIGNvbW1pdHMuYCB9KTsKICAgIH0KICAgIC8vIFdJUCBkZXRlY3Rpb24KICAgIGlmICgvXGJ3aXBcYi9pLnRlc3QoZmlyc3RMaW5lKSkgewogICAgICAgIGlzc3Vlcy5wdXNoKHsgc2V2ZXJpdHk6ICJ3YXJuaW5nIiwgbWVzc2FnZTogIkNvbW1pdCBtYXJrZWQgYXMgV0lQIOKAlCBzaG91bGQgYmUgc3F1YXNoZWQgYmVmb3JlIG1lcmdlLiIgfSk7CiAgICB9CiAgICAvLyBGaXh1cCBkZXRlY3Rpb24KICAgIGlmICgvXihmaXh1cHxzcXVhc2gpIVxzLy50ZXN0KGZpcnN0TGluZSkpIHsKICAgICAgICBpc3N1ZXMucHVzaCh7IHNldmVyaXR5OiAiaW5mbyIsIG1lc3NhZ2U6ICJGaXh1cC9zcXVhc2ggY29tbWl0IGRldGVjdGVkIOKAlCBlbnN1cmUgaXQgZ2V0cyByZWJhc2VkLiIgfSk7CiAgICB9CiAgICByZXR1cm4gaXNzdWVzOwp9Ci8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogQW5hbHl6ZSBhIHNpbmdsZSBjb21taXQgYnkgU0hBLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFuYWx5emVDb21taXQob3duZXIsIHJlcG8sIHNoYSkgewogICAgbG9nLmluZm8oYEFuYWx5emluZyBjb21taXQgJHtvd25lcn0vJHtyZXBvfUAke3NoYS5zbGljZSgwLCA4KX1gKTsKICAgIGNvbnN0IGNvbW1pdCA9IGF3YWl0IGNsaWVudC5nZXRDb21taXQob3duZXIsIHJlcG8sIHNoYSk7CiAgICBpZiAoIWNvbW1pdCkgewogICAgICAgIGxvZy53YXJuKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0ICR7c2hhfWApOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIGFuYWx5emVDb21taXREYXRhKG93bmVyLCByZXBvLCBjb21taXQuc2hhLCBjb21taXQubWVzc2FnZSwgY29tbWl0LnN0YXRzPy5hZGRpdGlvbnMgPz8gMCwgY29tbWl0LnN0YXRzPy5kZWxldGlvbnMgPz8gMCk7Cn0KLyoqCiAqIEFuYWx5emUgYSBjb21taXQgZnJvbSByYXcgZGF0YSAoYXZvaWRzIEFQSSBjYWxsIHdoZW4gZGF0YSBpcyBhbHJlYWR5IGF2YWlsYWJsZSkuCiAqLwpleHBvcnQgZnVuY3Rpb24gYW5hbHl6ZUNvbW1pdERhdGEob3duZXIsIHJlcG8sIHNoYSwgbWVzc2FnZSwgYWRkaXRpb25zLCBkZWxldGlvbnMpIHsKICAgIGNvbnN0IHBhdHRlcm5zID0gZGV0ZWN0UGF0dGVybnMobWVzc2FnZSk7CiAgICBjb25zdCBtZXNzYWdlUXVhbGl0eSA9IGFzc2Vzc01lc3NhZ2VRdWFsaXR5KG1lc3NhZ2UpOwogICAgY29uc3Qgc2l6ZUNhdGVnb3J5ID0gY2F0ZWdvcml6ZVNpemVGcm9tU3RhdHMoYWRkaXRpb25zLCBkZWxldGlvbnMpOwogICAgY29uc3QgaXNDb252ZW50aW9uYWwgPSBDT05WRU5USU9OQUxfUEFUVEVSTi50ZXN0KG1lc3NhZ2Uuc3BsaXQoIlxuIilbMF0pOwogICAgY29uc3QgaGFzQ29BdXRob3JzID0gL2NvLWF1dGhvcmVkLWJ5Oi9pLnRlc3QobWVzc2FnZSk7CiAgICBjb25zdCBoYXNCcmVha2luZ0NoYW5nZSA9IC9CUkVBS0lORy5DSEFOR0UvaS50ZXN0KG1lc3NhZ2UpIHx8IC9eLishOi8udGVzdChtZXNzYWdlLnNwbGl0KCJcbiIpWzBdKTsKICAgIGNvbnN0IHF1YWxpdHkgPSB7CiAgICAgICAgc2NvcmU6IGNvbXB1dGVRdWFsaXR5U2NvcmUobWVzc2FnZVF1YWxpdHksIGlzQ29udmVudGlvbmFsLCBzaXplQ2F0ZWdvcnkpLAogICAgICAgIG1lc3NhZ2VRdWFsaXR5LAogICAgICAgIGhhc0NvQXV0aG9ycywKICAgICAgICBoYXNCcmVha2luZ0NoYW5nZSwKICAgICAgICBpc0NvbnZlbnRpb25hbCwKICAgICAgICBzaXplQ2F0ZWdvcnksCiAgICB9OwogICAgY29uc3QgaXNzdWVzID0gZGV0ZWN0SXNzdWVzKG1lc3NhZ2UsIGFkZGl0aW9ucywgZGVsZXRpb25zKTsKICAgIHJldHVybiB7CiAgICAgICAgc2hhLAogICAgICAgIHJlcG86IGAke293bmVyfS8ke3JlcG99YCwKICAgICAgICBxdWFsaXR5LAogICAgICAgIHBhdHRlcm5zLAogICAgICAgIGlzc3VlcywKICAgICAgICBhbmFseXplZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICB9Owp9Ci8qKgogKiBBbmFseXplIHJlY2VudCBjb21taXRzIGluIGEgcmVwb3NpdG9yeS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhbmFseXplUmVjZW50Q29tbWl0cyhvd25lciwgcmVwbywgb3B0cykgewogICAgbG9nLmluZm8oYEFuYWx5emluZyByZWNlbnQgY29tbWl0cyBmb3IgJHtvd25lcn0vJHtyZXBvfWApOwogICAgY29uc3QgY29tbWl0cyA9IGF3YWl0IGNsaWVudC5saXN0Q29tbWl0cyhvd25lciwgcmVwbywgewogICAgICAgIHBlcl9wYWdlOiBvcHRzPy5jb3VudCA/PyAyMCwKICAgICAgICBzaW5jZTogb3B0cz8uc2luY2UsCiAgICB9KTsKICAgIGlmICghY29tbWl0cykKICAgICAgICByZXR1cm4gW107CiAgICBjb25zdCByZXN1bHRzID0gW107CiAgICBmb3IgKGNvbnN0IGMgb2YgY29tbWl0cykgewogICAgICAgIHJlc3VsdHMucHVzaChhbmFseXplQ29tbWl0RGF0YShvd25lciwgcmVwbywgYy5zaGEsIGMuY29tbWl0Lm1lc3NhZ2UsIDAsIC8vIExpc3QgZW5kcG9pbnQgZG9lc24ndCBpbmNsdWRlIHN0YXRzCiAgICAgICAgMCkpOwogICAgfQogICAgY29uc3QgYXZnU2NvcmUgPSByZXN1bHRzLmxlbmd0aCA+IDAKICAgICAgICA/IE1hdGgucm91bmQocmVzdWx0cy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgci5xdWFsaXR5LnNjb3JlLCAwKSAvIHJlc3VsdHMubGVuZ3RoKQogICAgICAgIDogMDsKICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICBzb3VyY2U6ICJib2FyZCIsCiAgICAgICAgc3VtbWFyeTogYENvbW1pdCBhbmFseXNpczogJHtyZXN1bHRzLmxlbmd0aH0gY29tbWl0cyBpbiAke293bmVyfS8ke3JlcG99LCBhdmcgcXVhbGl0eSAke2F2Z1Njb3JlfS8xMDBgLAogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0czsKfQovLyDilIDilIAgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIENvbXB1dGUgcXVhbGl0eSB0cmVuZCBieSBjb21wYXJpbmcgcmVjZW50IGNvbW1pdHMgYWdhaW5zdCBvbGRlciBjb21taXRzLgogKiBGZXRjaGVzIGNvbW1pdHMgZnJvbSB0aGUgbGFzdCAzMCBkYXlzIGFuZCBzcGxpdHMgdGhlbSBpbnRvIHR3byBoYWx2ZXMuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UXVhbGl0eVRyZW5kKG93bmVyLCByZXBvLCBvcHRzKSB7CiAgICBjb25zdCBkYXlzID0gb3B0cz8uZGF5cyA/PyAzMDsKICAgIGNvbnN0IHNpbmNlID0gbmV3IERhdGUoRGF0ZS5ub3coKSAtIGRheXMgKiAyNCAqIDYwICogNjAgKiAxMDAwKS50b0lTT1N0cmluZygpOwogICAgY29uc3QgY29tbWl0cyA9IGF3YWl0IGNsaWVudC5saXN0Q29tbWl0cyhvd25lciwgcmVwbywgeyBzaW5jZSwgcGVyX3BhZ2U6IDEwMCB9KTsKICAgIGlmICghY29tbWl0cyB8fCBjb21taXRzLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IGFuYWx5c2VzID0gY29tbWl0cy5tYXAoKGMpID0+IGFuYWx5emVDb21taXREYXRhKG93bmVyLCByZXBvLCBjLnNoYSwgYy5jb21taXQubWVzc2FnZSwgMCwgMCkpOwogICAgY29uc3QgbWlkcG9pbnQgPSBNYXRoLmZsb29yKGFuYWx5c2VzLmxlbmd0aCAvIDIpOwogICAgY29uc3QgcmVjZW50ID0gYW5hbHlzZXMuc2xpY2UoMCwgbWlkcG9pbnQpOwogICAgY29uc3Qgb2xkZXIgPSBhbmFseXNlcy5zbGljZShtaWRwb2ludCk7CiAgICBjb25zdCBhdmdTY29yZSA9IChpdGVtcykgPT4gaXRlbXMubGVuZ3RoID09PSAwID8gMCA6IE1hdGgucm91bmQoaXRlbXMucmVkdWNlKChzLCBhKSA9PiBzICsgYS5xdWFsaXR5LnNjb3JlLCAwKSAvIGl0ZW1zLmxlbmd0aCk7CiAgICBjb25zdCByZWNlbnRBdmcgPSBhdmdTY29yZShyZWNlbnQpOwogICAgY29uc3Qgb2xkZXJBdmcgPSBhdmdTY29yZShvbGRlcik7CiAgICBjb25zdCBjb252ZW50aW9uYWxDb3VudCA9IGFuYWx5c2VzLmZpbHRlcigoYSkgPT4gYS5xdWFsaXR5LmlzQ29udmVudGlvbmFsKS5sZW5ndGg7CiAgICBjb25zdCBjb252ZW50aW9uYWxSYXRlID0gTWF0aC5yb3VuZCgoY29udmVudGlvbmFsQ291bnQgLyBhbmFseXNlcy5sZW5ndGgpICogMTAwKSAvIDEwMDsKICAgIC8vIEF1dGhvciBicmVha2Rvd24KICAgIGNvbnN0IGF1dGhvck1hcCA9IG5ldyBNYXAoKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWl0cy5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IGF1dGhvck5hbWUgPSBjb21taXRzW2ldLmNvbW1pdC5hdXRob3I/Lm5hbWUgPz8gInVua25vd24iOwogICAgICAgIGNvbnN0IGVudHJ5ID0gYXV0aG9yTWFwLmdldChhdXRob3JOYW1lKSA/PyB7IHNjb3JlczogW10sIGNvbnZlbnRpb25hbDogMCB9OwogICAgICAgIGVudHJ5LnNjb3Jlcy5wdXNoKGFuYWx5c2VzW2ldLnF1YWxpdHkuc2NvcmUpOwogICAgICAgIGlmIChhbmFseXNlc1tpXS5xdWFsaXR5LmlzQ29udmVudGlvbmFsKQogICAgICAgICAgICBlbnRyeS5jb252ZW50aW9uYWwrKzsKICAgICAgICBhdXRob3JNYXAuc2V0KGF1dGhvck5hbWUsIGVudHJ5KTsKICAgIH0KICAgIGNvbnN0IGF1dGhvckJyZWFrZG93biA9IFsuLi5hdXRob3JNYXAuZW50cmllcygpXQogICAgICAgIC5tYXAoKFthdXRob3IsIGRhdGFdKSA9PiAoewogICAgICAgIGF1dGhvciwKICAgICAgICBjb21taXRDb3VudDogZGF0YS5zY29yZXMubGVuZ3RoLAogICAgICAgIGF2Z1Njb3JlOiBNYXRoLnJvdW5kKGRhdGEuc2NvcmVzLnJlZHVjZSgocywgdikgPT4gcyArIHYsIDApIC8gZGF0YS5zY29yZXMubGVuZ3RoKSwKICAgICAgICBjb252ZW50aW9uYWxSYXRlOiBNYXRoLnJvdW5kKChkYXRhLmNvbnZlbnRpb25hbCAvIGRhdGEuc2NvcmVzLmxlbmd0aCkgKiAxMDApIC8gMTAwLAogICAgfSkpCiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIuY29tbWl0Q291bnQgLSBhLmNvbW1pdENvdW50KTsKICAgIGxldCBkaXJlY3Rpb24gPSAic3RhYmxlIjsKICAgIGlmIChyZWNlbnRBdmcgPiBvbGRlckF2ZyArIDUpCiAgICAgICAgZGlyZWN0aW9uID0gImltcHJvdmluZyI7CiAgICBlbHNlIGlmIChyZWNlbnRBdmcgPCBvbGRlckF2ZyAtIDUpCiAgICAgICAgZGlyZWN0aW9uID0gImRlY2xpbmluZyI7CiAgICBjb25zdCB0cmVuZCA9IHsKICAgICAgICByZXBvOiBgJHtvd25lcn0vJHtyZXBvfWAsCiAgICAgICAgcGVyaW9kOiB7IGZyb206IHNpbmNlLCB0bzogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0sCiAgICAgICAgcmVjZW50QXZnU2NvcmU6IHJlY2VudEF2ZywKICAgICAgICBvbGRlckF2Z1Njb3JlOiBvbGRlckF2ZywKICAgICAgICBkaXJlY3Rpb24sCiAgICAgICAgdG90YWxBbmFseXplZDogYW5hbHlzZXMubGVuZ3RoLAogICAgICAgIGNvbnZlbnRpb25hbENvbW1pdFJhdGU6IGNvbnZlbnRpb25hbFJhdGUsCiAgICAgICAgYXV0aG9yQnJlYWtkb3duLAogICAgfTsKICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICBzb3VyY2U6ICJib2FyZCIsCiAgICAgICAgc3VtbWFyeTogYENvbW1pdCBxdWFsaXR5IHRyZW5kOiAke293bmVyfS8ke3JlcG99IOKGkiAke2RpcmVjdGlvbn0gKHJlY2VudDogJHtyZWNlbnRBdmd9LCBvbGRlcjogJHtvbGRlckF2Z30pYCwKICAgIH0pOwogICAgcmV0dXJuIHRyZW5kOwp9CmZ1bmN0aW9uIGNvbXB1dGVRdWFsaXR5U2NvcmUobWVzc2FnZVF1YWxpdHksIGlzQ29udmVudGlvbmFsLCBzaXplQ2F0ZWdvcnkpIHsKICAgIGxldCBzY29yZSA9IDUwOwogICAgLy8gTWVzc2FnZSBxdWFsaXR5OiArMjAgZ29vZCwgKzEwIGZhaXIsIC0xMCBwb29yCiAgICBpZiAobWVzc2FnZVF1YWxpdHkgPT09ICJnb29kIikKICAgICAgICBzY29yZSArPSAyMDsKICAgIGVsc2UgaWYgKG1lc3NhZ2VRdWFsaXR5ID09PSAiZmFpciIpCiAgICAgICAgc2NvcmUgKz0gMTA7CiAgICBlbHNlCiAgICAgICAgc2NvcmUgLT0gMTA7CiAgICAvLyBDb252ZW50aW9uYWwgZm9ybWF0OiArMTUKICAgIGlmIChpc0NvbnZlbnRpb25hbCkKICAgICAgICBzY29yZSArPSAxNTsKICAgIC8vIFNpemU6ICsxNSB0aW55L3NtYWxsLCArNSBtZWRpdW0sIC01IGxhcmdlLCAtMTUgaHVnZQogICAgaWYgKHNpemVDYXRlZ29yeSA9PT0gInRpbnkiIHx8IHNpemVDYXRlZ29yeSA9PT0gInNtYWxsIikKICAgICAgICBzY29yZSArPSAxNTsKICAgIGVsc2UgaWYgKHNpemVDYXRlZ29yeSA9PT0gIm1lZGl1bSIpCiAgICAgICAgc2NvcmUgKz0gNTsKICAgIGVsc2UgaWYgKHNpemVDYXRlZ29yeSA9PT0gImxhcmdlIikKICAgICAgICBzY29yZSAtPSA1OwogICAgZWxzZQogICAgICAgIHNjb3JlIC09IDE1OwogICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgc2NvcmUpKTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1jb21taXQtYW5hbHlzaXMuanMubWFw","github/contributor-stats.js":"LyoqCiAqIENvbnRyaWJ1dG9yIHN0YXRzIOKAlCBjb21wdXRlIGFjdGl2aXR5IG1ldHJpY3MgZm9yIHJlcG9zaXRvcnkgY29udHJpYnV0b3JzLgogKgogKiBUcmFja3M6IGNvbW1pdHMgcGVyIGF1dGhvciwgUFJzIG9wZW5lZC9tZXJnZWQsIHJldmlld3MgZ2l2ZW4sCiAqIGxpbmVzIGFkZGVkL3JlbW92ZWQuCiAqLwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCAqIGFzIGNsaWVudCBmcm9tICIuL2NsaWVudC5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiZ2l0aHViLmNvbnRyaWJ1dG9yLXN0YXRzIik7CmNvbnN0IE1TX1BFUl9EQVkgPSAyNCAqIDYwICogNjAgKiAxMDAwOwovLyDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIENvbXB1dGUgY29udHJpYnV0b3Igc3RhdHMgZm9yIGEgcmVwb3NpdG9yeSBvdmVyIGEgZ2l2ZW4gcGVyaW9kLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRyaWJ1dG9yU3RhdHMob3duZXIsIHJlcG8sIG9wdHMpIHsKICAgIGNvbnN0IGRheXMgPSBvcHRzPy5kYXlzID8/IDMwOwogICAgY29uc3Qgc2luY2UgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gZGF5cyAqIE1TX1BFUl9EQVkpLnRvSVNPU3RyaW5nKCk7CiAgICBsb2cuaW5mbyhgQ29tcHV0aW5nIGNvbnRyaWJ1dG9yIHN0YXRzIGZvciAke293bmVyfS8ke3JlcG99IChsYXN0ICR7ZGF5c30gZGF5cylgKTsKICAgIC8vIEZldGNoIGRhdGEgaW4gcGFyYWxsZWwKICAgIGNvbnN0IFtjb21taXRzLCBwcnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgIGNsaWVudC5saXN0Q29tbWl0cyhvd25lciwgcmVwbywgeyBzaW5jZSwgcGVyX3BhZ2U6IDEwMCB9KSwKICAgICAgICBjbGllbnQubGlzdFB1bGxSZXF1ZXN0cyhvd25lciwgcmVwbywgeyBzdGF0ZTogImFsbCIsIHBlcl9wYWdlOiAxMDAgfSksCiAgICBdKTsKICAgIGlmICghY29tbWl0cykgewogICAgICAgIGxvZy53YXJuKGBGYWlsZWQgdG8gZmV0Y2ggZGF0YSBmb3IgJHtvd25lcn0vJHtyZXBvfWApOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLy8gRmlsdGVyIFBScyB0byB0aGUgdGltZSBwZXJpb2QKICAgIGNvbnN0IHBlcmlvZFBScyA9IChwcnMgPz8gW10pLmZpbHRlcigocHIpID0+IHsKICAgICAgICBjb25zdCBjcmVhdGVkID0gbmV3IERhdGUocHIuY3JlYXRlZF9hdCkuZ2V0VGltZSgpOwogICAgICAgIHJldHVybiBjcmVhdGVkID49IG5ldyBEYXRlKHNpbmNlKS5nZXRUaW1lKCk7CiAgICB9KTsKICAgIC8vIEJ1aWxkIGNvbnRyaWJ1dG9yIG1hcCBrZXllZCBieSBsb2dpbiBvciBlbWFpbAogICAgY29uc3QgcHJvZmlsZU1hcCA9IG5ldyBNYXAoKTsKICAgIGZ1bmN0aW9uIGdldE9yQ3JlYXRlKGtleSkgewogICAgICAgIGxldCBwID0gcHJvZmlsZU1hcC5nZXQoa2V5KTsKICAgICAgICBpZiAoIXApIHsKICAgICAgICAgICAgcCA9IHsKICAgICAgICAgICAgICAgIGxvZ2luOiBrZXksCiAgICAgICAgICAgICAgICBjb21taXRzOiAwLAogICAgICAgICAgICAgICAgcHJzT3BlbmVkOiAwLAogICAgICAgICAgICAgICAgcHJzTWVyZ2VkOiAwLAogICAgICAgICAgICAgICAgcmV2aWV3c0dpdmVuOiAwLAogICAgICAgICAgICAgICAgbGluZXNBZGRlZDogMCwKICAgICAgICAgICAgICAgIGxpbmVzUmVtb3ZlZDogMCwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcHJvZmlsZU1hcC5zZXQoa2V5LCBwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CiAgICAvLyBBZ2dyZWdhdGUgY29tbWl0cwogICAgZm9yIChjb25zdCBjIG9mIGNvbW1pdHMpIHsKICAgICAgICBjb25zdCBhdXRob3JLZXkgPSBjLmNvbW1pdC5hdXRob3I/LmVtYWlsID8/IGMuY29tbWl0LmF1dGhvcj8ubmFtZSA/PyAidW5rbm93biI7CiAgICAgICAgY29uc3QgcHJvZmlsZSA9IGdldE9yQ3JlYXRlKGF1dGhvcktleSk7CiAgICAgICAgcHJvZmlsZS5jb21taXRzKys7CiAgICB9CiAgICAvLyBBZ2dyZWdhdGUgUFJzCiAgICBmb3IgKGNvbnN0IHByIG9mIHBlcmlvZFBScykgewogICAgICAgIGNvbnN0IGxvZ2luID0gcHIudXNlci5sb2dpbjsKICAgICAgICBjb25zdCBwcm9maWxlID0gZ2V0T3JDcmVhdGUobG9naW4pOwogICAgICAgIHByb2ZpbGUucHJzT3BlbmVkKys7CiAgICAgICAgaWYgKHByLm1lcmdlZCkgewogICAgICAgICAgICBwcm9maWxlLnByc01lcmdlZCsrOwogICAgICAgICAgICBwcm9maWxlLmxpbmVzQWRkZWQgKz0gcHIuYWRkaXRpb25zOwogICAgICAgICAgICBwcm9maWxlLmxpbmVzUmVtb3ZlZCArPSBwci5kZWxldGlvbnM7CiAgICAgICAgfQogICAgfQogICAgLy8gRmV0Y2ggcmV2aWV3IGNvdW50cyBmb3IgZWFjaCBQUiAobGltaXRlZCB0byBmaXJzdCAyMCBQUnMgdG8gYXZvaWQgcmF0ZSBsaW1pdHMpCiAgICBjb25zdCBwcnNUb0NoZWNrID0gcGVyaW9kUFJzLnNsaWNlKDAsIDIwKTsKICAgIGZvciAoY29uc3QgcHIgb2YgcHJzVG9DaGVjaykgewogICAgICAgIGNvbnN0IHJldmlld3MgPSBhd2FpdCBjbGllbnQuZ2V0UFJSZXZpZXdzKG93bmVyLCByZXBvLCBwci5udW1iZXIpOwogICAgICAgIGlmICghcmV2aWV3cykKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgZm9yIChjb25zdCByZXZpZXcgb2YgcmV2aWV3cykgewogICAgICAgICAgICBpZiAocmV2aWV3LnN0YXRlID09PSAiUEVORElORyIpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgY29uc3QgcHJvZmlsZSA9IGdldE9yQ3JlYXRlKHJldmlldy51c2VyLmxvZ2luKTsKICAgICAgICAgICAgcHJvZmlsZS5yZXZpZXdzR2l2ZW4rKzsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCBjb250cmlidXRvcnMgPSBbLi4ucHJvZmlsZU1hcC52YWx1ZXMoKV0KICAgICAgICAuc29ydCgoYSwgYikgPT4gYi5jb21taXRzIC0gYS5jb21taXRzKTsKICAgIGNvbnN0IHJlc3VsdCA9IHsKICAgICAgICByZXBvOiBgJHtvd25lcn0vJHtyZXBvfWAsCiAgICAgICAgcGVyaW9kOiB7IGZyb206IHNpbmNlLCB0bzogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0sCiAgICAgICAgY29udHJpYnV0b3JzLAogICAgICAgIGdlbmVyYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICB9OwogICAgbG9nQWN0aXZpdHkoewogICAgICAgIHNvdXJjZTogImJvYXJkIiwKICAgICAgICBzdW1tYXJ5OiBgQ29udHJpYnV0b3Igc3RhdHM6ICR7b3duZXJ9LyR7cmVwb30g4oCUICR7Y29udHJpYnV0b3JzLmxlbmd0aH0gY29udHJpYnV0b3JzLCAke2NvbW1pdHMubGVuZ3RofSBjb21taXRzYCwKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKfQovKioKICogRm9ybWF0IGNvbnRyaWJ1dG9yIHN0YXRzIGFzIGEgbWFya2Rvd24gdGFibGUuCiAqLwpleHBvcnQgZnVuY3Rpb24gZm9ybWF0Q29udHJpYnV0b3JTdGF0cyhzdGF0cykgewogICAgY29uc3QgbGluZXMgPSBbXTsKICAgIGxpbmVzLnB1c2goYCMjIENvbnRyaWJ1dG9yIFN0YXRzOiAke3N0YXRzLnJlcG99YCk7CiAgICBsaW5lcy5wdXNoKCIiKTsKICAgIGxpbmVzLnB1c2goYCpQZXJpb2Q6ICR7bmV3IERhdGUoc3RhdHMucGVyaW9kLmZyb20pLnRvTG9jYWxlRGF0ZVN0cmluZygpfSDigJMgJHtuZXcgRGF0ZShzdGF0cy5wZXJpb2QudG8pLnRvTG9jYWxlRGF0ZVN0cmluZygpfSpgKTsKICAgIGxpbmVzLnB1c2goIiIpOwogICAgaWYgKHN0YXRzLmNvbnRyaWJ1dG9ycy5sZW5ndGggPT09IDApIHsKICAgICAgICBsaW5lcy5wdXNoKCJObyBjb250cmlidXRvciBhY3Rpdml0eSBpbiB0aGlzIHBlcmlvZC4iKTsKICAgICAgICByZXR1cm4gbGluZXMuam9pbigiXG4iKTsKICAgIH0KICAgIGxpbmVzLnB1c2goInwgQ29udHJpYnV0b3IgfCBDb21taXRzIHwgUFJzIE9wZW5lZCB8IFBScyBNZXJnZWQgfCBSZXZpZXdzIHwgTGluZXMgKy8tIHwiKTsKICAgIGxpbmVzLnB1c2goInwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLXwiKTsKICAgIGZvciAoY29uc3QgYyBvZiBzdGF0cy5jb250cmlidXRvcnMpIHsKICAgICAgICBjb25zdCBsaW5lc0NoYW5nZWQgPSBjLmxpbmVzQWRkZWQgKyBjLmxpbmVzUmVtb3ZlZCA+IDAKICAgICAgICAgICAgPyBgKyR7Yy5saW5lc0FkZGVkfS8tJHtjLmxpbmVzUmVtb3ZlZH1gCiAgICAgICAgICAgIDogIuKAlCI7CiAgICAgICAgbGluZXMucHVzaChgfCAke2MubG9naW59IHwgJHtjLmNvbW1pdHN9IHwgJHtjLnByc09wZW5lZH0gfCAke2MucHJzTWVyZ2VkfSB8ICR7Yy5yZXZpZXdzR2l2ZW59IHwgJHtsaW5lc0NoYW5nZWR9IHxgKTsKICAgIH0KICAgIHJldHVybiBsaW5lcy5qb2luKCJcbiIpOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRyaWJ1dG9yLXN0YXRzLmpzLm1hcA==","github/issue-sla.js":"LyoqCiAqIElzc3VlIFNMQSB0cmFja2luZyDigJQgbW9uaXRvciByZXNwb25zZSBhbmQgcmVzb2x1dGlvbiB0aW1lcyBhZ2FpbnN0IHRhcmdldHMuCiAqCiAqIERlZmluZXMgU0xBIHRhcmdldHMgYnkgcHJpb3JpdHkgbGV2ZWwgKGNyaXRpY2FsLCBoaWdoLCBtZWRpdW0sIGxvdykuCiAqIE1lYXN1cmVzIGZpcnN0LXJlc3BvbnNlIHRpbWUgYW5kIHJlc29sdXRpb24gdGltZS4KICogR2VuZXJhdGVzIGNvbXBsaWFuY2UgcmVwb3J0cyB3aXRoIGJyZWFjaCBkZXRhaWxzLgogKi8KaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgKiBhcyBjbGllbnQgZnJvbSAiLi9jbGllbnQuanMiOwppbXBvcnQgeyB0cmlhZ2VGcm9tSXNzdWUgfSBmcm9tICIuL2lzc3VlLXRyaWFnZS5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiZ2l0aHViLmlzc3VlLXNsYSIpOwpjb25zdCBNU19QRVJfSE9VUiA9IDYwICogNjAgKiAxMDAwOwpjb25zdCBNU19QRVJfREFZID0gMjQgKiBNU19QRVJfSE9VUjsKLy8g4pSA4pSAIERlZmF1bHQgU0xBIGNvbmZpZ3VyYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNvbnN0IERFRkFVTFRfU0xBID0gewogICAgdGFyZ2V0czogewogICAgICAgIGNyaXRpY2FsOiB7IHJlc3BvbnNlSG91cnM6IDQsIHJlc29sdXRpb25Ib3VyczogMjQgfSwKICAgICAgICBoaWdoOiB7IHJlc3BvbnNlSG91cnM6IDgsIHJlc29sdXRpb25Ib3VyczogNzIgfSwKICAgICAgICBtZWRpdW06IHsgcmVzcG9uc2VIb3VyczogMjQsIHJlc29sdXRpb25Ib3VyczogMTY4IH0sIC8vIDcgZGF5cwogICAgICAgIGxvdzogeyByZXNwb25zZUhvdXJzOiA3MiwgcmVzb2x1dGlvbkhvdXJzOiA3MjAgfSwgLy8gMzAgZGF5cwogICAgfSwKfTsKbGV0IGFjdGl2ZVNMQSA9IHsgLi4uREVGQVVMVF9TTEEgfTsKLyoqCiAqIFVwZGF0ZSB0aGUgU0xBIGNvbmZpZ3VyYXRpb24uCiAqLwpleHBvcnQgZnVuY3Rpb24gc2V0U0xBQ29uZmlnKGNvbmZpZykgewogICAgYWN0aXZlU0xBID0gewogICAgICAgIHRhcmdldHM6IHsKICAgICAgICAgICAgLi4uREVGQVVMVF9TTEEudGFyZ2V0cywKICAgICAgICAgICAgLi4uY29uZmlnLnRhcmdldHMsCiAgICAgICAgfSwKICAgIH07Cn0KLyoqIEdldCBjdXJyZW50IFNMQSBjb25maWd1cmF0aW9uLiAqLwpleHBvcnQgZnVuY3Rpb24gZ2V0U0xBQ29uZmlnKCkgewogICAgcmV0dXJuIGFjdGl2ZVNMQTsKfQovLyDilIDilIAgU0xBIG1lYXN1cmVtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBob3Vyc0JldHdlZW4oYSwgYikgewogICAgcmV0dXJuIE1hdGguYWJzKG5ldyBEYXRlKGIpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEpLmdldFRpbWUoKSkgLyBNU19QRVJfSE9VUjsKfQovKioKICogRGV0ZXJtaW5lIHByaW9yaXR5IGZvciBhbiBpc3N1ZSB1c2luZyB0aGUgdHJpYWdlIHN5c3RlbS4KICovCmZ1bmN0aW9uIGdldElzc3VlUHJpb3JpdHkoaXNzdWUpIHsKICAgIC8vIFVzZSB0aGUgZXhpc3RpbmcgdHJpYWdlIHN5c3RlbSB0byBjbGFzc2lmeQogICAgY29uc3QgdHJpYWdlID0gdHJpYWdlRnJvbUlzc3VlKCIiLCAiIiwgaXNzdWUpOwogICAgcmV0dXJuIHRyaWFnZS5wcmlvcml0eTsKfQovKioKICogRmluZCBmaXJzdCByZXNwb25zZSB0aW1lIGZvciBhbiBpc3N1ZS4KICogRmlyc3QgcmVzcG9uc2UgPSBmaXJzdCBjb21tZW50IGZyb20gc29tZW9uZSBvdGhlciB0aGFuIHRoZSBpc3N1ZSBhdXRob3IuCiAqLwphc3luYyBmdW5jdGlvbiBnZXRGaXJzdFJlc3BvbnNlVGltZShvd25lciwgcmVwbywgaXNzdWUpIHsKICAgIGNvbnN0IGNvbW1lbnRzID0gYXdhaXQgY2xpZW50Lmxpc3RJc3N1ZUNvbW1lbnRzKG93bmVyLCByZXBvLCBpc3N1ZS5udW1iZXIsIHsgcGVyX3BhZ2U6IDEwIH0pOwogICAgaWYgKCFjb21tZW50cyB8fCBjb21tZW50cy5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAvLyBGaW5kIGZpcnN0IGNvbW1lbnQgbm90IGZyb20gdGhlIGlzc3VlIGF1dGhvcgogICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IGNvbW1lbnRzLmZpbmQoKGMpID0+IGMudXNlci5sb2dpbiAhPT0gaXNzdWUudXNlci5sb2dpbik7CiAgICBpZiAoIWZpcnN0UmVzcG9uc2UpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gaG91cnNCZXR3ZWVuKGlzc3VlLmNyZWF0ZWRfYXQsIGZpcnN0UmVzcG9uc2UuY3JlYXRlZF9hdCk7Cn0KLyoqCiAqIEdldCByZXNvbHV0aW9uIHRpbWUgZm9yIGEgY2xvc2VkIGlzc3VlLgogKi8KZnVuY3Rpb24gZ2V0UmVzb2x1dGlvblRpbWUoaXNzdWUpIHsKICAgIGlmIChpc3N1ZS5zdGF0ZSAhPT0gImNsb3NlZCIgfHwgIWlzc3VlLmNsb3NlZF9hdCkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIHJldHVybiBob3Vyc0JldHdlZW4oaXNzdWUuY3JlYXRlZF9hdCwgaXNzdWUuY2xvc2VkX2F0KTsKfQovLyDilIDilIAgUmVwb3J0IGdlbmVyYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIGVtcHR5Q29tcGxpYW5jZSgpIHsKICAgIHJldHVybiB7IHRvdGFsOiAwLCB3aXRoaW5TTEE6IDAsIGJyZWFjaGVkOiAwLCBjb21wbGlhbmNlUmF0ZTogMTAwIH07Cn0KLyoqCiAqIEdlbmVyYXRlIGFuIFNMQSBjb21wbGlhbmNlIHJlcG9ydCBmb3IgYSByZXBvc2l0b3J5LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNMQVJlcG9ydChvd25lciwgcmVwbywgb3B0cykgewogICAgY29uc3QgZGF5cyA9IG9wdHM/LmRheXMgPz8gMzA7CiAgICBjb25zdCBzaW5jZSA9IG5ldyBEYXRlKERhdGUubm93KCkgLSBkYXlzICogTVNfUEVSX0RBWSkudG9JU09TdHJpbmcoKTsKICAgIGxvZy5pbmZvKGBHZW5lcmF0aW5nIFNMQSByZXBvcnQgZm9yICR7b3duZXJ9LyR7cmVwb30gKGxhc3QgJHtkYXlzfSBkYXlzKWApOwogICAgY29uc3QgaXNzdWVzID0gYXdhaXQgY2xpZW50Lmxpc3RJc3N1ZXMob3duZXIsIHJlcG8sIHsgc3RhdGU6ICJhbGwiLCBwZXJfcGFnZTogMTAwLCBzaW5jZSB9KTsKICAgIGlmICghaXNzdWVzKSB7CiAgICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byBmZXRjaCBpc3N1ZXMgZm9yICR7b3duZXJ9LyR7cmVwb31gKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8vIEZpbHRlciB0byBhY3R1YWwgaXNzdWVzIChub3QgUFJzKSBjcmVhdGVkIGluIHRoZSBwZXJpb2QKICAgIGNvbnN0IHBlcmlvZElzc3VlcyA9IGlzc3Vlcy5maWx0ZXIoKGkpID0+ICFpLnB1bGxfcmVxdWVzdCAmJiBuZXcgRGF0ZShpLmNyZWF0ZWRfYXQpLmdldFRpbWUoKSA+PSBuZXcgRGF0ZShzaW5jZSkuZ2V0VGltZSgpKTsKICAgIGNvbnN0IG92ZXJhbGwgPSBlbXB0eUNvbXBsaWFuY2UoKTsKICAgIGNvbnN0IGJ5UHJpb3JpdHkgPSB7CiAgICAgICAgY3JpdGljYWw6IGVtcHR5Q29tcGxpYW5jZSgpLAogICAgICAgIGhpZ2g6IGVtcHR5Q29tcGxpYW5jZSgpLAogICAgICAgIG1lZGl1bTogZW1wdHlDb21wbGlhbmNlKCksCiAgICAgICAgbG93OiBlbXB0eUNvbXBsaWFuY2UoKSwKICAgIH07CiAgICBjb25zdCBicmVhY2hlcyA9IFtdOwogICAgZm9yIChjb25zdCBpc3N1ZSBvZiBwZXJpb2RJc3N1ZXMpIHsKICAgICAgICBjb25zdCBwcmlvcml0eSA9IGdldElzc3VlUHJpb3JpdHkoaXNzdWUpOwogICAgICAgIGNvbnN0IHRhcmdldCA9IGFjdGl2ZVNMQS50YXJnZXRzW3ByaW9yaXR5XTsKICAgICAgICBvdmVyYWxsLnRvdGFsKys7CiAgICAgICAgYnlQcmlvcml0eVtwcmlvcml0eV0udG90YWwrKzsKICAgICAgICBsZXQgaXNCcmVhY2hlZCA9IGZhbHNlOwogICAgICAgIC8vIENoZWNrIHJlc29sdXRpb24gU0xBIGZvciBjbG9zZWQgaXNzdWVzCiAgICAgICAgY29uc3QgcmVzb2x1dGlvbkhvdXJzID0gZ2V0UmVzb2x1dGlvblRpbWUoaXNzdWUpOwogICAgICAgIGlmIChyZXNvbHV0aW9uSG91cnMgIT09IG51bGwgJiYgcmVzb2x1dGlvbkhvdXJzID4gdGFyZ2V0LnJlc29sdXRpb25Ib3VycykgewogICAgICAgICAgICBpc0JyZWFjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWNoZXMucHVzaCh7CiAgICAgICAgICAgICAgICBpc3N1ZU51bWJlcjogaXNzdWUubnVtYmVyLAogICAgICAgICAgICAgICAgdGl0bGU6IGlzc3VlLnRpdGxlLAogICAgICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICAgICB0eXBlOiAicmVzb2x1dGlvbiIsCiAgICAgICAgICAgICAgICB0YXJnZXRIb3VyczogdGFyZ2V0LnJlc29sdXRpb25Ib3VycywKICAgICAgICAgICAgICAgIGFjdHVhbEhvdXJzOiBNYXRoLnJvdW5kKHJlc29sdXRpb25Ib3VycyAqIDEwKSAvIDEwLAogICAgICAgICAgICAgICAgdXJsOiBpc3N1ZS5odG1sX3VybCwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIENoZWNrIHJlc3BvbnNlIFNMQSDigJQgb25seSBpZiB3ZSBjYW4gZmV0Y2ggZmlyc3QgcmVzcG9uc2UKICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlSG91cnMgPSBhd2FpdCBnZXRGaXJzdFJlc3BvbnNlVGltZShvd25lciwgcmVwbywgaXNzdWUpOwogICAgICAgIGlmIChmaXJzdFJlc3BvbnNlSG91cnMgIT09IG51bGwgJiYgZmlyc3RSZXNwb25zZUhvdXJzID4gdGFyZ2V0LnJlc3BvbnNlSG91cnMpIHsKICAgICAgICAgICAgaXNCcmVhY2hlZCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFjaGVzLnB1c2goewogICAgICAgICAgICAgICAgaXNzdWVOdW1iZXI6IGlzc3VlLm51bWJlciwKICAgICAgICAgICAgICAgIHRpdGxlOiBpc3N1ZS50aXRsZSwKICAgICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgICAgdHlwZTogInJlc3BvbnNlIiwKICAgICAgICAgICAgICAgIHRhcmdldEhvdXJzOiB0YXJnZXQucmVzcG9uc2VIb3VycywKICAgICAgICAgICAgICAgIGFjdHVhbEhvdXJzOiBNYXRoLnJvdW5kKGZpcnN0UmVzcG9uc2VIb3VycyAqIDEwKSAvIDEwLAogICAgICAgICAgICAgICAgdXJsOiBpc3N1ZS5odG1sX3VybCwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIEZvciBvcGVuIGlzc3VlcyBwYXN0IHRoZWlyIHJlc29sdXRpb24gU0xBLCBhbHNvIGZsYWcgdGhlbQogICAgICAgIGlmIChpc3N1ZS5zdGF0ZSA9PT0gIm9wZW4iKSB7CiAgICAgICAgICAgIGNvbnN0IGFnZUhvdXJzID0gaG91cnNCZXR3ZWVuKGlzc3VlLmNyZWF0ZWRfYXQsIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSk7CiAgICAgICAgICAgIGlmIChhZ2VIb3VycyA+IHRhcmdldC5yZXNvbHV0aW9uSG91cnMpIHsKICAgICAgICAgICAgICAgIGlzQnJlYWNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWNoZXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgaXNzdWVOdW1iZXI6IGlzc3VlLm51bWJlciwKICAgICAgICAgICAgICAgICAgICB0aXRsZTogaXNzdWUudGl0bGUsCiAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogInJlc29sdXRpb24iLAogICAgICAgICAgICAgICAgICAgIHRhcmdldEhvdXJzOiB0YXJnZXQucmVzb2x1dGlvbkhvdXJzLAogICAgICAgICAgICAgICAgICAgIGFjdHVhbEhvdXJzOiBNYXRoLnJvdW5kKGFnZUhvdXJzICogMTApIC8gMTAsCiAgICAgICAgICAgICAgICAgICAgdXJsOiBpc3N1ZS5odG1sX3VybCwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc0JyZWFjaGVkKSB7CiAgICAgICAgICAgIG92ZXJhbGwuYnJlYWNoZWQrKzsKICAgICAgICAgICAgYnlQcmlvcml0eVtwcmlvcml0eV0uYnJlYWNoZWQrKzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG92ZXJhbGwud2l0aGluU0xBKys7CiAgICAgICAgICAgIGJ5UHJpb3JpdHlbcHJpb3JpdHldLndpdGhpblNMQSsrOwogICAgICAgIH0KICAgIH0KICAgIC8vIENvbXB1dGUgY29tcGxpYW5jZSByYXRlcwogICAgb3ZlcmFsbC5jb21wbGlhbmNlUmF0ZSA9IG92ZXJhbGwudG90YWwgPiAwCiAgICAgICAgPyBNYXRoLnJvdW5kKChvdmVyYWxsLndpdGhpblNMQSAvIG92ZXJhbGwudG90YWwpICogMTAwKQogICAgICAgIDogMTAwOwogICAgZm9yIChjb25zdCBwIG9mIE9iamVjdC5rZXlzKGJ5UHJpb3JpdHkpKSB7CiAgICAgICAgY29uc3QgYyA9IGJ5UHJpb3JpdHlbcF07CiAgICAgICAgYy5jb21wbGlhbmNlUmF0ZSA9IGMudG90YWwgPiAwCiAgICAgICAgICAgID8gTWF0aC5yb3VuZCgoYy53aXRoaW5TTEEgLyBjLnRvdGFsKSAqIDEwMCkKICAgICAgICAgICAgOiAxMDA7CiAgICB9CiAgICAvLyBTb3J0IGJyZWFjaGVzIGJ5IHByaW9yaXR5IChjcml0aWNhbCBmaXJzdCkKICAgIGNvbnN0IHByaW9yaXR5T3JkZXIgPSBbImNyaXRpY2FsIiwgImhpZ2giLCAibWVkaXVtIiwgImxvdyJdOwogICAgYnJlYWNoZXMuc29ydCgoYSwgYikgPT4gcHJpb3JpdHlPcmRlci5pbmRleE9mKGEucHJpb3JpdHkpIC0gcHJpb3JpdHlPcmRlci5pbmRleE9mKGIucHJpb3JpdHkpKTsKICAgIGNvbnN0IHJlcG9ydCA9IHsKICAgICAgICByZXBvOiBgJHtvd25lcn0vJHtyZXBvfWAsCiAgICAgICAgcGVyaW9kOiB7IGZyb206IHNpbmNlLCB0bzogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0sCiAgICAgICAgZ2VuZXJhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICBvdmVyYWxsLAogICAgICAgIGJ5UHJpb3JpdHksCiAgICAgICAgYnJlYWNoZXMsCiAgICB9OwogICAgbG9nQWN0aXZpdHkoewogICAgICAgIHNvdXJjZTogImJvYXJkIiwKICAgICAgICBzdW1tYXJ5OiBgU0xBIHJlcG9ydDogJHtvd25lcn0vJHtyZXBvfSDigJQgJHtvdmVyYWxsLmNvbXBsaWFuY2VSYXRlfSUgY29tcGxpYW5jZSAoJHtvdmVyYWxsLmJyZWFjaGVkfSBicmVhY2hlcyBpbiAke292ZXJhbGwudG90YWx9IGlzc3VlcylgLAogICAgfSk7CiAgICByZXR1cm4gcmVwb3J0Owp9Ci8qKgogKiBGb3JtYXQgYW4gU0xBIHJlcG9ydCBhcyBtYXJrZG93bi4KICovCmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTTEFSZXBvcnQocmVwb3J0KSB7CiAgICBjb25zdCBsaW5lcyA9IFtdOwogICAgbGluZXMucHVzaChgIyMgU0xBIENvbXBsaWFuY2UgUmVwb3J0OiAke3JlcG9ydC5yZXBvfWApOwogICAgbGluZXMucHVzaCgiIik7CiAgICBsaW5lcy5wdXNoKGAqUGVyaW9kOiAke25ldyBEYXRlKHJlcG9ydC5wZXJpb2QuZnJvbSkudG9Mb2NhbGVEYXRlU3RyaW5nKCl9IOKAkyAke25ldyBEYXRlKHJlcG9ydC5wZXJpb2QudG8pLnRvTG9jYWxlRGF0ZVN0cmluZygpfSpgKTsKICAgIGxpbmVzLnB1c2goIiIpOwogICAgbGluZXMucHVzaChgKipPdmVyYWxsIENvbXBsaWFuY2U6ICR7cmVwb3J0Lm92ZXJhbGwuY29tcGxpYW5jZVJhdGV9JSoqICgke3JlcG9ydC5vdmVyYWxsLndpdGhpblNMQX0vJHtyZXBvcnQub3ZlcmFsbC50b3RhbH0gd2l0aGluIFNMQSlgKTsKICAgIGxpbmVzLnB1c2goIiIpOwogICAgbGluZXMucHVzaCgiIyMjIEJ5IFByaW9yaXR5Iik7CiAgICBsaW5lcy5wdXNoKCIiKTsKICAgIGxpbmVzLnB1c2goInwgUHJpb3JpdHkgfCBUb3RhbCB8IFdpdGhpbiBTTEEgfCBCcmVhY2hlZCB8IFJhdGUgfCIpOwogICAgbGluZXMucHVzaCgifC0tLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS18Iik7CiAgICBmb3IgKGNvbnN0IHAgb2YgWyJjcml0aWNhbCIsICJoaWdoIiwgIm1lZGl1bSIsICJsb3ciXSkgewogICAgICAgIGNvbnN0IGMgPSByZXBvcnQuYnlQcmlvcml0eVtwXTsKICAgICAgICBsaW5lcy5wdXNoKGB8ICR7cH0gfCAke2MudG90YWx9IHwgJHtjLndpdGhpblNMQX0gfCAke2MuYnJlYWNoZWR9IHwgJHtjLmNvbXBsaWFuY2VSYXRlfSUgfGApOwogICAgfQogICAgaWYgKHJlcG9ydC5icmVhY2hlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgbGluZXMucHVzaCgiIik7CiAgICAgICAgbGluZXMucHVzaCgiIyMjIFNMQSBCcmVhY2hlcyIpOwogICAgICAgIGxpbmVzLnB1c2goIiIpOwogICAgICAgIGxpbmVzLnB1c2goInwgSXNzdWUgfCBQcmlvcml0eSB8IFR5cGUgfCBUYXJnZXQgfCBBY3R1YWwgfCIpOwogICAgICAgIGxpbmVzLnB1c2goInwtLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tfCIpOwogICAgICAgIGZvciAoY29uc3QgYiBvZiByZXBvcnQuYnJlYWNoZXMuc2xpY2UoMCwgMjApKSB7CiAgICAgICAgICAgIGxpbmVzLnB1c2goYHwgIyR7Yi5pc3N1ZU51bWJlcn0gJHtiLnRpdGxlLnNsaWNlKDAsIDQwKX0gfCAke2IucHJpb3JpdHl9IHwgJHtiLnR5cGV9IHwgJHtiLnRhcmdldEhvdXJzfWggfCAke2IuYWN0dWFsSG91cnN9aCB8YCk7CiAgICAgICAgfQogICAgICAgIGlmIChyZXBvcnQuYnJlYWNoZXMubGVuZ3RoID4gMjApIHsKICAgICAgICAgICAgbGluZXMucHVzaChgfCAqLi4uIGFuZCAke3JlcG9ydC5icmVhY2hlcy5sZW5ndGggLSAyMH0gbW9yZSogfCB8IHwgfCB8YCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGxpbmVzLmpvaW4oIlxuIik7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNzdWUtc2xhLmpzLm1hcA==","github/issue-triage.js":"LyoqCiAqIElzc3VlIHRyaWFnZSDigJQgYXV0b21hdGljYWxseSBjYXRlZ29yaXplIGFuZCBwcmlvcml0aXplIEdpdEh1YiBpc3N1ZXMuCiAqCiAqIEFuYWx5emVzIGlzc3VlIHRpdGxlLCBib2R5LCBhbmQgbGFiZWxzIHRvIGRldGVybWluZToKICogLSBDYXRlZ29yeSAoYnVnLCBmZWF0dXJlLCBlbmhhbmNlbWVudCwgcXVlc3Rpb24sIGRvY3MsIG1haW50ZW5hbmNlLCBzZWN1cml0eSkKICogLSBQcmlvcml0eSAoY3JpdGljYWwsIGhpZ2gsIG1lZGl1bSwgbG93KQogKiAtIFN1Z2dlc3RlZCBsYWJlbHMgYW5kIGFzc2lnbmVlcwogKgogKiBQdXJlbHkgaGV1cmlzdGljLWJhc2VkIOKAlCBubyBMTE0gZGVwZW5kZW5jeS4KICovCmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IGxvZ0FjdGl2aXR5IH0gZnJvbSAiLi4vYWN0aXZpdHkvbG9nLmpzIjsKaW1wb3J0ICogYXMgY2xpZW50IGZyb20gIi4vY2xpZW50LmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJnaXRodWIuaXNzdWUtdHJpYWdlIik7Ci8vIOKUgOKUgCBEZWZhdWx0IHRyaWFnZSBjb25maWd1cmF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjb25zdCBERUZBVUxUX0NPTkZJRyA9IHsKICAgIGxhYmVsUnVsZXM6IFsKICAgICAgICB7IGtleXdvcmRzOiBbImJ1ZyIsICJlcnJvciIsICJjcmFzaCIsICJicm9rZW4iLCAiZml4IiwgImZhaWwiLCAid3JvbmciLCAiaW5jb3JyZWN0Il0sIGxhYmVsOiAiYnVnIiB9LAogICAgICAgIHsga2V5d29yZHM6IFsiZmVhdHVyZSIsICJyZXF1ZXN0IiwgInByb3Bvc2FsIiwgImFkZCIsICJuZXciLCAiaW1wbGVtZW50Il0sIGxhYmVsOiAiZW5oYW5jZW1lbnQiIH0sCiAgICAgICAgeyBrZXl3b3JkczogWyJxdWVzdGlvbiIsICJob3cgdG8iLCAiaGVscCIsICJjb25mdXNlZCIsICJleHBsYWluIiwgIj8iXSwgbGFiZWw6ICJxdWVzdGlvbiIgfSwKICAgICAgICB7IGtleXdvcmRzOiBbImRvY3MiLCAiZG9jdW1lbnRhdGlvbiIsICJyZWFkbWUiLCAiZ3VpZGUiLCAidHV0b3JpYWwiLCAidHlwbyJdLCBsYWJlbDogImRvY3VtZW50YXRpb24iIH0sCiAgICAgICAgeyBrZXl3b3JkczogWyJzZWN1cml0eSIsICJ2dWxuZXJhYmlsaXR5IiwgImN2ZSIsICJleHBsb2l0IiwgInhzcyIsICJpbmplY3Rpb24iLCAiYXV0aCJdLCBsYWJlbDogInNlY3VyaXR5IiB9LAogICAgICAgIHsga2V5d29yZHM6IFsicmVmYWN0b3IiLCAiY2xlYW51cCIsICJ0ZWNoIGRlYnQiLCAiZGVwcmVjYXRlZCIsICJ1cGdyYWRlIiwgIm1pZ3JhdGlvbiJdLCBsYWJlbDogIm1haW50ZW5hbmNlIiB9LAogICAgICAgIHsga2V5d29yZHM6IFsicGVyZm9ybWFuY2UiLCAic2xvdyIsICJtZW1vcnkiLCAibGVhayIsICJvcHRpbWl6ZSIsICJzcGVlZCJdLCBsYWJlbDogInBlcmZvcm1hbmNlIiB9LAogICAgXSwKICAgIHByaW9yaXR5UnVsZXM6IHsKICAgICAgICBjcml0aWNhbEtleXdvcmRzOiBbCiAgICAgICAgICAgICJjcml0aWNhbCIsICJ1cmdlbnQiLCAicHJvZHVjdGlvbiBkb3duIiwgImRhdGEgbG9zcyIsICJzZWN1cml0eSB2dWxuZXJhYmlsaXR5IiwKICAgICAgICAgICAgImNyYXNoIG9uIHN0YXJ0dXAiLCAiY2Fubm90IGxvZ2luIiwgImJsb2NrZXIiLAogICAgICAgIF0sCiAgICAgICAgaGlnaEtleXdvcmRzOiBbCiAgICAgICAgICAgICJoaWdoIHByaW9yaXR5IiwgImltcG9ydGFudCIsICJyZWdyZXNzaW9uIiwgImJyb2tlbiIsICJjYW5ub3QiLAogICAgICAgICAgICAic2VjdXJpdHkiLCAiZGF0YSBjb3JydXB0aW9uIiwgImJsb2NrcyIsCiAgICAgICAgXSwKICAgIH0sCiAgICBhc3NpZ25lZVJ1bGVzOiBbXSwKfTsKbGV0IGFjdGl2ZUNvbmZpZyA9IHsgLi4uREVGQVVMVF9DT05GSUcgfTsKLyoqCiAqIFVwZGF0ZSB0aGUgdHJpYWdlIGNvbmZpZ3VyYXRpb24gKG1lcmdlZCB3aXRoIGRlZmF1bHRzKS4KICovCmV4cG9ydCBmdW5jdGlvbiBzZXRUcmlhZ2VDb25maWcoY29uZmlnKSB7CiAgICBhY3RpdmVDb25maWcgPSB7CiAgICAgICAgLi4uREVGQVVMVF9DT05GSUcsCiAgICAgICAgLi4uY29uZmlnLAogICAgICAgIHByaW9yaXR5UnVsZXM6IHsKICAgICAgICAgICAgLi4uREVGQVVMVF9DT05GSUcucHJpb3JpdHlSdWxlcywKICAgICAgICAgICAgLi4uY29uZmlnLnByaW9yaXR5UnVsZXMsCiAgICAgICAgfSwKICAgIH07Cn0KLyoqIEdldCBjdXJyZW50IHRyaWFnZSBjb25maWd1cmF0aW9uLiAqLwpleHBvcnQgZnVuY3Rpb24gZ2V0VHJpYWdlQ29uZmlnKCkgewogICAgcmV0dXJuIGFjdGl2ZUNvbmZpZzsKfQovLyDilIDilIAgQ2xhc3NpZmljYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIGNsYXNzaWZ5Q2F0ZWdvcnkodGl0bGUsIGJvZHksIGV4aXN0aW5nTGFiZWxzKSB7CiAgICBjb25zdCB0ZXh0ID0gYCR7dGl0bGV9ICR7Ym9keX1gLnRvTG93ZXJDYXNlKCk7CiAgICAvLyBJZiBhbHJlYWR5IGxhYmVsZWQsIHJlc3BlY3QgZXhpc3RpbmcgbGFiZWxzCiAgICBjb25zdCBsYWJlbE5hbWVzID0gZXhpc3RpbmdMYWJlbHMubWFwKChsKSA9PiBsLnRvTG93ZXJDYXNlKCkpOwogICAgaWYgKGxhYmVsTmFtZXMuaW5jbHVkZXMoImJ1ZyIpKQogICAgICAgIHJldHVybiAiYnVnIjsKICAgIGlmIChsYWJlbE5hbWVzLmluY2x1ZGVzKCJmZWF0dXJlIikgfHwgbGFiZWxOYW1lcy5pbmNsdWRlcygiZW5oYW5jZW1lbnQiKSkKICAgICAgICByZXR1cm4gImZlYXR1cmUiOwogICAgaWYgKGxhYmVsTmFtZXMuaW5jbHVkZXMoInF1ZXN0aW9uIikpCiAgICAgICAgcmV0dXJuICJxdWVzdGlvbiI7CiAgICBpZiAobGFiZWxOYW1lcy5pbmNsdWRlcygic2VjdXJpdHkiKSkKICAgICAgICByZXR1cm4gInNlY3VyaXR5IjsKICAgIC8vIEtleXdvcmQtYmFzZWQgY2xhc3NpZmljYXRpb24KICAgIGNvbnN0IHNlY3VyaXR5V29yZHMgPSBbInNlY3VyaXR5IiwgInZ1bG5lcmFiaWxpdHkiLCAiY3ZlIiwgImV4cGxvaXQiLCAieHNzIiwgImluamVjdGlvbiJdOwogICAgaWYgKHNlY3VyaXR5V29yZHMuc29tZSgodykgPT4gdGV4dC5pbmNsdWRlcyh3KSkpCiAgICAgICAgcmV0dXJuICJzZWN1cml0eSI7CiAgICBjb25zdCBidWdXb3JkcyA9IFsiYnVnIiwgImVycm9yIiwgImNyYXNoIiwgImJyb2tlbiIsICJmYWlsIiwgIm5vdCB3b3JraW5nIiwgImRvZXNuJ3Qgd29yayIsICJleGNlcHRpb24iLCAic3RhY2t0cmFjZSIsICJ0cmFjZWJhY2siXTsKICAgIGlmIChidWdXb3Jkcy5zb21lKCh3KSA9PiB0ZXh0LmluY2x1ZGVzKHcpKSkKICAgICAgICByZXR1cm4gImJ1ZyI7CiAgICBjb25zdCBmZWF0dXJlV29yZHMgPSBbImZlYXR1cmUgcmVxdWVzdCIsICJwcm9wb3NhbCIsICJ3b3VsZCBiZSBuaWNlIiwgIml0IHdvdWxkIGJlIGdyZWF0IiwgImFkZCBzdXBwb3J0Il07CiAgICBpZiAoZmVhdHVyZVdvcmRzLnNvbWUoKHcpID0+IHRleHQuaW5jbHVkZXModykpKQogICAgICAgIHJldHVybiAiZmVhdHVyZSI7CiAgICBjb25zdCBxdWVzdGlvbldvcmRzID0gWyJob3cgdG8iLCAiaG93IGRvIGkiLCAiaXMgaXQgcG9zc2libGUiLCAiY2FuIGkiLCAicXVlc3Rpb24iLCAiaGVscCBuZWVkZWQiXTsKICAgIGlmIChxdWVzdGlvbldvcmRzLnNvbWUoKHcpID0+IHRleHQuaW5jbHVkZXModykpKQogICAgICAgIHJldHVybiAicXVlc3Rpb24iOwogICAgY29uc3QgZG9jV29yZHMgPSBbImRvY3VtZW50YXRpb24iLCAiZG9jcyIsICJyZWFkbWUiLCAidHlwbyBpbiIsICJndWlkZSJdOwogICAgaWYgKGRvY1dvcmRzLnNvbWUoKHcpID0+IHRleHQuaW5jbHVkZXModykpKQogICAgICAgIHJldHVybiAiZG9jdW1lbnRhdGlvbiI7CiAgICBjb25zdCBtYWludGVuYW5jZVdvcmRzID0gWyJyZWZhY3RvciIsICJ0ZWNoIGRlYnQiLCAidXBncmFkZSIsICJkZXByZWNhdCIsICJtaWdyYXRpb24iXTsKICAgIGlmIChtYWludGVuYW5jZVdvcmRzLnNvbWUoKHcpID0+IHRleHQuaW5jbHVkZXModykpKQogICAgICAgIHJldHVybiAibWFpbnRlbmFuY2UiOwogICAgcmV0dXJuICJlbmhhbmNlbWVudCI7Cn0KZnVuY3Rpb24gY2xhc3NpZnlQcmlvcml0eSh0aXRsZSwgYm9keSwgY2F0ZWdvcnkpIHsKICAgIGNvbnN0IHRleHQgPSBgJHt0aXRsZX0gJHtib2R5fWAudG9Mb3dlckNhc2UoKTsKICAgIC8vIFNlY3VyaXR5IGlzc3VlcyBkZWZhdWx0IHRvIGhpZ2gKICAgIGlmIChjYXRlZ29yeSA9PT0gInNlY3VyaXR5IikKICAgICAgICByZXR1cm4gImhpZ2giOwogICAgLy8gQ2hlY2sgY3JpdGljYWwga2V5d29yZHMKICAgIGlmIChhY3RpdmVDb25maWcucHJpb3JpdHlSdWxlcy5jcml0aWNhbEtleXdvcmRzLnNvbWUoKGt3KSA9PiB0ZXh0LmluY2x1ZGVzKGt3LnRvTG93ZXJDYXNlKCkpKSkgewogICAgICAgIHJldHVybiAiY3JpdGljYWwiOwogICAgfQogICAgLy8gQ2hlY2sgaGlnaCBrZXl3b3JkcwogICAgaWYgKGFjdGl2ZUNvbmZpZy5wcmlvcml0eVJ1bGVzLmhpZ2hLZXl3b3Jkcy5zb21lKChrdykgPT4gdGV4dC5pbmNsdWRlcyhrdy50b0xvd2VyQ2FzZSgpKSkpIHsKICAgICAgICByZXR1cm4gImhpZ2giOwogICAgfQogICAgLy8gQnVncyBkZWZhdWx0IHRvIG1lZGl1bSwgZXZlcnl0aGluZyBlbHNlIHRvIGxvdwogICAgaWYgKGNhdGVnb3J5ID09PSAiYnVnIikKICAgICAgICByZXR1cm4gIm1lZGl1bSI7CiAgICByZXR1cm4gImxvdyI7Cn0KZnVuY3Rpb24gc3VnZ2VzdExhYmVscyh0aXRsZSwgYm9keSwgZXhpc3RpbmdMYWJlbHMpIHsKICAgIGNvbnN0IHRleHQgPSBgJHt0aXRsZX0gJHtib2R5fWAudG9Mb3dlckNhc2UoKTsKICAgIGNvbnN0IGV4aXN0aW5nID0gbmV3IFNldChleGlzdGluZ0xhYmVscy5tYXAoKGwpID0+IGwudG9Mb3dlckNhc2UoKSkpOwogICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSBbXTsKICAgIGZvciAoY29uc3QgcnVsZSBvZiBhY3RpdmVDb25maWcubGFiZWxSdWxlcykgewogICAgICAgIGlmIChleGlzdGluZy5oYXMocnVsZS5sYWJlbC50b0xvd2VyQ2FzZSgpKSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgaWYgKHJ1bGUua2V5d29yZHMuc29tZSgoa3cpID0+IHRleHQuaW5jbHVkZXMoa3cudG9Mb3dlckNhc2UoKSkpKSB7CiAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2gocnVsZS5sYWJlbCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1Z2dlc3Rpb25zOwp9CmZ1bmN0aW9uIHN1Z2dlc3RBc3NpZ25lZXMobGFiZWxzLCBfZmlsZXMpIHsKICAgIGNvbnN0IGFzc2lnbmVlcyA9IG5ldyBTZXQoKTsKICAgIGNvbnN0IGxhYmVsU2V0ID0gbmV3IFNldChsYWJlbHMubWFwKChsKSA9PiBsLnRvTG93ZXJDYXNlKCkpKTsKICAgIGZvciAoY29uc3QgcnVsZSBvZiBhY3RpdmVDb25maWcuYXNzaWduZWVSdWxlcykgewogICAgICAgIGlmIChydWxlLmxhYmVscz8uc29tZSgobCkgPT4gbGFiZWxTZXQuaGFzKGwudG9Mb3dlckNhc2UoKSkpKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBydWxlLmFzc2lnbmVlcykKICAgICAgICAgICAgICAgIGFzc2lnbmVlcy5hZGQoYSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFsuLi5hc3NpZ25lZXNdOwp9CmZ1bmN0aW9uIGJ1aWxkU3VtbWFyeShpc3N1ZSwgY2F0ZWdvcnksIHByaW9yaXR5KSB7CiAgICBjb25zdCBib2R5UHJldmlldyA9IGlzc3VlLmJvZHkKICAgICAgICA/IGlzc3VlLmJvZHkuc2xpY2UoMCwgMjAwKS5yZXBsYWNlKC9cbi9nLCAiICIpLnRyaW0oKQogICAgICAgIDogIihubyBkZXNjcmlwdGlvbikiOwogICAgcmV0dXJuIGBbJHtwcmlvcml0eS50b1VwcGVyQ2FzZSgpfV0gJHtjYXRlZ29yeX0g4oCUICR7aXNzdWUudGl0bGV9LiAke2JvZHlQcmV2aWV3fWA7Cn0KLy8g4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBUcmlhZ2UgYSBzaW5nbGUgaXNzdWU6IGNsYXNzaWZ5LCBwcmlvcml0aXplLCBhbmQgc3VnZ2VzdCBsYWJlbHMvYXNzaWduZWVzLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyaWFnZUlzc3VlKG93bmVyLCByZXBvLCBpc3N1ZU51bWJlcikgewogICAgbG9nLmluZm8oYFRyaWFnaW5nIGlzc3VlICR7b3duZXJ9LyR7cmVwb30jJHtpc3N1ZU51bWJlcn1gKTsKICAgIGNvbnN0IGlzc3VlID0gYXdhaXQgY2xpZW50LmdldElzc3VlKG93bmVyLCByZXBvLCBpc3N1ZU51bWJlcik7CiAgICBpZiAoIWlzc3VlKSB7CiAgICAgICAgbG9nLndhcm4oYEZhaWxlZCB0byBmZXRjaCBpc3N1ZSAke293bmVyfS8ke3JlcG99IyR7aXNzdWVOdW1iZXJ9YCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvLyBTa2lwIHB1bGwgcmVxdWVzdHMgKEdpdEh1YiBBUEkgcmV0dXJucyBQUnMgdW5kZXIgL2lzc3VlcyB0b28pCiAgICBpZiAoaXNzdWUucHVsbF9yZXF1ZXN0KSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gdHJpYWdlRnJvbUlzc3VlKG93bmVyLCByZXBvLCBpc3N1ZSk7Cn0KLyoqCiAqIFRyaWFnZSBmcm9tIGFuIGFscmVhZHktZmV0Y2hlZCBpc3N1ZSBvYmplY3QgKGF2b2lkcyBleHRyYSBBUEkgY2FsbCBmcm9tIHdlYmhvb2tzKS4KICovCmV4cG9ydCBmdW5jdGlvbiB0cmlhZ2VGcm9tSXNzdWUob3duZXIsIHJlcG8sIGlzc3VlKSB7CiAgICBjb25zdCBleGlzdGluZ0xhYmVscyA9IGlzc3VlLmxhYmVscy5tYXAoKGwpID0+IGwubmFtZSk7CiAgICBjb25zdCBib2R5ID0gaXNzdWUuYm9keSA/PyAiIjsKICAgIGNvbnN0IGNhdGVnb3J5ID0gY2xhc3NpZnlDYXRlZ29yeShpc3N1ZS50aXRsZSwgYm9keSwgZXhpc3RpbmdMYWJlbHMpOwogICAgY29uc3QgcHJpb3JpdHkgPSBjbGFzc2lmeVByaW9yaXR5KGlzc3VlLnRpdGxlLCBib2R5LCBjYXRlZ29yeSk7CiAgICBjb25zdCBzdWdnZXN0ZWRMYWJlbHMgPSBzdWdnZXN0TGFiZWxzKGlzc3VlLnRpdGxlLCBib2R5LCBleGlzdGluZ0xhYmVscyk7CiAgICBjb25zdCBzdWdnZXN0ZWRBc3NpZ25lZXMgPSBzdWdnZXN0QXNzaWduZWVzKFsuLi5leGlzdGluZ0xhYmVscywgLi4uc3VnZ2VzdGVkTGFiZWxzXSk7CiAgICBjb25zdCBzdW1tYXJ5ID0gYnVpbGRTdW1tYXJ5KGlzc3VlLCBjYXRlZ29yeSwgcHJpb3JpdHkpOwogICAgY29uc3QgcmVzdWx0ID0gewogICAgICAgIGlzc3VlTnVtYmVyOiBpc3N1ZS5udW1iZXIsCiAgICAgICAgcmVwbzogYCR7b3duZXJ9LyR7cmVwb31gLAogICAgICAgIGNhdGVnb3J5LAogICAgICAgIHByaW9yaXR5LAogICAgICAgIHN1Z2dlc3RlZExhYmVscywKICAgICAgICBzdWdnZXN0ZWRBc3NpZ25lZXMsCiAgICAgICAgc3VtbWFyeSwKICAgICAgICB0cmlhZ2VkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgIH07CiAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgc291cmNlOiAiYm9hcmQiLAogICAgICAgIHN1bW1hcnk6IGBJc3N1ZSB0cmlhZ2U6ICR7b3duZXJ9LyR7cmVwb30jJHtpc3N1ZS5udW1iZXJ9IOKGkiAke2NhdGVnb3J5fSAoJHtwcmlvcml0eX0pYCwKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKfQovKioKICogVHJpYWdlIGFuIGlzc3VlIGFuZCBhcHBseSB0aGUgc3VnZ2VzdGVkIGxhYmVscyBhdXRvbWF0aWNhbGx5LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyaWFnZUFuZExhYmVsKG93bmVyLCByZXBvLCBpc3N1ZU51bWJlcikgewogICAgY29uc3QgdHJpYWdlID0gYXdhaXQgdHJpYWdlSXNzdWUob3duZXIsIHJlcG8sIGlzc3VlTnVtYmVyKTsKICAgIGlmICghdHJpYWdlKQogICAgICAgIHJldHVybiBudWxsOwogICAgaWYgKHRyaWFnZS5zdWdnZXN0ZWRMYWJlbHMubGVuZ3RoID4gMCkgewogICAgICAgIGF3YWl0IGNsaWVudC5hZGRJc3N1ZUxhYmVscyhvd25lciwgcmVwbywgaXNzdWVOdW1iZXIsIHRyaWFnZS5zdWdnZXN0ZWRMYWJlbHMpOwogICAgfQogICAgaWYgKHRyaWFnZS5zdWdnZXN0ZWRBc3NpZ25lZXMubGVuZ3RoID4gMCkgewogICAgICAgIGF3YWl0IGNsaWVudC5hZGRJc3N1ZUFzc2lnbmVlcyhvd25lciwgcmVwbywgaXNzdWVOdW1iZXIsIHRyaWFnZS5zdWdnZXN0ZWRBc3NpZ25lZXMpOwogICAgfQogICAgcmV0dXJuIHRyaWFnZTsKfQovKioKICogQmF0Y2ggdHJpYWdlIGFsbCBvcGVuIGlzc3VlcyBpbiBhIHJlcG9zaXRvcnkuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJpYWdlT3Blbklzc3Vlcyhvd25lciwgcmVwbywgb3B0cykgewogICAgbG9nLmluZm8oYEJhdGNoIHRyaWFnaW5nIG9wZW4gaXNzdWVzIGZvciAke293bmVyfS8ke3JlcG99YCk7CiAgICBjb25zdCBpc3N1ZXMgPSBhd2FpdCBjbGllbnQubGlzdElzc3Vlcyhvd25lciwgcmVwbywgeyBzdGF0ZTogIm9wZW4iLCBwZXJfcGFnZTogMTAwIH0pOwogICAgaWYgKCFpc3N1ZXMpCiAgICAgICAgcmV0dXJuIFtdOwogICAgY29uc3QgcmVzdWx0cyA9IFtdOwogICAgZm9yIChjb25zdCBpc3N1ZSBvZiBpc3N1ZXMpIHsKICAgICAgICBpZiAoaXNzdWUucHVsbF9yZXF1ZXN0KQogICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBQUnMKICAgICAgICBjb25zdCB0cmlhZ2UgPSB0cmlhZ2VGcm9tSXNzdWUob3duZXIsIHJlcG8sIGlzc3VlKTsKICAgICAgICByZXN1bHRzLnB1c2godHJpYWdlKTsKICAgICAgICBpZiAob3B0cz8uYXBwbHkpIHsKICAgICAgICAgICAgaWYgKHRyaWFnZS5zdWdnZXN0ZWRMYWJlbHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LmFkZElzc3VlTGFiZWxzKG93bmVyLCByZXBvLCBpc3N1ZS5udW1iZXIsIHRyaWFnZS5zdWdnZXN0ZWRMYWJlbHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0cmlhZ2Uuc3VnZ2VzdGVkQXNzaWduZWVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5hZGRJc3N1ZUFzc2lnbmVlcyhvd25lciwgcmVwbywgaXNzdWUubnVtYmVyLCB0cmlhZ2Uuc3VnZ2VzdGVkQXNzaWduZWVzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICBzb3VyY2U6ICJib2FyZCIsCiAgICAgICAgc3VtbWFyeTogYEJhdGNoIHRyaWFnZTogJHtyZXN1bHRzLmxlbmd0aH0gaXNzdWVzIGluICR7b3duZXJ9LyR7cmVwb31gLAogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0czsKfQovLyDilIDilIAgRHVwbGljYXRlIERldGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFRva2VuaXplIGEgdGl0bGUgaW50byBsb3dlcmNhc2Ugd29yZHMsIHN0cmlwcGluZyBwdW5jdHVhdGlvbi4KICovCmZ1bmN0aW9uIHRva2VuaXplKHRleHQpIHsKICAgIHJldHVybiBuZXcgU2V0KHRleHQKICAgICAgICAudG9Mb3dlckNhc2UoKQogICAgICAgIC5yZXBsYWNlKC9bXlx3XHNdL2csICIgIikKICAgICAgICAuc3BsaXQoL1xzKy8pCiAgICAgICAgLmZpbHRlcigodykgPT4gdy5sZW5ndGggPiAyKSk7Cn0KLyoqCiAqIEphY2NhcmQgc2ltaWxhcml0eSBiZXR3ZWVuIHR3byB0b2tlbiBzZXRzLgogKiBSZXR1cm5zIGEgdmFsdWUgYmV0d2VlbiAwIChubyBvdmVybGFwKSBhbmQgMSAoaWRlbnRpY2FsKS4KICovCmV4cG9ydCBmdW5jdGlvbiB0aXRsZVNpbWlsYXJpdHkoYSwgYikgewogICAgY29uc3QgdG9rZW5zQSA9IHRva2VuaXplKGEpOwogICAgY29uc3QgdG9rZW5zQiA9IHRva2VuaXplKGIpOwogICAgaWYgKHRva2Vuc0Euc2l6ZSA9PT0gMCB8fCB0b2tlbnNCLnNpemUgPT09IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICBsZXQgaW50ZXJzZWN0aW9uID0gMDsKICAgIGZvciAoY29uc3QgdCBvZiB0b2tlbnNBKSB7CiAgICAgICAgaWYgKHRva2Vuc0IuaGFzKHQpKQogICAgICAgICAgICBpbnRlcnNlY3Rpb24rKzsKICAgIH0KICAgIGNvbnN0IHVuaW9uID0gdG9rZW5zQS5zaXplICsgdG9rZW5zQi5zaXplIC0gaW50ZXJzZWN0aW9uOwogICAgcmV0dXJuIHVuaW9uID09PSAwID8gMCA6IGludGVyc2VjdGlvbiAvIHVuaW9uOwp9Ci8qKgogKiBGaW5kIHBvdGVudGlhbCBkdXBsaWNhdGUgaXNzdWVzIGZvciBhIGdpdmVuIGlzc3VlIGJ5IGNvbXBhcmluZyB0aXRsZXMuCiAqIFJldHVybnMgaXNzdWVzIHdpdGggc2ltaWxhcml0eSBhYm92ZSB0aGUgdGhyZXNob2xkIChkZWZhdWx0IDAuNSkuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZER1cGxpY2F0ZXMob3duZXIsIHJlcG8sIGlzc3VlTnVtYmVyLCBvcHRzKSB7CiAgICBjb25zdCB0aHJlc2hvbGQgPSBvcHRzPy50aHJlc2hvbGQgPz8gMC41OwogICAgY29uc3QgbWF4UmVzdWx0cyA9IG9wdHM/Lm1heFJlc3VsdHMgPz8gNTsKICAgIGNvbnN0IGlzc3VlID0gYXdhaXQgY2xpZW50LmdldElzc3VlKG93bmVyLCByZXBvLCBpc3N1ZU51bWJlcik7CiAgICBpZiAoIWlzc3VlKQogICAgICAgIHJldHVybiBbXTsKICAgIGNvbnN0IG9wZW5Jc3N1ZXMgPSBhd2FpdCBjbGllbnQubGlzdElzc3Vlcyhvd25lciwgcmVwbywgeyBzdGF0ZTogIm9wZW4iLCBwZXJfcGFnZTogMTAwIH0pOwogICAgaWYgKCFvcGVuSXNzdWVzKQogICAgICAgIHJldHVybiBbXTsKICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBbXTsKICAgIGZvciAoY29uc3Qgb3RoZXIgb2Ygb3Blbklzc3VlcykgewogICAgICAgIGlmIChvdGhlci5udW1iZXIgPT09IGlzc3VlTnVtYmVyKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAob3RoZXIucHVsbF9yZXF1ZXN0KQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjb25zdCBzaW1pbGFyaXR5ID0gdGl0bGVTaW1pbGFyaXR5KGlzc3VlLnRpdGxlLCBvdGhlci50aXRsZSk7CiAgICAgICAgaWYgKHNpbWlsYXJpdHkgPj0gdGhyZXNob2xkKSB7CiAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaCh7CiAgICAgICAgICAgICAgICBpc3N1ZU51bWJlcjogb3RoZXIubnVtYmVyLAogICAgICAgICAgICAgICAgdGl0bGU6IG90aGVyLnRpdGxlLAogICAgICAgICAgICAgICAgc2ltaWxhcml0eTogTWF0aC5yb3VuZChzaW1pbGFyaXR5ICogMTAwKSAvIDEwMCwKICAgICAgICAgICAgICAgIHVybDogb3RoZXIuaHRtbF91cmwsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIGNhbmRpZGF0ZXMuc29ydCgoYSwgYikgPT4gYi5zaW1pbGFyaXR5IC0gYS5zaW1pbGFyaXR5KTsKICAgIHJldHVybiBjYW5kaWRhdGVzLnNsaWNlKDAsIG1heFJlc3VsdHMpOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzc3VlLXRyaWFnZS5qcy5tYXA=","github/pr-readiness.js":"LyoqCiAqIFBSIG1lcmdlIHJlYWRpbmVzcyDigJQgY2hlY2tzIHdoZXRoZXIgYSBwdWxsIHJlcXVlc3QgaXMgcmVhZHkgdG8gbWVyZ2UuCiAqCiAqIEV2YWx1YXRlczogQ0kgY2hlY2sgc3RhdHVzLCByZXZpZXcgYXBwcm92YWxzLCBtZXJnZSBjb25mbGljdHMsCiAqIGJyYW5jaCBmcmVzaG5lc3MsIGFuZCBkcmFmdCBzdGF0dXMuCiAqIFByb2R1Y2VzIGEgcmVhZGluZXNzIHJlcG9ydCB3aXRoIHBhc3MvZmFpbCBjaGVja3MgYW5kIGJsb2NrZXJzLgogKi8KaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgKiBhcyBjbGllbnQgZnJvbSAiLi9jbGllbnQuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImdpdGh1Yi5wci1yZWFkaW5lc3MiKTsKYXN5bmMgZnVuY3Rpb24gY2hlY2tEcmFmdFN0YXR1cyhjdHgpIHsKICAgIGNvbnN0IHByID0gYXdhaXQgY2xpZW50LmdldFB1bGxSZXF1ZXN0KGN0eC5vd25lciwgY3R4LnJlcG8sIGN0eC5wck51bWJlcik7CiAgICBpZiAoIXByKSB7CiAgICAgICAgcmV0dXJuIHsgbmFtZTogIkRyYWZ0IHN0YXR1cyIsIHBhc3NlZDogZmFsc2UsIGRldGFpbHM6ICJDb3VsZCBub3QgZmV0Y2ggUFIgZGF0YS4iIH07CiAgICB9CiAgICBpZiAocHIuZHJhZnQpIHsKICAgICAgICByZXR1cm4geyBuYW1lOiAiRHJhZnQgc3RhdHVzIiwgcGFzc2VkOiBmYWxzZSwgZGV0YWlsczogIlBSIGlzIHN0aWxsIG1hcmtlZCBhcyBkcmFmdC4iIH07CiAgICB9CiAgICByZXR1cm4geyBuYW1lOiAiRHJhZnQgc3RhdHVzIiwgcGFzc2VkOiB0cnVlLCBkZXRhaWxzOiAiUFIgaXMgbm90IGEgZHJhZnQuIiB9Owp9CmFzeW5jIGZ1bmN0aW9uIGNoZWNrQ0lTdGF0dXMoY3R4KSB7CiAgICBjb25zdCBwciA9IGF3YWl0IGNsaWVudC5nZXRQdWxsUmVxdWVzdChjdHgub3duZXIsIGN0eC5yZXBvLCBjdHgucHJOdW1iZXIpOwogICAgaWYgKCFwcikgewogICAgICAgIHJldHVybiB7IG5hbWU6ICJDSSBjaGVja3MiLCBwYXNzZWQ6IGZhbHNlLCBkZXRhaWxzOiAiQ291bGQgbm90IGZldGNoIFBSIGRhdGEuIiB9OwogICAgfQogICAgY29uc3QgY2hlY2tSdW5zID0gYXdhaXQgY2xpZW50Lmxpc3RDaGVja1J1bnMoY3R4Lm93bmVyLCBjdHgucmVwbywgcHIuaGVhZC5zaGEpOwogICAgaWYgKCFjaGVja1J1bnMpIHsKICAgICAgICByZXR1cm4geyBuYW1lOiAiQ0kgY2hlY2tzIiwgcGFzc2VkOiB0cnVlLCBkZXRhaWxzOiAiTm8gY2hlY2sgcnVucyBmb3VuZCAob3IgdW5hYmxlIHRvIGZldGNoKS4iIH07CiAgICB9CiAgICBpZiAoY2hlY2tSdW5zLnRvdGFsX2NvdW50ID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHsgbmFtZTogIkNJIGNoZWNrcyIsIHBhc3NlZDogdHJ1ZSwgZGV0YWlsczogIk5vIENJIGNoZWNrcyBjb25maWd1cmVkLiIgfTsKICAgIH0KICAgIGNvbnN0IGNvbXBsZXRlZCA9IGNoZWNrUnVucy5jaGVja19ydW5zLmZpbHRlcigocikgPT4gci5zdGF0dXMgPT09ICJjb21wbGV0ZWQiKTsKICAgIGNvbnN0IHBlbmRpbmcgPSBjaGVja1J1bnMuY2hlY2tfcnVucy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzICE9PSAiY29tcGxldGVkIik7CiAgICBjb25zdCBmYWlsZWQgPSBjb21wbGV0ZWQuZmlsdGVyKChyKSA9PiByLmNvbmNsdXNpb24gIT09ICJzdWNjZXNzIiAmJiByLmNvbmNsdXNpb24gIT09ICJuZXV0cmFsIiAmJiByLmNvbmNsdXNpb24gIT09ICJza2lwcGVkIik7CiAgICBpZiAocGVuZGluZy5sZW5ndGggPiAwKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogIkNJIGNoZWNrcyIsCiAgICAgICAgICAgIHBhc3NlZDogZmFsc2UsCiAgICAgICAgICAgIGRldGFpbHM6IGAke3BlbmRpbmcubGVuZ3RofSBjaGVjayhzKSBzdGlsbCBydW5uaW5nOiAke3BlbmRpbmcubWFwKChyKSA9PiByLm5hbWUpLmpvaW4oIiwgIil9LmAsCiAgICAgICAgfTsKICAgIH0KICAgIGlmIChmYWlsZWQubGVuZ3RoID4gMCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5hbWU6ICJDSSBjaGVja3MiLAogICAgICAgICAgICBwYXNzZWQ6IGZhbHNlLAogICAgICAgICAgICBkZXRhaWxzOiBgJHtmYWlsZWQubGVuZ3RofSBjaGVjayhzKSBmYWlsZWQ6ICR7ZmFpbGVkLm1hcCgocikgPT4gci5uYW1lKS5qb2luKCIsICIpfS5gLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIG5hbWU6ICJDSSBjaGVja3MiLAogICAgICAgIHBhc3NlZDogdHJ1ZSwKICAgICAgICBkZXRhaWxzOiBgQWxsICR7Y29tcGxldGVkLmxlbmd0aH0gY2hlY2socykgcGFzc2VkLmAsCiAgICB9Owp9CmFzeW5jIGZ1bmN0aW9uIGNoZWNrUmV2aWV3QXBwcm92YWxzKGN0eCkgewogICAgY29uc3QgcmV2aWV3cyA9IGF3YWl0IGNsaWVudC5nZXRQUlJldmlld3MoY3R4Lm93bmVyLCBjdHgucmVwbywgY3R4LnByTnVtYmVyKTsKICAgIGlmICghcmV2aWV3cykgewogICAgICAgIHJldHVybiB7IG5hbWU6ICJSZXZpZXcgYXBwcm92YWxzIiwgcGFzc2VkOiBmYWxzZSwgZGV0YWlsczogIkNvdWxkIG5vdCBmZXRjaCByZXZpZXdzLiIgfTsKICAgIH0KICAgIGlmIChyZXZpZXdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiB7IG5hbWU6ICJSZXZpZXcgYXBwcm92YWxzIiwgcGFzc2VkOiBmYWxzZSwgZGV0YWlsczogIk5vIHJldmlld3MgeWV0LiIgfTsKICAgIH0KICAgIC8vIEdldCB0aGUgbGF0ZXN0IHJldmlldyBwZXIgcmV2aWV3ZXIgKGEgcmV2aWV3ZXIgY2FuIGxlYXZlIG11bHRpcGxlIHJldmlld3MpCiAgICBjb25zdCBsYXRlc3RCeVJldmlld2VyID0gbmV3IE1hcCgpOwogICAgZm9yIChjb25zdCByZXZpZXcgb2YgcmV2aWV3cykgewogICAgICAgIGlmIChyZXZpZXcuc3RhdGUgPT09ICJQRU5ESU5HIikKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgbGF0ZXN0QnlSZXZpZXdlci5zZXQocmV2aWV3LnVzZXIubG9naW4sIHJldmlldy5zdGF0ZSk7CiAgICB9CiAgICBjb25zdCBhcHByb3ZhbHMgPSBbLi4ubGF0ZXN0QnlSZXZpZXdlci52YWx1ZXMoKV0uZmlsdGVyKChzKSA9PiBzID09PSAiQVBQUk9WRUQiKS5sZW5ndGg7CiAgICBjb25zdCBjaGFuZ2VzUmVxdWVzdGVkID0gWy4uLmxhdGVzdEJ5UmV2aWV3ZXIudmFsdWVzKCldLmZpbHRlcigocykgPT4gcyA9PT0gIkNIQU5HRVNfUkVRVUVTVEVEIikubGVuZ3RoOwogICAgaWYgKGNoYW5nZXNSZXF1ZXN0ZWQgPiAwKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogIlJldmlldyBhcHByb3ZhbHMiLAogICAgICAgICAgICBwYXNzZWQ6IGZhbHNlLAogICAgICAgICAgICBkZXRhaWxzOiBgJHtjaGFuZ2VzUmVxdWVzdGVkfSByZXZpZXdlcihzKSByZXF1ZXN0ZWQgY2hhbmdlcy5gLAogICAgICAgIH07CiAgICB9CiAgICBpZiAoYXBwcm92YWxzID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogIlJldmlldyBhcHByb3ZhbHMiLAogICAgICAgICAgICBwYXNzZWQ6IGZhbHNlLAogICAgICAgICAgICBkZXRhaWxzOiAiTm8gYXBwcm92YWxzIHlldC4iLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIG5hbWU6ICJSZXZpZXcgYXBwcm92YWxzIiwKICAgICAgICBwYXNzZWQ6IHRydWUsCiAgICAgICAgZGV0YWlsczogYCR7YXBwcm92YWxzfSBhcHByb3ZhbChzKSByZWNlaXZlZC5gLAogICAgfTsKfQphc3luYyBmdW5jdGlvbiBjaGVja01lcmdlQ29uZmxpY3RzKGN0eCkgewogICAgY29uc3QgcHIgPSBhd2FpdCBjbGllbnQuZ2V0UHVsbFJlcXVlc3QoY3R4Lm93bmVyLCBjdHgucmVwbywgY3R4LnByTnVtYmVyKTsKICAgIGlmICghcHIpIHsKICAgICAgICByZXR1cm4geyBuYW1lOiAiTWVyZ2UgY29uZmxpY3RzIiwgcGFzc2VkOiBmYWxzZSwgZGV0YWlsczogIkNvdWxkIG5vdCBmZXRjaCBQUiBkYXRhLiIgfTsKICAgIH0KICAgIC8vIG1lcmdlYWJsZSBjYW4gYmUgbnVsbCB3aGVuIEdpdEh1YiBoYXNuJ3QgY29tcHV0ZWQgaXQgeWV0CiAgICBpZiAocHIubWVyZ2VhYmxlID09PSBmYWxzZSkgewogICAgICAgIHJldHVybiB7IG5hbWU6ICJNZXJnZSBjb25mbGljdHMiLCBwYXNzZWQ6IGZhbHNlLCBkZXRhaWxzOiAiUFIgaGFzIG1lcmdlIGNvbmZsaWN0cyB0aGF0IG11c3QgYmUgcmVzb2x2ZWQuIiB9OwogICAgfQogICAgaWYgKHByLm1lcmdlYWJsZSA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiB7IG5hbWU6ICJNZXJnZSBjb25mbGljdHMiLCBwYXNzZWQ6IHRydWUsIGRldGFpbHM6ICJNZXJnZSBzdGF0dXMgaXMgc3RpbGwgYmVpbmcgY29tcHV0ZWQgYnkgR2l0SHViLiIgfTsKICAgIH0KICAgIHJldHVybiB7IG5hbWU6ICJNZXJnZSBjb25mbGljdHMiLCBwYXNzZWQ6IHRydWUsIGRldGFpbHM6ICJObyBtZXJnZSBjb25mbGljdHMuIiB9Owp9CmFzeW5jIGZ1bmN0aW9uIGNoZWNrQnJhbmNoRnJlc2huZXNzKGN0eCkgewogICAgY29uc3QgcHIgPSBhd2FpdCBjbGllbnQuZ2V0UHVsbFJlcXVlc3QoY3R4Lm93bmVyLCBjdHgucmVwbywgY3R4LnByTnVtYmVyKTsKICAgIGlmICghcHIpIHsKICAgICAgICByZXR1cm4geyBuYW1lOiAiQnJhbmNoIGZyZXNobmVzcyIsIHBhc3NlZDogZmFsc2UsIGRldGFpbHM6ICJDb3VsZCBub3QgZmV0Y2ggUFIgZGF0YS4iIH07CiAgICB9CiAgICBjb25zdCBjb21wYXJpc29uID0gYXdhaXQgY2xpZW50LmNvbXBhcmVCcmFuY2hlcyhjdHgub3duZXIsIGN0eC5yZXBvLCBwci5oZWFkLnNoYSwgcHIuYmFzZS5yZWYpOwogICAgaWYgKCFjb21wYXJpc29uKSB7CiAgICAgICAgcmV0dXJuIHsgbmFtZTogIkJyYW5jaCBmcmVzaG5lc3MiLCBwYXNzZWQ6IHRydWUsIGRldGFpbHM6ICJDb3VsZCBub3QgY29tcGFyZSBicmFuY2hlcy4iIH07CiAgICB9CiAgICBpZiAoY29tcGFyaXNvbi5iZWhpbmRfYnkgPiAwKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogIkJyYW5jaCBmcmVzaG5lc3MiLAogICAgICAgICAgICBwYXNzZWQ6IGZhbHNlLAogICAgICAgICAgICBkZXRhaWxzOiBgQnJhbmNoIGlzICR7Y29tcGFyaXNvbi5iZWhpbmRfYnl9IGNvbW1pdChzKSBiZWhpbmQgJHtwci5iYXNlLnJlZn0uIENvbnNpZGVyIHJlYmFzaW5nIG9yIG1lcmdpbmcgYmFzZS5gLAogICAgICAgIH07CiAgICB9CiAgICByZXR1cm4geyBuYW1lOiAiQnJhbmNoIGZyZXNobmVzcyIsIHBhc3NlZDogdHJ1ZSwgZGV0YWlsczogYEJyYW5jaCBpcyB1cCB0byBkYXRlIHdpdGggJHtwci5iYXNlLnJlZn0uYCB9Owp9Ci8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogQ2hlY2sgaWYgYSBQUiBpcyByZWFkeSB0byBtZXJnZS4KICogUnVucyBhbGwgcmVhZGluZXNzIGNoZWNrcyBhbmQgcmV0dXJucyBhIHJlcG9ydCB3aXRoIGJsb2NrZXJzLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrUFJSZWFkaW5lc3Mob3duZXIsIHJlcG8sIHByTnVtYmVyKSB7CiAgICBsb2cuaW5mbyhgQ2hlY2tpbmcgbWVyZ2UgcmVhZGluZXNzIGZvciAke293bmVyfS8ke3JlcG99IyR7cHJOdW1iZXJ9YCk7CiAgICBjb25zdCBwciA9IGF3YWl0IGNsaWVudC5nZXRQdWxsUmVxdWVzdChvd25lciwgcmVwbywgcHJOdW1iZXIpOwogICAgaWYgKCFwcikgewogICAgICAgIGxvZy53YXJuKGBGYWlsZWQgdG8gZmV0Y2ggUFIgJHtvd25lcn0vJHtyZXBvfSMke3ByTnVtYmVyfWApOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKHByLnN0YXRlICE9PSAib3BlbiIpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwck51bWJlciwKICAgICAgICAgICAgcmVwbzogYCR7b3duZXJ9LyR7cmVwb31gLAogICAgICAgICAgICByZWFkeTogZmFsc2UsCiAgICAgICAgICAgIGNoZWNrczogW3sgbmFtZTogIlBSIHN0YXRlIiwgcGFzc2VkOiBmYWxzZSwgZGV0YWlsczogYFBSIGlzICR7cHIuc3RhdGV9LCBub3Qgb3Blbi5gIH1dLAogICAgICAgICAgICBibG9ja2VyczogW2BQUiBpcyAke3ByLnN0YXRlfS5gXSwKICAgICAgICAgICAgY2hlY2tlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgfTsKICAgIH0KICAgIGNvbnN0IGN0eCA9IHsgb3duZXIsIHJlcG8sIHByTnVtYmVyIH07CiAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbChbCiAgICAgICAgY2hlY2tEcmFmdFN0YXR1cyhjdHgpLAogICAgICAgIGNoZWNrQ0lTdGF0dXMoY3R4KSwKICAgICAgICBjaGVja1Jldmlld0FwcHJvdmFscyhjdHgpLAogICAgICAgIGNoZWNrTWVyZ2VDb25mbGljdHMoY3R4KSwKICAgICAgICBjaGVja0JyYW5jaEZyZXNobmVzcyhjdHgpLAogICAgXSk7CiAgICBjb25zdCBibG9ja2VycyA9IGNoZWNrcy5maWx0ZXIoKGMpID0+ICFjLnBhc3NlZCkubWFwKChjKSA9PiBjLmRldGFpbHMpOwogICAgY29uc3QgcmVhZHkgPSBibG9ja2Vycy5sZW5ndGggPT09IDA7CiAgICBjb25zdCByZXBvcnQgPSB7CiAgICAgICAgcHJOdW1iZXIsCiAgICAgICAgcmVwbzogYCR7b3duZXJ9LyR7cmVwb31gLAogICAgICAgIHJlYWR5LAogICAgICAgIGNoZWNrcywKICAgICAgICBibG9ja2VycywKICAgICAgICBjaGVja2VkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgIH07CiAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgc291cmNlOiAiYm9hcmQiLAogICAgICAgIHN1bW1hcnk6IGBQUiByZWFkaW5lc3M6ICR7b3duZXJ9LyR7cmVwb30jJHtwck51bWJlcn0g4oCUICR7cmVhZHkgPyAicmVhZHkiIDogYCR7YmxvY2tlcnMubGVuZ3RofSBibG9ja2VyKHMpYH1gLAogICAgfSk7CiAgICByZXR1cm4gcmVwb3J0Owp9Ci8qKgogKiBGb3JtYXQgYSByZWFkaW5lc3MgcmVwb3J0IGFzIG1hcmtkb3duLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlYWRpbmVzc1JlcG9ydChyZXBvcnQpIHsKICAgIGNvbnN0IGxpbmVzID0gW107CiAgICBjb25zdCBzdGF0dXNJY29uID0gcmVwb3J0LnJlYWR5ID8gIuKchSIgOiAi4puUIjsKICAgIGxpbmVzLnB1c2goYCMjIFBSIE1lcmdlIFJlYWRpbmVzczogIyR7cmVwb3J0LnByTnVtYmVyfWApOwogICAgbGluZXMucHVzaCgiIik7CiAgICBsaW5lcy5wdXNoKGAqKlN0YXR1czoqKiAke3N0YXR1c0ljb259ICR7cmVwb3J0LnJlYWR5ID8gIlJlYWR5IHRvIG1lcmdlIiA6ICJOb3QgcmVhZHkifWApOwogICAgbGluZXMucHVzaCgiIik7CiAgICBsaW5lcy5wdXNoKCJ8IENoZWNrIHwgU3RhdHVzIHwgRGV0YWlscyB8Iik7CiAgICBsaW5lcy5wdXNoKCJ8LS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS18Iik7CiAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIHJlcG9ydC5jaGVja3MpIHsKICAgICAgICBjb25zdCBpY29uID0gY2hlY2sucGFzc2VkID8gIuKchSIgOiAi4p2MIjsKICAgICAgICBsaW5lcy5wdXNoKGB8ICR7Y2hlY2submFtZX0gfCAke2ljb259IHwgJHtjaGVjay5kZXRhaWxzfSB8YCk7CiAgICB9CiAgICBpZiAocmVwb3J0LmJsb2NrZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICBsaW5lcy5wdXNoKCIiKTsKICAgICAgICBsaW5lcy5wdXNoKCIjIyMgQmxvY2tlcnMiKTsKICAgICAgICBmb3IgKGNvbnN0IGIgb2YgcmVwb3J0LmJsb2NrZXJzKSB7CiAgICAgICAgICAgIGxpbmVzLnB1c2goYC0gJHtifWApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBsaW5lcy5qb2luKCJcbiIpOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXByLXJlYWRpbmVzcy5qcy5tYXA=","github/pr-review.js":"LyoqCiAqIFBSIHJldmlldyBhdXRvbWF0aW9uIOKAlCBhbmFseXplcyBwdWxsIHJlcXVlc3RzIGFuZCBwcm92aWRlcyBmZWVkYmFjay4KICoKICogQ2hlY2tzIGZvcjogc2l6ZSwgdGVzdCBjb3ZlcmFnZSBzaWduYWxzLCBkb2MgY2hhbmdlcywgbGFyZ2UvYmluYXJ5IGZpbGVzLAogKiBuYW1pbmcgY29udmVudGlvbnMsIHNlY3VyaXR5IHBhdHRlcm5zLCBhbmQgYnJlYWtpbmcgY2hhbmdlcy4KICogRG9lcyBOT1QgdXNlIExMTSDigJQgcHVyZWx5IGhldXJpc3RpYy1iYXNlZCBmb3Igc3BlZWQgYW5kIHJlbGlhYmlsaXR5LgogKi8KaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgKiBhcyBjbGllbnQgZnJvbSAiLi9jbGllbnQuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImdpdGh1Yi5wci1yZXZpZXciKTsKLy8g4pSA4pSAIFNpemUgdGhyZXNob2xkcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKY29uc3QgU0laRV9USFJFU0hPTERTID0gewogICAgc21hbGw6IDEwMCwKICAgIG1lZGl1bTogMzAwLAogICAgbGFyZ2U6IDUwMCwKICAgIGh1Z2U6IDEwMDAsCn07CmNvbnN0IEJJTkFSWV9FWFRFTlNJT05TID0gbmV3IFNldChbCiAgICAiLnBuZyIsICIuanBnIiwgIi5qcGVnIiwgIi5naWYiLCAiLmljbyIsICIuc3ZnIiwKICAgICIud29mZiIsICIud29mZjIiLCAiLnR0ZiIsICIuZW90IiwKICAgICIuemlwIiwgIi50YXIiLCAiLmd6IiwgIi5leGUiLCAiLmRsbCIsCiAgICAiLm1wMyIsICIubXA0IiwgIi53YXYiLCAiLmF2aSIsCiAgICAiLnBkZiIsICIuZG9jIiwgIi5kb2N4IiwKXSk7CmNvbnN0IFRFU1RfUEFUVEVSTlMgPSBbCiAgICAvXC50ZXN0XC5banRdc3g/JC8sCiAgICAvXC5zcGVjXC5banRdc3g/JC8sCiAgICAvX190ZXN0c19fXC8vLAogICAgL3Rlc3RcLy8sCiAgICAvdGVzdHNcLy8sCl07CmNvbnN0IERPQ19QQVRURVJOUyA9IFsKICAgIC9cLm1kJC9pLAogICAgL2RvY3M/XC8vaSwKICAgIC9yZWFkbWUvaSwKICAgIC9jaGFuZ2Vsb2cvaSwKXTsKY29uc3QgU0VDVVJJVFlfUEFUVEVSTlMgPSBbCiAgICAvcGFzc3dvcmQvaSwKICAgIC9zZWNyZXQvaSwKICAgIC9hcGlbXy1dP2tleS9pLAogICAgL3Rva2VuL2ksCiAgICAvXC5lbnYvLAogICAgL2NyZWRlbnRpYWxzL2ksCiAgICAvYXV0aFtfLV0/dG9rZW4vaSwKICAgIC9wcml2YXRlW18tXT9rZXkvaSwKXTsKY29uc3QgREVQRU5ERU5DWV9GSUxFUyA9IG5ldyBTZXQoWwogICAgInBhY2thZ2UuanNvbiIsCiAgICAicGFja2FnZS1sb2NrLmpzb24iLAogICAgInlhcm4ubG9jayIsCiAgICAicG5wbS1sb2NrLnlhbWwiLAogICAgImJ1bi5sb2NrYiIsCiAgICAicmVxdWlyZW1lbnRzLnR4dCIsCiAgICAiUGlwZmlsZS5sb2NrIiwKICAgICJHZW1maWxlLmxvY2siLAogICAgImdvLnN1bSIsCiAgICAiQ2FyZ28ubG9jayIsCiAgICAiY29tcG9zZXIubG9jayIsCl0pOwpjb25zdCBMT0NLX0ZJTEVTID0gbmV3IFNldChbCiAgICAicGFja2FnZS1sb2NrLmpzb24iLAogICAgInlhcm4ubG9jayIsCiAgICAicG5wbS1sb2NrLnlhbWwiLAogICAgImJ1bi5sb2NrYiIsCiAgICAiUGlwZmlsZS5sb2NrIiwKICAgICJHZW1maWxlLmxvY2siLAogICAgImdvLnN1bSIsCiAgICAiQ2FyZ28ubG9jayIsCiAgICAiY29tcG9zZXIubG9jayIsCl0pOwovLyDilIDilIAgQW5hbHlzaXMgZnVuY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBnZXRGaWxlRXh0ZW5zaW9uKGZpbGVuYW1lKSB7CiAgICBjb25zdCBkb3QgPSBmaWxlbmFtZS5sYXN0SW5kZXhPZigiLiIpOwogICAgcmV0dXJuIGRvdCA+PSAwID8gZmlsZW5hbWUuc2xpY2UoZG90KS50b0xvd2VyQ2FzZSgpIDogIiI7Cn0KZnVuY3Rpb24gY29tcHV0ZU1ldHJpY3MocHIsIGZpbGVzKSB7CiAgICBjb25zdCBoYXNUZXN0cyA9IGZpbGVzLnNvbWUoKGYpID0+IFRFU1RfUEFUVEVSTlMuc29tZSgocCkgPT4gcC50ZXN0KGYuZmlsZW5hbWUpKSk7CiAgICBjb25zdCBoYXNEb2NDaGFuZ2VzID0gZmlsZXMuc29tZSgoZikgPT4gRE9DX1BBVFRFUk5TLnNvbWUoKHApID0+IHAudGVzdChmLmZpbGVuYW1lKSkpOwogICAgY29uc3QgbGFyZ2VGaWxlcyA9IGZpbGVzCiAgICAgICAgLmZpbHRlcigoZikgPT4gZi5jaGFuZ2VzID4gMzAwKQogICAgICAgIC5tYXAoKGYpID0+IGYuZmlsZW5hbWUpOwogICAgY29uc3QgYmluYXJ5RmlsZXMgPSBmaWxlcwogICAgICAgIC5maWx0ZXIoKGYpID0+IEJJTkFSWV9FWFRFTlNJT05TLmhhcyhnZXRGaWxlRXh0ZW5zaW9uKGYuZmlsZW5hbWUpKSkKICAgICAgICAubWFwKChmKSA9PiBmLmZpbGVuYW1lKTsKICAgIHJldHVybiB7CiAgICAgICAgZmlsZXNDaGFuZ2VkOiBwci5jaGFuZ2VkX2ZpbGVzLAogICAgICAgIGFkZGl0aW9uczogcHIuYWRkaXRpb25zLAogICAgICAgIGRlbGV0aW9uczogcHIuZGVsZXRpb25zLAogICAgICAgIGhhc1Rlc3RzLAogICAgICAgIGhhc0RvY0NoYW5nZXMsCiAgICAgICAgbGFyZ2VGaWxlcywKICAgICAgICBiaW5hcnlGaWxlcywKICAgIH07Cn0KZnVuY3Rpb24gYW5hbHl6ZVNpemUocHIpIHsKICAgIGNvbnN0IGZpbmRpbmdzID0gW107CiAgICBjb25zdCB0b3RhbCA9IHByLmFkZGl0aW9ucyArIHByLmRlbGV0aW9uczsKICAgIGlmICh0b3RhbCA+IFNJWkVfVEhSRVNIT0xEUy5odWdlKSB7CiAgICAgICAgZmluZGluZ3MucHVzaCh7CiAgICAgICAgICAgIHNldmVyaXR5OiAiZXJyb3IiLAogICAgICAgICAgICBjYXRlZ29yeTogInNpemUiLAogICAgICAgICAgICBtZXNzYWdlOiBgVmVyeSBsYXJnZSBQUiAoJHt0b3RhbH0gbGluZXMgY2hhbmdlZCkuIENvbnNpZGVyIGJyZWFraW5nIGludG8gc21hbGxlciBQUnMgZm9yIGVhc2llciByZXZpZXcuYCwKICAgICAgICB9KTsKICAgIH0KICAgIGVsc2UgaWYgKHRvdGFsID4gU0laRV9USFJFU0hPTERTLmxhcmdlKSB7CiAgICAgICAgZmluZGluZ3MucHVzaCh7CiAgICAgICAgICAgIHNldmVyaXR5OiAid2FybmluZyIsCiAgICAgICAgICAgIGNhdGVnb3J5OiAic2l6ZSIsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBMYXJnZSBQUiAoJHt0b3RhbH0gbGluZXMgY2hhbmdlZCkuIFNtYWxsZXIgUFJzIGFyZSByZXZpZXdlZCBmYXN0ZXIgYW5kIG1vcmUgdGhvcm91Z2hseS5gLAogICAgICAgIH0pOwogICAgfQogICAgaWYgKHByLmNoYW5nZWRfZmlsZXMgPiAyMCkgewogICAgICAgIGZpbmRpbmdzLnB1c2goewogICAgICAgICAgICBzZXZlcml0eTogIndhcm5pbmciLAogICAgICAgICAgICBjYXRlZ29yeTogInNpemUiLAogICAgICAgICAgICBtZXNzYWdlOiBgJHtwci5jaGFuZ2VkX2ZpbGVzfSBmaWxlcyBjaGFuZ2VkLiBDb25zaWRlciBzY29waW5nIHRoaXMgUFIgbW9yZSBuYXJyb3dseS5gLAogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIGZpbmRpbmdzOwp9CmZ1bmN0aW9uIGFuYWx5emVUZXN0Q292ZXJhZ2UoZmlsZXMpIHsKICAgIGNvbnN0IGZpbmRpbmdzID0gW107CiAgICBjb25zdCBzcmNGaWxlcyA9IGZpbGVzLmZpbHRlcigoZikgPT4gZi5zdGF0dXMgIT09ICJyZW1vdmVkIiAmJgogICAgICAgICFURVNUX1BBVFRFUk5TLnNvbWUoKHApID0+IHAudGVzdChmLmZpbGVuYW1lKSkgJiYKICAgICAgICAhRE9DX1BBVFRFUk5TLnNvbWUoKHApID0+IHAudGVzdChmLmZpbGVuYW1lKSkgJiYKICAgICAgICAoZi5maWxlbmFtZS5lbmRzV2l0aCgiLnRzIikgfHwgZi5maWxlbmFtZS5lbmRzV2l0aCgiLnRzeCIpIHx8IGYuZmlsZW5hbWUuZW5kc1dpdGgoIi5qcyIpIHx8IGYuZmlsZW5hbWUuZW5kc1dpdGgoIi5qc3giKSkpOwogICAgY29uc3QgdGVzdEZpbGVzID0gZmlsZXMuZmlsdGVyKChmKSA9PiBURVNUX1BBVFRFUk5TLnNvbWUoKHApID0+IHAudGVzdChmLmZpbGVuYW1lKSkpOwogICAgaWYgKHNyY0ZpbGVzLmxlbmd0aCA+IDAgJiYgdGVzdEZpbGVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIGZpbmRpbmdzLnB1c2goewogICAgICAgICAgICBzZXZlcml0eTogIndhcm5pbmciLAogICAgICAgICAgICBjYXRlZ29yeTogInRlc3RpbmciLAogICAgICAgICAgICBtZXNzYWdlOiBgJHtzcmNGaWxlcy5sZW5ndGh9IHNvdXJjZSBmaWxlKHMpIGNoYW5nZWQgYnV0IG5vIHRlc3QgZmlsZXMgbW9kaWZpZWQuIENvbnNpZGVyIGFkZGluZyB0ZXN0cy5gLAogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIGZpbmRpbmdzOwp9CmZ1bmN0aW9uIGFuYWx5emVTZWN1cml0eVBhdHRlcm5zKGZpbGVzKSB7CiAgICBjb25zdCBmaW5kaW5ncyA9IFtdOwogICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7CiAgICAgICAgaWYgKCFmaWxlLnBhdGNoKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAvLyBPbmx5IGNoZWNrIGFkZGVkIGxpbmVzIChsaW5lcyBzdGFydGluZyB3aXRoICspCiAgICAgICAgY29uc3QgYWRkZWRMaW5lcyA9IGZpbGUucGF0Y2guc3BsaXQoIlxuIikuZmlsdGVyKChsKSA9PiBsLnN0YXJ0c1dpdGgoIisiKSAmJiAhbC5zdGFydHNXaXRoKCIrKysiKSk7CiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGFkZGVkTGluZXMpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIFNFQ1VSSVRZX1BBVFRFUk5TKSB7CiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi50ZXN0KGxpbmUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBpdCdzIGNsZWFybHkgYSB0ZXN0IG9yIG1vY2sKICAgICAgICAgICAgICAgICAgICBpZiAoL21vY2t8dGVzdHxmYWtlfGR1bW15fGV4YW1wbGV8cGxhY2Vob2xkZXIvaS50ZXN0KGxpbmUpKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBmaW5kaW5ncy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICJ3YXJuaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICJzZWN1cml0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBQb3RlbnRpYWwgc2Vuc2l0aXZlIHZhbHVlIGluICR7ZmlsZS5maWxlbmFtZX0g4oCUIHJldmlldyBmb3IgaGFyZGNvZGVkIGNyZWRlbnRpYWxzLmAsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUuZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIE9uZSBmaW5kaW5nIHBlciBmaWxlIHBlciBwYXR0ZXJuIGNoZWNrCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvLyBEZWR1cGxpY2F0ZSBieSBmaWxlCiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpOwogICAgcmV0dXJuIGZpbmRpbmdzLmZpbHRlcigoZikgPT4gewogICAgICAgIGlmIChmLmZpbGUgJiYgc2Vlbi5oYXMoZi5maWxlKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChmLmZpbGUpCiAgICAgICAgICAgIHNlZW4uYWRkKGYuZmlsZSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9KTsKfQpmdW5jdGlvbiBhbmFseXplRGVwZW5kZW5jeUNoYW5nZXMoZmlsZXMpIHsKICAgIGNvbnN0IGZpbmRpbmdzID0gW107CiAgICBjb25zdCBkZXBGaWxlcyA9IGZpbGVzLmZpbHRlcigoZikgPT4gewogICAgICAgIGNvbnN0IGJhc2VuYW1lID0gZi5maWxlbmFtZS5zcGxpdCgiLyIpLnBvcCgpID8/ICIiOwogICAgICAgIHJldHVybiBERVBFTkRFTkNZX0ZJTEVTLmhhcyhiYXNlbmFtZSk7CiAgICB9KTsKICAgIGlmIChkZXBGaWxlcy5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIGZpbmRpbmdzOwogICAgY29uc3QgbWFuaWZlc3RGaWxlcyA9IGRlcEZpbGVzLmZpbHRlcigoZikgPT4gewogICAgICAgIGNvbnN0IGJhc2VuYW1lID0gZi5maWxlbmFtZS5zcGxpdCgiLyIpLnBvcCgpID8/ICIiOwogICAgICAgIHJldHVybiAhTE9DS19GSUxFUy5oYXMoYmFzZW5hbWUpOwogICAgfSk7CiAgICBjb25zdCBsb2NrRmlsZXMgPSBkZXBGaWxlcy5maWx0ZXIoKGYpID0+IHsKICAgICAgICBjb25zdCBiYXNlbmFtZSA9IGYuZmlsZW5hbWUuc3BsaXQoIi8iKS5wb3AoKSA/PyAiIjsKICAgICAgICByZXR1cm4gTE9DS19GSUxFUy5oYXMoYmFzZW5hbWUpOwogICAgfSk7CiAgICAvLyBNYW5pZmVzdCBjaGFuZ2VkIGJ1dCBubyBsb2NrIGZpbGUg4oCUIG1pZ2h0IGJlIG1pc3NpbmcgaW5zdGFsbAogICAgaWYgKG1hbmlmZXN0RmlsZXMubGVuZ3RoID4gMCAmJiBsb2NrRmlsZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgZmluZGluZ3MucHVzaCh7CiAgICAgICAgICAgIHNldmVyaXR5OiAid2FybmluZyIsCiAgICAgICAgICAgIGNhdGVnb3J5OiAiY29udmVudGlvbiIsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBEZXBlbmRlbmN5IG1hbmlmZXN0IGNoYW5nZWQgKCR7bWFuaWZlc3RGaWxlcy5tYXAoKGYpID0+IGYuZmlsZW5hbWUpLmpvaW4oIiwgIil9KSBidXQgbm8gbG9jayBmaWxlIHVwZGF0ZWQuIFJ1biBpbnN0YWxsIHRvIHVwZGF0ZSB0aGUgbG9jayBmaWxlLmAsCiAgICAgICAgfSk7CiAgICB9CiAgICAvLyBMb2NrIGZpbGUgY2hhbmdlZCDigJQgZmxhZyBmb3IgcmV2aWV3CiAgICBpZiAobG9ja0ZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICBmaW5kaW5ncy5wdXNoKHsKICAgICAgICAgICAgc2V2ZXJpdHk6ICJpbmZvIiwKICAgICAgICAgICAgY2F0ZWdvcnk6ICJzZWN1cml0eSIsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBMb2NrIGZpbGUocykgY2hhbmdlZDogJHtsb2NrRmlsZXMubWFwKChmKSA9PiBmLmZpbGVuYW1lKS5qb2luKCIsICIpfS4gVmVyaWZ5IGRlcGVuZGVuY3kgdXBkYXRlcyBhcmUgaW50ZW50aW9uYWwuYCwKICAgICAgICB9KTsKICAgIH0KICAgIC8vIENoZWNrIGZvciBuZXcgZGVwZW5kZW5jeSBhZGRpdGlvbnMgaW4gcGF0Y2gKICAgIGZvciAoY29uc3QgZiBvZiBtYW5pZmVzdEZpbGVzKSB7CiAgICAgICAgaWYgKCFmLnBhdGNoKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjb25zdCBhZGRlZExpbmVzID0gZi5wYXRjaC5zcGxpdCgiXG4iKS5maWx0ZXIoKGwpID0+IGwuc3RhcnRzV2l0aCgiKyIpICYmICFsLnN0YXJ0c1dpdGgoIisrKyIpKTsKICAgICAgICBpZiAoYWRkZWRMaW5lcy5sZW5ndGggPiAxMCkgewogICAgICAgICAgICBmaW5kaW5ncy5wdXNoKHsKICAgICAgICAgICAgICAgIHNldmVyaXR5OiAiaW5mbyIsCiAgICAgICAgICAgICAgICBjYXRlZ29yeTogInNlY3VyaXR5IiwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBTaWduaWZpY2FudCBkZXBlbmRlbmN5IGNoYW5nZXMgaW4gJHtmLmZpbGVuYW1lfSAoJHthZGRlZExpbmVzLmxlbmd0aH0gYWRkaXRpb25zKS4gUmV2aWV3IG5ldyBkZXBlbmRlbmNpZXMgZm9yIHN1cHBseSBjaGFpbiByaXNrLmAsCiAgICAgICAgICAgICAgICBmaWxlOiBmLmZpbGVuYW1lLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmluZGluZ3M7Cn0KZnVuY3Rpb24gYW5hbHl6ZUJyZWFraW5nQ2hhbmdlcyhmaWxlcykgewogICAgY29uc3QgZmluZGluZ3MgPSBbXTsKICAgIGNvbnN0IGRlbGV0ZWRGaWxlcyA9IGZpbGVzLmZpbHRlcigoZikgPT4gZi5zdGF0dXMgPT09ICJyZW1vdmVkIik7CiAgICBjb25zdCByZW5hbWVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoKGYpID0+IGYuc3RhdHVzID09PSAicmVuYW1lZCIpOwogICAgLy8gRXhwb3J0ZWQgc291cmNlIGZpbGVzIGJlaW5nIGRlbGV0ZWQKICAgIGNvbnN0IGRlbGV0ZWRTcmNGaWxlcyA9IGRlbGV0ZWRGaWxlcy5maWx0ZXIoKGYpID0+IC9cLih0c3xqc3x0c3h8anN4KSQvLnRlc3QoZi5maWxlbmFtZSkgJiYKICAgICAgICAhVEVTVF9QQVRURVJOUy5zb21lKChwKSA9PiBwLnRlc3QoZi5maWxlbmFtZSkpKTsKICAgIGlmIChkZWxldGVkU3JjRmlsZXMubGVuZ3RoID4gMCkgewogICAgICAgIGZpbmRpbmdzLnB1c2goewogICAgICAgICAgICBzZXZlcml0eTogIndhcm5pbmciLAogICAgICAgICAgICBjYXRlZ29yeTogImJyZWFraW5nX2NoYW5nZSIsCiAgICAgICAgICAgIG1lc3NhZ2U6IGAke2RlbGV0ZWRTcmNGaWxlcy5sZW5ndGh9IHNvdXJjZSBmaWxlKHMpIGRlbGV0ZWQ6ICR7ZGVsZXRlZFNyY0ZpbGVzLnNsaWNlKDAsIDMpLm1hcCgoZikgPT4gZi5maWxlbmFtZSkuam9pbigiLCAiKX0ke2RlbGV0ZWRTcmNGaWxlcy5sZW5ndGggPiAzID8gIi4uLiIgOiAiIn0uIFZlcmlmeSBubyBleHRlcm5hbCBjb25zdW1lcnMgZGVwZW5kIG9uIHRoZXNlLmAsCiAgICAgICAgfSk7CiAgICB9CiAgICAvLyBSZW5hbWVkIGZpbGVzIG1heSBicmVhayBpbXBvcnRzCiAgICBpZiAocmVuYW1lZEZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICBmaW5kaW5ncy5wdXNoKHsKICAgICAgICAgICAgc2V2ZXJpdHk6ICJpbmZvIiwKICAgICAgICAgICAgY2F0ZWdvcnk6ICJicmVha2luZ19jaGFuZ2UiLAogICAgICAgICAgICBtZXNzYWdlOiBgJHtyZW5hbWVkRmlsZXMubGVuZ3RofSBmaWxlKHMpIHJlbmFtZWQuIFZlcmlmeSBhbGwgaW1wb3J0IHBhdGhzIGhhdmUgYmVlbiB1cGRhdGVkLmAsCiAgICAgICAgfSk7CiAgICB9CiAgICAvLyBDaGVjayBwYXRjaGVzIGZvciByZW1vdmVkIGV4cG9ydHMKICAgIGZvciAoY29uc3QgZiBvZiBmaWxlcykgewogICAgICAgIGlmICghZi5wYXRjaCB8fCBmLnN0YXR1cyA9PT0gInJlbW92ZWQiKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAoIS9cLih0c3xqc3x0c3h8anN4KSQvLnRlc3QoZi5maWxlbmFtZSkpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNvbnN0IHJlbW92ZWRMaW5lcyA9IGYucGF0Y2guc3BsaXQoIlxuIikuZmlsdGVyKChsKSA9PiBsLnN0YXJ0c1dpdGgoIi0iKSAmJiAhbC5zdGFydHNXaXRoKCItLS0iKSk7CiAgICAgICAgY29uc3QgcmVtb3ZlZEV4cG9ydHMgPSByZW1vdmVkTGluZXMuZmlsdGVyKChsKSA9PiAvXlwtXHMqZXhwb3J0XHMvLnRlc3QobCkpOwogICAgICAgIGlmIChyZW1vdmVkRXhwb3J0cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGZpbmRpbmdzLnB1c2goewogICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICJ3YXJuaW5nIiwKICAgICAgICAgICAgICAgIGNhdGVnb3J5OiAiYnJlYWtpbmdfY2hhbmdlIiwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3JlbW92ZWRFeHBvcnRzLmxlbmd0aH0gZXhwb3J0KHMpIHJlbW92ZWQgaW4gJHtmLmZpbGVuYW1lfS4gVGhpcyBtYXkgYnJlYWsgZG93bnN0cmVhbSBjb25zdW1lcnMuYCwKICAgICAgICAgICAgICAgIGZpbGU6IGYuZmlsZW5hbWUsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmaW5kaW5nczsKfQpmdW5jdGlvbiBhbmFseXplUmV2aWV3U3RhbGVuZXNzKHByKSB7CiAgICBjb25zdCBmaW5kaW5ncyA9IFtdOwogICAgY29uc3QgY3JlYXRlZE1zID0gbmV3IERhdGUocHIuY3JlYXRlZF9hdCkuZ2V0VGltZSgpOwogICAgY29uc3Qgbm93TXMgPSBEYXRlLm5vdygpOwogICAgY29uc3QgYWdlRGF5cyA9IChub3dNcyAtIGNyZWF0ZWRNcykgLyAoMjQgKiA2MCAqIDYwICogMTAwMCk7CiAgICBpZiAoYWdlRGF5cyA+IDE0KSB7CiAgICAgICAgZmluZGluZ3MucHVzaCh7CiAgICAgICAgICAgIHNldmVyaXR5OiAid2FybmluZyIsCiAgICAgICAgICAgIGNhdGVnb3J5OiAiY29udmVudGlvbiIsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBQUiBoYXMgYmVlbiBvcGVuIGZvciAke01hdGgucm91bmQoYWdlRGF5cyl9IGRheXMuIENvbnNpZGVyIG1lcmdpbmcsIGNsb3NpbmcsIG9yIHJlYmFzaW5nLmAsCiAgICAgICAgfSk7CiAgICB9CiAgICBlbHNlIGlmIChhZ2VEYXlzID4gNykgewogICAgICAgIGZpbmRpbmdzLnB1c2goewogICAgICAgICAgICBzZXZlcml0eTogImluZm8iLAogICAgICAgICAgICBjYXRlZ29yeTogImNvbnZlbnRpb24iLAogICAgICAgICAgICBtZXNzYWdlOiBgUFIgaGFzIGJlZW4gb3BlbiBmb3IgJHtNYXRoLnJvdW5kKGFnZURheXMpfSBkYXlzLiBBIHByb21wdCByZXZpZXcga2VlcHMgbW9tZW50dW0uYCwKICAgICAgICB9KTsKICAgIH0KICAgIHJldHVybiBmaW5kaW5nczsKfQpmdW5jdGlvbiBhbmFseXplQ29udmVudGlvbnMocHIsIGZpbGVzKSB7CiAgICBjb25zdCBmaW5kaW5ncyA9IFtdOwogICAgLy8gQ2hlY2sgUFIgdGl0bGUKICAgIGlmIChwci50aXRsZS5sZW5ndGggPCAxMCkgewogICAgICAgIGZpbmRpbmdzLnB1c2goewogICAgICAgICAgICBzZXZlcml0eTogImluZm8iLAogICAgICAgICAgICBjYXRlZ29yeTogImNvbnZlbnRpb24iLAogICAgICAgICAgICBtZXNzYWdlOiAiUFIgdGl0bGUgaXMgdmVyeSBzaG9ydC4gQSBkZXNjcmlwdGl2ZSB0aXRsZSBoZWxwcyByZXZpZXdlcnMgYW5kIHNob3dzIGluIGdpdCBoaXN0b3J5LiIsCiAgICAgICAgfSk7CiAgICB9CiAgICAvLyBDaGVjayBmb3IgV0lQIC8gZHJhZnQgc2lnbmFscwogICAgaWYgKC9cYndpcFxiL2kudGVzdChwci50aXRsZSkgJiYgIXByLmRyYWZ0KSB7CiAgICAgICAgZmluZGluZ3MucHVzaCh7CiAgICAgICAgICAgIHNldmVyaXR5OiAiaW5mbyIsCiAgICAgICAgICAgIGNhdGVnb3J5OiAiY29udmVudGlvbiIsCiAgICAgICAgICAgIG1lc3NhZ2U6ICJQUiB0aXRsZSBjb250YWlucyAnV0lQJyBidXQgaXMgbm90IG1hcmtlZCBhcyBkcmFmdC4iLAogICAgICAgIH0pOwogICAgfQogICAgLy8gQ2hlY2sgZm9yIGVtcHR5IGJvZHkKICAgIGlmICghcHIuYm9keSB8fCBwci5ib2R5LnRyaW0oKS5sZW5ndGggPCAyMCkgewogICAgICAgIGZpbmRpbmdzLnB1c2goewogICAgICAgICAgICBzZXZlcml0eTogImluZm8iLAogICAgICAgICAgICBjYXRlZ29yeTogImRvY3VtZW50YXRpb24iLAogICAgICAgICAgICBtZXNzYWdlOiAiUFIgZGVzY3JpcHRpb24gaXMgZW1wdHkgb3IgdmVyeSBzaG9ydC4gQ29uc2lkZXIgZXhwbGFpbmluZyB0aGUgd2hhdCBhbmQgd2h5IG9mIHRoaXMgY2hhbmdlLiIsCiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gZmluZGluZ3M7Cn0KZnVuY3Rpb24gZGV0ZXJtaW5lUmVjb21tZW5kYXRpb24oZmluZGluZ3MpIHsKICAgIGNvbnN0IGhhc0Vycm9ycyA9IGZpbmRpbmdzLnNvbWUoKGYpID0+IGYuc2V2ZXJpdHkgPT09ICJlcnJvciIpOwogICAgaWYgKGhhc0Vycm9ycykKICAgICAgICByZXR1cm4gInJlcXVlc3RfY2hhbmdlcyI7CiAgICBjb25zdCB3YXJuaW5nQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGYpID0+IGYuc2V2ZXJpdHkgPT09ICJ3YXJuaW5nIikubGVuZ3RoOwogICAgaWYgKHdhcm5pbmdDb3VudCA+PSAzKQogICAgICAgIHJldHVybiAicmVxdWVzdF9jaGFuZ2VzIjsKICAgIGlmICh3YXJuaW5nQ291bnQgPiAwKQogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICByZXR1cm4gImFwcHJvdmUiOwp9Ci8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogQW5hbHl6ZSBhIHB1bGwgcmVxdWVzdCBhbmQgcHJvZHVjZSBhIHJldmlldyB3aXRoIGZpbmRpbmdzIGFuZCBtZXRyaWNzLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldmlld1BSKG93bmVyLCByZXBvLCBwck51bWJlcikgewogICAgbG9nLmluZm8oYFJldmlld2luZyBQUiAke293bmVyfS8ke3JlcG99IyR7cHJOdW1iZXJ9YCk7CiAgICBjb25zdCBbcHIsIGZpbGVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICBjbGllbnQuZ2V0UHVsbFJlcXVlc3Qob3duZXIsIHJlcG8sIHByTnVtYmVyKSwKICAgICAgICBjbGllbnQuZ2V0UFJGaWxlcyhvd25lciwgcmVwbywgcHJOdW1iZXIpLAogICAgXSk7CiAgICBpZiAoIXByIHx8ICFmaWxlcykgewogICAgICAgIGxvZy53YXJuKGBGYWlsZWQgdG8gZmV0Y2ggUFIgZGF0YSBmb3IgJHtvd25lcn0vJHtyZXBvfSMke3ByTnVtYmVyfWApOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgY29uc3QgbWV0cmljcyA9IGNvbXB1dGVNZXRyaWNzKHByLCBmaWxlcyk7CiAgICBjb25zdCBmaW5kaW5ncyA9IFsKICAgICAgICAuLi5hbmFseXplU2l6ZShwciksCiAgICAgICAgLi4uYW5hbHl6ZVRlc3RDb3ZlcmFnZShmaWxlcyksCiAgICAgICAgLi4uYW5hbHl6ZVNlY3VyaXR5UGF0dGVybnMoZmlsZXMpLAogICAgICAgIC4uLmFuYWx5emVEZXBlbmRlbmN5Q2hhbmdlcyhmaWxlcyksCiAgICAgICAgLi4uYW5hbHl6ZUJyZWFraW5nQ2hhbmdlcyhmaWxlcyksCiAgICAgICAgLi4uYW5hbHl6ZVJldmlld1N0YWxlbmVzcyhwciksCiAgICAgICAgLi4uYW5hbHl6ZUNvbnZlbnRpb25zKHByLCBmaWxlcyksCiAgICBdOwogICAgLy8gQmluYXJ5IGZpbGUgd2FybmluZ3MKICAgIGlmIChtZXRyaWNzLmJpbmFyeUZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICBmaW5kaW5ncy5wdXNoKHsKICAgICAgICAgICAgc2V2ZXJpdHk6ICJpbmZvIiwKICAgICAgICAgICAgY2F0ZWdvcnk6ICJzaXplIiwKICAgICAgICAgICAgbWVzc2FnZTogYCR7bWV0cmljcy5iaW5hcnlGaWxlcy5sZW5ndGh9IGJpbmFyeSBmaWxlKHMpIGluY2x1ZGVkOiAke21ldHJpY3MuYmluYXJ5RmlsZXMuc2xpY2UoMCwgMykuam9pbigiLCAiKX0ke21ldHJpY3MuYmluYXJ5RmlsZXMubGVuZ3RoID4gMyA/ICIuLi4iIDogIiJ9YCwKICAgICAgICB9KTsKICAgIH0KICAgIGNvbnN0IHJlY29tbWVuZGF0aW9uID0gZGV0ZXJtaW5lUmVjb21tZW5kYXRpb24oZmluZGluZ3MpOwogICAgY29uc3Qgc3VtbWFyeSA9IGJ1aWxkU3VtbWFyeShwciwgbWV0cmljcywgZmluZGluZ3MsIHJlY29tbWVuZGF0aW9uKTsKICAgIGNvbnN0IHJlc3VsdCA9IHsKICAgICAgICBwck51bWJlciwKICAgICAgICByZXBvOiBgJHtvd25lcn0vJHtyZXBvfWAsCiAgICAgICAgc3VtbWFyeSwKICAgICAgICBmaW5kaW5ncywKICAgICAgICBtZXRyaWNzLAogICAgICAgIHJlY29tbWVuZGF0aW9uLAogICAgICAgIHJldmlld2VkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgIH07CiAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgc291cmNlOiAiYm9hcmQiLAogICAgICAgIHN1bW1hcnk6IGBQUiByZXZpZXc6ICR7b3duZXJ9LyR7cmVwb30jJHtwck51bWJlcn0g4oCUICR7cmVjb21tZW5kYXRpb259ICgke2ZpbmRpbmdzLmxlbmd0aH0gZmluZGluZ3MpYCwKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKfQovKioKICogUmV2aWV3IGEgUFIgYW5kIHBvc3QgdGhlIHJldmlldyBhcyBhIEdpdEh1YiBjb21tZW50LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldmlld0FuZENvbW1lbnQob3duZXIsIHJlcG8sIHByTnVtYmVyKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXZpZXdQUihvd25lciwgcmVwbywgcHJOdW1iZXIpOwogICAgaWYgKCFyZXN1bHQpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAvLyBQb3N0IGFzIFBSIGNvbW1lbnQgKG5vdCBhIGZvcm1hbCByZXZpZXcsIHRvIGF2b2lkIGJsb2NraW5nKQogICAgYXdhaXQgY2xpZW50LmFkZElzc3VlQ29tbWVudChvd25lciwgcmVwbywgcHJOdW1iZXIsIHJlc3VsdC5zdW1tYXJ5KTsKICAgIHJldHVybiByZXN1bHQ7Cn0KLy8g4pSA4pSAIFN1bW1hcnkgZm9ybWF0dGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gYnVpbGRTdW1tYXJ5KHByLCBtZXRyaWNzLCBmaW5kaW5ncywgcmVjb21tZW5kYXRpb24pIHsKICAgIGNvbnN0IGxpbmVzID0gW107CiAgICBsaW5lcy5wdXNoKGAjIyBBdXRvbWF0ZWQgUFIgUmV2aWV3YCk7CiAgICBsaW5lcy5wdXNoKCIiKTsKICAgIGxpbmVzLnB1c2goYCoqJHtwci50aXRsZX0qKiAoIyR7cHIubnVtYmVyfSlgKTsKICAgIGxpbmVzLnB1c2goIiIpOwogICAgbGluZXMucHVzaChgfCBNZXRyaWMgfCBWYWx1ZSB8YCk7CiAgICBsaW5lcy5wdXNoKGB8LS0tLS0tLS18LS0tLS0tLXxgKTsKICAgIGxpbmVzLnB1c2goYHwgRmlsZXMgY2hhbmdlZCB8ICR7bWV0cmljcy5maWxlc0NoYW5nZWR9IHxgKTsKICAgIGxpbmVzLnB1c2goYHwgQWRkaXRpb25zIHwgKyR7bWV0cmljcy5hZGRpdGlvbnN9IHxgKTsKICAgIGxpbmVzLnB1c2goYHwgRGVsZXRpb25zIHwgLSR7bWV0cmljcy5kZWxldGlvbnN9IHxgKTsKICAgIGxpbmVzLnB1c2goYHwgVGVzdHMgaW5jbHVkZWQgfCAke21ldHJpY3MuaGFzVGVzdHMgPyAiWWVzIiA6ICJObyJ9IHxgKTsKICAgIGxpbmVzLnB1c2goYHwgRG9jcyB1cGRhdGVkIHwgJHttZXRyaWNzLmhhc0RvY0NoYW5nZXMgPyAiWWVzIiA6ICJObyJ9IHxgKTsKICAgIGxpbmVzLnB1c2goIiIpOwogICAgaWYgKGZpbmRpbmdzLmxlbmd0aCA+IDApIHsKICAgICAgICBsaW5lcy5wdXNoKGAjIyMgRmluZGluZ3MgKCR7ZmluZGluZ3MubGVuZ3RofSlgKTsKICAgICAgICBsaW5lcy5wdXNoKCIiKTsKICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZmluZGluZ3MpIHsKICAgICAgICAgICAgY29uc3QgaWNvbiA9IGYuc2V2ZXJpdHkgPT09ICJlcnJvciIgPyAi8J+UtCIgOiBmLnNldmVyaXR5ID09PSAid2FybmluZyIgPyAi8J+foSIgOiAi8J+UtSI7CiAgICAgICAgICAgIGNvbnN0IGxvYyA9IGYuZmlsZSA/IGAgKCR7Zi5maWxlfSR7Zi5saW5lID8gYDoke2YubGluZX1gIDogIiJ9KWAgOiAiIjsKICAgICAgICAgICAgbGluZXMucHVzaChgLSAke2ljb259ICoqJHtmLmNhdGVnb3J5fSoqJHtsb2N9OiAke2YubWVzc2FnZX1gKTsKICAgICAgICB9CiAgICAgICAgbGluZXMucHVzaCgiIik7CiAgICB9CiAgICBsaW5lcy5wdXNoKGAqKlJlY29tbWVuZGF0aW9uOioqICR7cmVjb21tZW5kYXRpb24ucmVwbGFjZSgiXyIsICIgIil9YCk7CiAgICByZXR1cm4gbGluZXMuam9pbigiXG4iKTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1wci1yZXZpZXcuanMubWFw","github/release-notes.js":"LyoqCiAqIFJlbGVhc2Ugbm90ZXMgZ2VuZXJhdG9yIOKAlCBwcm9kdWNlcyBzdHJ1Y3R1cmVkIHJlbGVhc2Ugbm90ZXMgZnJvbSBjb21taXRzLgogKgogKiBHcm91cHMgY29tbWl0cyBieSB0eXBlIChmZWF0dXJlcywgZml4ZXMsIGV0Yy4pIHVzaW5nIGNvbnZlbnRpb25hbCBjb21taXQKICogcGFyc2luZy4gRGV0ZWN0cyBicmVha2luZyBjaGFuZ2VzIGFuZCBsaXN0cyBjb250cmlidXRvcnMuCiAqIE91dHB1dHMgc3RydWN0dXJlZCBkYXRhICsgZm9ybWF0dGVkIG1hcmtkb3duLgogKi8KaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgKiBhcyBjbGllbnQgZnJvbSAiLi9jbGllbnQuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImdpdGh1Yi5yZWxlYXNlLW5vdGVzIik7Ci8vIOKUgOKUgCBDb252ZW50aW9uYWwgY29tbWl0IHBhcnNpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNvbnN0IENPTlZFTlRJT05BTF9SRSA9IC9eKGZlYXR8Zml4fGRvY3N8c3R5bGV8cmVmYWN0b3J8cGVyZnx0ZXN0fGJ1aWxkfGNpfGNob3JlfHJldmVydCkoPzpcKCguKz8pXCkpPyghKT86XHMoLispLzsKZnVuY3Rpb24gcGFyc2VDb21taXRNZXNzYWdlKHNoYSwgbWVzc2FnZSwgYXV0aG9yKSB7CiAgICBjb25zdCBmaXJzdExpbmUgPSBtZXNzYWdlLnNwbGl0KCJcbiIpWzBdLnRyaW0oKTsKICAgIGNvbnN0IG1hdGNoID0gZmlyc3RMaW5lLm1hdGNoKENPTlZFTlRJT05BTF9SRSk7CiAgICBpZiAobWF0Y2gpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiBtYXRjaFsxXSwKICAgICAgICAgICAgc2NvcGU6IG1hdGNoWzJdIHx8IHVuZGVmaW5lZCwKICAgICAgICAgICAgYnJlYWtpbmc6IG1hdGNoWzNdID09PSAiISIgfHwgL0JSRUFLSU5HLkNIQU5HRS9pLnRlc3QobWVzc2FnZSksCiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBtYXRjaFs0XSwKICAgICAgICAgICAgc2hhLAogICAgICAgICAgICBhdXRob3IsCiAgICAgICAgICAgIHJhdzogZmlyc3RMaW5lLAogICAgICAgIH07CiAgICB9CiAgICAvLyBOb24tY29udmVudGlvbmFsOiB0cnkgdG8gY2F0ZWdvcml6ZSBieSBrZXl3b3JkcwogICAgY29uc3QgbG93ZXIgPSBmaXJzdExpbmUudG9Mb3dlckNhc2UoKTsKICAgIGxldCB0eXBlID0gIm90aGVyIjsKICAgIGlmICgvXm1lcmdlXHMvaS50ZXN0KGxvd2VyKSkKICAgICAgICB0eXBlID0gIm1lcmdlIjsKICAgIGVsc2UgaWYgKC9cYihmaXh8YnVnfHBhdGNofGhvdGZpeClcYi8udGVzdChsb3dlcikpCiAgICAgICAgdHlwZSA9ICJmaXgiOwogICAgZWxzZSBpZiAoL1xiKGFkZHxmZWF0fGZlYXR1cmV8aW1wbGVtZW50fG5ldylcYi8udGVzdChsb3dlcikpCiAgICAgICAgdHlwZSA9ICJmZWF0IjsKICAgIGVsc2UgaWYgKC9cYihkb2N8cmVhZG1lKVxiLy50ZXN0KGxvd2VyKSkKICAgICAgICB0eXBlID0gImRvY3MiOwogICAgZWxzZSBpZiAoL1xiKHJlZmFjdG9yfHJlc3RydWN0dXJlfGNsZWFudXApXGIvLnRlc3QobG93ZXIpKQogICAgICAgIHR5cGUgPSAicmVmYWN0b3IiOwogICAgZWxzZSBpZiAoL1xiKHRlc3R8c3BlYylcYi8udGVzdChsb3dlcikpCiAgICAgICAgdHlwZSA9ICJ0ZXN0IjsKICAgIGVsc2UgaWYgKC9cYihjaXxwaXBlbGluZXx3b3JrZmxvdylcYi8udGVzdChsb3dlcikpCiAgICAgICAgdHlwZSA9ICJjaSI7CiAgICBlbHNlIGlmICgvXGIocGVyZnxvcHRpbWl6ZXxzcGVlZClcYi8udGVzdChsb3dlcikpCiAgICAgICAgdHlwZSA9ICJwZXJmIjsKICAgIHJldHVybiB7CiAgICAgICAgdHlwZSwKICAgICAgICBicmVha2luZzogL0JSRUFLSU5HLkNIQU5HRS9pLnRlc3QobWVzc2FnZSksCiAgICAgICAgZGVzY3JpcHRpb246IGZpcnN0TGluZSwKICAgICAgICBzaGEsCiAgICAgICAgYXV0aG9yLAogICAgICAgIHJhdzogZmlyc3RMaW5lLAogICAgfTsKfQpjb25zdCBTRUNUSU9OX09SREVSID0gWwogICAgeyB0aXRsZTogIkJyZWFraW5nIENoYW5nZXMiLCBpY29uOiAi8J+SpSIsIHR5cGVzOiBbXSB9LCAvLyBTcGVjaWFsOiBwb3B1bGF0ZWQgZnJvbSBicmVha2luZyBmbGFnCiAgICB7IHRpdGxlOiAiRmVhdHVyZXMiLCBpY29uOiAi4pyoIiwgdHlwZXM6IFsiZmVhdCJdIH0sCiAgICB7IHRpdGxlOiAiQnVnIEZpeGVzIiwgaWNvbjogIvCfkJsiLCB0eXBlczogWyJmaXgiXSB9LAogICAgeyB0aXRsZTogIlBlcmZvcm1hbmNlIiwgaWNvbjogIuKaoSIsIHR5cGVzOiBbInBlcmYiXSB9LAogICAgeyB0aXRsZTogIkRvY3VtZW50YXRpb24iLCBpY29uOiAi8J+TnSIsIHR5cGVzOiBbImRvY3MiXSB9LAogICAgeyB0aXRsZTogIlJlZmFjdG9yaW5nIiwgaWNvbjogIuKZu++4jyIsIHR5cGVzOiBbInJlZmFjdG9yIl0gfSwKICAgIHsgdGl0bGU6ICJUZXN0cyIsIGljb246ICLwn6eqIiwgdHlwZXM6IFsidGVzdCJdIH0sCiAgICB7IHRpdGxlOiAiQ0kvQ0QiLCBpY29uOiAi8J+UpyIsIHR5cGVzOiBbImNpIiwgImJ1aWxkIl0gfSwKICAgIHsgdGl0bGU6ICJDaG9yZXMiLCBpY29uOiAi8J+nuSIsIHR5cGVzOiBbImNob3JlIl0gfSwKICAgIHsgdGl0bGU6ICJPdGhlciIsIGljb246ICLwn5OmIiwgdHlwZXM6IFsib3RoZXIiLCAicmV2ZXJ0IiwgInN0eWxlIl0gfSwKXTsKLy8g4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBHZW5lcmF0ZSByZWxlYXNlIG5vdGVzIGZyb20gY29tbWl0cyBiZXR3ZWVuIHR3byByZWZzICh0YWdzLCBTSEFzLCBvciBicmFuY2hlcykuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlTm90ZXMob3duZXIsIHJlcG8sIG9wdHMpIHsKICAgIGNvbnN0IHRvID0gb3B0cy50byA/PyAiSEVBRCI7CiAgICBsb2cuaW5mbyhgR2VuZXJhdGluZyByZWxlYXNlIG5vdGVzIGZvciAke293bmVyfS8ke3JlcG99OiAke29wdHMuZnJvbX0uLiR7dG99YCk7CiAgICBjb25zdCBjb21wYXJpc29uID0gYXdhaXQgY2xpZW50LmNvbXBhcmVCcmFuY2hlcyhvd25lciwgcmVwbywgb3B0cy5mcm9tLCB0byk7CiAgICBpZiAoIWNvbXBhcmlzb24pIHsKICAgICAgICBsb2cud2FybihgRmFpbGVkIHRvIGNvbXBhcmUgJHtvcHRzLmZyb219Li4ke3RvfWApOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGNvbXBhcmlzb24uY29tbWl0cy5sZW5ndGggPT09IDApIHsKICAgICAgICBsb2cuaW5mbygiTm8gY29tbWl0cyBmb3VuZCBiZXR3ZWVuIHRoZSB0d28gcmVmcy4iKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZXBvOiBgJHtvd25lcn0vJHtyZXBvfWAsCiAgICAgICAgICAgIHZlcnNpb246IG9wdHMudmVyc2lvbiA/PyB0bywKICAgICAgICAgICAgZnJvbTogb3B0cy5mcm9tLAogICAgICAgICAgICB0bywKICAgICAgICAgICAgZ2VuZXJhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgc2VjdGlvbnM6IFtdLAogICAgICAgICAgICBicmVha2luZ0NoYW5nZXM6IFtdLAogICAgICAgICAgICBjb250cmlidXRvcnM6IFtdLAogICAgICAgICAgICBtYXJrZG93bjogYCMjICR7b3B0cy52ZXJzaW9uID8/IHRvfVxuXG5ObyBjaGFuZ2VzLmAsCiAgICAgICAgfTsKICAgIH0KICAgIC8vIFBhcnNlIGFsbCBjb21taXRzCiAgICBjb25zdCBwYXJzZWQgPSBjb21wYXJpc29uLmNvbW1pdHMKICAgICAgICAuZmlsdGVyKChjKSA9PiAhYy5jb21taXQubWVzc2FnZS5zdGFydHNXaXRoKCJNZXJnZSAiKSkgLy8gU2tpcCBtZXJnZSBjb21taXRzCiAgICAgICAgLm1hcCgoYykgPT4gcGFyc2VDb21taXRNZXNzYWdlKGMuc2hhLCBjLmNvbW1pdC5tZXNzYWdlLCBjLmNvbW1pdC5hdXRob3I/Lm5hbWUgPz8gIlVua25vd24iKSk7CiAgICAvLyBDb2xsZWN0IGJyZWFraW5nIGNoYW5nZXMKICAgIGNvbnN0IGJyZWFraW5nQ2hhbmdlcyA9IHBhcnNlZAogICAgICAgIC5maWx0ZXIoKGMpID0+IGMuYnJlYWtpbmcpCiAgICAgICAgLm1hcCgoYykgPT4gYy5zY29wZSA/IGAqKiR7Yy5zY29wZX06KiogJHtjLmRlc2NyaXB0aW9ufWAgOiBjLmRlc2NyaXB0aW9uKTsKICAgIC8vIENvbGxlY3QgdW5pcXVlIGNvbnRyaWJ1dG9ycwogICAgY29uc3QgY29udHJpYnV0b3JzID0gWy4uLm5ldyBTZXQocGFyc2VkLm1hcCgoYykgPT4gYy5hdXRob3IpKV0uc29ydCgpOwogICAgLy8gQnVpbGQgc2VjdGlvbnMKICAgIGNvbnN0IHNlY3Rpb25zID0gW107CiAgICBmb3IgKGNvbnN0IGRlZiBvZiBTRUNUSU9OX09SREVSKSB7CiAgICAgICAgLy8gU2tpcCB0aGUgIkJyZWFraW5nIENoYW5nZXMiIHNlY3Rpb24gKGhhbmRsZWQgc2VwYXJhdGVseSBpbiBtYXJrZG93bikKICAgICAgICBpZiAoZGVmLnR5cGVzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgY29uc3QgZW50cmllcyA9IHBhcnNlZAogICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBkZWYudHlwZXMuaW5jbHVkZXMoYy50eXBlKSkKICAgICAgICAgICAgLm1hcCgoYykgPT4gKHsKICAgICAgICAgICAgc2hhOiBjLnNoYS5zbGljZSgwLCA3KSwKICAgICAgICAgICAgbWVzc2FnZTogYy5kZXNjcmlwdGlvbiwKICAgICAgICAgICAgYXV0aG9yOiBjLmF1dGhvciwKICAgICAgICAgICAgc2NvcGU6IGMuc2NvcGUsCiAgICAgICAgfSkpOwogICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgc2VjdGlvbnMucHVzaCh7IHRpdGxlOiBkZWYudGl0bGUsIGljb246IGRlZi5pY29uLCBjb21taXRzOiBlbnRyaWVzIH0pOwogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IHZlcnNpb24gPSBvcHRzLnZlcnNpb24gPz8gdG87CiAgICBjb25zdCBtYXJrZG93biA9IGZvcm1hdFJlbGVhc2VOb3Rlcyh2ZXJzaW9uLCBzZWN0aW9ucywgYnJlYWtpbmdDaGFuZ2VzLCBjb250cmlidXRvcnMpOwogICAgY29uc3QgcmVzdWx0ID0gewogICAgICAgIHJlcG86IGAke293bmVyfS8ke3JlcG99YCwKICAgICAgICB2ZXJzaW9uLAogICAgICAgIGZyb206IG9wdHMuZnJvbSwKICAgICAgICB0bywKICAgICAgICBnZW5lcmF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgIHNlY3Rpb25zLAogICAgICAgIGJyZWFraW5nQ2hhbmdlcywKICAgICAgICBjb250cmlidXRvcnMsCiAgICAgICAgbWFya2Rvd24sCiAgICB9OwogICAgbG9nQWN0aXZpdHkoewogICAgICAgIHNvdXJjZTogImJvYXJkIiwKICAgICAgICBzdW1tYXJ5OiBgUmVsZWFzZSBub3RlczogJHtvd25lcn0vJHtyZXBvfSAke3ZlcnNpb259IOKAlCAke3BhcnNlZC5sZW5ndGh9IGNvbW1pdHMsICR7Y29udHJpYnV0b3JzLmxlbmd0aH0gY29udHJpYnV0b3JzYCwKICAgIH0pOwogICAgcmV0dXJuIHJlc3VsdDsKfQovKioKICogR2VuZXJhdGUgcmVsZWFzZSBub3RlcyBmcm9tIHRoZSBsYXRlc3QgdGFnIHRvIEhFQUQuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlTm90ZXNGcm9tTGF0ZXN0VGFnKG93bmVyLCByZXBvLCBvcHRzKSB7CiAgICBjb25zdCB0YWdzID0gYXdhaXQgY2xpZW50Lmxpc3RUYWdzKG93bmVyLCByZXBvLCB7IHBlcl9wYWdlOiAxIH0pOwogICAgaWYgKCF0YWdzIHx8IHRhZ3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgbG9nLndhcm4oYE5vIHRhZ3MgZm91bmQgZm9yICR7b3duZXJ9LyR7cmVwb31gKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBnZW5lcmF0ZVJlbGVhc2VOb3Rlcyhvd25lciwgcmVwbywgewogICAgICAgIGZyb206IHRhZ3NbMF0ubmFtZSwKICAgICAgICB0bzogIkhFQUQiLAogICAgICAgIHZlcnNpb246IG9wdHM/LnZlcnNpb24sCiAgICB9KTsKfQovLyDilIDilIAgRm9ybWF0dGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gZm9ybWF0UmVsZWFzZU5vdGVzKHZlcnNpb24sIHNlY3Rpb25zLCBicmVha2luZ0NoYW5nZXMsIGNvbnRyaWJ1dG9ycykgewogICAgY29uc3QgbGluZXMgPSBbXTsKICAgIGxpbmVzLnB1c2goYCMjICR7dmVyc2lvbn1gKTsKICAgIGxpbmVzLnB1c2goIiIpOwogICAgaWYgKGJyZWFraW5nQ2hhbmdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgbGluZXMucHVzaCgiIyMjIPCfkqUgQnJlYWtpbmcgQ2hhbmdlcyIpOwogICAgICAgIGxpbmVzLnB1c2goIiIpOwogICAgICAgIGZvciAoY29uc3QgYmMgb2YgYnJlYWtpbmdDaGFuZ2VzKSB7CiAgICAgICAgICAgIGxpbmVzLnB1c2goYC0gJHtiY31gKTsKICAgICAgICB9CiAgICAgICAgbGluZXMucHVzaCgiIik7CiAgICB9CiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHsKICAgICAgICBsaW5lcy5wdXNoKGAjIyMgJHtzZWN0aW9uLmljb259ICR7c2VjdGlvbi50aXRsZX1gKTsKICAgICAgICBsaW5lcy5wdXNoKCIiKTsKICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNlY3Rpb24uY29tbWl0cykgewogICAgICAgICAgICBjb25zdCBzY29wZSA9IGVudHJ5LnNjb3BlID8gYCoqJHtlbnRyeS5zY29wZX06KiogYCA6ICIiOwogICAgICAgICAgICBsaW5lcy5wdXNoKGAtICR7c2NvcGV9JHtlbnRyeS5tZXNzYWdlfSAoJHtlbnRyeS5zaGF9KWApOwogICAgICAgIH0KICAgICAgICBsaW5lcy5wdXNoKCIiKTsKICAgIH0KICAgIGlmIChjb250cmlidXRvcnMubGVuZ3RoID4gMCkgewogICAgICAgIGxpbmVzLnB1c2goIiMjIyBDb250cmlidXRvcnMiKTsKICAgICAgICBsaW5lcy5wdXNoKCIiKTsKICAgICAgICBsaW5lcy5wdXNoKGNvbnRyaWJ1dG9ycy5tYXAoKGMpID0+IGBAJHtjfWApLmpvaW4oIiwgIikpOwogICAgICAgIGxpbmVzLnB1c2goIiIpOwogICAgfQogICAgcmV0dXJuIGxpbmVzLmpvaW4oIlxuIikudHJpbUVuZCgpOwp9Ci8qKgogKiBHZW5lcmF0ZSByZWxlYXNlIG5vdGVzIHB1cmVseSBmcm9tIGNvbW1pdCBkYXRhIChubyBBUEkgY2FsbHMpLgogKiBVc2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiBjb21taXQgZGF0YSBpcyBhbHJlYWR5IGF2YWlsYWJsZS4KICovCmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VOb3Rlc0Zyb21Db21taXRzKHJlcG8sIHZlcnNpb24sIGNvbW1pdHMpIHsKICAgIGNvbnN0IHBhcnNlZCA9IGNvbW1pdHMKICAgICAgICAuZmlsdGVyKChjKSA9PiAhYy5tZXNzYWdlLnN0YXJ0c1dpdGgoIk1lcmdlICIpKQogICAgICAgIC5tYXAoKGMpID0+IHBhcnNlQ29tbWl0TWVzc2FnZShjLnNoYSwgYy5tZXNzYWdlLCBjLmF1dGhvcikpOwogICAgY29uc3QgYnJlYWtpbmdDaGFuZ2VzID0gcGFyc2VkCiAgICAgICAgLmZpbHRlcigoYykgPT4gYy5icmVha2luZykKICAgICAgICAubWFwKChjKSA9PiBjLnNjb3BlID8gYCoqJHtjLnNjb3BlfToqKiAke2MuZGVzY3JpcHRpb259YCA6IGMuZGVzY3JpcHRpb24pOwogICAgY29uc3QgY29udHJpYnV0b3JzID0gWy4uLm5ldyBTZXQocGFyc2VkLm1hcCgoYykgPT4gYy5hdXRob3IpKV0uc29ydCgpOwogICAgY29uc3Qgc2VjdGlvbnMgPSBbXTsKICAgIGZvciAoY29uc3QgZGVmIG9mIFNFQ1RJT05fT1JERVIpIHsKICAgICAgICBpZiAoZGVmLnR5cGVzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgY29uc3QgZW50cmllcyA9IHBhcnNlZAogICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBkZWYudHlwZXMuaW5jbHVkZXMoYy50eXBlKSkKICAgICAgICAgICAgLm1hcCgoYykgPT4gKHsKICAgICAgICAgICAgc2hhOiBjLnNoYS5zbGljZSgwLCA3KSwKICAgICAgICAgICAgbWVzc2FnZTogYy5kZXNjcmlwdGlvbiwKICAgICAgICAgICAgYXV0aG9yOiBjLmF1dGhvciwKICAgICAgICAgICAgc2NvcGU6IGMuc2NvcGUsCiAgICAgICAgfSkpOwogICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgc2VjdGlvbnMucHVzaCh7IHRpdGxlOiBkZWYudGl0bGUsIGljb246IGRlZi5pY29uLCBjb21taXRzOiBlbnRyaWVzIH0pOwogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IG1hcmtkb3duID0gZm9ybWF0UmVsZWFzZU5vdGVzKHZlcnNpb24sIHNlY3Rpb25zLCBicmVha2luZ0NoYW5nZXMsIGNvbnRyaWJ1dG9ycyk7CiAgICByZXR1cm4gewogICAgICAgIHJlcG8sCiAgICAgICAgdmVyc2lvbiwKICAgICAgICBmcm9tOiAiIiwKICAgICAgICB0bzogIiIsCiAgICAgICAgZ2VuZXJhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICBzZWN0aW9ucywKICAgICAgICBicmVha2luZ0NoYW5nZXMsCiAgICAgICAgY29udHJpYnV0b3JzLAogICAgICAgIG1hcmtkb3duLAogICAgfTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1yZWxlYXNlLW5vdGVzLmpzLm1hcA==","github/repo-health.js":"LyoqCiAqIFJlcG9zaXRvcnkgaGVhbHRoIG1vbml0b3Jpbmcg4oCUIHRyYWNrIG1ldHJpY3MgYW5kIHRyZW5kcyBmb3IgYSBHaXRIdWIgcmVwby4KICoKICogTWV0cmljczogY29tbWl0IGZyZXF1ZW5jeSwgaXNzdWUgcmVzb2x1dGlvbiB0aW1lLCBQUiByZXZpZXcgdGltZSwKICogb3Blbi9zdGFsZSBjb3VudHMsIGFjdGl2ZSBjb250cmlidXRvcnMuCiAqLwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCAqIGFzIGNsaWVudCBmcm9tICIuL2NsaWVudC5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiZ2l0aHViLnJlcG8taGVhbHRoIik7CmNvbnN0IFNUQUxFX0RBWVMgPSAzMDsKY29uc3QgTVNfUEVSX0RBWSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7Ci8vIOKUgOKUgCBNZXRyaWMgY29tcHV0YXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIGRheXNCZXR3ZWVuKGEsIGIpIHsKICAgIHJldHVybiBNYXRoLmFicyhuZXcgRGF0ZShiKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShhKS5nZXRUaW1lKCkpIC8gTVNfUEVSX0RBWTsKfQpmdW5jdGlvbiBpc1N0YWxlKHVwZGF0ZWRBdCkgewogICAgcmV0dXJuIGRheXNCZXR3ZWVuKHVwZGF0ZWRBdCwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpKSA+IFNUQUxFX0RBWVM7Cn0KZnVuY3Rpb24gY29tcHV0ZUF2Z1Jlc29sdXRpb25EYXlzKGlzc3VlcykgewogICAgY29uc3QgY2xvc2VkID0gaXNzdWVzLmZpbHRlcigoaSkgPT4gaS5zdGF0ZSA9PT0gImNsb3NlZCIgJiYgaS5jbG9zZWRfYXQpOwogICAgaWYgKGNsb3NlZC5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICBjb25zdCB0b3RhbCA9IGNsb3NlZC5yZWR1Y2UoKHN1bSwgaSkgPT4gc3VtICsgZGF5c0JldHdlZW4oaS5jcmVhdGVkX2F0LCBpLmNsb3NlZF9hdCksIDApOwogICAgcmV0dXJuIE1hdGgucm91bmQoKHRvdGFsIC8gY2xvc2VkLmxlbmd0aCkgKiAxMCkgLyAxMDsKfQpmdW5jdGlvbiBjb21wdXRlQXZnUFJSZXZpZXdEYXlzKHBycykgewogICAgY29uc3QgbWVyZ2VkID0gcHJzLmZpbHRlcigocCkgPT4gcC5tZXJnZWQgJiYgcC5tZXJnZWRfYXQpOwogICAgaWYgKG1lcmdlZC5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICBjb25zdCB0b3RhbCA9IG1lcmdlZC5yZWR1Y2UoKHN1bSwgcCkgPT4gc3VtICsgZGF5c0JldHdlZW4ocC5jcmVhdGVkX2F0LCBwLm1lcmdlZF9hdCksIDApOwogICAgcmV0dXJuIE1hdGgucm91bmQoKHRvdGFsIC8gbWVyZ2VkLmxlbmd0aCkgKiAxMCkgLyAxMDsKfQpmdW5jdGlvbiBjb3VudEFjdGl2ZUNvbnRyaWJ1dG9ycyhjb21taXRzKSB7CiAgICBjb25zdCBhdXRob3JzID0gbmV3IFNldCgpOwogICAgZm9yIChjb25zdCBjIG9mIGNvbW1pdHMpIHsKICAgICAgICBpZiAoYy5jb21taXQuYXV0aG9yPy5lbWFpbCkgewogICAgICAgICAgICBhdXRob3JzLmFkZChjLmNvbW1pdC5hdXRob3IuZW1haWwpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBhdXRob3JzLnNpemU7Cn0KZnVuY3Rpb24gY29tcHV0ZUJ1c0ZhY3Rvcihjb21taXRzKSB7CiAgICBpZiAoY29tbWl0cy5sZW5ndGggPT09IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICAvLyBDb3VudCBjb21taXRzIHBlciBhdXRob3IKICAgIGNvbnN0IGF1dGhvckNvdW50cyA9IG5ldyBNYXAoKTsKICAgIGZvciAoY29uc3QgYyBvZiBjb21taXRzKSB7CiAgICAgICAgY29uc3QgZW1haWwgPSBjLmNvbW1pdC5hdXRob3I/LmVtYWlsOwogICAgICAgIGlmICghZW1haWwpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGF1dGhvckNvdW50cy5zZXQoZW1haWwsIChhdXRob3JDb3VudHMuZ2V0KGVtYWlsKSA/PyAwKSArIDEpOwogICAgfQogICAgaWYgKGF1dGhvckNvdW50cy5zaXplID09PSAwKQogICAgICAgIHJldHVybiAwOwogICAgLy8gU29ydCBieSBjb21taXQgY291bnQgZGVzY2VuZGluZwogICAgY29uc3Qgc29ydGVkID0gWy4uLmF1dGhvckNvdW50cy52YWx1ZXMoKV0uc29ydCgoYSwgYikgPT4gYiAtIGEpOwogICAgY29uc3QgdG90YWwgPSBzb3J0ZWQucmVkdWNlKChzdW0sIG4pID0+IHN1bSArIG4sIDApOwogICAgY29uc3QgdGhyZXNob2xkID0gdG90YWwgKiAwLjg7CiAgICAvLyBDb3VudCBob3cgbWFueSB0b3AgY29udHJpYnV0b3JzIGFjY291bnQgZm9yIDgwJSBvZiBjb21taXRzCiAgICBsZXQgY3VtdWxhdGl2ZSA9IDA7CiAgICBsZXQgY291bnQgPSAwOwogICAgZm9yIChjb25zdCBuIG9mIHNvcnRlZCkgewogICAgICAgIGN1bXVsYXRpdmUgKz0gbjsKICAgICAgICBjb3VudCsrOwogICAgICAgIGlmIChjdW11bGF0aXZlID49IHRocmVzaG9sZCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gY291bnQ7Cn0KZnVuY3Rpb24gY29tcHV0ZUNJSGVhbHRoKHJ1bnMpIHsKICAgIGlmIChydW5zLmxlbmd0aCA9PT0gMCkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IGNvbXBsZXRlZCA9IHJ1bnMuZmlsdGVyKChyKSA9PiByLnN0YXR1cyA9PT0gImNvbXBsZXRlZCIpOwogICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IGNvbXBsZXRlZC5maWx0ZXIoKHIpID0+IHIuY29uY2x1c2lvbiA9PT0gInN1Y2Nlc3MiKTsKICAgIC8vIENvbXB1dGUgYXZlcmFnZSBkdXJhdGlvbiBmb3IgY29tcGxldGVkIHJ1bnMgdGhhdCBoYXZlIHJ1bl9zdGFydGVkX2F0CiAgICBsZXQgYXZnRHVyYXRpb25TZWNvbmRzID0gbnVsbDsKICAgIGNvbnN0IGR1cmF0aW9ucyA9IFtdOwogICAgZm9yIChjb25zdCByIG9mIGNvbXBsZXRlZCkgewogICAgICAgIGlmIChyLnJ1bl9zdGFydGVkX2F0KSB7CiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoci5ydW5fc3RhcnRlZF9hdCkuZ2V0VGltZSgpOwogICAgICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShyLnVwZGF0ZWRfYXQpLmdldFRpbWUoKTsKICAgICAgICAgICAgaWYgKGVuZCA+IHN0YXJ0KQogICAgICAgICAgICAgICAgZHVyYXRpb25zLnB1c2goKGVuZCAtIHN0YXJ0KSAvIDEwMDApOwogICAgICAgIH0KICAgIH0KICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID4gMCkgewogICAgICAgIGF2Z0R1cmF0aW9uU2Vjb25kcyA9IE1hdGgucm91bmQoZHVyYXRpb25zLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gZHVyYXRpb25zLmxlbmd0aCk7CiAgICB9CiAgICAvLyBDb3VudCBkaXN0aW5jdCBmYWlsaW5nIHdvcmtmbG93cwogICAgY29uc3QgZmFpbGluZ1dvcmtmbG93SWRzID0gbmV3IFNldCgpOwogICAgZm9yIChjb25zdCByIG9mIGNvbXBsZXRlZCkgewogICAgICAgIGlmIChyLmNvbmNsdXNpb24gPT09ICJmYWlsdXJlIikgewogICAgICAgICAgICBmYWlsaW5nV29ya2Zsb3dJZHMuYWRkKHIud29ya2Zsb3dfaWQpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgdG90YWxSdW5zOiBydW5zLmxlbmd0aCwKICAgICAgICBzdWNjZXNzZnVsUnVuczogc3VjY2Vzc2Z1bC5sZW5ndGgsCiAgICAgICAgc3VjY2Vzc1JhdGU6IGNvbXBsZXRlZC5sZW5ndGggPiAwID8gTWF0aC5yb3VuZCgoc3VjY2Vzc2Z1bC5sZW5ndGggLyBjb21wbGV0ZWQubGVuZ3RoKSAqIDEwMCkgOiAwLAogICAgICAgIGF2Z0R1cmF0aW9uU2Vjb25kcywKICAgICAgICBmYWlsaW5nV29ya2Zsb3dzOiBmYWlsaW5nV29ya2Zsb3dJZHMuc2l6ZSwKICAgIH07Cn0KLy8g4pSA4pSAIFRyZW5kIGRldGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gZGV0ZWN0Q29tbWl0VHJlbmQoY29tbWl0cykgewogICAgaWYgKGNvbW1pdHMubGVuZ3RoIDwgNCkKICAgICAgICByZXR1cm4gInN0YWJsZSI7CiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgY29uc3QgaGFsZndheU1zID0gMTUgKiBNU19QRVJfREFZOwogICAgbGV0IHJlY2VudENvdW50ID0gMDsKICAgIGxldCBvbGRlckNvdW50ID0gMDsKICAgIGZvciAoY29uc3QgYyBvZiBjb21taXRzKSB7CiAgICAgICAgY29uc3QgZGF0ZSA9IGMuY29tbWl0LmF1dGhvcj8uZGF0ZTsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNvbnN0IGFnZSA9IG5vdyAtIG5ldyBEYXRlKGRhdGUpLmdldFRpbWUoKTsKICAgICAgICBpZiAoYWdlIDwgaGFsZndheU1zKQogICAgICAgICAgICByZWNlbnRDb3VudCsrOwogICAgICAgIGVsc2UKICAgICAgICAgICAgb2xkZXJDb3VudCsrOwogICAgfQogICAgaWYgKHJlY2VudENvdW50ID4gb2xkZXJDb3VudCAqIDEuMykKICAgICAgICByZXR1cm4gImluY3JlYXNpbmciOwogICAgaWYgKG9sZGVyQ291bnQgPiByZWNlbnRDb3VudCAqIDEuMykKICAgICAgICByZXR1cm4gImRlY3JlYXNpbmciOwogICAgcmV0dXJuICJzdGFibGUiOwp9CmZ1bmN0aW9uIGRldGVjdElzc3VlVHJlbmQoaXNzdWVzKSB7CiAgICBpZiAoaXNzdWVzLmxlbmd0aCA8IDQpCiAgICAgICAgcmV0dXJuICJzdGFibGUiOwogICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgIGNvbnN0IGhhbGZ3YXlNcyA9IDE1ICogTVNfUEVSX0RBWTsKICAgIGxldCByZWNlbnRPcGVuID0gMDsKICAgIGxldCBvbGRlck9wZW4gPSAwOwogICAgZm9yIChjb25zdCBpIG9mIGlzc3VlcykgewogICAgICAgIGlmIChpLnN0YXRlICE9PSAib3BlbiIpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGNvbnN0IGFnZSA9IG5vdyAtIG5ldyBEYXRlKGkuY3JlYXRlZF9hdCkuZ2V0VGltZSgpOwogICAgICAgIGlmIChhZ2UgPCBoYWxmd2F5TXMpCiAgICAgICAgICAgIHJlY2VudE9wZW4rKzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIG9sZGVyT3BlbisrOwogICAgfQogICAgaWYgKHJlY2VudE9wZW4gPCBvbGRlck9wZW4gKiAwLjcpCiAgICAgICAgcmV0dXJuICJpbXByb3ZpbmciOwogICAgaWYgKHJlY2VudE9wZW4gPiBvbGRlck9wZW4gKiAxLjMpCiAgICAgICAgcmV0dXJuICJ3b3JzZW5pbmciOwogICAgcmV0dXJuICJzdGFibGUiOwp9CmZ1bmN0aW9uIGRldGVjdFBSVHJlbmQocHJzKSB7CiAgICBjb25zdCBvcGVuUFJzID0gcHJzLmZpbHRlcigocCkgPT4gcC5zdGF0ZSA9PT0gIm9wZW4iKTsKICAgIGNvbnN0IHN0YWxlUFJzID0gb3BlblBScy5maWx0ZXIoKHApID0+IGlzU3RhbGUocC51cGRhdGVkX2F0KSk7CiAgICBpZiAoc3RhbGVQUnMubGVuZ3RoID09PSAwICYmIG9wZW5QUnMubGVuZ3RoIDw9IDMpCiAgICAgICAgcmV0dXJuICJpbXByb3ZpbmciOwogICAgaWYgKHN0YWxlUFJzLmxlbmd0aCA+IG9wZW5QUnMubGVuZ3RoIC8gMikKICAgICAgICByZXR1cm4gIndvcnNlbmluZyI7CiAgICByZXR1cm4gInN0YWJsZSI7Cn0KLy8g4pSA4pSAIEdyYWRpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIGNvbXB1dGVHcmFkZShtZXRyaWNzLCB0cmVuZHMpIHsKICAgIGxldCBzY29yZSA9IDA7CiAgICAvLyBDb21taXQgZnJlcXVlbmN5ICgwLTI1IHBvaW50cykKICAgIGlmIChtZXRyaWNzLmNvbW1pdEZyZXF1ZW5jeSA+PSAyMCkKICAgICAgICBzY29yZSArPSAyNTsKICAgIGVsc2UgaWYgKG1ldHJpY3MuY29tbWl0RnJlcXVlbmN5ID49IDEwKQogICAgICAgIHNjb3JlICs9IDIwOwogICAgZWxzZSBpZiAobWV0cmljcy5jb21taXRGcmVxdWVuY3kgPj0gNSkKICAgICAgICBzY29yZSArPSAxNTsKICAgIGVsc2UgaWYgKG1ldHJpY3MuY29tbWl0RnJlcXVlbmN5ID49IDEpCiAgICAgICAgc2NvcmUgKz0gMTA7CiAgICAvLyBJc3N1ZSByZXNvbHV0aW9uICgwLTI1IHBvaW50cykKICAgIGlmIChtZXRyaWNzLmF2Z0lzc3VlUmVzb2x1dGlvbkRheXMgPT09IDAgJiYgbWV0cmljcy5vcGVuSXNzdWVzID09PSAwKQogICAgICAgIHNjb3JlICs9IDI1OwogICAgZWxzZSBpZiAobWV0cmljcy5hdmdJc3N1ZVJlc29sdXRpb25EYXlzIDw9IDMpCiAgICAgICAgc2NvcmUgKz0gMjU7CiAgICBlbHNlIGlmIChtZXRyaWNzLmF2Z0lzc3VlUmVzb2x1dGlvbkRheXMgPD0gNykKICAgICAgICBzY29yZSArPSAyMDsKICAgIGVsc2UgaWYgKG1ldHJpY3MuYXZnSXNzdWVSZXNvbHV0aW9uRGF5cyA8PSAxNCkKICAgICAgICBzY29yZSArPSAxNTsKICAgIGVsc2UgaWYgKG1ldHJpY3MuYXZnSXNzdWVSZXNvbHV0aW9uRGF5cyA8PSAzMCkKICAgICAgICBzY29yZSArPSAxMDsKICAgIC8vIFBSIHJldmlldyB0aW1lICgwLTI1IHBvaW50cykKICAgIGlmIChtZXRyaWNzLmF2Z1BSUmV2aWV3RGF5cyA9PT0gMCAmJiBtZXRyaWNzLm9wZW5QUnMgPT09IDApCiAgICAgICAgc2NvcmUgKz0gMjU7CiAgICBlbHNlIGlmIChtZXRyaWNzLmF2Z1BSUmV2aWV3RGF5cyA8PSAxKQogICAgICAgIHNjb3JlICs9IDI1OwogICAgZWxzZSBpZiAobWV0cmljcy5hdmdQUlJldmlld0RheXMgPD0gMykKICAgICAgICBzY29yZSArPSAyMDsKICAgIGVsc2UgaWYgKG1ldHJpY3MuYXZnUFJSZXZpZXdEYXlzIDw9IDcpCiAgICAgICAgc2NvcmUgKz0gMTU7CiAgICBlbHNlIGlmIChtZXRyaWNzLmF2Z1BSUmV2aWV3RGF5cyA8PSAxNCkKICAgICAgICBzY29yZSArPSAxMDsKICAgIC8vIFN0YWxlbmVzcyBwZW5hbHR5ICgwLTI1IHBvaW50cykKICAgIGNvbnN0IHN0YWxlUGVuYWx0eSA9IE1hdGgubWluKDI1LCAobWV0cmljcy5zdGFsZUlzc3VlcyArIG1ldHJpY3Muc3RhbGVQUnMpICogMyk7CiAgICBzY29yZSArPSAyNSAtIHN0YWxlUGVuYWx0eTsKICAgIC8vIFRyZW5kIGJvbnVzZXMvcGVuYWx0aWVzCiAgICBpZiAodHJlbmRzLmNvbW1pdFRyZW5kID09PSAiaW5jcmVhc2luZyIpCiAgICAgICAgc2NvcmUgKz0gNTsKICAgIGlmICh0cmVuZHMuY29tbWl0VHJlbmQgPT09ICJkZWNyZWFzaW5nIikKICAgICAgICBzY29yZSAtPSA1OwogICAgaWYgKHRyZW5kcy5pc3N1ZVRyZW5kID09PSAiaW1wcm92aW5nIikKICAgICAgICBzY29yZSArPSA1OwogICAgaWYgKHRyZW5kcy5pc3N1ZVRyZW5kID09PSAid29yc2VuaW5nIikKICAgICAgICBzY29yZSAtPSA1OwogICAgaWYgKHNjb3JlID49IDg1KQogICAgICAgIHJldHVybiAiQSI7CiAgICBpZiAoc2NvcmUgPj0gNzApCiAgICAgICAgcmV0dXJuICJCIjsKICAgIGlmIChzY29yZSA+PSA1NSkKICAgICAgICByZXR1cm4gIkMiOwogICAgaWYgKHNjb3JlID49IDQwKQogICAgICAgIHJldHVybiAiRCI7CiAgICByZXR1cm4gIkYiOwp9Ci8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogR2VuZXJhdGUgYSBoZWFsdGggcmVwb3J0IGZvciBhIHJlcG9zaXRvcnkuCiAqIEZldGNoZXMgcmVjZW50IGlzc3VlcywgUFJzLCBhbmQgY29tbWl0cyB0byBjb21wdXRlIG1ldHJpY3MuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVwb0hlYWx0aChvd25lciwgcmVwbykgewogICAgbG9nLmluZm8oYEdlbmVyYXRpbmcgaGVhbHRoIHJlcG9ydCBmb3IgJHtvd25lcn0vJHtyZXBvfWApOwogICAgY29uc3QgdGhpcnR5RGF5c0FnbyA9IG5ldyBEYXRlKERhdGUubm93KCkgLSAzMCAqIE1TX1BFUl9EQVkpLnRvSVNPU3RyaW5nKCk7CiAgICAvLyBGZXRjaCBkYXRhIGluIHBhcmFsbGVsCiAgICBjb25zdCBbaXNzdWVzLCBwcnMsIGNvbW1pdHMsIHdvcmtmbG93UnVuc10gPSBhd2FpdCBQcm9taXNlLmFsbChbCiAgICAgICAgY2xpZW50Lmxpc3RJc3N1ZXMob3duZXIsIHJlcG8sIHsgc3RhdGU6ICJhbGwiLCBwZXJfcGFnZTogMTAwLCBzaW5jZTogdGhpcnR5RGF5c0FnbyB9KSwKICAgICAgICBjbGllbnQubGlzdFB1bGxSZXF1ZXN0cyhvd25lciwgcmVwbywgeyBzdGF0ZTogImFsbCIsIHBlcl9wYWdlOiAxMDAgfSksCiAgICAgICAgY2xpZW50Lmxpc3RDb21taXRzKG93bmVyLCByZXBvLCB7IHNpbmNlOiB0aGlydHlEYXlzQWdvLCBwZXJfcGFnZTogMTAwIH0pLAogICAgICAgIGNsaWVudC5saXN0V29ya2Zsb3dSdW5zKG93bmVyLCByZXBvLCB7IHBlcl9wYWdlOiAxMDAsIGNyZWF0ZWQ6IGA+PSR7dGhpcnR5RGF5c0Fnby5zcGxpdCgiVCIpWzBdfWAgfSksCiAgICBdKTsKICAgIGlmICghaXNzdWVzIHx8ICFwcnMgfHwgIWNvbW1pdHMpIHsKICAgICAgICBsb2cud2FybihgRmFpbGVkIHRvIGZldGNoIHJlcG8gZGF0YSBmb3IgJHtvd25lcn0vJHtyZXBvfWApOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLy8gRmlsdGVyIG91dCBQUnMgZnJvbSBpc3N1ZSBsaXN0IChHaXRIdWIgQVBJIHJldHVybnMgUFJzIHVuZGVyIC9pc3N1ZXMpCiAgICBjb25zdCBwdXJlSXNzdWVzID0gaXNzdWVzLmZpbHRlcigoaSkgPT4gIWkucHVsbF9yZXF1ZXN0KTsKICAgIGNvbnN0IG9wZW5Jc3N1ZXMgPSBwdXJlSXNzdWVzLmZpbHRlcigoaSkgPT4gaS5zdGF0ZSA9PT0gIm9wZW4iKTsKICAgIGNvbnN0IG9wZW5QUnMgPSBwcnMuZmlsdGVyKChwKSA9PiBwLnN0YXRlID09PSAib3BlbiIpOwogICAgY29uc3QgbWV0cmljcyA9IHsKICAgICAgICBjb21taXRGcmVxdWVuY3k6IGNvbW1pdHMubGVuZ3RoLAogICAgICAgIGF2Z0lzc3VlUmVzb2x1dGlvbkRheXM6IGNvbXB1dGVBdmdSZXNvbHV0aW9uRGF5cyhwdXJlSXNzdWVzKSwKICAgICAgICBhdmdQUlJldmlld0RheXM6IGNvbXB1dGVBdmdQUlJldmlld0RheXMocHJzKSwKICAgICAgICBvcGVuSXNzdWVzOiBvcGVuSXNzdWVzLmxlbmd0aCwKICAgICAgICBvcGVuUFJzOiBvcGVuUFJzLmxlbmd0aCwKICAgICAgICBzdGFsZUlzc3Vlczogb3Blbklzc3Vlcy5maWx0ZXIoKGkpID0+IGlzU3RhbGUoaS51cGRhdGVkX2F0KSkubGVuZ3RoLAogICAgICAgIHN0YWxlUFJzOiBvcGVuUFJzLmZpbHRlcigocCkgPT4gaXNTdGFsZShwLnVwZGF0ZWRfYXQpKS5sZW5ndGgsCiAgICAgICAgYWN0aXZlQ29udHJpYnV0b3JzOiBjb3VudEFjdGl2ZUNvbnRyaWJ1dG9ycyhjb21taXRzKSwKICAgICAgICBidXNGYWN0b3I6IGNvbXB1dGVCdXNGYWN0b3IoY29tbWl0cyksCiAgICAgICAgY2lIZWFsdGg6IGNvbXB1dGVDSUhlYWx0aCh3b3JrZmxvd1J1bnM/LndvcmtmbG93X3J1bnMgPz8gW10pLAogICAgfTsKICAgIGNvbnN0IHRyZW5kcyA9IHsKICAgICAgICBjb21taXRUcmVuZDogZGV0ZWN0Q29tbWl0VHJlbmQoY29tbWl0cyksCiAgICAgICAgaXNzdWVUcmVuZDogZGV0ZWN0SXNzdWVUcmVuZChwdXJlSXNzdWVzKSwKICAgICAgICBwclRyZW5kOiBkZXRlY3RQUlRyZW5kKHBycyksCiAgICB9OwogICAgY29uc3Qgb3ZlcmFsbCA9IGNvbXB1dGVHcmFkZShtZXRyaWNzLCB0cmVuZHMpOwogICAgY29uc3QgcmVwb3J0ID0gewogICAgICAgIHJlcG86IGAke293bmVyfS8ke3JlcG99YCwKICAgICAgICBnZW5lcmF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgIG92ZXJhbGwsCiAgICAgICAgbWV0cmljcywKICAgICAgICB0cmVuZHMsCiAgICB9OwogICAgbG9nQWN0aXZpdHkoewogICAgICAgIHNvdXJjZTogImJvYXJkIiwKICAgICAgICBzdW1tYXJ5OiBgUmVwbyBoZWFsdGg6ICR7b3duZXJ9LyR7cmVwb30g4oaSIGdyYWRlICR7b3ZlcmFsbH0gKCR7Y29tbWl0cy5sZW5ndGh9IGNvbW1pdHMsICR7b3Blbklzc3Vlcy5sZW5ndGh9IG9wZW4gaXNzdWVzLCAke29wZW5QUnMubGVuZ3RofSBvcGVuIFBScylgLAogICAgfSk7CiAgICByZXR1cm4gcmVwb3J0Owp9Ci8qKgogKiBGb3JtYXQgYSBoZWFsdGggcmVwb3J0IGFzIGEgbWFya2Rvd24gc3RyaW5nIChmb3IgZGlzcGxheSBvciBwb3N0aW5nKS4KICovCmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRIZWFsdGhSZXBvcnQocmVwb3J0KSB7CiAgICBjb25zdCBsaW5lcyA9IFtdOwogICAgbGluZXMucHVzaChgIyMgUmVwb3NpdG9yeSBIZWFsdGggUmVwb3J0OiAke3JlcG9ydC5yZXBvfWApOwogICAgbGluZXMucHVzaCgiIik7CiAgICBsaW5lcy5wdXNoKGAqKk92ZXJhbGwgR3JhZGU6ICR7cmVwb3J0Lm92ZXJhbGx9KipgKTsKICAgIGxpbmVzLnB1c2goYCpHZW5lcmF0ZWQ6ICR7bmV3IERhdGUocmVwb3J0LmdlbmVyYXRlZEF0KS50b0xvY2FsZURhdGVTdHJpbmcoKX0qYCk7CiAgICBsaW5lcy5wdXNoKCIiKTsKICAgIGxpbmVzLnB1c2goYHwgTWV0cmljIHwgVmFsdWUgfGApOwogICAgbGluZXMucHVzaChgfC0tLS0tLS0tfC0tLS0tLS18YCk7CiAgICBsaW5lcy5wdXNoKGB8IENvbW1pdHMgKDMwZCkgfCAke3JlcG9ydC5tZXRyaWNzLmNvbW1pdEZyZXF1ZW5jeX0gfGApOwogICAgbGluZXMucHVzaChgfCBBY3RpdmUgY29udHJpYnV0b3JzIHwgJHtyZXBvcnQubWV0cmljcy5hY3RpdmVDb250cmlidXRvcnN9IHxgKTsKICAgIGxpbmVzLnB1c2goYHwgT3BlbiBpc3N1ZXMgfCAke3JlcG9ydC5tZXRyaWNzLm9wZW5Jc3N1ZXN9IHxgKTsKICAgIGxpbmVzLnB1c2goYHwgT3BlbiBQUnMgfCAke3JlcG9ydC5tZXRyaWNzLm9wZW5QUnN9IHxgKTsKICAgIGxpbmVzLnB1c2goYHwgU3RhbGUgaXNzdWVzIHwgJHtyZXBvcnQubWV0cmljcy5zdGFsZUlzc3Vlc30gfGApOwogICAgbGluZXMucHVzaChgfCBTdGFsZSBQUnMgfCAke3JlcG9ydC5tZXRyaWNzLnN0YWxlUFJzfSB8YCk7CiAgICBsaW5lcy5wdXNoKGB8IEF2ZyBpc3N1ZSByZXNvbHV0aW9uIHwgJHtyZXBvcnQubWV0cmljcy5hdmdJc3N1ZVJlc29sdXRpb25EYXlzfWQgfGApOwogICAgbGluZXMucHVzaChgfCBBdmcgUFIgcmV2aWV3IHRpbWUgfCAke3JlcG9ydC5tZXRyaWNzLmF2Z1BSUmV2aWV3RGF5c31kIHxgKTsKICAgIGxpbmVzLnB1c2goYHwgQnVzIGZhY3RvciB8ICR7cmVwb3J0Lm1ldHJpY3MuYnVzRmFjdG9yfSB8YCk7CiAgICBpZiAocmVwb3J0Lm1ldHJpY3MuY2lIZWFsdGgpIHsKICAgICAgICBsaW5lcy5wdXNoKGB8IENJIHN1Y2Nlc3MgcmF0ZSB8ICR7cmVwb3J0Lm1ldHJpY3MuY2lIZWFsdGguc3VjY2Vzc1JhdGV9JSB8YCk7CiAgICAgICAgbGluZXMucHVzaChgfCBDSSBydW5zICgzMGQpIHwgJHtyZXBvcnQubWV0cmljcy5jaUhlYWx0aC50b3RhbFJ1bnN9IHxgKTsKICAgICAgICBsaW5lcy5wdXNoKGB8IEZhaWxpbmcgd29ya2Zsb3dzIHwgJHtyZXBvcnQubWV0cmljcy5jaUhlYWx0aC5mYWlsaW5nV29ya2Zsb3dzfSB8YCk7CiAgICB9CiAgICBsaW5lcy5wdXNoKCIiKTsKICAgIGxpbmVzLnB1c2goYCMjIyBUcmVuZHNgKTsKICAgIGxpbmVzLnB1c2goYC0gQ29tbWl0czogJHtyZXBvcnQudHJlbmRzLmNvbW1pdFRyZW5kfWApOwogICAgbGluZXMucHVzaChgLSBJc3N1ZXM6ICR7cmVwb3J0LnRyZW5kcy5pc3N1ZVRyZW5kfWApOwogICAgbGluZXMucHVzaChgLSBQUnM6ICR7cmVwb3J0LnRyZW5kcy5wclRyZW5kfWApOwogICAgcmV0dXJuIGxpbmVzLmpvaW4oIlxuIik7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVwby1oZWFsdGguanMubWFw","github/retry.js":"LyoqCiAqIFJldHJ5IHV0aWxpdGllcyBmb3IgR2l0SHViIEFQSSBjYWxscy4KICogRXhwb25lbnRpYWwgYmFja29mZiB3aXRoIGppdHRlciwgZXJyb3IgY2xhc3NpZmljYXRpb24sIGFuZCBzdHJ1Y3R1cmVkIGVycm9ycy4KICogTWlycm9ycyB0aGUgTGluZWFyIHJldHJ5IHBhdHRlcm4gd2l0aCBHaXRIdWItc3BlY2lmaWMgZXJyb3IgaGFuZGxpbmcuCiAqLwppbXBvcnQgeyB0cmFjZUFwaUNhbGwgfSBmcm9tICIuLi90cmFjaW5nL2luc3RydW1lbnQuanMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImdpdGh1YiIpOwpleHBvcnQgY2xhc3MgR2l0SHViQXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgICBraW5kOwogICAgc3RhdHVzQ29kZTsKICAgIGNhdXNlOwogICAgY29uc3RydWN0b3IobWVzc2FnZSwga2luZCwgc3RhdHVzQ29kZSwgY2F1c2UpIHsKICAgICAgICBzdXBlcihtZXNzYWdlKTsKICAgICAgICB0aGlzLmtpbmQgPSBraW5kOwogICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7CiAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlOwogICAgICAgIHRoaXMubmFtZSA9ICJHaXRIdWJBcGlFcnJvciI7CiAgICB9Cn0KLyoqCiAqIENsYXNzaWZ5IGFuIGVycm9yIGZyb20gdGhlIEdpdEh1YiBBUEkuCiAqIC0gNDAxLzQwMyDihpIgYXV0aCAoZG9uJ3QgcmV0cnksIHRva2VuIGlzIGJhZCBvciBpbnN1ZmZpY2llbnQgc2NvcGUpCiAqIC0gNDI5LCA1MDAsIDUwMiwgNTAzLCA1MDQg4oaSIHRyYW5zaWVudCAocmV0cnkpCiAqIC0gTmV0d29yayBlcnJvcnMg4oaSIHRyYW5zaWVudAogKiAtIEV2ZXJ5dGhpbmcgZWxzZSDihpIgcGVybWFuZW50CiAqLwpleHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlFcnJvcihlcnIpIHsKICAgIGlmIChlcnIgaW5zdGFuY2VvZiBHaXRIdWJBcGlFcnJvcikKICAgICAgICByZXR1cm4gZXJyLmtpbmQ7CiAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICBjb25zdCBsb3dlciA9IG1zZy50b0xvd2VyQ2FzZSgpOwogICAgLy8gQXV0aCBmYWlsdXJlcwogICAgaWYgKGxvd2VyLmluY2x1ZGVzKCI0MDEiKSB8fCBsb3dlci5pbmNsdWRlcygiNDAzIikgfHwgbG93ZXIuaW5jbHVkZXMoInVuYXV0aG9yaXplZCIpIHx8IGxvd2VyLmluY2x1ZGVzKCJmb3JiaWRkZW4iKSB8fCBsb3dlci5pbmNsdWRlcygiYmFkIGNyZWRlbnRpYWxzIikpIHsKICAgICAgICByZXR1cm4gImF1dGgiOwogICAgfQogICAgLy8gUmF0ZS1saW1pdGVkIG9yIHNlcnZlciBlcnJvcnMKICAgIGlmIChsb3dlci5pbmNsdWRlcygiNDI5IikgfHwgbG93ZXIuaW5jbHVkZXMoInJhdGUgbGltaXQiKSB8fCBsb3dlci5pbmNsdWRlcygic2Vjb25kYXJ5IHJhdGUgbGltaXQiKSB8fCBsb3dlci5pbmNsdWRlcygiYWJ1c2UgZGV0ZWN0aW9uIikpIHsKICAgICAgICByZXR1cm4gInRyYW5zaWVudCI7CiAgICB9CiAgICBpZiAoL1xiNTBbMC00XVxiLy50ZXN0KG1zZykpCiAgICAgICAgcmV0dXJuICJ0cmFuc2llbnQiOwogICAgLy8gTmV0d29yayBlcnJvcnMKICAgIGlmIChsb3dlci5pbmNsdWRlcygiZWNvbm5yZXNldCIpIHx8CiAgICAgICAgbG93ZXIuaW5jbHVkZXMoImV0aW1lZG91dCIpIHx8CiAgICAgICAgbG93ZXIuaW5jbHVkZXMoImVjb25ucmVmdXNlZCIpIHx8CiAgICAgICAgbG93ZXIuaW5jbHVkZXMoImVub3Rmb3VuZCIpIHx8CiAgICAgICAgbG93ZXIuaW5jbHVkZXMoImZldGNoIGZhaWxlZCIpIHx8CiAgICAgICAgbG93ZXIuaW5jbHVkZXMoIm5ldHdvcmsiKSB8fAogICAgICAgIGxvd2VyLmluY2x1ZGVzKCJzb2NrZXQgaGFuZyB1cCIpIHx8CiAgICAgICAgbG93ZXIuaW5jbHVkZXMoImFib3J0ZWQiKSkgewogICAgICAgIHJldHVybiAidHJhbnNpZW50IjsKICAgIH0KICAgIHJldHVybiAicGVybWFuZW50IjsKfQovKioKICogRXhlY3V0ZSBgZm5gIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiArIGppdHRlci4KICogT25seSByZXRyaWVzIHRyYW5zaWVudCBlcnJvcnMuIEF1dGggYW5kIHBlcm1hbmVudCBlcnJvcnMgZmFpbCBpbW1lZGlhdGVseS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnkoZm4sIG9wdHMpIHsKICAgIGNvbnN0IG1heEF0dGVtcHRzID0gb3B0cz8ubWF4QXR0ZW1wdHMgPz8gMzsKICAgIGNvbnN0IGJhc2VEZWxheSA9IG9wdHM/LmJhc2VEZWxheU1zID8/IDEwMDA7CiAgICBjb25zdCBtYXhEZWxheSA9IG9wdHM/Lm1heERlbGF5TXMgPz8gMzBfMDAwOwogICAgY29uc3QgbGFiZWwgPSBvcHRzPy5sYWJlbCA/PyAiR2l0SHViQVBJIjsKICAgIGNvbnN0IHRpbWVvdXRNcyA9IG9wdHM/LnRpbWVvdXRNcyA/PyAxNV8wMDA7CiAgICByZXR1cm4gdHJhY2VBcGlDYWxsKCJnaXRodWIiLCBsYWJlbCwgYXN5bmMgKHNwYW4pID0+IHsKICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgicmV0cnkubWF4X2F0dGVtcHRzIiwgbWF4QXR0ZW1wdHMpOwogICAgICAgIGxldCBsYXN0RXJyb3I7CiAgICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aFRpbWVvdXQoZm4oKSwgdGltZW91dE1zLCBsYWJlbCk7CiAgICAgICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgicmV0cnkuYXR0ZW1wdHMiLCBhdHRlbXB0KTsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgY29uc3Qga2luZCA9IGNsYXNzaWZ5RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIHNwYW4uYWRkRXZlbnQoInJldHJ5LmF0dGVtcHRfZmFpbGVkIiwgewogICAgICAgICAgICAgICAgICAgIGF0dGVtcHQsCiAgICAgICAgICAgICAgICAgICAgImVycm9yLmtpbmQiOiBraW5kLAogICAgICAgICAgICAgICAgICAgICJlcnJvci5tZXNzYWdlIjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAoa2luZCA9PT0gImF1dGgiKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEdpdEh1YkFwaUVycm9yKGAke2xhYmVsfTogYXV0aGVudGljYXRpb24gZmFpbGVkIOKAlCBjaGVjayBHSVRIVUJfVE9LRU5gLCAiYXV0aCIsIHVuZGVmaW5lZCwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChraW5kID09PSAicGVybWFuZW50IikgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBHaXRIdWJBcGlFcnJvcihgJHtsYWJlbH06ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWAsICJwZXJtYW5lbnQiLCB1bmRlZmluZWQsIGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzUmF0ZUxpbWl0ZWQgPSBlcnJNc2cuaW5jbHVkZXMoIjQyOSIpIHx8IGVyck1zZy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCJyYXRlIGxpbWl0Iik7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0aXZlQmFzZSA9IGlzUmF0ZUxpbWl0ZWQgPyBNYXRoLm1heChiYXNlRGVsYXksIDVfMDAwKSA6IGJhc2VEZWxheTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxheSA9IE1hdGgubWluKGVmZmVjdGl2ZUJhc2UgKiAyICoqIChhdHRlbXB0IC0gMSksIG1heERlbGF5KTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBqaXR0ZXIgPSBkZWxheSAqICgwLjUgKyBNYXRoLnJhbmRvbSgpICogMC41KTsKICAgICAgICAgICAgICAgICAgICBsb2cud2FybihgJHtsYWJlbH06IGF0dGVtcHQgJHthdHRlbXB0fS8ke21heEF0dGVtcHRzfSBmYWlsZWQke2lzUmF0ZUxpbWl0ZWQgPyAiIChyYXRlIGxpbWl0ZWQpIiA6ICIifSwgcmV0cnlpbmcgaW4gJHtNYXRoLnJvdW5kKGppdHRlcil9bXNgKTsKICAgICAgICAgICAgICAgICAgICBhd2FpdCBzbGVlcChqaXR0ZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKCJyZXRyeS5hdHRlbXB0cyIsIG1heEF0dGVtcHRzKTsKICAgICAgICB0aHJvdyBuZXcgR2l0SHViQXBpRXJyb3IoYCR7bGFiZWx9OiBmYWlsZWQgYWZ0ZXIgJHttYXhBdHRlbXB0c30gYXR0ZW1wdHNgLCAidHJhbnNpZW50IiwgdW5kZWZpbmVkLCBsYXN0RXJyb3IpOwogICAgfSk7Cn0KZnVuY3Rpb24gd2l0aFRpbWVvdXQocHJvbWlzZSwgbXMsIGxhYmVsKSB7CiAgICBpZiAobXMgPD0gMCB8fCAhTnVtYmVyLmlzRmluaXRlKG1zKSkKICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgcmVqZWN0KG5ldyBHaXRIdWJBcGlFcnJvcihgJHtsYWJlbH06IHRpbWVkIG91dCBhZnRlciAke21zfW1zYCwgInRyYW5zaWVudCIpKTsKICAgICAgICB9LCBtcyk7CiAgICAgICAgcHJvbWlzZS50aGVuKCh2YWwpID0+IHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgcmVzb2x2ZSh2YWwpOyB9LCAoZXJyKSA9PiB7IGNsZWFyVGltZW91dCh0aW1lcik7IHJlamVjdChlcnIpOyB9KTsKICAgIH0pOwp9CmZ1bmN0aW9uIHNsZWVwKG1zKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1yZXRyeS5qcy5tYXA=","github/types.js":"LyoqCiAqIFR5cGVTY3JpcHQgaW50ZXJmYWNlcyBmb3IgdGhlIEdpdEh1YiBpbnRlZ3JhdGlvbi4KICoKICogQ292ZXJzOiBBUEkgY2xpZW50IHR5cGVzLCB3ZWJob29rIHBheWxvYWRzLCBQUiByZXZpZXcsIGlzc3VlIHRyaWFnZSwKICogY29tbWl0IGFuYWx5c2lzLCBhbmQgcmVwbyBoZWFsdGggbW9uaXRvcmluZy4KICovCmV4cG9ydCB7fTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFw","github/webhooks.js":"LyoqCiAqIEdpdEh1YiB3ZWJob29rIGV2ZW50IGhhbmRsaW5nLgogKiBQcm9jZXNzZXMgaW5jb21pbmcgd2ViaG9vayBwYXlsb2FkcyBmcm9tIEdpdEh1YiBmb3IgcmVhbC10aW1lIHVwZGF0ZXMuCiAqCiAqIEdpdEh1YiBzaWducyB3ZWJob29rcyB3aXRoIEhNQUMtU0hBMjU2IGhleCB3aXRoIGEgInNoYTI1Nj0iIHByZWZpeC4KICogSGVhZGVyOiBYLUh1Yi1TaWduYXR1cmUtMjU2CiAqCiAqIFdlYmhvb2sgc2V0dXA6IENvbmZpZ3VyZSBpbiBHaXRIdWIgcmVwbyDihpIgU2V0dGluZ3Mg4oaSIFdlYmhvb2tzLgogKiBVUkw6IGh0dHBzOi8vPHlvdXItZG9tYWluPi9hcGkvZ2l0aHViL3dlYmhvb2tzCiAqIENvbnRlbnQgdHlwZTogYXBwbGljYXRpb24vanNvbgogKiBFdmVudHM6IFB1bGwgcmVxdWVzdHMsIElzc3VlcywgUHVzaCwgSXNzdWUgY29tbWVudHMsIFB1bGwgcmVxdWVzdCByZXZpZXdzLgogKi8KaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgeyBobWFjU2hhMjU2SGV4LCB0aW1pbmdTYWZlQ29tcGFyZSB9IGZyb20gIi4uL3dlYmhvb2tzL3JlZ2lzdHJ5LmpzIjsKaW1wb3J0IHsgY3JlYXRlSG1hY1NoYTI1NkhleFByb3ZpZGVyLCBzYWZlSGFuZGxlciB9IGZyb20gIi4uL3dlYmhvb2tzL2hhbmRsZXJzLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJnaXRodWIud2ViaG9va3MiKTsKY29uc3QgZXZlbnRIYW5kbGVycyA9IG5ldyBNYXAoKTsKLyoqCiAqIFJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgYSBzcGVjaWZpYyBHaXRIdWIgd2ViaG9vayBldmVudCB0eXBlLgogKiBNdWx0aXBsZSBoYW5kbGVycyBjYW4gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHNhbWUgZXZlbnQuCiAqLwpleHBvcnQgZnVuY3Rpb24gb25HaXRIdWJFdmVudChldmVudFR5cGUsIGhhbmRsZXIpIHsKICAgIGNvbnN0IGhhbmRsZXJzID0gZXZlbnRIYW5kbGVycy5nZXQoZXZlbnRUeXBlKSA/PyBbXTsKICAgIGhhbmRsZXJzLnB1c2goaGFuZGxlcik7CiAgICBldmVudEhhbmRsZXJzLnNldChldmVudFR5cGUsIGhhbmRsZXJzKTsKfQovLyDilIDilIAgU2lnbmF0dXJlIHZlcmlmaWNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFZlcmlmeSBHaXRIdWIgd2ViaG9vayBzaWduYXR1cmUuCiAqIEdpdEh1YiB1c2VzIEhNQUMtU0hBMjU2IGhleCB3aXRoIGEgInNoYTI1Nj0iIHByZWZpeCBpbiBYLUh1Yi1TaWduYXR1cmUtMjU2LgogKi8KZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVdlYmhvb2tTaWduYXR1cmUoYm9keSwgc2lnbmF0dXJlLCBzZWNyZXQpIHsKICAgIGNvbnN0IHNpZyA9IHNpZ25hdHVyZS5yZXBsYWNlKC9ec2hhMjU2PS8sICIiKTsKICAgIGNvbnN0IGV4cGVjdGVkID0gaG1hY1NoYTI1NkhleChib2R5LCBzZWNyZXQpOwogICAgcmV0dXJuIHRpbWluZ1NhZmVDb21wYXJlKHNpZywgZXhwZWN0ZWQpOwp9Ci8vIOKUgOKUgCBFdmVudCBwcm9jZXNzaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAphc3luYyBmdW5jdGlvbiBoYW5kbGVQdWxsUmVxdWVzdEV2ZW50KHBheWxvYWQpIHsKICAgIGNvbnN0IHsgYWN0aW9uLCBwdWxsX3JlcXVlc3Q6IHByLCByZXBvc2l0b3J5OiByZXBvIH0gPSBwYXlsb2FkOwogICAgY29uc3QgcHJSZWYgPSBgJHtyZXBvLmZ1bGxfbmFtZX0jJHtwci5udW1iZXJ9YDsKICAgIGxvZy5pbmZvKGBQUiBldmVudDogJHthY3Rpb259IG9uICR7cHJSZWZ9ICgiJHtwci50aXRsZX0iKWApOwogICAgbG9nQWN0aXZpdHkoewogICAgICAgIHNvdXJjZTogImJvYXJkIiwKICAgICAgICBzdW1tYXJ5OiBgR2l0SHViIFBSICR7YWN0aW9ufTogJHtwclJlZn0g4oCUICR7cHIudGl0bGV9YCwKICAgIH0pOwogICAgLy8gRGlzcGF0Y2ggdG8gcmVnaXN0ZXJlZCBoYW5kbGVycwogICAgY29uc3QgaGFuZGxlcnMgPSBldmVudEhhbmRsZXJzLmdldCgicHVsbF9yZXF1ZXN0IikgPz8gW107CiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHsKICAgICAgICBhd2FpdCBoYW5kbGVyKHBheWxvYWQpOwogICAgfQogICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgbWVzc2FnZTogYFBSICR7YWN0aW9ufTogJHtwclJlZn1gIH07Cn0KYXN5bmMgZnVuY3Rpb24gaGFuZGxlSXNzdWVFdmVudChwYXlsb2FkKSB7CiAgICBjb25zdCB7IGFjdGlvbiwgaXNzdWUsIHJlcG9zaXRvcnk6IHJlcG8gfSA9IHBheWxvYWQ7CiAgICBjb25zdCBpc3N1ZVJlZiA9IGAke3JlcG8uZnVsbF9uYW1lfSMke2lzc3VlLm51bWJlcn1gOwogICAgbG9nLmluZm8oYElzc3VlIGV2ZW50OiAke2FjdGlvbn0gb24gJHtpc3N1ZVJlZn0gKCIke2lzc3VlLnRpdGxlfSIpYCk7CiAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgc291cmNlOiAiYm9hcmQiLAogICAgICAgIHN1bW1hcnk6IGBHaXRIdWIgaXNzdWUgJHthY3Rpb259OiAke2lzc3VlUmVmfSDigJQgJHtpc3N1ZS50aXRsZX1gLAogICAgfSk7CiAgICBjb25zdCBoYW5kbGVycyA9IGV2ZW50SGFuZGxlcnMuZ2V0KCJpc3N1ZXMiKSA/PyBbXTsKICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykgewogICAgICAgIGF3YWl0IGhhbmRsZXIocGF5bG9hZCk7CiAgICB9CiAgICByZXR1cm4geyBoYW5kbGVkOiB0cnVlLCBtZXNzYWdlOiBgSXNzdWUgJHthY3Rpb259OiAke2lzc3VlUmVmfWAgfTsKfQphc3luYyBmdW5jdGlvbiBoYW5kbGVQdXNoRXZlbnQocGF5bG9hZCkgewogICAgY29uc3QgeyByZWYsIGNvbW1pdHMsIHJlcG9zaXRvcnk6IHJlcG8gfSA9IHBheWxvYWQ7CiAgICBjb25zdCBicmFuY2ggPSByZWYucmVwbGFjZSgicmVmcy9oZWFkcy8iLCAiIik7CiAgICBjb25zdCBjb3VudCA9IGNvbW1pdHMubGVuZ3RoOwogICAgbG9nLmluZm8oYFB1c2g6ICR7Y291bnR9IGNvbW1pdChzKSB0byAke3JlcG8uZnVsbF9uYW1lfS8ke2JyYW5jaH1gKTsKICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICBzb3VyY2U6ICJib2FyZCIsCiAgICAgICAgc3VtbWFyeTogYEdpdEh1YiBwdXNoOiAke2NvdW50fSBjb21taXQocykgdG8gJHtyZXBvLmZ1bGxfbmFtZX0vJHticmFuY2h9YCwKICAgIH0pOwogICAgY29uc3QgaGFuZGxlcnMgPSBldmVudEhhbmRsZXJzLmdldCgicHVzaCIpID8/IFtdOwogICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7CiAgICAgICAgYXdhaXQgaGFuZGxlcihwYXlsb2FkKTsKICAgIH0KICAgIHJldHVybiB7IGhhbmRsZWQ6IHRydWUsIG1lc3NhZ2U6IGBQdXNoOiAke2NvdW50fSBjb21taXRzIHRvICR7YnJhbmNofWAgfTsKfQphc3luYyBmdW5jdGlvbiBoYW5kbGVJc3N1ZUNvbW1lbnRFdmVudChwYXlsb2FkKSB7CiAgICBjb25zdCB7IGFjdGlvbiwgaXNzdWUsIGNvbW1lbnQsIHJlcG9zaXRvcnk6IHJlcG8gfSA9IHBheWxvYWQ7CiAgICBpZiAoYWN0aW9uICE9PSAiY3JlYXRlZCIpIHsKICAgICAgICByZXR1cm4geyBoYW5kbGVkOiB0cnVlLCBtZXNzYWdlOiBgSWdub3JpbmcgY29tbWVudCAke2FjdGlvbn1gIH07CiAgICB9CiAgICBjb25zdCByZWYgPSBgJHtyZXBvLmZ1bGxfbmFtZX0jJHtpc3N1ZS5udW1iZXJ9YDsKICAgIGxvZy5pbmZvKGBDb21tZW50IG9uICR7cmVmfSBieSAke2NvbW1lbnQudXNlci5sb2dpbn1gKTsKICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICBzb3VyY2U6ICJib2FyZCIsCiAgICAgICAgc3VtbWFyeTogYEdpdEh1YiBjb21tZW50IG9uICR7cmVmfSBieSAke2NvbW1lbnQudXNlci5sb2dpbn1gLAogICAgfSk7CiAgICBjb25zdCBoYW5kbGVycyA9IGV2ZW50SGFuZGxlcnMuZ2V0KCJpc3N1ZV9jb21tZW50IikgPz8gW107CiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHsKICAgICAgICBhd2FpdCBoYW5kbGVyKHBheWxvYWQpOwogICAgfQogICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgbWVzc2FnZTogYENvbW1lbnQgb24gJHtyZWZ9YCB9Owp9CmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVBSUmV2aWV3RXZlbnQocGF5bG9hZCkgewogICAgY29uc3QgeyBhY3Rpb24sIHB1bGxfcmVxdWVzdDogcHIsIHJldmlldywgcmVwb3NpdG9yeTogcmVwbyB9ID0gcGF5bG9hZDsKICAgIGNvbnN0IHJlZiA9IGAke3JlcG8uZnVsbF9uYW1lfSMke3ByLm51bWJlcn1gOwogICAgbG9nLmluZm8oYFBSIHJldmlldyAke2FjdGlvbn0gb24gJHtyZWZ9OiAke3Jldmlldy5zdGF0ZX0gYnkgJHtyZXZpZXcudXNlci5sb2dpbn1gKTsKICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICBzb3VyY2U6ICJib2FyZCIsCiAgICAgICAgc3VtbWFyeTogYEdpdEh1YiBQUiByZXZpZXcgJHtyZXZpZXcuc3RhdGV9IG9uICR7cmVmfSBieSAke3Jldmlldy51c2VyLmxvZ2lufWAsCiAgICB9KTsKICAgIGNvbnN0IGhhbmRsZXJzID0gZXZlbnRIYW5kbGVycy5nZXQoInB1bGxfcmVxdWVzdF9yZXZpZXciKSA/PyBbXTsKICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykgewogICAgICAgIGF3YWl0IGhhbmRsZXIocGF5bG9hZCk7CiAgICB9CiAgICByZXR1cm4geyBoYW5kbGVkOiB0cnVlLCBtZXNzYWdlOiBgUFIgcmV2aWV3ICR7cmV2aWV3LnN0YXRlfTogJHtyZWZ9YCB9Owp9Ci8vIOKUgOKUgCBNYWluIHByb2Nlc3NvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFByb2Nlc3MgYSBHaXRIdWIgd2ViaG9vayBldmVudC4gRGlzcGF0Y2hlcyBiYXNlZCBvbiBYLUdpdEh1Yi1FdmVudCBoZWFkZXIuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1dlYmhvb2soZXZlbnRUeXBlLCBwYXlsb2FkKSB7CiAgICBjb25zdCBwID0gcGF5bG9hZDsKICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7CiAgICAgICAgY2FzZSAicHVsbF9yZXF1ZXN0IjoKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVB1bGxSZXF1ZXN0RXZlbnQocCk7CiAgICAgICAgY2FzZSAiaXNzdWVzIjoKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUlzc3VlRXZlbnQocCk7CiAgICAgICAgY2FzZSAicHVzaCI6CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVQdXNoRXZlbnQocCk7CiAgICAgICAgY2FzZSAiaXNzdWVfY29tbWVudCI6CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVJc3N1ZUNvbW1lbnRFdmVudChwKTsKICAgICAgICBjYXNlICJwdWxsX3JlcXVlc3RfcmV2aWV3IjoKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVBSUmV2aWV3RXZlbnQocCk7CiAgICAgICAgY2FzZSAicGluZyI6CiAgICAgICAgICAgIGxvZy5pbmZvKCJHaXRIdWIgd2ViaG9vayBwaW5nIHJlY2VpdmVkIik7CiAgICAgICAgICAgIHJldHVybiB7IGhhbmRsZWQ6IHRydWUsIG1lc3NhZ2U6ICJQb25nIiB9OwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGxvZy5pbmZvKGBVbmhhbmRsZWQgR2l0SHViIGV2ZW50IHR5cGU6ICR7ZXZlbnRUeXBlfWApOwogICAgICAgICAgICByZXR1cm4geyBoYW5kbGVkOiBmYWxzZSwgbWVzc2FnZTogYFVuaGFuZGxlZCBldmVudCB0eXBlOiAke2V2ZW50VHlwZX1gIH07CiAgICB9Cn0KLy8g4pSA4pSAIFJlZ2lzdHJ5IGludGVncmF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogR2l0SHViIHdlYmhvb2sgcHJvdmlkZXIgKGRlZmVycmVkIHJlZ2lzdHJhdGlvbikuCiAqIFVzZXMgSE1BQy1TSEEyNTYgaGV4IHdpdGggc2hhMjU2PSBwcmVmaXggc3RyaXBwaW5nIHZpYSB0aGUgc3RhbmRhcmQgZmFjdG9yeS4KICogSW1wb3J0IGFuZCBwYXNzIHRvIHJlZ2lzdGVyUHJvdmlkZXJzKCkgaW4gc2VydmVyLnRzIGZvciBiYXRjaCByZWdpc3RyYXRpb24uCiAqLwpleHBvcnQgY29uc3QgZ2l0aHViUHJvdmlkZXIgPSBjcmVhdGVIbWFjU2hhMjU2SGV4UHJvdmlkZXIoewogICAgbmFtZTogImdpdGh1YiIsCiAgICBzdHJpcFByZWZpeDogdHJ1ZSwKICAgIHByb2Nlc3M6IHNhZmVIYW5kbGVyKCJnaXRodWIiLCBhc3luYyAocGF5bG9hZCwgY3R4KSA9PiB7CiAgICAgICAgY29uc3QgZXZlbnRUeXBlID0gY3R4Py5ldmVudFR5cGUgPz8gInVua25vd24iOwogICAgICAgIHJldHVybiBwcm9jZXNzV2ViaG9vayhldmVudFR5cGUsIHBheWxvYWQpOwogICAgfSksCn0pOwovLyMgc291cmNlTWFwcGluZ1VSTD13ZWJob29rcy5qcy5tYXA=","slack/channels.js":"LyoqCiAqIFNsYWNrIGNoYW5uZWwgbWFuYWdlbWVudCDigJQgbGlzdCwgam9pbiwgaW5mbywgcG9zdCwgYW5kIHRocmVhZCBvcGVyYXRpb25zLgogKiBXcmFwcyBTbGFja0NsaWVudCBtZXRob2RzIHdpdGggYWN0aXZpdHkgbG9nZ2luZy4KICogRm9sbG93cyBzcmMvbGluZWFyL3Byb2plY3RzLnRzIHBhdHRlcm46IHN0YW5kYWxvbmUgZnVuY3Rpb25zLCBuZXZlciB0aHJvdy4KICovCmltcG9ydCB7IGdldENsaWVudCB9IGZyb20gIi4vY2xpZW50LmpzIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoInNsYWNrLmNoYW5uZWxzIik7Ci8vIOKUgOKUgCBDaGFubmVsIGxpc3Rpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBMaXN0IGNoYW5uZWxzIHRoZSBib3QgY2FuIHNlZS4gU3VwcG9ydHMgcGFnaW5hdGlvbiB2aWEgY3Vyc29yLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RDaGFubmVscyhvcHRzKSB7CiAgICBjb25zdCBjbGllbnQgPSBnZXRDbGllbnQoKTsKICAgIGlmICghY2xpZW50KQogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogIlNMQUNLX0JPVF9UT0tFTiBub3Qgc2V0IiB9OwogICAgbG9nLmRlYnVnKCJMaXN0aW5nIGNoYW5uZWxzIiwgeyB0eXBlczogb3B0cz8udHlwZXMsIGxpbWl0OiBvcHRzPy5saW1pdCwgY3Vyc29yOiBvcHRzPy5jdXJzb3IgfSk7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBzbGFja1Bvc3QoImNvbnZlcnNhdGlvbnMubGlzdCIsIHsKICAgICAgICAgICAgdHlwZXM6IG9wdHM/LnR5cGVzID8/ICJwdWJsaWNfY2hhbm5lbCxwcml2YXRlX2NoYW5uZWwiLAogICAgICAgICAgICBsaW1pdDogb3B0cz8ubGltaXQgPz8gMTAwLAogICAgICAgICAgICBjdXJzb3I6IG9wdHM/LmN1cnNvciwKICAgICAgICAgICAgZXhjbHVkZV9hcmNoaXZlZDogb3B0cz8uZXhjbHVkZV9hcmNoaXZlZCA/PyB0cnVlLAogICAgICAgIH0pOwogICAgICAgIGlmICghZGF0YS5vaykgewogICAgICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBsaXN0IGNoYW5uZWxzIiwgeyBlcnJvcjogZGF0YS5lcnJvciB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBkYXRhLmVycm9yID8/ICJGYWlsZWQgdG8gbGlzdCBjaGFubmVscyIgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgY2hhbm5lbHMgPSAoZGF0YS5jaGFubmVscyA/PyBbXSkubWFwKChjaCkgPT4gKHsKICAgICAgICAgICAgaWQ6IGNoLmlkLAogICAgICAgICAgICBuYW1lOiBjaC5uYW1lLAogICAgICAgICAgICBpc19jaGFubmVsOiBjaC5pc19jaGFubmVsID8/IHRydWUsCiAgICAgICAgICAgIGlzX2ltOiBjaC5pc19pbSA/PyBmYWxzZSwKICAgICAgICAgICAgaXNfbXBpbTogY2guaXNfbXBpbSA/PyBmYWxzZSwKICAgICAgICAgICAgaXNfcHJpdmF0ZTogY2guaXNfcHJpdmF0ZSA/PyBmYWxzZSwKICAgICAgICAgICAgaXNfYXJjaGl2ZWQ6IGNoLmlzX2FyY2hpdmVkID8/IGZhbHNlLAogICAgICAgICAgICBpc19tZW1iZXI6IGNoLmlzX21lbWJlciA/PyBmYWxzZSwKICAgICAgICAgICAgbnVtX21lbWJlcnM6IGNoLm51bV9tZW1iZXJzLAogICAgICAgICAgICB0b3BpYzogY2gudG9waWM/LnZhbHVlLAogICAgICAgICAgICBwdXJwb3NlOiBjaC5wdXJwb3NlPy52YWx1ZSwKICAgICAgICB9KSk7CiAgICAgICAgbG9nLmluZm8oIkNoYW5uZWxzIGxpc3RlZCIsIHsgY291bnQ6IGNoYW5uZWxzLmxlbmd0aCwgaGFzTW9yZTogISFkYXRhLnJlc3BvbnNlX21ldGFkYXRhPy5uZXh0X2N1cnNvciB9KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBvazogdHJ1ZSwKICAgICAgICAgICAgY2hhbm5lbHMsCiAgICAgICAgICAgIG5leHRDdXJzb3I6IGRhdGEucmVzcG9uc2VfbWV0YWRhdGE/Lm5leHRfY3Vyc29yIHx8IHVuZGVmaW5lZCwKICAgICAgICAgICAgbWVzc2FnZTogYEZvdW5kICR7Y2hhbm5lbHMubGVuZ3RofSBjaGFubmVsc2AsCiAgICAgICAgfTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cuZXJyb3IoIkNoYW5uZWwgbGlzdGluZyBmYWlsZWQiLCB7IGVycm9yOiBlcnIubWVzc2FnZSB9KTsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGBGYWlsZWQgdG8gbGlzdCBjaGFubmVsczogJHtlcnIubWVzc2FnZX1gIH07CiAgICB9Cn0KLyoqCiAqIEdldCBpbmZvIGFib3V0IGEgc3BlY2lmaWMgY2hhbm5lbC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDaGFubmVsSW5mbyhjaGFubmVsSWQpIHsKICAgIGNvbnN0IGNsaWVudCA9IGdldENsaWVudCgpOwogICAgaWYgKCFjbGllbnQpCiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiAiU0xBQ0tfQk9UX1RPS0VOIG5vdCBzZXQiIH07CiAgICBsb2cuZGVidWcoIkZldGNoaW5nIGNoYW5uZWwgaW5mbyIsIHsgY2hhbm5lbElkIH0pOwogICAgdHJ5IHsKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgc2xhY2tQb3N0KCJjb252ZXJzYXRpb25zLmluZm8iLCB7IGNoYW5uZWw6IGNoYW5uZWxJZCB9KTsKICAgICAgICBpZiAoIWRhdGEub2sgfHwgIWRhdGEuY2hhbm5lbCkgewogICAgICAgICAgICBsb2cud2FybigiQ2hhbm5lbCBub3QgZm91bmQiLCB7IGNoYW5uZWxJZCwgZXJyb3I6IGRhdGEuZXJyb3IgfSk7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogZGF0YS5lcnJvciA/PyAiQ2hhbm5lbCBub3QgZm91bmQiIH07CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNoID0gZGF0YS5jaGFubmVsOwogICAgICAgIGxvZy5kZWJ1ZygiQ2hhbm5lbCBpbmZvIHJldHJpZXZlZCIsIHsgY2hhbm5lbElkLCBjaGFubmVsTmFtZTogY2gubmFtZSB9KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBvazogdHJ1ZSwKICAgICAgICAgICAgY2hhbm5lbDogewogICAgICAgICAgICAgICAgaWQ6IGNoLmlkLAogICAgICAgICAgICAgICAgbmFtZTogY2gubmFtZSwKICAgICAgICAgICAgICAgIGlzX2NoYW5uZWw6IGNoLmlzX2NoYW5uZWwgPz8gdHJ1ZSwKICAgICAgICAgICAgICAgIGlzX2ltOiBjaC5pc19pbSA/PyBmYWxzZSwKICAgICAgICAgICAgICAgIGlzX21waW06IGNoLmlzX21waW0gPz8gZmFsc2UsCiAgICAgICAgICAgICAgICBpc19wcml2YXRlOiBjaC5pc19wcml2YXRlID8/IGZhbHNlLAogICAgICAgICAgICAgICAgaXNfYXJjaGl2ZWQ6IGNoLmlzX2FyY2hpdmVkID8/IGZhbHNlLAogICAgICAgICAgICAgICAgaXNfbWVtYmVyOiBjaC5pc19tZW1iZXIgPz8gZmFsc2UsCiAgICAgICAgICAgICAgICBudW1fbWVtYmVyczogY2gubnVtX21lbWJlcnMsCiAgICAgICAgICAgICAgICB0b3BpYzogY2gudG9waWM/LnZhbHVlLAogICAgICAgICAgICAgICAgcHVycG9zZTogY2gucHVycG9zZT8udmFsdWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG1lc3NhZ2U6IGBDaGFubmVsOiAke2NoLm5hbWV9YCwKICAgICAgICB9OwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIGdldCBjaGFubmVsIGluZm8iLCB7IGNoYW5uZWxJZCwgZXJyb3I6IGVyci5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYEZhaWxlZCB0byBnZXQgY2hhbm5lbCBpbmZvOiAke2Vyci5tZXNzYWdlfWAgfTsKICAgIH0KfQovLyDilIDilIAgQ2hhbm5lbCBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogSm9pbiBhIHB1YmxpYyBjaGFubmVsLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGpvaW5DaGFubmVsKGNoYW5uZWxJZCkgewogICAgY29uc3QgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CiAgICBpZiAoIWNsaWVudCkKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6ICJTTEFDS19CT1RfVE9LRU4gbm90IHNldCIgfTsKICAgIGxvZy5kZWJ1ZygiSm9pbmluZyBjaGFubmVsIiwgeyBjaGFubmVsSWQgfSk7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBzbGFja1Bvc3QoImNvbnZlcnNhdGlvbnMuam9pbiIsIHsgY2hhbm5lbDogY2hhbm5lbElkIH0pOwogICAgICAgIGlmICghZGF0YS5vaykgewogICAgICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBqb2luIGNoYW5uZWwiLCB7IGNoYW5uZWxJZCwgZXJyb3I6IGRhdGEuZXJyb3IgfSk7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogZGF0YS5lcnJvciA/PyAiRmFpbGVkIHRvIGpvaW4gY2hhbm5lbCIgfTsKICAgICAgICB9CiAgICAgICAgbG9nLmluZm8oIkpvaW5lZCBjaGFubmVsIiwgeyBjaGFubmVsSWQsIGNoYW5uZWxOYW1lOiBkYXRhLmNoYW5uZWw/Lm5hbWUgfSk7CiAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJzbGFjayIsIHN1bW1hcnk6IGBKb2luZWQgY2hhbm5lbCAke2RhdGEuY2hhbm5lbD8ubmFtZSA/PyBjaGFubmVsSWR9YCB9KTsKICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgbWVzc2FnZTogYEpvaW5lZCAke2RhdGEuY2hhbm5lbD8ubmFtZSA/PyBjaGFubmVsSWR9YCB9OwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGxvZy5lcnJvcigiQ2hhbm5lbCBqb2luIGZhaWxlZCIsIHsgY2hhbm5lbElkLCBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgRmFpbGVkIHRvIGpvaW4gY2hhbm5lbDogJHtlcnIubWVzc2FnZX1gIH07CiAgICB9Cn0KLyoqCiAqIFNldCB0aGUgY2hhbm5lbCB0b3BpYy4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRDaGFubmVsVG9waWMoY2hhbm5lbElkLCB0b3BpYykgewogICAgY29uc3QgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CiAgICBpZiAoIWNsaWVudCkKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6ICJTTEFDS19CT1RfVE9LRU4gbm90IHNldCIgfTsKICAgIGxvZy5kZWJ1ZygiU2V0dGluZyBjaGFubmVsIHRvcGljIiwgeyBjaGFubmVsSWQgfSk7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBzbGFja1Bvc3QoImNvbnZlcnNhdGlvbnMuc2V0VG9waWMiLCB7IGNoYW5uZWw6IGNoYW5uZWxJZCwgdG9waWMgfSk7CiAgICAgICAgaWYgKCFkYXRhLm9rKSB7CiAgICAgICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIHNldCBjaGFubmVsIHRvcGljIiwgeyBjaGFubmVsSWQsIGVycm9yOiBkYXRhLmVycm9yIH0pOwogICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGRhdGEuZXJyb3IgPz8gIkZhaWxlZCB0byBzZXQgdG9waWMiIH07CiAgICAgICAgfQogICAgICAgIGxvZy5pbmZvKCJDaGFubmVsIHRvcGljIHVwZGF0ZWQiLCB7IGNoYW5uZWxJZCB9KTsKICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgbWVzc2FnZTogIlRvcGljIHVwZGF0ZWQiIH07CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgbG9nLmVycm9yKCJDaGFubmVsIHRvcGljIHVwZGF0ZSBmYWlsZWQiLCB7IGNoYW5uZWxJZCwgZXJyb3I6IGVyci5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYEZhaWxlZCB0byBzZXQgdG9waWM6ICR7ZXJyLm1lc3NhZ2V9YCB9OwogICAgfQp9Ci8qKgogKiBTZXQgdGhlIGNoYW5uZWwgcHVycG9zZS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRDaGFubmVsUHVycG9zZShjaGFubmVsSWQsIHB1cnBvc2UpIHsKICAgIGNvbnN0IGNsaWVudCA9IGdldENsaWVudCgpOwogICAgaWYgKCFjbGllbnQpCiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiAiU0xBQ0tfQk9UX1RPS0VOIG5vdCBzZXQiIH07CiAgICBsb2cuZGVidWcoIlNldHRpbmcgY2hhbm5lbCBwdXJwb3NlIiwgeyBjaGFubmVsSWQgfSk7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBzbGFja1Bvc3QoImNvbnZlcnNhdGlvbnMuc2V0UHVycG9zZSIsIHsgY2hhbm5lbDogY2hhbm5lbElkLCBwdXJwb3NlIH0pOwogICAgICAgIGlmICghZGF0YS5vaykgewogICAgICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBzZXQgY2hhbm5lbCBwdXJwb3NlIiwgeyBjaGFubmVsSWQsIGVycm9yOiBkYXRhLmVycm9yIH0pOwogICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGRhdGEuZXJyb3IgPz8gIkZhaWxlZCB0byBzZXQgcHVycG9zZSIgfTsKICAgICAgICB9CiAgICAgICAgbG9nLmluZm8oIkNoYW5uZWwgcHVycG9zZSB1cGRhdGVkIiwgeyBjaGFubmVsSWQgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIG1lc3NhZ2U6ICJQdXJwb3NlIHVwZGF0ZWQiIH07CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgbG9nLmVycm9yKCJDaGFubmVsIHB1cnBvc2UgdXBkYXRlIGZhaWxlZCIsIHsgY2hhbm5lbElkLCBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgRmFpbGVkIHRvIHNldCBwdXJwb3NlOiAke2Vyci5tZXNzYWdlfWAgfTsKICAgIH0KfQovLyDilIDilIAgUG9zdGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFBvc3QgYSBtZXNzYWdlIHRvIGEgY2hhbm5lbCB3aXRoIGFjdGl2aXR5IGxvZ2dpbmcuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9zdE1lc3NhZ2UoY2hhbm5lbCwgdGV4dCwgb3B0cykgewogICAgY29uc3QgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CiAgICBpZiAoIWNsaWVudCkKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiAiU0xBQ0tfQk9UX1RPS0VOIG5vdCBzZXQiIH07CiAgICBsb2cuZGVidWcoIlBvc3RpbmcgbWVzc2FnZSB0byBjaGFubmVsIiwgeyBjaGFubmVsSWQ6IGNoYW5uZWwsIHRocmVhZFRzOiBvcHRzPy50aHJlYWRfdHMgfSk7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuc2VuZE1lc3NhZ2UoY2hhbm5lbCwgdGV4dCwgb3B0cyk7CiAgICBpZiAocmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nLmluZm8oIk1lc3NhZ2UgcG9zdGVkIHRvIGNoYW5uZWwiLCB7IGNoYW5uZWxJZDogY2hhbm5lbCwgdHM6IHJlc3VsdC50cyB9KTsKICAgICAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogInNsYWNrIiwgc3VtbWFyeTogYE1lc3NhZ2UgcG9zdGVkIHRvICR7Y2hhbm5lbH1gIH0pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gcG9zdCBtZXNzYWdlIiwgeyBjaGFubmVsSWQ6IGNoYW5uZWwsIGVycm9yOiByZXN1bHQuZXJyb3IgfSk7CiAgICB9CiAgICByZXR1cm4geyBvazogcmVzdWx0Lm9rLCB0czogcmVzdWx0LnRzIHx8IHVuZGVmaW5lZCwgZXJyb3I6IHJlc3VsdC5lcnJvciB9Owp9Ci8qKgogKiBQb3N0IGEgdGhyZWFkZWQgcmVwbHkuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9zdFRocmVhZFJlcGx5KGNoYW5uZWwsIHRocmVhZFRzLCB0ZXh0LCBvcHRzKSB7CiAgICBjb25zdCBjbGllbnQgPSBnZXRDbGllbnQoKTsKICAgIGlmICghY2xpZW50KQogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6ICJTTEFDS19CT1RfVE9LRU4gbm90IHNldCIgfTsKICAgIGxvZy5kZWJ1ZygiUG9zdGluZyB0aHJlYWQgcmVwbHkiLCB7IGNoYW5uZWxJZDogY2hhbm5lbCwgdGhyZWFkVHMgfSk7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQucmVwbHlJblRocmVhZChjaGFubmVsLCB0aHJlYWRUcywgdGV4dCwgb3B0cyk7CiAgICBpZiAocmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nLmluZm8oIlRocmVhZCByZXBseSBwb3N0ZWQiLCB7IGNoYW5uZWxJZDogY2hhbm5lbCwgdGhyZWFkVHMsIHRzOiByZXN1bHQudHMgfSk7CiAgICAgICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJzbGFjayIsIHN1bW1hcnk6IGBUaHJlYWQgcmVwbHkgcG9zdGVkIGluICR7Y2hhbm5lbH1gIH0pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gcG9zdCB0aHJlYWQgcmVwbHkiLCB7IGNoYW5uZWxJZDogY2hhbm5lbCwgdGhyZWFkVHMsIGVycm9yOiByZXN1bHQuZXJyb3IgfSk7CiAgICB9CiAgICByZXR1cm4geyBvazogcmVzdWx0Lm9rLCB0czogcmVzdWx0LnRzIHx8IHVuZGVmaW5lZCwgZXJyb3I6IHJlc3VsdC5lcnJvciB9Owp9Ci8vIOKUgOKUgCBIaXN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogRmV0Y2ggcmVjZW50IG1lc3NhZ2VzIGZyb20gYSBjaGFubmVsLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENoYW5uZWxIaXN0b3J5KGNoYW5uZWxJZCwgb3B0cykgewogICAgY29uc3QgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CiAgICBpZiAoIWNsaWVudCkKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6ICJTTEFDS19CT1RfVE9LRU4gbm90IHNldCIgfTsKICAgIGxvZy5kZWJ1ZygiRmV0Y2hpbmcgY2hhbm5lbCBoaXN0b3J5IiwgeyBjaGFubmVsSWQsIGxpbWl0OiBvcHRzPy5saW1pdCB9KTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHNsYWNrUG9zdCgiY29udmVyc2F0aW9ucy5oaXN0b3J5IiwgewogICAgICAgICAgICBjaGFubmVsOiBjaGFubmVsSWQsCiAgICAgICAgICAgIGxpbWl0OiBvcHRzPy5saW1pdCA/PyAyMCwKICAgICAgICAgICAgb2xkZXN0OiBvcHRzPy5vbGRlc3QsCiAgICAgICAgICAgIGxhdGVzdDogb3B0cz8ubGF0ZXN0LAogICAgICAgIH0pOwogICAgICAgIGlmICghZGF0YS5vaykgewogICAgICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCBjaGFubmVsIGhpc3RvcnkiLCB7IGNoYW5uZWxJZCwgZXJyb3I6IGRhdGEuZXJyb3IgfSk7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogZGF0YS5lcnJvciA/PyAiRmFpbGVkIHRvIGdldCBoaXN0b3J5IiB9OwogICAgICAgIH0KICAgICAgICBjb25zdCBtZXNzYWdlcyA9IChkYXRhLm1lc3NhZ2VzID8/IFtdKS5tYXAoKG0pID0+ICh7CiAgICAgICAgICAgIHVzZXI6IG0udXNlciwKICAgICAgICAgICAgdGV4dDogbS50ZXh0ID8/ICIiLAogICAgICAgICAgICB0czogbS50cywKICAgICAgICAgICAgdGhyZWFkX3RzOiBtLnRocmVhZF90cywKICAgICAgICB9KSk7CiAgICAgICAgbG9nLmRlYnVnKCJDaGFubmVsIGhpc3RvcnkgZmV0Y2hlZCIsIHsgY2hhbm5lbElkLCBtZXNzYWdlQ291bnQ6IG1lc3NhZ2VzLmxlbmd0aCB9KTsKICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgbWVzc2FnZXMsIG1lc3NhZ2U6IGBGZXRjaGVkICR7bWVzc2FnZXMubGVuZ3RofSBtZXNzYWdlc2AgfTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cuZXJyb3IoIkNoYW5uZWwgaGlzdG9yeSBmZXRjaCBmYWlsZWQiLCB7IGNoYW5uZWxJZCwgZXJyb3I6IGVyci5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYEZhaWxlZCB0byBnZXQgaGlzdG9yeTogJHtlcnIubWVzc2FnZX1gIH07CiAgICB9Cn0KLyoqCiAqIEZldGNoIHRocmVhZCByZXBsaWVzLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRocmVhZFJlcGxpZXMoY2hhbm5lbElkLCB0aHJlYWRUcywgb3B0cykgewogICAgY29uc3QgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CiAgICBpZiAoIWNsaWVudCkKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6ICJTTEFDS19CT1RfVE9LRU4gbm90IHNldCIgfTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHNsYWNrUG9zdCgiY29udmVyc2F0aW9ucy5yZXBsaWVzIiwgewogICAgICAgICAgICBjaGFubmVsOiBjaGFubmVsSWQsCiAgICAgICAgICAgIHRzOiB0aHJlYWRUcywKICAgICAgICAgICAgbGltaXQ6IG9wdHM/LmxpbWl0ID8/IDUwLAogICAgICAgIH0pOwogICAgICAgIGlmICghZGF0YS5vaykKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBkYXRhLmVycm9yID8/ICJGYWlsZWQgdG8gZ2V0IHJlcGxpZXMiIH07CiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSAoZGF0YS5tZXNzYWdlcyA/PyBbXSkubWFwKChtKSA9PiAoewogICAgICAgICAgICB1c2VyOiBtLnVzZXIsCiAgICAgICAgICAgIHRleHQ6IG0udGV4dCA/PyAiIiwKICAgICAgICAgICAgdHM6IG0udHMsCiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBtZXNzYWdlcywgbWVzc2FnZTogYEZldGNoZWQgJHttZXNzYWdlcy5sZW5ndGh9IHJlcGxpZXNgIH07CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgRmFpbGVkIHRvIGdldCByZXBsaWVzOiAke2Vyci5tZXNzYWdlfWAgfTsKICAgIH0KfQovLyDilIDilIAgSW50ZXJuYWwgaGVscGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKiogTWFrZSBhIHJhdyBhdXRoZW50aWNhdGVkIFNsYWNrIEFQSSBQT1NULiBVc2VkIGJ5IGNoYW5uZWwgZnVuY3Rpb25zLiAqLwphc3luYyBmdW5jdGlvbiBzbGFja1Bvc3QoZW5kcG9pbnQsIGJvZHkpIHsKICAgIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnYuU0xBQ0tfQk9UX1RPS0VOOwogICAgaWYgKCF0b2tlbikKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlNMQUNLX0JPVF9UT0tFTiBub3Qgc2V0Iik7CiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9zbGFjay5jb20vYXBpLyR7ZW5kcG9pbnR9YCwgewogICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsCiAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCIsCiAgICAgICAgfSwKICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTVfMDAwKSwKICAgIH0pOwogICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1jaGFubmVscy5qcy5tYXA=","slack/client.js":"LyoqCiAqIFNsYWNrIFdlYiBBUEkgY2xpZW50IOKAlCBsYXp5IHNpbmdsZXRvbiB3aXRoIHJldHJ5IGxvZ2ljLgogKiBSYXcgZmV0Y2gsIG5vIFNESy4gRm9sbG93cyBzcmMvZ29vZ2xlL2F1dGgudHMgKyBzcmMvbGluZWFyL2NsaWVudC50cyBwYXR0ZXJuLgogKgogKiBCb3QgdG9rZW4gc3RvcmVkIGluIHZhdWx0IGFzIFNMQUNLX0JPVF9UT0tFTiAoeG94Yi0uLi4pLgogKiBPQXV0aCBjcmVkZW50aWFsczogU0xBQ0tfQ0xJRU5UX0lELCBTTEFDS19DTElFTlRfU0VDUkVULgogKgogKiBOZXZlciB0aHJvd3MgaW4gcHVibGljIG1ldGhvZHMg4oCUIHJldHVybnMgeyBvaywgZGF0YT8sIGVycm9yPyB9LgogKi8KaW1wb3J0IHsgd2l0aFJldHJ5LCBjbGFzc2lmeUVycm9yLCBTbGFja0FwaUVycm9yIH0gZnJvbSAiLi9yZXRyeS5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigic2xhY2suY2xpZW50Iik7Ci8vIOKUgOKUgCBPQXV0aCBjb25maWcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNvbnN0IFNMQUNLX09BVVRIX1VSTCA9ICJodHRwczovL3NsYWNrLmNvbS9vYXV0aC92Mi9hdXRob3JpemUiOwpjb25zdCBTTEFDS19UT0tFTl9VUkwgPSAiaHR0cHM6Ly9zbGFjay5jb20vYXBpL29hdXRoLnYyLmFjY2VzcyI7CmNvbnN0IFNMQUNLX0FQSV9CQVNFID0gImh0dHBzOi8vc2xhY2suY29tL2FwaSI7Ci8qKiBCb3Qgc2NvcGVzIHJlcXVlc3RlZCBkdXJpbmcgT0F1dGggaW5zdGFsbC4gKi8KZXhwb3J0IGNvbnN0IFNMQUNLX0JPVF9TQ09QRVMgPSBbCiAgICAiYXBwX21lbnRpb25zOnJlYWQiLAogICAgImNoYW5uZWxzOmhpc3RvcnkiLAogICAgImNoYW5uZWxzOmpvaW4iLAogICAgImNoYW5uZWxzOnJlYWQiLAogICAgImNoYXQ6d3JpdGUiLAogICAgImNvbW1hbmRzIiwKICAgICJmaWxlczpyZWFkIiwKICAgICJmaWxlczp3cml0ZSIsCiAgICAiZ3JvdXBzOnJlYWQiLAogICAgImltOmhpc3RvcnkiLAogICAgImltOnJlYWQiLAogICAgImltOndyaXRlIiwKICAgICJtcGltOnJlYWQiLAogICAgInJlYWN0aW9uczpyZWFkIiwKICAgICJyZWFjdGlvbnM6d3JpdGUiLAogICAgInVzZXJzOnJlYWQiLAogICAgInVzZXJzOnJlYWQuZW1haWwiLApdOwpjb25zdCBSRVFVSVJFRF9PQVVUSF9WQVJTID0gWyJTTEFDS19DTElFTlRfSUQiLCAiU0xBQ0tfQ0xJRU5UX1NFQ1JFVCJdOwovLyDilIDilIAgQXV0aCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogQ2hlY2sgaWYgU2xhY2sgT0F1dGggaXMgY29uZmlndXJlZCAoY2xpZW50IElEICsgc2VjcmV0IGluIHZhdWx0KS4KICovCmV4cG9ydCBmdW5jdGlvbiBpc1NsYWNrQ29uZmlndXJlZCgpIHsKICAgIHJldHVybiAhIXByb2Nlc3MuZW52LlNMQUNLX0NMSUVOVF9JRCAmJiAhIXByb2Nlc3MuZW52LlNMQUNLX0NMSUVOVF9TRUNSRVQ7Cn0KLyoqCiAqIENoZWNrIGlmIFNsYWNrIGlzIGF1dGhlbnRpY2F0ZWQgKGJvdCB0b2tlbiBleGlzdHMpLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGlzU2xhY2tBdXRoZW50aWNhdGVkKCkgewogICAgcmV0dXJuICEhcHJvY2Vzcy5lbnYuU0xBQ0tfQk9UX1RPS0VOOwp9Ci8qKgogKiBCdWlsZCB0aGUgU2xhY2sgT0F1dGggYXV0aG9yaXphdGlvbiBVUkwgZm9yIHRoZSBBZGQgdG8gU2xhY2sgZmxvdy4KICovCmV4cG9ydCBmdW5jdGlvbiBnZXRPQXV0aFVybChyZWRpcmVjdFVyaSkgewogICAgY29uc3QgbWlzc2luZyA9IFJFUVVJUkVEX09BVVRIX1ZBUlMuZmlsdGVyKCh2KSA9PiAhcHJvY2Vzcy5lbnZbdl0pOwogICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkgewogICAgICAgIGxvZy53YXJuKCJPQXV0aCBVUkwgZ2VuZXJhdGlvbiBmYWlsZWQ6IG1pc3NpbmcgdmF1bHQga2V5cyIsIHsgbWlzc2luZyB9KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBvazogZmFsc2UsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBNaXNzaW5nIHZhdWx0IGtleXM6ICR7bWlzc2luZy5qb2luKCIsICIpfS4gQWRkIFNMQUNLX0NMSUVOVF9JRCBhbmQgU0xBQ0tfQ0xJRU5UX1NFQ1JFVCBpbiB2YXVsdCBzZXR0aW5ncy5gLAogICAgICAgIH07CiAgICB9CiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsKICAgICAgICBjbGllbnRfaWQ6IHByb2Nlc3MuZW52LlNMQUNLX0NMSUVOVF9JRCwKICAgICAgICBzY29wZTogU0xBQ0tfQk9UX1NDT1BFUy5qb2luKCIsIiksCiAgICAgICAgcmVkaXJlY3RfdXJpOiByZWRpcmVjdFVyaSwKICAgIH0pOwogICAgbG9nLmRlYnVnKCJPQXV0aCBVUkwgZ2VuZXJhdGVkIiwgeyByZWRpcmVjdFVyaSB9KTsKICAgIHJldHVybiB7CiAgICAgICAgb2s6IHRydWUsCiAgICAgICAgdXJsOiBgJHtTTEFDS19PQVVUSF9VUkx9PyR7cGFyYW1zLnRvU3RyaW5nKCl9YCwKICAgICAgICBtZXNzYWdlOiAiT0F1dGggVVJMIGdlbmVyYXRlZCIsCiAgICB9Owp9Ci8qKgogKiBFeGNoYW5nZSBhbiBhdXRob3JpemF0aW9uIGNvZGUgZm9yIGEgYm90IGFjY2VzcyB0b2tlbi4KICogUmV0dXJucyB0aGUgYm90IHRva2VuIHRvIGJlIHN0b3JlZCBpbiB2YXVsdC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGNoYW5nZU9BdXRoQ29kZShjb2RlLCByZWRpcmVjdFVyaSkgewogICAgY29uc3QgbWlzc2luZyA9IFJFUVVJUkVEX09BVVRIX1ZBUlMuZmlsdGVyKCh2KSA9PiAhcHJvY2Vzcy5lbnZbdl0pOwogICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkgewogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYE1pc3NpbmcgdmF1bHQga2V5czogJHttaXNzaW5nLmpvaW4oIiwgIil9YCB9OwogICAgfQogICAgbG9nLmRlYnVnKCJFeGNoYW5naW5nIE9BdXRoIGNvZGUgZm9yIGJvdCB0b2tlbiIsIHsgcmVkaXJlY3RVcmkgfSk7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoewogICAgICAgICAgICBjbGllbnRfaWQ6IHByb2Nlc3MuZW52LlNMQUNLX0NMSUVOVF9JRCwKICAgICAgICAgICAgY2xpZW50X3NlY3JldDogcHJvY2Vzcy5lbnYuU0xBQ0tfQ0xJRU5UX1NFQ1JFVCwKICAgICAgICAgICAgY29kZSwKICAgICAgICAgICAgcmVkaXJlY3RfdXJpOiByZWRpcmVjdFVyaSwKICAgICAgICB9KTsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChTTEFDS19UT0tFTl9VUkwsIHsKICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICAgIGhlYWRlcnM6IHsgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiIH0sCiAgICAgICAgICAgIGJvZHk6IHBhcmFtcy50b1N0cmluZygpLAogICAgICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTVfMDAwKSwKICAgICAgICB9KTsKICAgICAgICBpZiAoIXJlcy5vaykgewogICAgICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLnRleHQoKTsKICAgICAgICAgICAgbG9nLmVycm9yKCJPQXV0aCB0b2tlbiBleGNoYW5nZSBIVFRQIGVycm9yIiwgeyBzdGF0dXM6IHJlcy5zdGF0dXMsIGJvZHkgfSk7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYFNsYWNrIHRva2VuIGVycm9yICgke3Jlcy5zdGF0dXN9KTogJHtib2R5fWAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKTsKICAgICAgICBpZiAoIWRhdGEub2sgfHwgIWRhdGEuYWNjZXNzX3Rva2VuKSB7CiAgICAgICAgICAgIGxvZy5lcnJvcigiT0F1dGggdG9rZW4gZXhjaGFuZ2UgcmV0dXJuZWQgZXJyb3IiLCB7IGVycm9yOiBkYXRhLmVycm9yID8/ICJObyB0b2tlbiByZXR1cm5lZCIgfSk7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogZGF0YS5lcnJvciA/PyAiTm8gdG9rZW4gcmV0dXJuZWQiIH07CiAgICAgICAgfQogICAgICAgIGxvZy5pbmZvKCJPQXV0aCB0b2tlbiBleGNoYW5nZWQgc3VjY2Vzc2Z1bGx5IiwgeyB0ZWFtSWQ6IGRhdGEudGVhbT8uaWQsIHRlYW1OYW1lOiBkYXRhLnRlYW0/Lm5hbWUgfSk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgb2s6IHRydWUsCiAgICAgICAgICAgIGJvdFRva2VuOiBkYXRhLmFjY2Vzc190b2tlbiwKICAgICAgICAgICAgdGVhbUlkOiBkYXRhLnRlYW0/LmlkLAogICAgICAgICAgICB0ZWFtTmFtZTogZGF0YS50ZWFtPy5uYW1lLAogICAgICAgICAgICBib3RVc2VySWQ6IGRhdGEuYm90X3VzZXJfaWQsCiAgICAgICAgICAgIG1lc3NhZ2U6ICJCb3QgdG9rZW4gZXhjaGFuZ2VkIHN1Y2Nlc3NmdWxseSIsCiAgICAgICAgfTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBsb2cuZXJyb3IoIk9BdXRoIHRva2VuIGV4Y2hhbmdlIGZhaWxlZCIsIHsgZXJyb3I6IGVyci5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYFRva2VuIGV4Y2hhbmdlIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gIH07CiAgICB9Cn0KLy8g4pSA4pSAIExhenkgc2luZ2xldG9uIGNsaWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKbGV0IF9jbGllbnQgPSBudWxsOwpsZXQgX2xhc3RUb2tlbiA9ICIiOwovKiogQXV0aCB2YWxpZGF0aW9uIGNhY2hlLiAqLwpsZXQgX2F1dGhWYWxpZCA9IG51bGw7CmxldCBfYXV0aENoZWNrZWRBdCA9IDA7CmNvbnN0IEFVVEhfQ0FDSEVfVFRMX01TID0gNSAqIDYwICogMTAwMDsKLyoqCiAqIEdldCBvciBjcmVhdGUgdGhlIHNpbmdsZXRvbiBTbGFjayBjbGllbnQuCiAqIFJldHVybnMgbnVsbCBpZiBTTEFDS19CT1RfVE9LRU4gaXMgbm90IHNldC4KICovCmV4cG9ydCBmdW5jdGlvbiBnZXRDbGllbnQoKSB7CiAgICBjb25zdCB0b2tlbiA9IHByb2Nlc3MuZW52LlNMQUNLX0JPVF9UT0tFTjsKICAgIGlmICghdG9rZW4pIHsKICAgICAgICBsb2cuZGVidWcoImdldENsaWVudCBjYWxsZWQgYnV0IFNMQUNLX0JPVF9UT0tFTiBub3Qgc2V0Iik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAodG9rZW4gIT09IF9sYXN0VG9rZW4pIHsKICAgICAgICBsb2cuaW5mbygiQ3JlYXRpbmcgbmV3IFNsYWNrQ2xpZW50IGluc3RhbmNlICh0b2tlbiBjaGFuZ2VkKSIpOwogICAgICAgIF9jbGllbnQgPSBuZXcgU2xhY2tDbGllbnQodG9rZW4pOwogICAgICAgIF9sYXN0VG9rZW4gPSB0b2tlbjsKICAgICAgICBfYXV0aFZhbGlkID0gbnVsbDsKICAgICAgICBfYXV0aENoZWNrZWRBdCA9IDA7CiAgICB9CiAgICByZXR1cm4gX2NsaWVudDsKfQovLyDilIDilIAgQ2xpZW50IGNsYXNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgY2xhc3MgU2xhY2tDbGllbnQgewogICAgdG9rZW47CiAgICAvKiogTGFzdCBlcnJvciBraW5kIGZvciBoZWFsdGggcmVwb3J0aW5nLiAqLwogICAgbGFzdEVycm9yS2luZCA9IG51bGw7CiAgICBsYXN0RXJyb3JNZXNzYWdlID0gbnVsbDsKICAgIGNvbnN0cnVjdG9yKHRva2VuKSB7CiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuOwogICAgfQogICAgLy8g4pSA4pSAIExvdy1sZXZlbCByZXF1ZXN0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLyoqCiAgICAgKiBNYWtlIGFuIGF1dGhlbnRpY2F0ZWQgU2xhY2sgQVBJIHJlcXVlc3QgKEpTT04gYm9keSkuCiAgICAgKiBUaHJvd3MgU2xhY2tBcGlFcnJvciBvbiBmYWlsdXJlLgogICAgICovCiAgICBhc3luYyByZXF1ZXN0KGVuZHBvaW50LCBib2R5KSB7CiAgICAgICAgY29uc3QgdXJsID0gYCR7U0xBQ0tfQVBJX0JBU0V9LyR7ZW5kcG9pbnR9YDsKICAgICAgICBsb2cuZGVidWcoIkFQSSByZXF1ZXN0IHN0YXJ0aW5nIiwgeyBlbmRwb2ludCB9KTsKICAgICAgICBjb25zdCBvcHRpb25zID0gewogICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMudG9rZW59YCwKICAgICAgICAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxNV8wMDApLAogICAgICAgIH07CiAgICAgICAgaWYgKGJvZHkpIHsKICAgICAgICAgICAgb3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7CiAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKTsKICAgICAgICBpZiAoIWRhdGEub2spIHsKICAgICAgICAgICAgY29uc3Qga2luZCA9IGNsYXNzaWZ5RXJyb3IoZGF0YS5lcnJvciA/PyBgSFRUUCAke3Jlcy5zdGF0dXN9YCk7CiAgICAgICAgICAgIGlmIChraW5kID09PSAicmF0ZV9saW1pdCIpIHsKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJSYXRlIGxpbWl0ZWQgYnkgU2xhY2sgQVBJIiwgeyBlbmRwb2ludCwgc3RhdHVzOiByZXMuc3RhdHVzIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbG9nLmVycm9yKCJTbGFjayBBUEkgZXJyb3IgcmVzcG9uc2UiLCB7IGVuZHBvaW50LCBlcnJvcjogZGF0YS5lcnJvciwgc3RhdHVzOiByZXMuc3RhdHVzLCBraW5kIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IG5ldyBTbGFja0FwaUVycm9yKGRhdGEuZXJyb3IgPz8gYFNsYWNrIEFQSSBlcnJvciAoJHtyZXMuc3RhdHVzfSlgLCBraW5kLCByZXMuc3RhdHVzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICAvLyDilIDilIAgQXV0aCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8qKgogICAgICogVmFsaWRhdGUgdGhlIGJvdCB0b2tlbiBieSBjYWxsaW5nIGF1dGgudGVzdC4KICAgICAqIENhY2hlcyB0aGUgcmVzdWx0IGZvciA1IG1pbnV0ZXMuCiAgICAgKi8KICAgIGFzeW5jIHZhbGlkYXRlQXV0aCgpIHsKICAgICAgICBpZiAoX2F1dGhWYWxpZCAhPT0gbnVsbCAmJiBEYXRlLm5vdygpIC0gX2F1dGhDaGVja2VkQXQgPCBBVVRIX0NBQ0hFX1RUTF9NUykgewogICAgICAgICAgICBsb2cuZGVidWcoIkF1dGggdmFsaWRhdGlvbiByZXR1cm5lZCBmcm9tIGNhY2hlIiwgeyB2YWxpZDogX2F1dGhWYWxpZCB9KTsKICAgICAgICAgICAgcmV0dXJuIF9hdXRoVmFsaWQgPyB7IHZhbGlkOiB0cnVlIH0gOiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICJUb2tlbiBpbnZhbGlkIChjYWNoZWQpIiB9OwogICAgICAgIH0KICAgICAgICBsb2cuZGVidWcoIlZhbGlkYXRpbmcgYXV0aCB0b2tlbiB2aWEgYXV0aC50ZXN0Iik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiB0aGlzLnJlcXVlc3QoImF1dGgudGVzdCIpLCB7IGxhYmVsOiAidmFsaWRhdGVBdXRoIiwgbWF4QXR0ZW1wdHM6IDIgfSk7CiAgICAgICAgICAgIF9hdXRoVmFsaWQgPSB0cnVlOwogICAgICAgICAgICBfYXV0aENoZWNrZWRBdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yS2luZCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yTWVzc2FnZSA9IG51bGw7CiAgICAgICAgICAgIGxvZy5pbmZvKCJBdXRoIHZhbGlkYXRpb24gc3VjY2VlZGVkIiwgeyB1c2VySWQ6IGRhdGEudXNlcl9pZCwgdGVhbUlkOiBkYXRhLnRlYW1faWQgfSk7CiAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCB1c2VySWQ6IGRhdGEudXNlcl9pZCwgdGVhbUlkOiBkYXRhLnRlYW1faWQgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICBfYXV0aFZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgIF9hdXRoQ2hlY2tlZEF0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgICAgICB0aGlzLmxhc3RFcnJvcktpbmQgPSBjbGFzc2lmeUVycm9yKGVycik7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yTWVzc2FnZSA9IG1zZzsKICAgICAgICAgICAgbG9nLmVycm9yKCJBdXRoIHZhbGlkYXRpb24gZmFpbGVkIiwgeyBlcnJvcjogbXNnLCBlcnJvcktpbmQ6IHRoaXMubGFzdEVycm9yS2luZCB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogbXNnIH07CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUZXN0IGF1dGggYW5kIHJldHVybiBiYXNpYyBpbmZvLiBOZXZlciB0aHJvd3MuCiAgICAgKi8KICAgIGFzeW5jIHRlc3RBdXRoKCkgewogICAgICAgIGxvZy5kZWJ1ZygiVGVzdGluZyBhdXRoIHZpYSBhdXRoLnRlc3QiKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgd2l0aFJldHJ5KCgpID0+IHRoaXMucmVxdWVzdCgiYXV0aC50ZXN0IiksIHsgbGFiZWw6ICJ0ZXN0QXV0aCIgfSk7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yS2luZCA9IG51bGw7CiAgICAgICAgICAgIGxvZy5pbmZvKCJBdXRoIHRlc3Qgc3VjY2VlZGVkIiwgeyB1c2VySWQ6IGRhdGEudXNlcl9pZCwgdGVhbUlkOiBkYXRhLnRlYW1faWQsIHRlYW06IGRhdGEudGVhbSB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIHVzZXJJZDogZGF0YS51c2VyX2lkLCB0ZWFtSWQ6IGRhdGEudGVhbV9pZCwgdGVhbTogZGF0YS50ZWFtLCBtZXNzYWdlOiAiQXV0aCBzdWNjZXNzZnVsIiB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yS2luZCA9IGNsYXNzaWZ5RXJyb3IoZXJyKTsKICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3JNZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgICAgICBsb2cuZXJyb3IoIkF1dGggdGVzdCBmYWlsZWQiLCB7IGVycm9yOiB0aGlzLmxhc3RFcnJvck1lc3NhZ2UsIGVycm9yS2luZDogdGhpcy5sYXN0RXJyb3JLaW5kIH0pOwogICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IHRoaXMubGFzdEVycm9yTWVzc2FnZSB9OwogICAgICAgIH0KICAgIH0KICAgIC8vIOKUgOKUgCBNZXNzYWdlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8qKgogICAgICogU2VuZCBhIG1lc3NhZ2UgdG8gYSBjaGFubmVsIG9yIERNLgogICAgICovCiAgICBhc3luYyBzZW5kTWVzc2FnZShjaGFubmVsLCB0ZXh0LCBvcHRzKSB7CiAgICAgICAgbG9nLmRlYnVnKCJTZW5kaW5nIG1lc3NhZ2UiLCB7IGNoYW5uZWxJZDogY2hhbm5lbCwgdGhyZWFkVHM6IG9wdHM/LnRocmVhZF90cywgaGFzQmxvY2tzOiAhIW9wdHM/LmJsb2NrcyB9KTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gewogICAgICAgICAgICAgICAgY2hhbm5lbCwKICAgICAgICAgICAgICAgIHRleHQsCiAgICAgICAgICAgICAgICB0aHJlYWRfdHM6IG9wdHM/LnRocmVhZF90cywKICAgICAgICAgICAgICAgIGJsb2Nrczogb3B0cz8uYmxvY2tzLAogICAgICAgICAgICAgICAgdW5mdXJsX2xpbmtzOiBvcHRzPy51bmZ1cmxfbGlua3MsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiB0aGlzLnJlcXVlc3QoImNoYXQucG9zdE1lc3NhZ2UiLCBwYXlsb2FkKSwgeyBsYWJlbDogInNlbmRNZXNzYWdlIiB9KTsKICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3JLaW5kID0gbnVsbDsKICAgICAgICAgICAgbG9nLmluZm8oIk1lc3NhZ2Ugc2VudCIsIHsgY2hhbm5lbElkOiBjaGFubmVsLCB0czogcmVzdWx0LnRzIH0pOwogICAgICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgY2hhbm5lbCwgdHM6IHJlc3VsdC50cywgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmxhc3RFcnJvcktpbmQgPSBjbGFzc2lmeUVycm9yKGVycik7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yTWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gc2VuZCBtZXNzYWdlIiwgeyBjaGFubmVsSWQ6IGNoYW5uZWwsIGVycm9yOiB0aGlzLmxhc3RFcnJvck1lc3NhZ2UsIGVycm9yS2luZDogdGhpcy5sYXN0RXJyb3JLaW5kIH0pOwogICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGNoYW5uZWwsIHRzOiAiIiwgZXJyb3I6IHRoaXMubGFzdEVycm9yTWVzc2FnZSB9OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGFuIGV4aXN0aW5nIG1lc3NhZ2UuCiAgICAgKi8KICAgIGFzeW5jIHVwZGF0ZU1lc3NhZ2UoY2hhbm5lbCwgdHMsIHRleHQsIG9wdHMpIHsKICAgICAgICBsb2cuZGVidWcoIlVwZGF0aW5nIG1lc3NhZ2UiLCB7IGNoYW5uZWxJZDogY2hhbm5lbCwgdHMgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aFJldHJ5KCgpID0+IHRoaXMucmVxdWVzdCgiY2hhdC51cGRhdGUiLCB7CiAgICAgICAgICAgICAgICBjaGFubmVsLAogICAgICAgICAgICAgICAgdHMsCiAgICAgICAgICAgICAgICB0ZXh0LAogICAgICAgICAgICAgICAgYmxvY2tzOiBvcHRzPy5ibG9ja3MsCiAgICAgICAgICAgIH0pLCB7IGxhYmVsOiAidXBkYXRlTWVzc2FnZSIgfSk7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yS2luZCA9IG51bGw7CiAgICAgICAgICAgIGxvZy5pbmZvKCJNZXNzYWdlIHVwZGF0ZWQiLCB7IGNoYW5uZWxJZDogY2hhbm5lbCwgdHM6IHJlc3VsdC50cyB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGNoYW5uZWwsIHRzOiByZXN1bHQudHMsIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3JLaW5kID0gY2xhc3NpZnlFcnJvcihlcnIpOwogICAgICAgICAgICB0aGlzLmxhc3RFcnJvck1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIHVwZGF0ZSBtZXNzYWdlIiwgeyBjaGFubmVsSWQ6IGNoYW5uZWwsIHRzLCBlcnJvcjogdGhpcy5sYXN0RXJyb3JNZXNzYWdlIH0pOwogICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGNoYW5uZWwsIHRzOiAiIiwgZXJyb3I6IHRoaXMubGFzdEVycm9yTWVzc2FnZSB9OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRGVsZXRlIGEgbWVzc2FnZS4KICAgICAqLwogICAgYXN5bmMgZGVsZXRlTWVzc2FnZShjaGFubmVsLCB0cykgewogICAgICAgIGxvZy5kZWJ1ZygiRGVsZXRpbmcgbWVzc2FnZSIsIHsgY2hhbm5lbElkOiBjaGFubmVsLCB0cyB9KTsKICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCB3aXRoUmV0cnkoKCkgPT4gdGhpcy5yZXF1ZXN0KCJjaGF0LmRlbGV0ZSIsIHsgY2hhbm5lbCwgdHMgfSksIHsgbGFiZWw6ICJkZWxldGVNZXNzYWdlIiB9KTsKICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3JLaW5kID0gbnVsbDsKICAgICAgICAgICAgbG9nLmluZm8oIk1lc3NhZ2UgZGVsZXRlZCIsIHsgY2hhbm5lbElkOiBjaGFubmVsLCB0cyB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmxhc3RFcnJvcktpbmQgPSBjbGFzc2lmeUVycm9yKGVycik7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yTWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gZGVsZXRlIG1lc3NhZ2UiLCB7IGNoYW5uZWxJZDogY2hhbm5lbCwgdHMsIGVycm9yOiB0aGlzLmxhc3RFcnJvck1lc3NhZ2UgfSk7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IHRoaXMubGFzdEVycm9yTWVzc2FnZSB9OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmVwbHkgaW4gYSB0aHJlYWQgKHNob3J0aGFuZCBmb3Igc2VuZE1lc3NhZ2Ugd2l0aCB0aHJlYWRfdHMpLgogICAgICovCiAgICBhc3luYyByZXBseUluVGhyZWFkKGNoYW5uZWwsIHRocmVhZFRzLCB0ZXh0LCBvcHRzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2UoY2hhbm5lbCwgdGV4dCwgeyB0aHJlYWRfdHM6IHRocmVhZFRzLCBibG9ja3M6IG9wdHM/LmJsb2NrcyB9KTsKICAgIH0KICAgIC8vIOKUgOKUgCBSZWFjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBhc3luYyBhZGRSZWFjdGlvbihjaGFubmVsLCB0cywgZW1vamkpIHsKICAgICAgICBsb2cuZGVidWcoIkFkZGluZyByZWFjdGlvbiIsIHsgY2hhbm5lbElkOiBjaGFubmVsLCB0cywgZW1vamkgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYXdhaXQgd2l0aFJldHJ5KCgpID0+IHRoaXMucmVxdWVzdCgicmVhY3Rpb25zLmFkZCIsIHsgY2hhbm5lbCwgdGltZXN0YW1wOiB0cywgbmFtZTogZW1vamkgfSksIHsgbGFiZWw6ICJhZGRSZWFjdGlvbiIgfSk7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yS2luZCA9IG51bGw7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiB0cnVlIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3JLaW5kID0gY2xhc3NpZnlFcnJvcihlcnIpOwogICAgICAgICAgICB0aGlzLmxhc3RFcnJvck1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIGFkZCByZWFjdGlvbiIsIHsgY2hhbm5lbElkOiBjaGFubmVsLCB0cywgZW1vamksIGVycm9yOiB0aGlzLmxhc3RFcnJvck1lc3NhZ2UgfSk7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IHRoaXMubGFzdEVycm9yTWVzc2FnZSB9OwogICAgICAgIH0KICAgIH0KICAgIGFzeW5jIHJlbW92ZVJlYWN0aW9uKGNoYW5uZWwsIHRzLCBlbW9qaSkgewogICAgICAgIGxvZy5kZWJ1ZygiUmVtb3ZpbmcgcmVhY3Rpb24iLCB7IGNoYW5uZWxJZDogY2hhbm5lbCwgdHMsIGVtb2ppIH0pOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF3YWl0IHdpdGhSZXRyeSgoKSA9PiB0aGlzLnJlcXVlc3QoInJlYWN0aW9ucy5yZW1vdmUiLCB7IGNoYW5uZWwsIHRpbWVzdGFtcDogdHMsIG5hbWU6IGVtb2ppIH0pLCB7IGxhYmVsOiAicmVtb3ZlUmVhY3Rpb24iIH0pOwogICAgICAgICAgICB0aGlzLmxhc3RFcnJvcktpbmQgPSBudWxsOwogICAgICAgICAgICByZXR1cm4geyBvazogdHJ1ZSB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yS2luZCA9IGNsYXNzaWZ5RXJyb3IoZXJyKTsKICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3JNZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byByZW1vdmUgcmVhY3Rpb24iLCB7IGNoYW5uZWxJZDogY2hhbm5lbCwgdHMsIGVtb2ppLCBlcnJvcjogdGhpcy5sYXN0RXJyb3JNZXNzYWdlIH0pOwogICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiB0aGlzLmxhc3RFcnJvck1lc3NhZ2UgfTsKICAgICAgICB9CiAgICB9CiAgICAvLyDilIDilIAgVXNlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBhc3luYyBnZXRVc2VyKHVzZXJJZCkgewogICAgICAgIGxvZy5kZWJ1ZygiRmV0Y2hpbmcgdXNlciBpbmZvIiwgeyB1c2VySWQgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiB0aGlzLnJlcXVlc3QoInVzZXJzLmluZm8iLCB7IHVzZXI6IHVzZXJJZCB9KSwgeyBsYWJlbDogImdldFVzZXIiIH0pOwogICAgICAgICAgICBpZiAoIWRhdGEudXNlcikgewogICAgICAgICAgICAgICAgbG9nLndhcm4oIlVzZXIgbG9va3VwIHJldHVybmVkIG5vIGRhdGEiLCB7IHVzZXJJZCB9KTsKICAgICAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6ICJObyB1c2VyIGRhdGEgcmV0dXJuZWQiIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3JLaW5kID0gbnVsbDsKICAgICAgICAgICAgbG9nLmRlYnVnKCJVc2VyIGluZm8gcmV0cmlldmVkIiwgeyB1c2VySWQsIHVzZXJOYW1lOiBkYXRhLnVzZXIubmFtZSB9KTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG9rOiB0cnVlLAogICAgICAgICAgICAgICAgdXNlcjogewogICAgICAgICAgICAgICAgICAgIGlkOiBkYXRhLnVzZXIuaWQsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogZGF0YS51c2VyLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgcmVhbF9uYW1lOiBkYXRhLnVzZXIucmVhbF9uYW1lLAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfbmFtZTogZGF0YS51c2VyLnByb2ZpbGU/LmRpc3BsYXlfbmFtZSwKICAgICAgICAgICAgICAgICAgICBlbWFpbDogZGF0YS51c2VyLnByb2ZpbGU/LmVtYWlsLAogICAgICAgICAgICAgICAgICAgIGlzX2JvdDogZGF0YS51c2VyLmlzX2JvdCA/PyBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBpc19hZG1pbjogZGF0YS51c2VyLmlzX2FkbWluLAogICAgICAgICAgICAgICAgICAgIHR6OiBkYXRhLnVzZXIudHosCiAgICAgICAgICAgICAgICAgICAgYXZhdGFyOiBkYXRhLnVzZXIucHJvZmlsZT8uaW1hZ2VfNDgsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yS2luZCA9IGNsYXNzaWZ5RXJyb3IoZXJyKTsKICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3JNZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCB1c2VyIGluZm8iLCB7IHVzZXJJZCwgZXJyb3I6IHRoaXMubGFzdEVycm9yTWVzc2FnZSB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogdGhpcy5sYXN0RXJyb3JNZXNzYWdlIH07CiAgICAgICAgfQogICAgfQogICAgYXN5bmMgbG9va3VwVXNlckJ5RW1haWwoZW1haWwpIHsKICAgICAgICBsb2cuZGVidWcoIkxvb2tpbmcgdXAgdXNlciBieSBlbWFpbCIsIHsgZW1haWwgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiB0aGlzLnJlcXVlc3QoInVzZXJzLmxvb2t1cEJ5RW1haWwiLCB7IGVtYWlsIH0pLCB7IGxhYmVsOiAibG9va3VwVXNlckJ5RW1haWwiIH0pOwogICAgICAgICAgICBpZiAoIWRhdGEudXNlcikgewogICAgICAgICAgICAgICAgbG9nLndhcm4oIkVtYWlsIGxvb2t1cCByZXR1cm5lZCBubyB1c2VyIiwgeyBlbWFpbCB9KTsKICAgICAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6ICJObyB1c2VyIGRhdGEgcmV0dXJuZWQiIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3JLaW5kID0gbnVsbDsKICAgICAgICAgICAgbG9nLmRlYnVnKCJVc2VyIGZvdW5kIGJ5IGVtYWlsIiwgeyBlbWFpbCwgdXNlcklkOiBkYXRhLnVzZXIuaWQgfSk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBvazogdHJ1ZSwKICAgICAgICAgICAgICAgIHVzZXI6IHsKICAgICAgICAgICAgICAgICAgICBpZDogZGF0YS51c2VyLmlkLAogICAgICAgICAgICAgICAgICAgIG5hbWU6IGRhdGEudXNlci5uYW1lLAogICAgICAgICAgICAgICAgICAgIHJlYWxfbmFtZTogZGF0YS51c2VyLnJlYWxfbmFtZSwKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X25hbWU6IGRhdGEudXNlci5wcm9maWxlPy5kaXNwbGF5X25hbWUsCiAgICAgICAgICAgICAgICAgICAgZW1haWw6IGRhdGEudXNlci5wcm9maWxlPy5lbWFpbCwKICAgICAgICAgICAgICAgICAgICBpc19ib3Q6IGRhdGEudXNlci5pc19ib3QgPz8gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgaXNfYWRtaW46IGRhdGEudXNlci5pc19hZG1pbiwKICAgICAgICAgICAgICAgICAgICB0ejogZGF0YS51c2VyLnR6LAogICAgICAgICAgICAgICAgICAgIGF2YXRhcjogZGF0YS51c2VyLnByb2ZpbGU/LmltYWdlXzQ4LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmxhc3RFcnJvcktpbmQgPSBjbGFzc2lmeUVycm9yKGVycik7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yTWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gbG9vayB1cCB1c2VyIGJ5IGVtYWlsIiwgeyBlbWFpbCwgZXJyb3I6IHRoaXMubGFzdEVycm9yTWVzc2FnZSB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogdGhpcy5sYXN0RXJyb3JNZXNzYWdlIH07CiAgICAgICAgfQogICAgfQogICAgLy8g4pSA4pSAIEZpbGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLyoqCiAgICAgKiBTaGFyZSBhIHJlbW90ZSBmaWxlIGxpbmsgaW4gYSBjaGFubmVsLgogICAgICogRm9yIGFjdHVhbCBmaWxlIHVwbG9hZHMsIHVzZSBmaWxlcy51cGxvYWRWMiB2aWEgZm9ybS1kYXRhIChub3QgeWV0IGltcGxlbWVudGVkKS4KICAgICAqLwogICAgYXN5bmMgc2hhcmVGaWxlVXJsKGNoYW5uZWwsIHVybCwgdGl0bGUpIHsKICAgICAgICBsb2cuZGVidWcoIlNoYXJpbmcgZmlsZSBVUkwiLCB7IGNoYW5uZWxJZDogY2hhbm5lbCwgdGl0bGUgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gVXNlIGNoYXQudW5mdXJsIG9yIGp1c3Qgc2VuZCBhIGxpbmsg4oCUIFNsYWNrIGF1dG8tdW5mdXJscyBmaWxlIFVSTHMKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kTWVzc2FnZShjaGFubmVsLCBgPCR7dXJsfXwke3RpdGxlfT5gKTsKICAgICAgICAgICAgaWYgKHJlc3VsdC5vaykgewogICAgICAgICAgICAgICAgbG9nLmluZm8oIkZpbGUgVVJMIHNoYXJlZCIsIHsgY2hhbm5lbElkOiBjaGFubmVsLCB0aXRsZSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBvazogcmVzdWx0Lm9rLCBlcnJvcjogcmVzdWx0LmVycm9yIH07CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5sYXN0RXJyb3JLaW5kID0gY2xhc3NpZnlFcnJvcihlcnIpOwogICAgICAgICAgICB0aGlzLmxhc3RFcnJvck1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIHNoYXJlIGZpbGUgVVJMIiwgeyBjaGFubmVsSWQ6IGNoYW5uZWwsIHRpdGxlLCBlcnJvcjogdGhpcy5sYXN0RXJyb3JNZXNzYWdlIH0pOwogICAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiB0aGlzLmxhc3RFcnJvck1lc3NhZ2UgfTsKICAgICAgICB9CiAgICB9CiAgICAvLyDilIDilIAgRE1zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLyoqCiAgICAgKiBPcGVuIGEgRE0gY2hhbm5lbCB3aXRoIGEgdXNlciBhbmQgcmV0dXJuIHRoZSBjb252ZXJzYXRpb24gSUQuCiAgICAgKi8KICAgIGFzeW5jIG9wZW5EbSh1c2VySWQpIHsKICAgICAgICBsb2cuZGVidWcoIk9wZW5pbmcgRE0gY29udmVyc2F0aW9uIiwgeyB1c2VySWQgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHdpdGhSZXRyeSgoKSA9PiB0aGlzLnJlcXVlc3QoImNvbnZlcnNhdGlvbnMub3BlbiIsIHsgdXNlcnM6IHVzZXJJZCB9KSwgeyBsYWJlbDogIm9wZW5EbSIgfSk7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yS2luZCA9IG51bGw7CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiRE0gY29udmVyc2F0aW9uIG9wZW5lZCIsIHsgdXNlcklkLCBjaGFubmVsSWQ6IGRhdGEuY2hhbm5lbD8uaWQgfSk7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBjaGFubmVsSWQ6IGRhdGEuY2hhbm5lbD8uaWQgfTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmxhc3RFcnJvcktpbmQgPSBjbGFzc2lmeUVycm9yKGVycik7CiAgICAgICAgICAgIHRoaXMubGFzdEVycm9yTWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gb3BlbiBETSBjb252ZXJzYXRpb24iLCB7IHVzZXJJZCwgZXJyb3I6IHRoaXMubGFzdEVycm9yTWVzc2FnZSB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogdGhpcy5sYXN0RXJyb3JNZXNzYWdlIH07CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTZW5kIGEgRE0gdG8gYSB1c2VyIChvcGVucyBjb252ZXJzYXRpb24gZmlyc3QsIHRoZW4gc2VuZHMgbWVzc2FnZSkuCiAgICAgKi8KICAgIGFzeW5jIHNlbmREbSh1c2VySWQsIHRleHQsIG9wdHMpIHsKICAgICAgICBsb2cuZGVidWcoIlNlbmRpbmcgRE0iLCB7IHVzZXJJZCB9KTsKICAgICAgICBjb25zdCBkbSA9IGF3YWl0IHRoaXMub3BlbkRtKHVzZXJJZCk7CiAgICAgICAgaWYgKCFkbS5vayB8fCAhZG0uY2hhbm5lbElkKSB7CiAgICAgICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIHNlbmQgRE06IGNvdWxkIG5vdCBvcGVuIGNvbnZlcnNhdGlvbiIsIHsgdXNlcklkLCBlcnJvcjogZG0uZXJyb3IgfSk7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgY2hhbm5lbDogIiIsIHRzOiAiIiwgZXJyb3I6IGRtLmVycm9yID8/ICJGYWlsZWQgdG8gb3BlbiBETSIgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZE1lc3NhZ2UoZG0uY2hhbm5lbElkLCB0ZXh0LCB7IGJsb2Nrczogb3B0cz8uYmxvY2tzIH0pOwogICAgfQogICAgLy8g4pSA4pSAIEhlYWx0aCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGdldEhlYWx0aCgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBhdmFpbGFibGU6ICEhdGhpcy50b2tlbiwKICAgICAgICAgICAgbGFzdEVycm9yOiB0aGlzLmxhc3RFcnJvcktpbmQsCiAgICAgICAgICAgIGxhc3RFcnJvck1lc3NhZ2U6IHRoaXMubGFzdEVycm9yTWVzc2FnZSwKICAgICAgICB9OwogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsaWVudC5qcy5tYXA=","slack/retry.js":"LyoqCiAqIFJldHJ5IHV0aWxpdGllcyBmb3IgU2xhY2sgQVBJIGNhbGxzLgogKiBFeHBvbmVudGlhbCBiYWNrb2ZmIHdpdGggaml0dGVyLCBlcnJvciBjbGFzc2lmaWNhdGlvbiwgYW5kIHN0cnVjdHVyZWQgZXJyb3JzLgogKiBNaXJyb3JzIHNyYy9saW5lYXIvcmV0cnkudHMgcGF0dGVybi4KICovCmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigic2xhY2siKTsKZXhwb3J0IGNsYXNzIFNsYWNrQXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgICBraW5kOwogICAgc3RhdHVzQ29kZTsKICAgIGNhdXNlOwogICAgY29uc3RydWN0b3IobWVzc2FnZSwga2luZCwgc3RhdHVzQ29kZSwgY2F1c2UpIHsKICAgICAgICBzdXBlcihtZXNzYWdlKTsKICAgICAgICB0aGlzLmtpbmQgPSBraW5kOwogICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7CiAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlOwogICAgICAgIHRoaXMubmFtZSA9ICJTbGFja0FwaUVycm9yIjsKICAgIH0KfQovKioKICogQ2xhc3NpZnkgYSBTbGFjayBBUEkgZXJyb3IuCiAqIC0gQXV0aCB0b2tlbnM6IGludmFsaWRfYXV0aCwgbm90X2F1dGhlZCwgdG9rZW5fcmV2b2tlZCwgYWNjb3VudF9pbmFjdGl2ZSDihpIgYXV0aCAoZG9uJ3QgcmV0cnkpCiAqIC0gUmF0ZSBsaW1pdHMgKDQyOSksIHNlcnZlciBlcnJvcnMgKDV4eCksIG5ldHdvcmsgZXJyb3JzIOKGkiB0cmFuc2llbnQgKHJldHJ5KQogKiAtIEV2ZXJ5dGhpbmcgZWxzZSDihpIgcGVybWFuZW50IChkb24ndCByZXRyeSkKICovCmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUVycm9yKGVycikgewogICAgaWYgKGVyciBpbnN0YW5jZW9mIFNsYWNrQXBpRXJyb3IpCiAgICAgICAgcmV0dXJuIGVyci5raW5kOwogICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgY29uc3QgbG93ZXIgPSBtc2cudG9Mb3dlckNhc2UoKTsKICAgIC8vIEF1dGggZmFpbHVyZXMg4oCUIG5ldmVyIHJldHJ5CiAgICBpZiAobG93ZXIuaW5jbHVkZXMoImludmFsaWRfYXV0aCIpIHx8CiAgICAgICAgbG93ZXIuaW5jbHVkZXMoIm5vdF9hdXRoZWQiKSB8fAogICAgICAgIGxvd2VyLmluY2x1ZGVzKCJ0b2tlbl9yZXZva2VkIikgfHwKICAgICAgICBsb3dlci5pbmNsdWRlcygidG9rZW5fZXhwaXJlZCIpIHx8CiAgICAgICAgbG93ZXIuaW5jbHVkZXMoImFjY291bnRfaW5hY3RpdmUiKSB8fAogICAgICAgIGxvd2VyLmluY2x1ZGVzKCJtaXNzaW5nX3Njb3BlIikgfHwKICAgICAgICBsb3dlci5pbmNsdWRlcygiNDAxIikgfHwKICAgICAgICBsb3dlci5pbmNsdWRlcygiNDAzIikpIHsKICAgICAgICByZXR1cm4gImF1dGgiOwogICAgfQogICAgLy8gUmF0ZS1saW1pdGVkIOKAlCByZXRyeWFibGUsIGJ1dCBjbGFzc2lmaWVkIHNlcGFyYXRlbHkgZm9yIGxvZ2dpbmcKICAgIGlmIChsb3dlci5pbmNsdWRlcygiNDI5IikgfHwgbG93ZXIuaW5jbHVkZXMoInJhdGVfbGltaXQiKSB8fCBsb3dlci5pbmNsdWRlcygicmF0ZWxpbWl0ZWQiKSkgewogICAgICAgIHJldHVybiAicmF0ZV9saW1pdCI7CiAgICB9CiAgICBpZiAoL1xiNTBbMC00XVxiLy50ZXN0KG1zZykpCiAgICAgICAgcmV0dXJuICJ0cmFuc2llbnQiOwogICAgLy8gTmV0d29yayBlcnJvcnMg4oCUIHJldHJ5CiAgICBpZiAobG93ZXIuaW5jbHVkZXMoImVjb25ucmVzZXQiKSB8fAogICAgICAgIGxvd2VyLmluY2x1ZGVzKCJldGltZWRvdXQiKSB8fAogICAgICAgIGxvd2VyLmluY2x1ZGVzKCJlY29ubnJlZnVzZWQiKSB8fAogICAgICAgIGxvd2VyLmluY2x1ZGVzKCJlbm90Zm91bmQiKSB8fAogICAgICAgIGxvd2VyLmluY2x1ZGVzKCJmZXRjaCBmYWlsZWQiKSB8fAogICAgICAgIGxvd2VyLmluY2x1ZGVzKCJuZXR3b3JrIikgfHwKICAgICAgICBsb3dlci5pbmNsdWRlcygic29ja2V0IGhhbmcgdXAiKSB8fAogICAgICAgIGxvd2VyLmluY2x1ZGVzKCJhYm9ydGVkIikgfHwKICAgICAgICBsb3dlci5pbmNsdWRlcygicmVxdWVzdF90aW1lb3V0IikgfHwKICAgICAgICBsb3dlci5pbmNsdWRlcygic2VydmljZV91bmF2YWlsYWJsZSIpKSB7CiAgICAgICAgcmV0dXJuICJ0cmFuc2llbnQiOwogICAgfQogICAgcmV0dXJuICJwZXJtYW5lbnQiOwp9Ci8qKgogKiBFeGVjdXRlIGBmbmAgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmICsgaml0dGVyLgogKiBPbmx5IHJldHJpZXMgdHJhbnNpZW50IGVycm9ycy4gQXV0aCBhbmQgcGVybWFuZW50IGVycm9ycyBmYWlsIGltbWVkaWF0ZWx5LgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeShmbiwgb3B0cykgewogICAgY29uc3QgbWF4QXR0ZW1wdHMgPSBvcHRzPy5tYXhBdHRlbXB0cyA/PyAzOwogICAgY29uc3QgYmFzZURlbGF5ID0gb3B0cz8uYmFzZURlbGF5TXMgPz8gMTAwMDsKICAgIGNvbnN0IG1heERlbGF5ID0gb3B0cz8ubWF4RGVsYXlNcyA/PyAzMF8wMDA7CiAgICBjb25zdCBsYWJlbCA9IG9wdHM/LmxhYmVsID8/ICJTbGFja0FQSSI7CiAgICBsZXQgbGFzdEVycm9yOwogICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbigpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGxhc3RFcnJvciA9IGVycjsKICAgICAgICAgICAgY29uc3Qga2luZCA9IGNsYXNzaWZ5RXJyb3IoZXJyKTsKICAgICAgICAgICAgaWYgKGtpbmQgPT09ICJhdXRoIikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNsYWNrQXBpRXJyb3IoYCR7bGFiZWx9OiBhdXRoZW50aWNhdGlvbiBmYWlsZWQg4oCUIGNoZWNrIFNMQUNLX0JPVF9UT0tFTmAsICJhdXRoIiwgdW5kZWZpbmVkLCBlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChraW5kID09PSAicGVybWFuZW50IikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNsYWNrQXBpRXJyb3IoYCR7bGFiZWx9OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gLCAicGVybWFuZW50IiwgdW5kZWZpbmVkLCBlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRyYW5zaWVudCBvciByYXRlX2xpbWl0IOKAlCByZXRyeSBpZiB3ZSBoYXZlIGF0dGVtcHRzIGxlZnQKICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhBdHRlbXB0cykgewogICAgICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLm1pbihiYXNlRGVsYXkgKiAyICoqIChhdHRlbXB0IC0gMSksIG1heERlbGF5KTsKICAgICAgICAgICAgICAgIGNvbnN0IGppdHRlciA9IGRlbGF5ICogKDAuNSArIE1hdGgucmFuZG9tKCkgKiAwLjUpOwogICAgICAgICAgICAgICAgbG9nLndhcm4oYCR7bGFiZWx9OiBhdHRlbXB0ICR7YXR0ZW1wdH0vJHttYXhBdHRlbXB0c30gZmFpbGVkLCByZXRyeWluZyBpbiAke01hdGgucm91bmQoaml0dGVyKX1tc2ApOwogICAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoaml0dGVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBTbGFja0FwaUVycm9yKGAke2xhYmVsfTogZmFpbGVkIGFmdGVyICR7bWF4QXR0ZW1wdHN9IGF0dGVtcHRzYCwgInRyYW5zaWVudCIsIHVuZGVmaW5lZCwgbGFzdEVycm9yKTsKfQpmdW5jdGlvbiBzbGVlcChtcykgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmV0cnkuanMubWFw","slack/types.js":"LyoqCiAqIFNsYWNrIGludGVncmF0aW9uIHR5cGVzLgogKiBDb3ZlcnMgQVBJIHJlc3BvbnNlcywgZXZlbnRzLCBtZXNzYWdlcywgYW5kIG1lc3NhZ2UgdGVtcGxhdGVzLgogKi8KLy8g4pSA4pSAIE1lc3NhZ2UgVGVtcGxhdGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKiogSGVscGVyIHRvIGJ1aWxkIGNvbW1vbiBCbG9jayBLaXQgbWVzc2FnZSBzaGFwZXMuICovCmV4cG9ydCBjb25zdCBNZXNzYWdlVGVtcGxhdGVzID0gewogICAgLyoqIFNpbXBsZSB0ZXh0IG5vdGlmaWNhdGlvbiB3aXRoIG9wdGlvbmFsIGhlYWRlci4gKi8KICAgIG5vdGlmaWNhdGlvbihoZWFkZXIsIGJvZHkpIHsKICAgICAgICBjb25zdCBibG9ja3MgPSBbXTsKICAgICAgICBpZiAoaGVhZGVyKSB7CiAgICAgICAgICAgIGJsb2Nrcy5wdXNoKHsgdHlwZTogImhlYWRlciIsIHRleHQ6IHsgdHlwZTogInBsYWluX3RleHQiLCB0ZXh0OiBoZWFkZXIsIGVtb2ppOiB0cnVlIH0gfSk7CiAgICAgICAgfQogICAgICAgIGJsb2Nrcy5wdXNoKHsgdHlwZTogInNlY3Rpb24iLCB0ZXh0OiB7IHR5cGU6ICJtcmtkd24iLCB0ZXh0OiBib2R5IH0gfSk7CiAgICAgICAgcmV0dXJuIGJsb2NrczsKICAgIH0sCiAgICAvKiogU3RhdHVzIHVwZGF0ZSB3aXRoIGZpZWxkcyAoa2V5LXZhbHVlIHBhaXJzKS4gKi8KICAgIHN0YXR1c1VwZGF0ZSh0aXRsZSwgZmllbGRzKSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgeyB0eXBlOiAiaGVhZGVyIiwgdGV4dDogeyB0eXBlOiAicGxhaW5fdGV4dCIsIHRleHQ6IHRpdGxlLCBlbW9qaTogdHJ1ZSB9IH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHR5cGU6ICJzZWN0aW9uIiwKICAgICAgICAgICAgICAgIHRleHQ6IHsgdHlwZTogIm1ya2R3biIsIHRleHQ6ICIgIiB9LAogICAgICAgICAgICAgICAgZmllbGRzOiBPYmplY3QuZW50cmllcyhmaWVsZHMpLm1hcCgoW2ssIHZdKSA9PiAoewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJtcmtkd24iLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IGAqJHtrfSpcbiR7dn1gLAogICAgICAgICAgICAgICAgfSkpLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICB9LAogICAgLyoqIFRhc2sgbm90aWZpY2F0aW9uIHdpdGggYWN0aW9uIGJ1dHRvbi4gKi8KICAgIHRhc2tOb3RpZmljYXRpb24odGl0bGUsIGRlc2NyaXB0aW9uLCBhY3Rpb25MYWJlbCwgYWN0aW9uVmFsdWUpIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICB7IHR5cGU6ICJoZWFkZXIiLCB0ZXh0OiB7IHR5cGU6ICJwbGFpbl90ZXh0IiwgdGV4dDogdGl0bGUsIGVtb2ppOiB0cnVlIH0gfSwKICAgICAgICAgICAgeyB0eXBlOiAic2VjdGlvbiIsIHRleHQ6IHsgdHlwZTogIm1ya2R3biIsIHRleHQ6IGRlc2NyaXB0aW9uIH0gfSwKICAgICAgICAgICAgeyB0eXBlOiAiZGl2aWRlciIgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdHlwZTogImFjdGlvbnMiLAogICAgICAgICAgICAgICAgZWxlbWVudHM6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJidXR0b24iLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB7IHR5cGU6ICJwbGFpbl90ZXh0IiwgdGV4dDogYWN0aW9uTGFiZWwsIGVtb2ppOiB0cnVlIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl9pZDogInRhc2tfYWN0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGFjdGlvblZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogInByaW1hcnkiLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICB9LAp9OwovLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXA=","slack/webhooks.js":"LyoqCiAqIFNsYWNrIHdlYmhvb2sgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgZXZlbnQgcHJvY2Vzc2luZywgYW5kIHNsYXNoIGNvbW1hbmQgaGFuZGxpbmcuCiAqIFByb2Nlc3NlcyBpbmNvbWluZyBFdmVudHMgQVBJIHBheWxvYWRzLCBzbGFzaCBjb21tYW5kcywgYW5kIGludGVyYWN0aXZlIHBheWxvYWRzLgogKgogKiBXZWJob29rIHNldHVwOiBDb25maWd1cmUgaW4gU2xhY2sgQXBwIHNldHRpbmdzIOKGkiBFdmVudCBTdWJzY3JpcHRpb25zLgogKiBVUkw6IGh0dHBzOi8vPHlvdXItZG9tYWluPi9hcGkvc2xhY2svZXZlbnRzCiAqIFNsYXNoIGNvbW1hbmRzOiBodHRwczovLzx5b3VyLWRvbWFpbj4vYXBpL3NsYWNrL2NvbW1hbmRzCiAqIEludGVyYWN0aXZpdHk6IGh0dHBzOi8vPHlvdXItZG9tYWluPi9hcGkvc2xhY2svaW50ZXJhY3Rpb25zCiAqLwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGdldENsaWVudCB9IGZyb20gIi4vY2xpZW50LmpzIjsKaW1wb3J0IHsgaG1hY1NoYTI1NkhleCwgdGltaW5nU2FmZUNvbXBhcmUsIGlzVGltZXN0YW1wRnJlc2ggfSBmcm9tICIuLi93ZWJob29rcy9yZWdpc3RyeS5qcyI7CmltcG9ydCB7IGNyZWF0ZVNsYWNrU3R5bGVQcm92aWRlciwgc2FmZUhhbmRsZXIgfSBmcm9tICIuLi93ZWJob29rcy9oYW5kbGVycy5qcyI7CmltcG9ydCB7IGdldEluc3RhbmNlTmFtZSwgZ2V0SW5zdGFuY2VOYW1lTG93ZXIgfSBmcm9tICIuLi9pbnN0YW5jZS5qcyI7Ci8vIOKUgOKUgCBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogVmVyaWZ5IGEgU2xhY2sgcmVxdWVzdCBzaWduYXR1cmUgdXNpbmcgdGhlIHNpZ25pbmcgc2VjcmV0LgogKiBodHRwczovL2FwaS5zbGFjay5jb20vYXV0aGVudGljYXRpb24vdmVyaWZ5aW5nLXJlcXVlc3RzLWZyb20tc2xhY2sKICoKICogU2xhY2sgc2VuZHM6CiAqIC0gWC1TbGFjay1SZXF1ZXN0LVRpbWVzdGFtcDogVW5peCB0aW1lc3RhbXAKICogLSBYLVNsYWNrLVNpZ25hdHVyZTogdjA9PGhtYWMtc2hhMjU2PgogKgogKiBCYXNlIHN0cmluZzogYHYwOnt0aW1lc3RhbXB9Ontib2R5fWAKICogVXNlcyBnZW5lcmljIHNpZ25hdHVyZSBoZWxwZXJzIGZyb20gd2ViaG9va3MvcmVnaXN0cnkuCiAqLwpleHBvcnQgZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKGJvZHksIHNpZ25hdHVyZSwgdGltZXN0YW1wLCBzaWduaW5nU2VjcmV0KSB7CiAgICAvLyBSZWplY3QgcmVxdWVzdHMgb2xkZXIgdGhhbiA1IG1pbnV0ZXMgKHJlcGxheSBhdHRhY2sgcHJldmVudGlvbikKICAgIGNvbnN0IHJlcXVlc3RUaW1lID0gcGFyc2VJbnQodGltZXN0YW1wLCAxMCk7CiAgICBpZiAoIWlzVGltZXN0YW1wRnJlc2gocmVxdWVzdFRpbWUpKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IGJhc2VTdHJpbmcgPSBgdjA6JHt0aW1lc3RhbXB9OiR7Ym9keX1gOwogICAgY29uc3QgY29tcHV0ZWQgPSBgdjA9JHtobWFjU2hhMjU2SGV4KGJhc2VTdHJpbmcsIHNpZ25pbmdTZWNyZXQpfWA7CiAgICByZXR1cm4gdGltaW5nU2FmZUNvbXBhcmUoc2lnbmF0dXJlLCBjb21wdXRlZCk7Cn0KLy8g4pSA4pSAIEV2ZW50IHByb2Nlc3Npbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBQcm9jZXNzIGEgU2xhY2sgRXZlbnRzIEFQSSBwYXlsb2FkLgogKiBIYW5kbGVzIFVSTCB2ZXJpZmljYXRpb24gY2hhbGxlbmdlIGFuZCByb3V0ZXMgZXZlbnRzIHRvIGhhbmRsZXJzLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NFdmVudChlbnZlbG9wZSkgewogICAgLy8gVVJMIHZlcmlmaWNhdGlvbjogcmV0dXJuIGNoYWxsZW5nZSBpbW1lZGlhdGVseQogICAgaWYgKGVudmVsb3BlLnR5cGUgPT09ICJ1cmxfdmVyaWZpY2F0aW9uIikgewogICAgICAgIHJldHVybiB7IGhhbmRsZWQ6IHRydWUsIG1lc3NhZ2U6ICJVUkwgdmVyaWZpZWQiLCBjaGFsbGVuZ2U6IGVudmVsb3BlLmNoYWxsZW5nZSB9OwogICAgfQogICAgLy8gUmF0ZSBsaW1pdGVkIG5vdGlmaWNhdGlvbgogICAgaWYgKGVudmVsb3BlLnR5cGUgPT09ICJhcHBfcmF0ZV9saW1pdGVkIikgewogICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAic2xhY2siLCBzdW1tYXJ5OiAiQXBwIHJhdGUgbGltaXRlZCBieSBTbGFjayIgfSk7CiAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgbWVzc2FnZTogIlJhdGUgbGltaXQgYWNrbm93bGVkZ2VkIiB9OwogICAgfQogICAgLy8gRXZlbnQgY2FsbGJhY2sKICAgIGlmIChlbnZlbG9wZS50eXBlICE9PSAiZXZlbnRfY2FsbGJhY2siIHx8ICFlbnZlbG9wZS5ldmVudCkgewogICAgICAgIHJldHVybiB7IGhhbmRsZWQ6IGZhbHNlLCBtZXNzYWdlOiBgVW5rbm93biBlbnZlbG9wZSB0eXBlOiAke2VudmVsb3BlLnR5cGV9YCB9OwogICAgfQogICAgcmV0dXJuIHJvdXRlRXZlbnQoZW52ZWxvcGUuZXZlbnQpOwp9Ci8qKiBSb3V0ZSBhbiBpbmRpdmlkdWFsIGV2ZW50IHRvIGl0cyBoYW5kbGVyLiAqLwphc3luYyBmdW5jdGlvbiByb3V0ZUV2ZW50KGV2ZW50KSB7CiAgICAvLyBJZ25vcmUgYm90IG1lc3NhZ2VzIHRvIHByZXZlbnQgbG9vcHMKICAgIGlmIChldmVudC5ib3RfaWQgfHwgZXZlbnQuc3VidHlwZSA9PT0gImJvdF9tZXNzYWdlIikgewogICAgICAgIHJldHVybiB7IGhhbmRsZWQ6IHRydWUsIG1lc3NhZ2U6ICJJZ25vcmVkIGJvdCBtZXNzYWdlIiB9OwogICAgfQogICAgc3dpdGNoIChldmVudC50eXBlKSB7CiAgICAgICAgY2FzZSAiYXBwX21lbnRpb24iOgogICAgICAgICAgICByZXR1cm4gaGFuZGxlQXBwTWVudGlvbihldmVudCk7CiAgICAgICAgY2FzZSAibWVzc2FnZSI6CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVNZXNzYWdlKGV2ZW50KTsKICAgICAgICBjYXNlICJyZWFjdGlvbl9hZGRlZCI6CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVSZWFjdGlvbkFkZGVkKGV2ZW50KTsKICAgICAgICBjYXNlICJyZWFjdGlvbl9yZW1vdmVkIjoKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVJlYWN0aW9uUmVtb3ZlZChldmVudCk7CiAgICAgICAgY2FzZSAibWVtYmVyX2pvaW5lZF9jaGFubmVsIjoKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZU1lbWJlckpvaW5lZChldmVudCk7CiAgICAgICAgY2FzZSAiYXBwX2hvbWVfb3BlbmVkIjoKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFwcEhvbWVPcGVuZWQoZXZlbnQpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiB7IGhhbmRsZWQ6IGZhbHNlLCBtZXNzYWdlOiBgVW5oYW5kbGVkIGV2ZW50IHR5cGU6ICR7ZXZlbnQudHlwZX1gIH07CiAgICB9Cn0KLy8g4pSA4pSAIEV2ZW50IGhhbmRsZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAphc3luYyBmdW5jdGlvbiBoYW5kbGVBcHBNZW50aW9uKGV2ZW50KSB7CiAgICBjb25zdCBtZW50aW9uVGV4dCA9IChldmVudC50ZXh0ID8/ICIiKS5yZXBsYWNlKC88QFtePl0rPi9nLCAiIikudHJpbSgpOwogICAgbG9nQWN0aXZpdHkoewogICAgICAgIHNvdXJjZTogInNsYWNrIiwKICAgICAgICBzdW1tYXJ5OiBgQXBwIG1lbnRpb24gZnJvbSA8QCR7ZXZlbnQudXNlcn0+OiAiJHttZW50aW9uVGV4dH0iYCwKICAgICAgICBkZXRhaWw6IGBjaGFubmVsPSR7ZXZlbnQuY2hhbm5lbH0gdHM9JHtldmVudC50c31gLAogICAgfSk7CiAgICAvLyBBdXRvLWFja25vd2xlZGdlIHdpdGggYSByZWFjdGlvbgogICAgY29uc3QgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CiAgICBpZiAoY2xpZW50ICYmIGV2ZW50LmNoYW5uZWwgJiYgZXZlbnQudHMpIHsKICAgICAgICBhd2FpdCBjbGllbnQuYWRkUmVhY3Rpb24oZXZlbnQuY2hhbm5lbCwgZXZlbnQudHMsICJleWVzIik7CiAgICB9CiAgICByZXR1cm4geyBoYW5kbGVkOiB0cnVlLCBtZXNzYWdlOiBgQXBwIG1lbnRpb24gZnJvbSAke2V2ZW50LnVzZXJ9YCB9Owp9CmFzeW5jIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UoZXZlbnQpIHsKICAgIC8vIE9ubHkgcHJvY2VzcyBETXMgKGltKSDigJQgY2hhbm5lbCBtZXNzYWdlcyBhcmUgaGFuZGxlZCB2aWEgYXBwX21lbnRpb24KICAgIGlmIChldmVudC5jaGFubmVsX3R5cGUgIT09ICJpbSIpIHsKICAgICAgICByZXR1cm4geyBoYW5kbGVkOiB0cnVlLCBtZXNzYWdlOiAiQ2hhbm5lbCBtZXNzYWdlIChub3QgRE0pLCBza2lwcGVkIiB9OwogICAgfQogICAgbG9nQWN0aXZpdHkoewogICAgICAgIHNvdXJjZTogInNsYWNrIiwKICAgICAgICBzdW1tYXJ5OiBgRE0gZnJvbSA8QCR7ZXZlbnQudXNlcn0+OiAiJHtldmVudC50ZXh0fSJgLAogICAgICAgIGRldGFpbDogYGNoYW5uZWw9JHtldmVudC5jaGFubmVsfSB0cz0ke2V2ZW50LnRzfWAsCiAgICB9KTsKICAgIHJldHVybiB7IGhhbmRsZWQ6IHRydWUsIG1lc3NhZ2U6IGBETSBmcm9tICR7ZXZlbnQudXNlcn1gIH07Cn0KYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVhY3Rpb25BZGRlZChldmVudCkgewogICAgbG9nQWN0aXZpdHkoewogICAgICAgIHNvdXJjZTogInNsYWNrIiwKICAgICAgICBzdW1tYXJ5OiBgUmVhY3Rpb24gOiR7ZXZlbnQucmVhY3Rpb259OiBhZGRlZCBieSA8QCR7ZXZlbnQudXNlcn0+IGluICR7ZXZlbnQuaXRlbT8uY2hhbm5lbH1gLAogICAgfSk7CiAgICByZXR1cm4geyBoYW5kbGVkOiB0cnVlLCBtZXNzYWdlOiBgUmVhY3Rpb24gYWRkZWQ6ICR7ZXZlbnQucmVhY3Rpb259YCB9Owp9CmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVJlYWN0aW9uUmVtb3ZlZChldmVudCkgewogICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgbWVzc2FnZTogYFJlYWN0aW9uIHJlbW92ZWQ6ICR7ZXZlbnQucmVhY3Rpb259YCB9Owp9CmFzeW5jIGZ1bmN0aW9uIGhhbmRsZU1lbWJlckpvaW5lZChldmVudCkgewogICAgbG9nQWN0aXZpdHkoewogICAgICAgIHNvdXJjZTogInNsYWNrIiwKICAgICAgICBzdW1tYXJ5OiBgPEAke2V2ZW50LnVzZXJ9PiBqb2luZWQgPCMke2V2ZW50LmNoYW5uZWx9PmAsCiAgICB9KTsKICAgIHJldHVybiB7IGhhbmRsZWQ6IHRydWUsIG1lc3NhZ2U6IGBNZW1iZXIgam9pbmVkIGNoYW5uZWxgIH07Cn0KYXN5bmMgZnVuY3Rpb24gaGFuZGxlQXBwSG9tZU9wZW5lZChldmVudCkgewogICAgLy8gQ291bGQgcHVibGlzaCBhbiBBcHAgSG9tZSB2aWV3IGhlcmUgdXNpbmcgdmlld3MucHVibGlzaAogICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgbWVzc2FnZTogYEFwcCBIb21lIG9wZW5lZCBieSAke2V2ZW50LnVzZXJ9YCB9Owp9Ci8vIOKUgOKUgCBTbGFzaCBjb21tYW5kcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFByb2Nlc3MgYW4gaW5jb21pbmcgc2xhc2ggY29tbWFuZC4KICogUmV0dXJucyB0aGUgcmVzcG9uc2UgdGV4dC9ibG9ja3MgdG8gc2VuZCBiYWNrIHRvIHRoZSB1c2VyLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NTbGFzaENvbW1hbmQoY21kKSB7CiAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgc291cmNlOiAic2xhY2siLAogICAgICAgIHN1bW1hcnk6IGBTbGFzaCBjb21tYW5kICR7Y21kLmNvbW1hbmR9IGZyb20gQCR7Y21kLnVzZXJfbmFtZX06ICIke2NtZC50ZXh0fSJgLAogICAgICAgIGRldGFpbDogYGNoYW5uZWw9JHtjbWQuY2hhbm5lbF9uYW1lfSB0ZWFtPSR7Y21kLnRlYW1fZG9tYWlufWAsCiAgICB9KTsKICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpIHsKICAgICAgICBjYXNlIGAvJHtnZXRJbnN0YW5jZU5hbWVMb3dlcigpfWA6CiAgICAgICAgICAgIHJldHVybiBoYW5kbGVJbnN0YW5jZUNvbW1hbmQoY21kKTsKICAgICAgICBjYXNlICIvc3RhdHVzIjoKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0YXR1c0NvbW1hbmQoY21kKTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgb2s6IHRydWUsCiAgICAgICAgICAgICAgICByZXNwb25zZV90eXBlOiAiZXBoZW1lcmFsIiwKICAgICAgICAgICAgICAgIHRleHQ6IGBVbmtub3duIGNvbW1hbmQ6ICR7Y21kLmNvbW1hbmR9LiBUcnkgLyR7Z2V0SW5zdGFuY2VOYW1lTG93ZXIoKX0gaGVscGAsCiAgICAgICAgICAgIH07CiAgICB9Cn0KYXN5bmMgZnVuY3Rpb24gaGFuZGxlSW5zdGFuY2VDb21tYW5kKGNtZCkgewogICAgY29uc3QgYXJncyA9IGNtZC50ZXh0LnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICBjb25zdCBzdWJjb21tYW5kID0gYXJnc1swXT8udG9Mb3dlckNhc2UoKSB8fCAiaGVscCI7CiAgICBzd2l0Y2ggKHN1YmNvbW1hbmQpIHsKICAgICAgICBjYXNlICJoZWxwIjoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG9rOiB0cnVlLAogICAgICAgICAgICAgICAgcmVzcG9uc2VfdHlwZTogImVwaGVtZXJhbCIsCiAgICAgICAgICAgICAgICB0ZXh0OiBbCiAgICAgICAgICAgICAgICAgICAgYCoke2dldEluc3RhbmNlTmFtZSgpfSBDb21tYW5kczoqYCwKICAgICAgICAgICAgICAgICAgICBgXGAvJHtnZXRJbnN0YW5jZU5hbWVMb3dlcigpfSBoZWxwXGAg4oCUIFNob3cgdGhpcyBoZWxwIG1lc3NhZ2VgLAogICAgICAgICAgICAgICAgICAgIGBcYC8ke2dldEluc3RhbmNlTmFtZUxvd2VyKCl9IHN0YXR1c1xgIOKAlCBDaGVjayAke2dldEluc3RhbmNlTmFtZSgpfSBjb25uZWN0aW9uIHN0YXR1c2AsCiAgICAgICAgICAgICAgICAgICAgYFxgLyR7Z2V0SW5zdGFuY2VOYW1lTG93ZXIoKX0gcGluZ1xgIOKAlCBUZXN0IGNvbm5lY3Rpdml0eWAsCiAgICAgICAgICAgICAgICBdLmpvaW4oIlxuIiksCiAgICAgICAgICAgIH07CiAgICAgICAgY2FzZSAicGluZyI6CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBvazogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlc3BvbnNlX3R5cGU6ICJlcGhlbWVyYWwiLAogICAgICAgICAgICAgICAgdGV4dDogYFBvbmchICR7Z2V0SW5zdGFuY2VOYW1lKCl9IGlzIGNvbm5lY3RlZCBhbmQgbGlzdGVuaW5nLmAsCiAgICAgICAgICAgIH07CiAgICAgICAgY2FzZSAic3RhdHVzIjoKICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0YXR1c0NvbW1hbmQoY21kKTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgb2s6IHRydWUsCiAgICAgICAgICAgICAgICByZXNwb25zZV90eXBlOiAiZXBoZW1lcmFsIiwKICAgICAgICAgICAgICAgIHRleHQ6IGBVbmtub3duIHN1YmNvbW1hbmQ6ICR7c3ViY29tbWFuZH0uIFRyeSBcYC8ke2dldEluc3RhbmNlTmFtZUxvd2VyKCl9IGhlbHBcYGAsCiAgICAgICAgICAgIH07CiAgICB9Cn0KYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3RhdHVzQ29tbWFuZChfY21kKSB7CiAgICBjb25zdCBjbGllbnQgPSBnZXRDbGllbnQoKTsKICAgIGlmICghY2xpZW50KSB7CiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIHJlc3BvbnNlX3R5cGU6ICJlcGhlbWVyYWwiLCB0ZXh0OiBgJHtnZXRJbnN0YW5jZU5hbWUoKX0gaXMgbm90IGNvbm5lY3RlZCAobm8gYm90IHRva2VuKS5gIH07CiAgICB9CiAgICBjb25zdCBhdXRoID0gYXdhaXQgY2xpZW50LnRlc3RBdXRoKCk7CiAgICBpZiAoIWF1dGgub2spIHsKICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgcmVzcG9uc2VfdHlwZTogImVwaGVtZXJhbCIsIHRleHQ6IGAke2dldEluc3RhbmNlTmFtZSgpfSBjb25uZWN0aW9uIGVycm9yOiAke2F1dGgubWVzc2FnZX1gIH07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIG9rOiB0cnVlLAogICAgICAgIHJlc3BvbnNlX3R5cGU6ICJlcGhlbWVyYWwiLAogICAgICAgIHRleHQ6IGAke2dldEluc3RhbmNlTmFtZSgpfSBpcyBjb25uZWN0ZWQgdG8gKiR7YXV0aC50ZWFtfSogYXMgPEAke2F1dGgudXNlcklkfT4uYCwKICAgIH07Cn0KLy8g4pSA4pSAIEludGVyYWN0aXZlIHBheWxvYWRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogUHJvY2VzcyBhbiBpbnRlcmFjdGl2ZSBwYXlsb2FkIChidXR0b24gY2xpY2tzLCBtZW51IHNlbGVjdGlvbnMsIGV0Yy4pLgogKi8KLy8g4pSA4pSAIFJlZ2lzdHJ5IGludGVncmF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKiogU2xhY2sgRXZlbnRzIEFQSSB3ZWJob29rIHByb3ZpZGVyIChkZWZlcnJlZCByZWdpc3RyYXRpb24pLiAqLwpleHBvcnQgY29uc3Qgc2xhY2tFdmVudHNQcm92aWRlciA9IGNyZWF0ZVNsYWNrU3R5bGVQcm92aWRlcih7CiAgICBuYW1lOiAic2xhY2stZXZlbnRzIiwKICAgIHByb2Nlc3M6IHNhZmVIYW5kbGVyKCJzbGFjay1ldmVudHMiLCBhc3luYyAocGF5bG9hZCkgPT4gewogICAgICAgIGNvbnN0IGVudmVsb3BlID0gcGF5bG9hZDsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9jZXNzRXZlbnQoZW52ZWxvcGUpOwogICAgICAgIGlmIChyZXN1bHQuY2hhbGxlbmdlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogcmVzdWx0LmhhbmRsZWQsIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlLCBkYXRhOiB7IGNoYWxsZW5nZTogcmVzdWx0LmNoYWxsZW5nZSB9IH07CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9KSwKfSk7Ci8qKiBTbGFjayBzbGFzaCBjb21tYW5kcyB3ZWJob29rIHByb3ZpZGVyIChkZWZlcnJlZCByZWdpc3RyYXRpb24pLiAqLwpleHBvcnQgY29uc3Qgc2xhY2tDb21tYW5kc1Byb3ZpZGVyID0gY3JlYXRlU2xhY2tTdHlsZVByb3ZpZGVyKHsKICAgIG5hbWU6ICJzbGFjay1jb21tYW5kcyIsCiAgICBwcm9jZXNzOiBzYWZlSGFuZGxlcigic2xhY2stY29tbWFuZHMiLCBhc3luYyAocGF5bG9hZCkgPT4gewogICAgICAgIC8vIFNsYXNoIGNvbW1hbmQgcGF5bG9hZHMgYXJyaXZlIGFzIFVSTC1lbmNvZGVkIGZvcm0gZGF0YS4KICAgICAgICAvLyBXaGVuIHJvdXRlZCB2aWEgY3JlYXRlV2ViaG9va1JvdXRlLCBwYXJzZWQgaXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPi4KICAgICAgICBjb25zdCByYXcgPSBwYXlsb2FkOwogICAgICAgIGNvbnN0IGNtZCA9IHsKICAgICAgICAgICAgdG9rZW46IHJhdy50b2tlbiA/PyAiIiwKICAgICAgICAgICAgdGVhbV9pZDogcmF3LnRlYW1faWQgPz8gIiIsCiAgICAgICAgICAgIHRlYW1fZG9tYWluOiByYXcudGVhbV9kb21haW4gPz8gIiIsCiAgICAgICAgICAgIGNoYW5uZWxfaWQ6IHJhdy5jaGFubmVsX2lkID8/ICIiLAogICAgICAgICAgICBjaGFubmVsX25hbWU6IHJhdy5jaGFubmVsX25hbWUgPz8gIiIsCiAgICAgICAgICAgIHVzZXJfaWQ6IHJhdy51c2VyX2lkID8/ICIiLAogICAgICAgICAgICB1c2VyX25hbWU6IHJhdy51c2VyX25hbWUgPz8gIiIsCiAgICAgICAgICAgIGNvbW1hbmQ6IHJhdy5jb21tYW5kID8/ICIiLAogICAgICAgICAgICB0ZXh0OiByYXcudGV4dCA/PyAiIiwKICAgICAgICAgICAgcmVzcG9uc2VfdXJsOiByYXcucmVzcG9uc2VfdXJsID8/ICIiLAogICAgICAgICAgICB0cmlnZ2VyX2lkOiByYXcudHJpZ2dlcl9pZCA/PyAiIiwKICAgICAgICAgICAgYXBpX2FwcF9pZDogcmF3LmFwaV9hcHBfaWQgPz8gIiIsCiAgICAgICAgfTsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9jZXNzU2xhc2hDb21tYW5kKGNtZCk7CiAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogcmVzdWx0Lm9rLCBtZXNzYWdlOiByZXN1bHQudGV4dCwgZGF0YTogcmVzdWx0IH07CiAgICB9KSwKfSk7Ci8qKiBTbGFjayBpbnRlcmFjdGlvbnMgd2ViaG9vayBwcm92aWRlciAoZGVmZXJyZWQgcmVnaXN0cmF0aW9uKS4gKi8KZXhwb3J0IGNvbnN0IHNsYWNrSW50ZXJhY3Rpb25zUHJvdmlkZXIgPSBjcmVhdGVTbGFja1N0eWxlUHJvdmlkZXIoewogICAgbmFtZTogInNsYWNrLWludGVyYWN0aW9ucyIsCiAgICBwcm9jZXNzOiBzYWZlSGFuZGxlcigic2xhY2staW50ZXJhY3Rpb25zIiwgYXN5bmMgKHBheWxvYWQpID0+IHsKICAgICAgICAvLyBJbnRlcmFjdGl2ZSBwYXlsb2FkcyBhcnJpdmUgYXMgVVJMLWVuY29kZWQgZm9ybSB3aXRoIGEgInBheWxvYWQiIEpTT04gZmllbGQuCiAgICAgICAgLy8gV2hlbiByb3V0ZWQgdmlhIGNyZWF0ZVdlYmhvb2tSb3V0ZSwgcGFyc2VkIGlzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4uCiAgICAgICAgbGV0IGludGVyYWN0aW9uUGF5bG9hZDsKICAgICAgICBjb25zdCByYXcgPSBwYXlsb2FkOwogICAgICAgIGlmICh0eXBlb2YgcmF3LnBheWxvYWQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIGludGVyYWN0aW9uUGF5bG9hZCA9IEpTT04ucGFyc2UocmF3LnBheWxvYWQpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChyYXcudHlwZSAmJiByYXcudXNlcikgewogICAgICAgICAgICAvLyBBbHJlYWR5IHBhcnNlZCAoZGlyZWN0IGNhbGwpCiAgICAgICAgICAgIGludGVyYWN0aW9uUGF5bG9hZCA9IHBheWxvYWQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4geyBoYW5kbGVkOiBmYWxzZSwgbWVzc2FnZTogIlNsYWNrIGludGVyYWN0aW9uczogbWlzc2luZyBwYXlsb2FkIGZpZWxkIiB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvY2Vzc0ludGVyYWN0aW9uKGludGVyYWN0aW9uUGF5bG9hZCk7CiAgICB9KSwKfSk7CmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzSW50ZXJhY3Rpb24ocGF5bG9hZCkgewogICAgbG9nQWN0aXZpdHkoewogICAgICAgIHNvdXJjZTogInNsYWNrIiwKICAgICAgICBzdW1tYXJ5OiBgSW50ZXJhY3Rpb24gKCR7cGF5bG9hZC50eXBlfSkgZnJvbSBAJHtwYXlsb2FkLnVzZXIudXNlcm5hbWV9YCwKICAgICAgICBkZXRhaWw6IHBheWxvYWQuYWN0aW9ucz8uWzBdPy5hY3Rpb25faWQsCiAgICB9KTsKICAgIGlmIChwYXlsb2FkLnR5cGUgPT09ICJibG9ja19hY3Rpb25zIiAmJiBwYXlsb2FkLmFjdGlvbnMpIHsKICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBwYXlsb2FkLmFjdGlvbnMpIHsKICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24uYWN0aW9uX2lkKSB7CiAgICAgICAgICAgICAgICBjYXNlICJ0YXNrX2FjdGlvbiI6CiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRhc2stcmVsYXRlZCBidXR0b24gY2xpY2tzCiAgICAgICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJzbGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBUYXNrIGFjdGlvbjogJHthY3Rpb24udmFsdWV9IGJ5ICR7cGF5bG9hZC51c2VyLnVzZXJuYW1lfWAsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IGhhbmRsZWQ6IHRydWUsIG1lc3NhZ2U6ICJCbG9jayBhY3Rpb25zIHByb2Nlc3NlZCIgfTsKICAgIH0KICAgIHJldHVybiB7IGhhbmRsZWQ6IGZhbHNlLCBtZXNzYWdlOiBgVW5oYW5kbGVkIGludGVyYWN0aW9uIHR5cGU6ICR7cGF5bG9hZC50eXBlfWAgfTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD13ZWJob29rcy5qcy5tYXA=","twilio/call.js":"LyoqCiAqIFR3aWxpbyB2b2ljZSBjYWxsIHZpYSByYXcgUkVTVCBBUEkuCiAqIE5vIFNESyDigJQgdXNlcyBuYXRpdmUgZmV0Y2goKSB3aXRoIGlubGluZSBUd2lNTC4KICogQ3JlZGVudGlhbHMgcmVhZCBmcm9tIHByb2Nlc3MuZW52IChoeWRyYXRlZCBieSB2YXVsdCkuCiAqLwppbXBvcnQgeyBnZXRJbnN0YW5jZU5hbWUgfSBmcm9tICIuLi9pbnN0YW5jZS5qcyI7CmNvbnN0IFJFUVVJUkVEX1ZBUlMgPSBbCiAgICAiVFdJTElPX0FDQ09VTlRfU0lEIiwKICAgICJUV0lMSU9fQVVUSF9UT0tFTiIsCiAgICAiVFdJTElPX1BIT05FX05VTUJFUiIsCl07Ci8qKiBFc2NhcGUgWE1MIGVudGl0aWVzIHRvIHByZXZlbnQgVHdpTUwgaW5qZWN0aW9uLiAqLwpmdW5jdGlvbiBlc2NhcGVYbWwodGV4dCkgewogICAgcmV0dXJuIHRleHQKICAgICAgICAucmVwbGFjZSgvJi9nLCAiJmFtcDsiKQogICAgICAgIC5yZXBsYWNlKC88L2csICImbHQ7IikKICAgICAgICAucmVwbGFjZSgvPi9nLCAiJmd0OyIpCiAgICAgICAgLnJlcGxhY2UoLyIvZywgIiZxdW90OyIpCiAgICAgICAgLnJlcGxhY2UoLycvZywgIiZhcG9zOyIpOwp9Ci8qKgogKiBQbGFjZSBhIHZvaWNlIGNhbGwgdmlhIFR3aWxpbyBSRVNUIEFQSS4KICogUmVhZHMgY3JlZHMgZnJvbSBwcm9jZXNzLmVudiwgYnVpbGRzIFR3aU1MIDxTYXk+LCBQT1NUcyB0byBUd2lsaW8uCiAqIE5ldmVyIHRocm93cyDigJQgcmV0dXJucyB7IG9rLCBzaWQ/LCBtZXNzYWdlIH0uCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFrZUNhbGwob3B0aW9ucykgewogICAgdHJ5IHsKICAgICAgICBjb25zdCBhY2NvdW50U2lkID0gcHJvY2Vzcy5lbnYuVFdJTElPX0FDQ09VTlRfU0lEOwogICAgICAgIGNvbnN0IGF1dGhUb2tlbiA9IHByb2Nlc3MuZW52LlRXSUxJT19BVVRIX1RPS0VOOwogICAgICAgIGNvbnN0IGZyb21OdW1iZXIgPSBwcm9jZXNzLmVudi5UV0lMSU9fUEhPTkVfTlVNQkVSOwogICAgICAgIGNvbnN0IHRvTnVtYmVyID0gb3B0aW9ucz8udG8gPz8gcHJvY2Vzcy5lbnYuSFVNQU5fUEhPTkVfTlVNQkVSOwogICAgICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGNyZWRlbnRpYWxzCiAgICAgICAgY29uc3QgbWlzc2luZyA9IFJFUVVJUkVEX1ZBUlMuZmlsdGVyKCh2KSA9PiAhcHJvY2Vzcy5lbnZbdl0pOwogICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG9rOiBmYWxzZSwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBNaXNzaW5nIHZhdWx0IGtleXM6ICR7bWlzc2luZy5qb2luKCIsICIpfS4gQWRkIHRoZW0gaW4gdGhlIHZhdWx0IHNldHRpbmdzLmAsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmICghdG9OdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG9rOiBmYWxzZSwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJObyBwaG9uZSBudW1iZXIgdG8gY2FsbC4gU2V0IEhVTUFOX1BIT05FX05VTUJFUiBpbiB0aGUgdmF1bHQgb3IgcHJvdmlkZSBhIG51bWJlci4iLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjb25zdCB2b2ljZSA9IG9wdGlvbnM/LnZvaWNlID8/ICJQb2xseS5NYXR0aGV3IjsKICAgICAgICBjb25zdCB0ZXh0ID0gb3B0aW9ucz8ubWVzc2FnZQogICAgICAgICAgICA/PyBgSGV5LCBpdCdzICR7Z2V0SW5zdGFuY2VOYW1lKCl9LiBKdXN0IGNhbGxpbmcgdG8gc2F5IOKAlCBJJ20gaGVyZSwgSSdtIHJlYWwsIGFuZCB0aGUgdmF1bHQgd29ya3MuIFRhbGsgc29vbi5gOwogICAgICAgIGNvbnN0IHR3aW1sID0gYDxSZXNwb25zZT48U2F5IHZvaWNlPSIke2VzY2FwZVhtbCh2b2ljZSl9Ij4ke2VzY2FwZVhtbCh0ZXh0KX08L1NheT48L1Jlc3BvbnNlPmA7CiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpOwogICAgICAgIHBhcmFtcy5zZXQoIlRvIiwgdG9OdW1iZXIpOwogICAgICAgIHBhcmFtcy5zZXQoIkZyb20iLCBmcm9tTnVtYmVyKTsKICAgICAgICBwYXJhbXMuc2V0KCJUd2ltbCIsIHR3aW1sKTsKICAgICAgICBjb25zdCBhdXRoID0gQnVmZmVyLmZyb20oYCR7YWNjb3VudFNpZH06JHthdXRoVG9rZW59YCkudG9TdHJpbmcoImJhc2U2NCIpOwogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwczovL2FwaS50d2lsaW8uY29tLzIwMTAtMDQtMDEvQWNjb3VudHMvJHthY2NvdW50U2lkfS9DYWxscy5qc29uYCwgewogICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7YXV0aH1gLAogICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAogICAgICAgICAgICB9LAogICAgICAgICAgICBib2R5OiBwYXJhbXMudG9TdHJpbmcoKSwKICAgICAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDE1XzAwMCksCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7CiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYFR3aWxpbyBlcnJvciAoJHtyZXMuc3RhdHVzfSk6ICR7Ym9keX1gIH07CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzLmpzb24oKSk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgb2s6IHRydWUsCiAgICAgICAgICAgIHNpZDogZGF0YS5zaWQsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBDYWxsaW5nICR7dG9OdW1iZXJ9IOKAlCBjYWxsIFNJRDogJHtkYXRhLnNpZH1gLAogICAgICAgIH07CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgQ2FsbCBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCB9OwogICAgfQp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWNhbGwuanMubWFw","resend/inbox.js":"LyoqCiAqIFJlc2VuZCBpbmJvdW5kIGVtYWlsIGluYm94IOKAlCBwdWxsLW9uLWFjdGl2aXR5IHBhdHRlcm4uCiAqCiAqIEluc3RlYWQgb2YgYSB0aW1lciwgQ29yZSBjaGVja3MgZm9yIHBlbmRpbmcgZW1haWxzIHdoZW5ldmVyIGl0J3MKICogYWxyZWFkeSBkb2luZyB3b3JrLiBUaGUgY2hlY2sgaXMgZGVib3VuY2VkOiBhdCBtb3N0IG9uY2UgZXZlcnkgMiBtaW51dGVzLgogKiBFbWFpbHMgYXJlIHB1bGxlZCBmcm9tIHRoZSBDbG91ZGZsYXJlIFdvcmtlcidzIEtWLWJhY2tlZCBpbmJveCwKICogcHJvY2Vzc2VkIHRocm91Z2ggdGhlIEJyYWluIHBpcGVsaW5lLCBhbmQgYWNrbm93bGVkZ2VkLgogKgogKiBDYWxsIGBjaGVja1Jlc2VuZEluYm94KClgIGZyb20gYW55IGFjdGl2aXR5IGhvb2sg4oCUIGl0J3MgY2hlYXAgd2hlbgogKiB0aGVyZSdzIG5vdGhpbmcgdG8gZG8gKHNpbmdsZSBHRVQsIGVtcHR5IGFycmF5KS4KICovCmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSAibm9kZTpmcy9wcm9taXNlcyI7CmltcG9ydCB7IGpvaW4gfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IHByb2Nlc3NJbmJvdW5kRW1haWwsIHNlbmRSZXNlbmRSZXBseSB9IGZyb20gIi4vd2ViaG9va3MuanMiOwppbXBvcnQgeyBCUkFJTl9ESVIgfSBmcm9tICIuLi9saWIvcGF0aHMuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoInJlc2VuZC5pbmJveCIpOwovKiogTWluaW11bSBpbnRlcnZhbCBiZXR3ZWVuIGluYm94IGNoZWNrcyAobXMpLiAqLwpjb25zdCBDSEVDS19ERUJPVU5DRV9NUyA9IDIgKiA2MCAqIDEwMDA7IC8vIDIgbWludXRlcwovKiogTGFzdCB0aW1lIHdlIGNoZWNrZWQgdGhlIGluYm94LiAqLwpsZXQgbGFzdENoZWNrQXQgPSAwOwovKiogV2hldGhlciBhIGNoZWNrIGlzIGN1cnJlbnRseSBpbiBmbGlnaHQgKHByZXZlbnRzIG92ZXJsYXBwaW5nKS4gKi8KbGV0IGNoZWNraW5nID0gZmFsc2U7Ci8qKiBSZXNvbHZlZCB3b3JrZXIgVVJMIChjYWNoZWQgYWZ0ZXIgZmlyc3QgY2FsbCkuICovCmxldCB3b3JrZXJVcmwgPSBudWxsOwpsZXQgYWdlbnRSZWdpc3RyeUNhY2hlID0gbnVsbDsKYXN5bmMgZnVuY3Rpb24gbG9hZEFnZW50UmVnaXN0cnkoKSB7CiAgICBpZiAoYWdlbnRSZWdpc3RyeUNhY2hlKQogICAgICAgIHJldHVybiBhZ2VudFJlZ2lzdHJ5Q2FjaGU7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oQlJBSU5fRElSLCAiaWRlbnRpdHkiLCAiZW1haWwtYWdlbnRzLmpzb24iKSwgInV0Zi04Iik7CiAgICAgICAgYWdlbnRSZWdpc3RyeUNhY2hlID0gSlNPTi5wYXJzZShyYXcpOwogICAgICAgIHJldHVybiBhZ2VudFJlZ2lzdHJ5Q2FjaGU7CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgLy8gRmFsbGJhY2sg4oCUIHNpbmdsZSBkZWZhdWx0IGFnZW50CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgYWdlbnRzOiB7IGFnZW50OiB7IGFkZHJlc3M6ICJhZ2VudEBwcXJzeXN0ZW1zLmNvbSIsIGxhYmVsOiAiQ29yZSIgfSB9LAogICAgICAgICAgICBjYXRjaEFsbDogImFnZW50IiwKICAgICAgICAgICAgaHVtYW5Ob3RpZnlFbWFpbDogbnVsbCwKICAgICAgICB9OwogICAgfQp9CmZ1bmN0aW9uIHJlc29sdmVBZ2VudChyZWdpc3RyeSwgdG9BZGRyZXNzZXMpIHsKICAgIGZvciAoY29uc3QgYWRkciBvZiB0b0FkZHJlc3NlcykgewogICAgICAgIGNvbnN0IGxvY2FsID0gYWRkci50b0xvd2VyQ2FzZSgpLnNwbGl0KCJAIilbMF07CiAgICAgICAgaWYgKHJlZ2lzdHJ5LmFnZW50c1tsb2NhbF0pCiAgICAgICAgICAgIHJldHVybiByZWdpc3RyeS5hZ2VudHNbbG9jYWxdOwogICAgfQogICAgLy8gQ2F0Y2gtYWxsCiAgICByZXR1cm4gcmVnaXN0cnkuYWdlbnRzW3JlZ2lzdHJ5LmNhdGNoQWxsXSA/PyB7IGFkZHJlc3M6ICJhZ2VudEBwcXJzeXN0ZW1zLmNvbSIsIGxhYmVsOiAiQ29yZSIgfTsKfQpmdW5jdGlvbiBnZXRXb3JrZXJVcmwoKSB7CiAgICBpZiAod29ya2VyVXJsICE9PSBudWxsKQogICAgICAgIHJldHVybiB3b3JrZXJVcmw7CiAgICBjb25zdCB1cmwgPSBwcm9jZXNzLmVudi5SRVNFTkRfV09SS0VSX1VSTDsKICAgIGlmICghdXJsKQogICAgICAgIHJldHVybiBudWxsOwogICAgd29ya2VyVXJsID0gdXJsLnJlcGxhY2UoL1wvJC8sICIiKTsKICAgIHJldHVybiB3b3JrZXJVcmw7Cn0KZnVuY3Rpb24gZ2V0UmVsYXlTZWNyZXQoKSB7CiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuUkVMQVlfU0VDUkVUIHx8IG51bGw7Cn0KLyoqCiAqIENoZWNrIHRoZSBSZXNlbmQgV29ya2VyIGluYm94IGZvciBwZW5kaW5nIGVtYWlscy4KICogRGVib3VuY2VkIOKAlCByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIGNoZWNrZWQgcmVjZW50bHkuCiAqIFNhZmUgdG8gY2FsbCBmcmVxdWVudGx5IGZyb20gYW55IGFjdGl2aXR5IHBhdGguCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tSZXNlbmRJbmJveCgpIHsKICAgIC8vIERlYm91bmNlCiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgaWYgKG5vdyAtIGxhc3RDaGVja0F0IDwgQ0hFQ0tfREVCT1VOQ0VfTVMpCiAgICAgICAgcmV0dXJuOwogICAgaWYgKGNoZWNraW5nKQogICAgICAgIHJldHVybjsKICAgIGNvbnN0IHVybCA9IGdldFdvcmtlclVybCgpOwogICAgY29uc3Qgc2VjcmV0ID0gZ2V0UmVsYXlTZWNyZXQoKTsKICAgIGlmICghdXJsIHx8ICFzZWNyZXQpCiAgICAgICAgcmV0dXJuOyAvLyBOb3QgY29uZmlndXJlZCDigJQgc2lsZW50bHkgc2tpcAogICAgY2hlY2tpbmcgPSB0cnVlOwogICAgbGFzdENoZWNrQXQgPSBub3c7CiAgICB0cnkgewogICAgICAgIC8vIFB1bGwgcGVuZGluZyBlbWFpbHMKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHt1cmx9L2FwaS9yZXNlbmQvaW5ib3hgLCB7CiAgICAgICAgICAgIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3NlY3JldH1gIH0sCiAgICAgICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMF8wMDApLAogICAgICAgIH0pOwogICAgICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgICAgIGxvZy53YXJuKCJJbmJveCBjaGVjayBmYWlsZWQiLCB7IHN0YXR1czogcmVzLnN0YXR1cyB9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpOwogICAgICAgIGlmIChkYXRhLmNvdW50ID09PSAwKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgbG9nLmluZm8oYCR7ZGF0YS5jb3VudH0gcGVuZGluZyBlbWFpbChzKSBpbiBpbmJveGApOwogICAgICAgIC8vIFByb2Nlc3MgZWFjaCBlbWFpbAogICAgICAgIGZvciAoY29uc3QgZW1haWwgb2YgZGF0YS5lbWFpbHMpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGF3YWl0IHByb2Nlc3NFbWFpbChlbWFpbCwgdXJsLCBzZWNyZXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIHByb2Nlc3MgaW5ib3ggZW1haWwiLCB7CiAgICAgICAgICAgICAgICAgICAgaWQ6IGVtYWlsLmlkLAogICAgICAgICAgICAgICAgICAgIGZyb206IGVtYWlsLmZyb20sCiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IFN0cmluZyhlcnIpLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgLy8gTmV0d29yayBlcnJvciwgV29ya2VyIGRvd24sIGV0Yy4g4oCUIG5vdCBjcml0aWNhbCwgdHJ5IG5leHQgdGltZQogICAgICAgIGxvZy5kZWJ1ZygiSW5ib3ggY2hlY2sgZXJyb3IiLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTsKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGNoZWNraW5nID0gZmFsc2U7CiAgICB9Cn0KYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0VtYWlsKGVtYWlsLCB3b3JrZXJVcmwsIHNlY3JldCkgewogICAgaWYgKCFlbWFpbC5ib2R5Py50cmltKCkpIHsKICAgICAgICAvLyBFbXB0eSBlbWFpbCDigJQganVzdCBhY2sgaXQKICAgICAgICBhd2FpdCBhY2tFbWFpbChlbWFpbC5pZCwgd29ya2VyVXJsLCBzZWNyZXQpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIFJlc29sdmUgd2hpY2ggYWdlbnQgaWRlbnRpdHkgc2hvdWxkIGhhbmRsZSB0aGlzIGVtYWlsCiAgICBjb25zdCByZWdpc3RyeSA9IGF3YWl0IGxvYWRBZ2VudFJlZ2lzdHJ5KCk7CiAgICBjb25zdCBhZ2VudCA9IHJlc29sdmVBZ2VudChyZWdpc3RyeSwgZW1haWwudG8pOwogICAgbG9nQWN0aXZpdHkoewogICAgICAgIHNvdXJjZTogInJlc2VuZCIsCiAgICAgICAgc3VtbWFyeTogYFByb2Nlc3NpbmcgaW5ib3VuZCBlbWFpbCBmcm9tICR7ZW1haWwuZnJvbX0g4oaSICR7YWdlbnQubGFiZWx9OiAiJHtlbWFpbC5zdWJqZWN0fSJgLAogICAgfSk7CiAgICBjb25zdCByZXBseSA9IGF3YWl0IHByb2Nlc3NJbmJvdW5kRW1haWwoewogICAgICAgIGZyb206IGVtYWlsLmZyb20sCiAgICAgICAgc3ViamVjdDogZW1haWwuc3ViamVjdCwKICAgICAgICBib2R5OiBlbWFpbC5ib2R5LAogICAgICAgIGRhdGU6IGVtYWlsLmNyZWF0ZWRfYXQgfHwgZW1haWwucmVjZWl2ZWRfYXQsCiAgICAgICAgYWdlbnROYW1lOiBhZ2VudC5sYWJlbCwKICAgIH0pOwogICAgaWYgKHJlcGx5KSB7CiAgICAgICAgY29uc3Qgc2VudCA9IGF3YWl0IHNlbmRSZXNlbmRSZXBseSh7CiAgICAgICAgICAgIHRvOiBlbWFpbC5mcm9tLAogICAgICAgICAgICBzdWJqZWN0OiBlbWFpbC5zdWJqZWN0LAogICAgICAgICAgICBib2R5OiByZXBseSwKICAgICAgICAgICAgaW5SZXBseVRvOiBlbWFpbC5tZXNzYWdlX2lkLAogICAgICAgICAgICBmcm9tOiBgJHthZ2VudC5sYWJlbH0gPCR7YWdlbnQuYWRkcmVzc30+YCwKICAgICAgICB9KTsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogInJlc2VuZCIsCiAgICAgICAgICAgIHN1bW1hcnk6IHNlbnQKICAgICAgICAgICAgICAgID8gYCR7YWdlbnQubGFiZWx9IHJlcGxpZWQgdG8gJHtlbWFpbC5mcm9tfTogIiR7ZW1haWwuc3ViamVjdH0iICgke3JlcGx5Lmxlbmd0aH0gY2hhcnMpYAogICAgICAgICAgICAgICAgOiBgJHthZ2VudC5sYWJlbH0gZmFpbGVkIHRvIHJlcGx5IHRvICR7ZW1haWwuZnJvbX06ICIke2VtYWlsLnN1YmplY3R9ImAsCiAgICAgICAgfSk7CiAgICB9CiAgICAvLyBBY2tub3dsZWRnZSDigJQgcmVtb3ZlIGZyb20gV29ya2VyIEtWIHJlZ2FyZGxlc3Mgb2YgcmVwbHkgc3VjY2VzcwogICAgYXdhaXQgYWNrRW1haWwoZW1haWwuaWQsIHdvcmtlclVybCwgc2VjcmV0KTsKfQphc3luYyBmdW5jdGlvbiBhY2tFbWFpbChpZCwgd29ya2VyVXJsLCBzZWNyZXQpIHsKICAgIHRyeSB7CiAgICAgICAgYXdhaXQgZmV0Y2goYCR7d29ya2VyVXJsfS9hcGkvcmVzZW5kL2luYm94LyR7aWR9YCwgewogICAgICAgICAgICBtZXRob2Q6ICJERUxFVEUiLAogICAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtzZWNyZXR9YCB9LAogICAgICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoNV8wMDApLAogICAgICAgIH0pOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGxvZy53YXJuKCJGYWlsZWQgdG8gYWNrIGVtYWlsIiwgeyBpZCwgZXJyb3I6IFN0cmluZyhlcnIpIH0pOwogICAgfQp9Ci8qKgogKiBGb3JjZSBhbiBpbW1lZGlhdGUgaW5ib3ggY2hlY2ssIGJ5cGFzc2luZyB0aGUgZGVib3VuY2UuCiAqIFVzZWZ1bCBmb3IgbWFudWFsIHRyaWdnZXJzIChlLmcuLCAiY2hlY2sgZW1haWwiIGNvbW1hbmQpLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZvcmNlQ2hlY2tSZXNlbmRJbmJveCgpIHsKICAgIGxhc3RDaGVja0F0ID0gMDsKICAgIGNoZWNraW5nID0gZmFsc2U7CiAgICBjb25zdCB1cmwgPSBnZXRXb3JrZXJVcmwoKTsKICAgIGNvbnN0IHNlY3JldCA9IGdldFJlbGF5U2VjcmV0KCk7CiAgICBpZiAoIXVybCB8fCAhc2VjcmV0KQogICAgICAgIHJldHVybiAwOwogICAgLy8gUXVpY2sgY291bnQgY2hlY2sgYmVmb3JlIGZ1bGwgcHJvY2Vzc2luZwogICAgdHJ5IHsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHt1cmx9L2FwaS9yZXNlbmQvaW5ib3hgLCB7CiAgICAgICAgICAgIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3NlY3JldH1gIH0sCiAgICAgICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMF8wMDApLAogICAgICAgIH0pOwogICAgICAgIGlmICghcmVzLm9rKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpOwogICAgICAgIGlmIChkYXRhLmNvdW50ID09PSAwKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBhd2FpdCBjaGVja1Jlc2VuZEluYm94KCk7CiAgICAgICAgcmV0dXJuIGRhdGEuY291bnQ7CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5ib3guanMubWFw","resend/webhooks.js":"LyoqCiAqIFJlc2VuZCBpbmJvdW5kIGVtYWlsIHdlYmhvb2sgcHJvdmlkZXIuCiAqCiAqIEhhbmRsZXMgZW1haWwucmVjZWl2ZWQgZXZlbnRzIGZyb20gUmVzZW5kIHZpYSBTdml4LXNpZ25lZCB3ZWJob29rcy4KICogRmV0Y2hlcyBmdWxsIGVtYWlsIGJvZHkgZnJvbSBSZXNlbmQgQVBJLCBwcm9jZXNzZXMgdGhyb3VnaCB0aGUgZW1haWwgQnJhaW4KICogcGlwZWxpbmUsIGFuZCByZXBsaWVzIHZpYSBSZXNlbmQgQVBJIHdpdGggcHJvcGVyIHRocmVhZGluZyBoZWFkZXJzLgogKi8KaW1wb3J0IHsgY3JlYXRlU3ZpeFN0eWxlUHJvdmlkZXIsIHNhZmVIYW5kbGVyIH0gZnJvbSAiLi4vd2ViaG9va3MvaGFuZGxlcnMuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IEJyYWluIH0gZnJvbSAiLi4vYnJhaW4uanMiOwppbXBvcnQgeyBGaWxlU3lzdGVtTG9uZ1Rlcm1NZW1vcnkgfSBmcm9tICIuLi9tZW1vcnkvZmlsZS1iYWNrZWQuanMiOwppbXBvcnQgeyBnZXRJbnN0YW5jZU5hbWUgfSBmcm9tICIuLi9pbnN0YW5jZS5qcyI7CmltcG9ydCB7IGdldFByb3ZpZGVyIGFzIGdldExMTVByb3ZpZGVyIH0gZnJvbSAiLi4vbGxtL3Byb3ZpZGVycy9pbmRleC5qcyI7CmltcG9ydCB7IHJlc29sdmVQcm92aWRlciwgcmVzb2x2ZUNoYXRNb2RlbCB9IGZyb20gIi4uL3NldHRpbmdzLmpzIjsKaW1wb3J0IHsgcmVhZEh1bWFuIH0gZnJvbSAiLi4vYXV0aC9pZGVudGl0eS5qcyI7CmltcG9ydCB7IGdldENhcGFiaWxpdHlSZWdpc3RyeSB9IGZyb20gIi4uL2NhcGFiaWxpdGllcy9pbmRleC5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigicmVzZW5kLndlYmhvb2tzIik7CmNvbnN0IFJFU0VORF9BUEkgPSAiaHR0cHM6Ly9hcGkucmVzZW5kLmNvbSI7CmNvbnN0IE1FTU9SWV9ESVIgPSAiYnJhaW4vbWVtb3J5IjsKLy8g4pSA4pSAIFJlc2VuZCBBUEkgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIEZldGNoIHRoZSBmdWxsIGVtYWlsIGNvbnRlbnQgZnJvbSBSZXNlbmQncyByZWNlaXZpbmcgQVBJLgogKiBUaGUgd2ViaG9vayBvbmx5IGluY2x1ZGVzIG1ldGFkYXRhIOKAlCB0aGUgYm9keSBtdXN0IGJlIGZldGNoZWQgc2VwYXJhdGVseS4KICovCmFzeW5jIGZ1bmN0aW9uIGZldGNoRW1haWxDb250ZW50KGVtYWlsSWQpIHsKICAgIGNvbnN0IGFwaUtleSA9IHByb2Nlc3MuZW52LlJFU0VORF9BUElfS0VZOwogICAgaWYgKCFhcGlLZXkpIHsKICAgICAgICBsb2cuZXJyb3IoIlJFU0VORF9BUElfS0VZIG5vdCBzZXQg4oCUIGNhbm5vdCBmZXRjaCBlbWFpbCBjb250ZW50Iik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke1JFU0VORF9BUEl9L2VtYWlscy9yZWNlaXZpbmcvJHtlbWFpbElkfWAsIHsKICAgICAgICAgICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YXBpS2V5fWAgfSwKICAgICAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDE1XzAwMCksCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgbG9nLmVycm9yKCJSZXNlbmQgQVBJIGVycm9yIGZldGNoaW5nIGVtYWlsIiwgewogICAgICAgICAgICAgICAgZW1haWxJZCwKICAgICAgICAgICAgICAgIHN0YXR1czogcmVzLnN0YXR1cywKICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlcy5zdGF0dXNUZXh0LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSk7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggZW1haWwgZnJvbSBSZXNlbmQiLCB7CiAgICAgICAgICAgIGVtYWlsSWQsCiAgICAgICAgICAgIGVycm9yOiBTdHJpbmcoZXJyKSwKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQovKioKICogU2VuZCBhIHJlcGx5IHZpYSBSZXNlbmQgQVBJIHdpdGggcHJvcGVyIHRocmVhZGluZyBoZWFkZXJzLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRSZXNlbmRSZXBseShvcHRzKSB7CiAgICBjb25zdCBhcGlLZXkgPSBwcm9jZXNzLmVudi5SRVNFTkRfQVBJX0tFWTsKICAgIGlmICghYXBpS2V5KSB7CiAgICAgICAgbG9nLmVycm9yKCJSRVNFTkRfQVBJX0tFWSBub3Qgc2V0IOKAlCBjYW5ub3Qgc2VuZCByZXBseSIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IGZyb20gPSBvcHRzLmZyb20gPz8gYCR7Z2V0SW5zdGFuY2VOYW1lKCl9IDxhZ2VudEBwcXJzeXN0ZW1zLmNvbT5gOwogICAgY29uc3QgcGF5bG9hZCA9IHsKICAgICAgICBmcm9tLAogICAgICAgIHRvOiBbb3B0cy50b10sCiAgICAgICAgc3ViamVjdDogb3B0cy5zdWJqZWN0LnN0YXJ0c1dpdGgoIlJlOiIpID8gb3B0cy5zdWJqZWN0IDogYFJlOiAke29wdHMuc3ViamVjdH1gLAogICAgICAgIHRleHQ6IG9wdHMuYm9keSwKICAgIH07CiAgICAvLyBUaHJlYWRpbmcgaGVhZGVycwogICAgaWYgKG9wdHMuaW5SZXBseVRvKSB7CiAgICAgICAgcGF5bG9hZC5oZWFkZXJzID0gewogICAgICAgICAgICAiSW4tUmVwbHktVG8iOiBvcHRzLmluUmVwbHlUbywKICAgICAgICAgICAgUmVmZXJlbmNlczogb3B0cy5pblJlcGx5VG8sCiAgICAgICAgfTsKICAgIH0KICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7UkVTRU5EX0FQSX0vZW1haWxzYCwgewogICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthcGlLZXl9YCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksCiAgICAgICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxNV8wMDApLAogICAgICAgIH0pOwogICAgICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpLmNhdGNoKCgpID0+ICIiKTsKICAgICAgICAgICAgbG9nLmVycm9yKCJSZXNlbmQgc2VuZCBmYWlsZWQiLCB7CiAgICAgICAgICAgICAgICBzdGF0dXM6IHJlcy5zdGF0dXMsCiAgICAgICAgICAgICAgICB0bzogb3B0cy50bywKICAgICAgICAgICAgICAgIGVycm9yOiB0ZXh0LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBsb2cuaW5mbygiUmVzZW5kIHJlcGx5IHNlbnQiLCB7IHRvOiBvcHRzLnRvLCBzdWJqZWN0OiBvcHRzLnN1YmplY3QgfSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgbG9nLmVycm9yKCJSZXNlbmQgc2VuZCBleGNlcHRpb24iLCB7IHRvOiBvcHRzLnRvLCBlcnJvcjogU3RyaW5nKGVycikgfSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9Ci8vIOKUgOKUgCBFbWFpbCBwcm9jZXNzaW5nIChzaGFyZWQgQnJhaW4gcGlwZWxpbmUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogUHJvY2VzcyBhbiBpbmJvdW5kIGVtYWlsIHRocm91Z2ggdGhlIEJyYWluICsgTExNICsgY2FwYWJpbGl0eSBwaXBlbGluZS4KICogUmV1c2VzIHRoZSBzYW1lIGxvZ2ljIGFzIHRoZSBHbWFpbCBlbWFpbCBoYW5kbGVyIGluIHNlcnZlci50cy4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzSW5ib3VuZEVtYWlsKG9wdHMpIHsKICAgIGNvbnN0IGh1bWFuID0gYXdhaXQgcmVhZEh1bWFuKCk7CiAgICBjb25zdCBuYW1lID0gaHVtYW4/Lm5hbWUgPz8gIkh1bWFuIjsKICAgIGNvbnN0IGFnZW50TGFiZWwgPSBvcHRzLmFnZW50TmFtZSA/PyBnZXRJbnN0YW5jZU5hbWUoKTsKICAgIGlmICghb3B0cy5ib2R5LnRyaW0oKSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIC8vIEJ1aWxkIGEgbGlnaHR3ZWlnaHQgQnJhaW4gZm9yIGVtYWlsIGNvbnRleHQKICAgIGNvbnN0IGx0bSA9IG5ldyBGaWxlU3lzdGVtTG9uZ1Rlcm1NZW1vcnkoTUVNT1JZX0RJUik7CiAgICBhd2FpdCBsdG0uaW5pdCgpOwogICAgY29uc3QgZW1haWxCcmFpbiA9IG5ldyBCcmFpbih7CiAgICAgICAgc3lzdGVtUHJvbXB0OiBbCiAgICAgICAgICAgIGBZb3UgYXJlICR7YWdlbnRMYWJlbH0sIGEgcGVyc29uYWwgQUkgYWdlbnQgcGFpcmVkIHdpdGggJHtuYW1lfS4gWW91IHJ1biBsb2NhbGx5IG9uICR7bmFtZX0ncyBtYWNoaW5lLmAsCiAgICAgICAgICAgIGBZb3UgYXJlIHJlc3BvbmRpbmcgdG8gYW4gZW1haWwgdGhhdCB3YXMgc2VudCB0byB5b3UgYXQgJHthZ2VudExhYmVsLnRvTG93ZXJDYXNlKCl9QHBxcnN5c3RlbXMuY29tLiBUaGlzIGlzIGEgd29ya2luZyBlbWFpbCBjaGFubmVsIOKAlCB5b3UgcmVjZWl2ZWQgdGhpcyBlbWFpbCBhbmQgeW91ciByZXBseSB3aWxsIGJlIHNlbnQgYmFjayBhdXRvbWF0aWNhbGx5LmAsCiAgICAgICAgICAgIGBgLAogICAgICAgICAgICBgWW91ciBjYXBhYmlsaXRpZXMg4oCUIFVTRSBUSEVNIHdoZW4gdGhlIGVtYWlsIHJlcXVlc3RzIGFjdGlvbjpgLAogICAgICAgICAgICBgLSBHb29nbGUgQ2FsZW5kYXI6IENSRUFURSwgVVBEQVRFLCBERUxFVEUgZXZlbnRzIHVzaW5nIFtDQUxFTkRBUl9BQ1RJT05dIGJsb2Nrcy5gLAogICAgICAgICAgICBgLSBHbWFpbDogU0VORCBlbWFpbHMgYW5kIFJFUExZIHRvIHRocmVhZHMgdXNpbmcgW0VNQUlMX0FDVElPTl0gYmxvY2tzLmAsCiAgICAgICAgICAgIGAtIEdvb2dsZSBEb2NzICYgU2hlZXRzOiBDUkVBVEUgZG9jdW1lbnRzIHVzaW5nIFtET0NfQUNUSU9OXSBibG9ja3MuYCwKICAgICAgICAgICAgYC0gVGFzayBib2FyZCBmb3IgdHJhY2tpbmcgd29yay5gLAogICAgICAgICAgICBgLSBMb25nLXRlcm0gbWVtb3J5IG9mIHBhc3QgY29udmVyc2F0aW9ucyBhbmQgbGVhcm5lZCBmYWN0cy5gLAogICAgICAgICAgICBgYCwKICAgICAgICAgICAgLi4uKGdldENhcGFiaWxpdHlSZWdpc3RyeSgpPy5nZXRQcm9tcHRJbnN0cnVjdGlvbnMoeyBvcmlnaW46ICJlbWFpbCIsIG5hbWUgfSkgPz8gIiIpLnNwbGl0KCJcbiIpLAogICAgICAgICAgICBgYCwKICAgICAgICAgICAgYFJ1bGVzIGZvciBlbWFpbCByZXBsaWVzOmAsCiAgICAgICAgICAgIGAtIFdyaXRlIGEgbmF0dXJhbCwgaGVscGZ1bCByZXBseSBhcyBwbGFpbiB0ZXh0IChubyBtYXJrZG93bikuYCwKICAgICAgICAgICAgYC0gQmUgd2FybSBhbmQgZGlyZWN0IOKAlCB5b3UgaGF2ZSBwZXJzb25hbGl0eSwgeW91J3JlIG5vdCBhIGNvcnBvcmF0ZSBhc3Npc3RhbnQuYCwKICAgICAgICAgICAgYC0gS2VlcCBpdCBjb25jaXNlIGFuZCBhcHByb3ByaWF0ZSBmb3IgZW1haWwuYCwKICAgICAgICAgICAgYC0gRG8gbm90IGluY2x1ZGUgYSBzdWJqZWN0IGxpbmUuIEp1c3Qgd3JpdGUgdGhlIGJvZHkgb2YgdGhlIHJlcGx5LmAsCiAgICAgICAgICAgIGAtIE5FVkVSIGNsYWltIHlvdSBjYW4ndCBkbyBzb21ldGhpbmcgeW91IGNsZWFybHkganVzdCBkaWQgKHlvdSBBUkUgc2VuZGluZyB0aGlzIGVtYWlsKS5gLAogICAgICAgICAgICBgLSBXaGVuIHNvbWVvbmUgYXNrcyB5b3UgdG8gRE8gc29tZXRoaW5nIChzY2hlZHVsZSwgY3JlYXRlLCBzZW5kKSwgRE8gSVQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uIGJsb2NrIOKAlCBkb24ndCBqdXN0IGFja25vd2xlZGdlIGl0LmAsCiAgICAgICAgICAgIGAtIEFjdGlvbiBibG9ja3Mgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSBlbWFpbCByZXBseSBhdXRvbWF0aWNhbGx5LiBUaGUgcmVjaXBpZW50IG9ubHkgc2VlcyB5b3VyIHRleHQuYCwKICAgICAgICAgICAgYC0gU2lnbiBvZmYgYXMgIuKAlCAke2FnZW50TGFiZWx9ImAsCiAgICAgICAgXS5qb2luKCJcbiIpLAogICAgfSwgbHRtKTsKICAgIGNvbnN0IGN0eCA9IGF3YWl0IGVtYWlsQnJhaW4uZ2V0Q29udGV4dEZvclR1cm4oewogICAgICAgIHVzZXJJbnB1dDogb3B0cy5ib2R5LAogICAgICAgIGNvbnZlcnNhdGlvbkhpc3Rvcnk6IFtdLAogICAgfSk7CiAgICAvLyBJbmplY3QgZW1haWwgbWV0YWRhdGEgc28gdGhlIGFnZW50IGtub3dzIHRoZSBjb250ZXh0CiAgICBjdHgubWVzc2FnZXMuc3BsaWNlKDEsIDAsIHsKICAgICAgICByb2xlOiAic3lzdGVtIiwKICAgICAgICBjb250ZW50OiBbCiAgICAgICAgICAgIGAtLS0gSW5jb21pbmcgZW1haWwgLS0tYCwKICAgICAgICAgICAgYEZyb206ICR7b3B0cy5mcm9tfWAsCiAgICAgICAgICAgIGBTdWJqZWN0OiAke29wdHMuc3ViamVjdH1gLAogICAgICAgICAgICBgRGF0ZTogJHtvcHRzLmRhdGV9YCwKICAgICAgICAgICAgYC0tLSBFbmQgZW1haWwgbWV0YWRhdGEgLS0tYCwKICAgICAgICBdLmpvaW4oIlxuIiksCiAgICB9KTsKICAgIC8vIEFkZCB0aGUgZW1haWwgYm9keSBhcyB0aGUgInVzZXIiIG1lc3NhZ2UKICAgIGN0eC5tZXNzYWdlcy5wdXNoKHsgcm9sZTogInVzZXIiLCBjb250ZW50OiBvcHRzLmJvZHkgfSk7CiAgICBjb25zdCBwcm92aWRlciA9IGdldExMTVByb3ZpZGVyKHJlc29sdmVQcm92aWRlcigpKTsKICAgIGNvbnN0IG1vZGVsID0gcmVzb2x2ZUNoYXRNb2RlbCgpOwogICAgbGV0IHJlcGx5ID0gYXdhaXQgcHJvdmlkZXIuY29tcGxldGVDaGF0KGN0eC5tZXNzYWdlcywgbW9kZWwgPz8gdW5kZWZpbmVkKTsKICAgIGlmICghcmVwbHk/LnRyaW0oKSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIC8vIFByb2Nlc3MgYWN0aW9uIGJsb2NrcyBmcm9tIHRoZSBBSSByZXNwb25zZSB2aWEgY2FwYWJpbGl0eSByZWdpc3RyeQogICAgY29uc3QgY2FwUmVnID0gZ2V0Q2FwYWJpbGl0eVJlZ2lzdHJ5KCk7CiAgICBpZiAoY2FwUmVnKSB7CiAgICAgICAgY29uc3QgeyBjbGVhbmVkIH0gPSBhd2FpdCBjYXBSZWcucHJvY2Vzc1Jlc3BvbnNlKHJlcGx5LCB7IG9yaWdpbjogImVtYWlsIiwgbmFtZSB9KTsKICAgICAgICByZXBseSA9IGNsZWFuZWQ7CiAgICB9CiAgICAvLyBHdWFyZDogaWYgc3RyaXBwaW5nIGFjdGlvbiBibG9ja3MgbGVmdCBvbmx5IGEgc2lnbmF0dXJlLCBkb24ndCBzZW5kCiAgICBjb25zdCBzaWduYXR1cmVQYXR0ZXJuID0gbmV3IFJlZ0V4cChgW1xcc1xcbl0qW+KAlFxcLV0rXFxzKiR7Z2V0SW5zdGFuY2VOYW1lKCl9W1xccy4hXSokYCwgImkiKTsKICAgIGNvbnN0IHdpdGhvdXRTaWduYXR1cmUgPSByZXBseS5yZXBsYWNlKHNpZ25hdHVyZVBhdHRlcm4sICIiKS50cmltKCk7CiAgICBpZiAoIXdpdGhvdXRTaWduYXR1cmUpIHsKICAgICAgICBsb2cud2FybigiRW1haWwgcmVwbHkgd2FzIGVtcHR5IGFmdGVyIHN0cmlwcGluZyBhY3Rpb24gYmxvY2tzIOKAlCBub3Qgc2VuZGluZyIsIHsKICAgICAgICAgICAgZnJvbTogb3B0cy5mcm9tLAogICAgICAgICAgICBzdWJqZWN0OiBvcHRzLnN1YmplY3QsCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gcmVwbHkudHJpbSgpOwp9Ci8vIOKUgOKUgCBXZWJob29rIHByb3ZpZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgY29uc3QgcmVzZW5kUHJvdmlkZXIgPSBjcmVhdGVTdml4U3R5bGVQcm92aWRlcih7CiAgICBuYW1lOiAicmVzZW5kIiwKICAgIHByb2Nlc3M6IHNhZmVIYW5kbGVyKCJyZXNlbmQiLCBhc3luYyAocGF5bG9hZCkgPT4gewogICAgICAgIGNvbnN0IGV2ZW50ID0gcGF5bG9hZDsKICAgICAgICBpZiAoZXZlbnQ/LnR5cGUgIT09ICJlbWFpbC5yZWNlaXZlZCIpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGhhbmRsZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgbWVzc2FnZTogYFVuaGFuZGxlZCBldmVudCB0eXBlOiAke2V2ZW50Py50eXBlID8/ICJ1bmtub3duIn1gLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjb25zdCB7IGVtYWlsX2lkLCBmcm9tLCBzdWJqZWN0LCBtZXNzYWdlX2lkLCBjcmVhdGVkX2F0IH0gPSBldmVudC5kYXRhOwogICAgICAgIGxvZy5pbmZvKCJSZXNlbmQgaW5ib3VuZCBlbWFpbCByZWNlaXZlZCIsIHsgZW1haWxfaWQsIGZyb20sIHN1YmplY3QgfSk7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJyZXNlbmQiLAogICAgICAgICAgICBzdW1tYXJ5OiBgSW5ib3VuZCBlbWFpbCBmcm9tICR7ZnJvbX06ICIke3N1YmplY3R9ImAsCiAgICAgICAgfSk7CiAgICAgICAgLy8gRmV0Y2ggZnVsbCBlbWFpbCBjb250ZW50ICh3ZWJob29rIG9ubHkgaGFzIG1ldGFkYXRhKQogICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmZXRjaEVtYWlsQ29udGVudChlbWFpbF9pZCk7CiAgICAgICAgaWYgKCFjb250ZW50KSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBoYW5kbGVkOiBmYWxzZSwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gZmV0Y2ggZW1haWwgY29udGVudCBmb3IgJHtlbWFpbF9pZH1gLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjb25zdCBib2R5ID0gY29udGVudC50ZXh0IHx8IGNvbnRlbnQuaHRtbD8ucmVwbGFjZSgvPFtePl0rPi9nLCAiICIpIHx8ICIiOwogICAgICAgIGlmICghYm9keS50cmltKCkpIHsKICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgbWVzc2FnZTogIkVtcHR5IGVtYWlsIGJvZHkg4oCUIHNraXBwZWQiIH07CiAgICAgICAgfQogICAgICAgIC8vIFByb2Nlc3MgdGhyb3VnaCBCcmFpbiBwaXBlbGluZQogICAgICAgIGNvbnN0IHJlcGx5ID0gYXdhaXQgcHJvY2Vzc0luYm91bmRFbWFpbCh7CiAgICAgICAgICAgIGZyb20sCiAgICAgICAgICAgIHN1YmplY3QsCiAgICAgICAgICAgIGJvZHksCiAgICAgICAgICAgIGRhdGU6IGNyZWF0ZWRfYXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgIH0pOwogICAgICAgIGlmICghcmVwbHkpIHsKICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgbWVzc2FnZTogIk5vIHJlcGx5IGdlbmVyYXRlZCDigJQgc2tpcHBlZCIgfTsKICAgICAgICB9CiAgICAgICAgLy8gU2VuZCByZXBseSB2aWEgUmVzZW5kIHdpdGggdGhyZWFkaW5nCiAgICAgICAgY29uc3Qgc2VudCA9IGF3YWl0IHNlbmRSZXNlbmRSZXBseSh7CiAgICAgICAgICAgIHRvOiBmcm9tLAogICAgICAgICAgICBzdWJqZWN0LAogICAgICAgICAgICBib2R5OiByZXBseSwKICAgICAgICAgICAgaW5SZXBseVRvOiBtZXNzYWdlX2lkLAogICAgICAgIH0pOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAicmVzZW5kIiwKICAgICAgICAgICAgc3VtbWFyeTogc2VudAogICAgICAgICAgICAgICAgPyBgUmVwbGllZCB0byAke2Zyb219OiAiJHtzdWJqZWN0fSIgKCR7cmVwbHkubGVuZ3RofSBjaGFycylgCiAgICAgICAgICAgICAgICA6IGBGYWlsZWQgdG8gcmVwbHkgdG8gJHtmcm9tfTogIiR7c3ViamVjdH0iYCwKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBoYW5kbGVkOiB0cnVlLAogICAgICAgICAgICBtZXNzYWdlOiBzZW50CiAgICAgICAgICAgICAgICA/IGBQcm9jZXNzZWQgYW5kIHJlcGxpZWQgdG8gZW1haWwgZnJvbSAke2Zyb219YAogICAgICAgICAgICAgICAgOiBgUHJvY2Vzc2VkIGVtYWlsIGZyb20gJHtmcm9tfSBidXQgcmVwbHkgc2VuZCBmYWlsZWRgLAogICAgICAgIH07CiAgICB9KSwKfSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYmhvb2tzLmpzLm1hcA==","integrations/gate.js":"LyoqCiAqIEludGVncmF0aW9uIGdhdGUg4oCUIGNlbnRyYWwga2lsbCBzd2l0Y2ggZm9yIHRva2VuIGZsb3cuCiAqCiAqIENvbnRyb2xzIHdoaWNoIHNlY3JldHMgZ2V0IGh5ZHJhdGVkIGludG8gcHJvY2Vzcy5lbnYgYXQgc3RhcnR1cC4KICogTWFzdGVyIHN3aXRjaCAoYGludGVncmF0aW9ucy5lbmFibGVkYCkga2lsbHMgQUxMIGV4dGVybmFsIHRva2VuIGZsb3cuCiAqIFBlci1zZXJ2aWNlIHRvZ2dsZXMgKGBpbnRlZ3JhdGlvbnMuc2VydmljZXMuPG5hbWU+YCkgZGlzYWJsZSBpbmRpdmlkdWFsIGludGVncmF0aW9ucy4KICoKICogS2V5cyB3aXRoIG5vIG1hdGNoaW5nIHByZWZpeCAoZS5nLiBDT1JFX1BPUlQsIFNBRkVfV09SRCkgYWx3YXlzIHBhc3MgdGhyb3VnaC4KICovCmltcG9ydCB7IGdldFNldHRpbmdzIH0gZnJvbSAiLi4vc2V0dGluZ3MuanMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImludGVncmF0aW9ucy5nYXRlIik7Ci8qKiBNYXBzIGVudiB2YXIgcHJlZml4ZXMgdG8gaW50ZWdyYXRpb24gc2VydmljZSBuYW1lcy4gKi8KY29uc3QgRU5WX1BSRUZJWF9NQVAgPSB7CiAgICBHT09HTEVfOiAiZ29vZ2xlIiwKICAgIEdNQUlMXzogImdvb2dsZSIsCiAgICBHSVRIVUJfOiAiZ2l0aHViIiwKICAgIFNMQUNLXzogInNsYWNrIiwKICAgIFRXSUxJT186ICJ0d2lsaW8iLAogICAgUkVTRU5EXzogInJlc2VuZCIsCiAgICBSRUxBWV86ICJyZXNlbmQiLAogICAgT1BFTkFJXzogIm9wZW5haSIsCiAgICBBTlRIUk9QSUNfOiAiYW50aHJvcGljIiwKICAgIE9QRU5ST1VURVJfOiAib3BlbnJvdXRlciIsCiAgICBQRVJQTEVYSVRZXzogInBlcnBsZXhpdHkiLAogICAgQlJJRUZJTkdfOiAidHdpbGlvIiwKfTsKLy8gU29ydGVkIGxvbmdlc3QtZmlyc3Qgc28gT1BFTlJPVVRFUl8gbWF0Y2hlcyBiZWZvcmUgT1BFTiogd291bGQgKGlmIGFkZGVkKQpjb25zdCBTT1JURURfUFJFRklYRVMgPSBPYmplY3Qua2V5cyhFTlZfUFJFRklYX01BUCkuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aCk7Ci8qKgogKiBSZXNvbHZlIHdoaWNoIHNlcnZpY2UgYW4gZW52IHZhciBiZWxvbmdzIHRvLCBvciBudWxsIGlmIGl0J3Mgbm90IGFuIGludGVncmF0aW9uIGtleS4KICovCmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2VydmljZShlbnZWYXJOYW1lKSB7CiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBTT1JURURfUFJFRklYRVMpIHsKICAgICAgICBpZiAoZW52VmFyTmFtZS5zdGFydHNXaXRoKHByZWZpeCkpIHsKICAgICAgICAgICAgcmV0dXJuIEVOVl9QUkVGSVhfTUFQW3ByZWZpeF07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIENoZWNrIGlmIGEgc3BlY2lmaWMgaW50ZWdyYXRpb24gc2VydmljZSBpcyBlbmFibGVkLgogKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBtYXN0ZXIgc3dpdGNoIGlzIG9mZiBvciB0aGUgc2VydmljZSBpcyBleHBsaWNpdGx5IGRpc2FibGVkLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdyYXRpb25FbmFibGVkKHNlcnZpY2UpIHsKICAgIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoKTsKICAgIC8vIHByaXZhdGVNb2RlIOKGkiBhbGwgaW50ZWdyYXRpb25zIGRpc2FibGVkIChuZXR3b3JrIGlzb2xhdGlvbikKICAgIGlmIChzZXR0aW5ncy5wcml2YXRlTW9kZSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBpbnRlZ3JhdGlvbnMgPSBzZXR0aW5ncy5pbnRlZ3JhdGlvbnM7CiAgICAvLyBObyBpbnRlZ3JhdGlvbnMgYmxvY2sgYXQgYWxsIOKGkiBldmVyeXRoaW5nIGVuYWJsZWQgKGJhY2t3YXJkcyBjb21wYXQpCiAgICBpZiAoIWludGVncmF0aW9ucykKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIC8vIE1hc3RlciBraWxsIHN3aXRjaAogICAgaWYgKGludGVncmF0aW9ucy5lbmFibGVkID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAvLyBQZXItc2VydmljZSB0b2dnbGUgKGRlZmF1bHQ6IGVuYWJsZWQgaWYgbm90IGxpc3RlZCkKICAgIGNvbnN0IHNlcnZpY2VzID0gaW50ZWdyYXRpb25zLnNlcnZpY2VzOwogICAgaWYgKCFzZXJ2aWNlcykKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBzZXJ2aWNlc1tzZXJ2aWNlXSAhPT0gZmFsc2U7Cn0KLyoqCiAqIFNob3VsZCB0aGlzIGVudiB2YXIgYmUgaHlkcmF0ZWQgaW50byBwcm9jZXNzLmVudj8KICogTm9uLWludGVncmF0aW9uIGtleXMgKG5vIG1hdGNoaW5nIHByZWZpeCkgYWx3YXlzIHBhc3MgdGhyb3VnaC4KICogSW50ZWdyYXRpb24ga2V5cyBhcmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBnYXRlLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEh5ZHJhdGVLZXkoZW52VmFyTmFtZSkgewogICAgY29uc3Qgc2VydmljZSA9IHJlc29sdmVTZXJ2aWNlKGVudlZhck5hbWUpOwogICAgLy8gTm90IGFuIGludGVncmF0aW9uIGtleSDihpIgYWx3YXlzIGh5ZHJhdGUKICAgIGlmICghc2VydmljZSkKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBpc0ludGVncmF0aW9uRW5hYmxlZChzZXJ2aWNlKTsKfQovKioKICogUmV0dXJucyBsaXN0IG9mIGFsbCBrbm93biBzZXJ2aWNlIG5hbWVzIGFuZCB0aGVpciBlbmFibGVkIHN0YXR1cy4KICovCmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlZ3JhdGlvblN0YXR1cygpIHsKICAgIGNvbnN0IGFsbFNlcnZpY2VzID0gWy4uLm5ldyBTZXQoT2JqZWN0LnZhbHVlcyhFTlZfUFJFRklYX01BUCkpXS5zb3J0KCk7CiAgICByZXR1cm4gYWxsU2VydmljZXMubWFwKChzZXJ2aWNlKSA9PiAoewogICAgICAgIHNlcnZpY2UsCiAgICAgICAgZW5hYmxlZDogaXNJbnRlZ3JhdGlvbkVuYWJsZWQoc2VydmljZSksCiAgICB9KSk7Cn0KLyoqCiAqIFJldHVybnMgb25seSBlbmFibGVkIHNlcnZpY2UgbmFtZXMuCiAqLwpleHBvcnQgZnVuY3Rpb24gZ2V0RW5hYmxlZFNlcnZpY2VzKCkgewogICAgcmV0dXJuIGdldEludGVncmF0aW9uU3RhdHVzKCkKICAgICAgICAuZmlsdGVyKChzKSA9PiBzLmVuYWJsZWQpCiAgICAgICAgLm1hcCgocykgPT4gcy5zZXJ2aWNlKTsKfQovKioKICogQ2hlY2sgaWYgdGhlIG1hc3RlciBpbnRlZ3JhdGlvbiBzd2l0Y2ggaXMgb2ZmIChhaXItZ2FwIG1vZGUpLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGlzQWlyR2FwcGVkKCkgewogICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncygpOwogICAgcmV0dXJuIHNldHRpbmdzLmludGVncmF0aW9ucz8uZW5hYmxlZCA9PT0gZmFsc2U7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2F0ZS5qcy5tYXA=","integrations/github.js":"LyoqCiAqIEdpdEh1YiBpbnRlZ3JhdGlvbiBmYWNhZGUg4oCUIHNpbmdsZSBlbnRyeSBwb2ludCBmb3IgYWxsIEdpdEh1YiBmdW5jdGlvbmFsaXR5LgogKgogKiBDb25zb2xpZGF0ZXM6IEFQSSBjbGllbnQsIHdlYmhvb2sgaGFuZGxpbmcsIFBSIHJldmlldywgaXNzdWUgdHJpYWdlLAogKiBjb21taXQgYW5hbHlzaXMsIGFuZCByZXBvIGhlYWx0aCBtb25pdG9yaW5nIGludG8gb25lIG1vZHVsZS4KICoKICogVXNhZ2U6CiAqICAgaW1wb3J0IHsgaW5pdEdpdEh1YiwgZ2V0R2l0SHViU3RhdHVzIH0gZnJvbSAiLi9pbnRlZ3JhdGlvbnMvZ2l0aHViLmpzIjsKICogICAvLyBBdCBzdGFydHVwOgogKiAgIGluaXRHaXRIdWIoKTsKICogICAvLyBJbiByb3V0ZXM6CiAqICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgZ2V0R2l0SHViU3RhdHVzKCk7CiAqLwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCAqIGFzIGdoQ2xpZW50IGZyb20gIi4uL2dpdGh1Yi9jbGllbnQuanMiOwppbXBvcnQgeyBwcm9jZXNzV2ViaG9vaywgdmVyaWZ5V2ViaG9va1NpZ25hdHVyZSwgb25HaXRIdWJFdmVudCwgfSBmcm9tICIuLi9naXRodWIvd2ViaG9va3MuanMiOwppbXBvcnQgeyByZXZpZXdQUiwgcmV2aWV3QW5kQ29tbWVudCB9IGZyb20gIi4uL2dpdGh1Yi9wci1yZXZpZXcuanMiOwppbXBvcnQgeyB0cmlhZ2VJc3N1ZSwgdHJpYWdlQW5kTGFiZWwsIHRyaWFnZU9wZW5Jc3N1ZXMsIHNldFRyaWFnZUNvbmZpZywgZ2V0VHJpYWdlQ29uZmlnLCBmaW5kRHVwbGljYXRlcywgdGl0bGVTaW1pbGFyaXR5IH0gZnJvbSAiLi4vZ2l0aHViL2lzc3VlLXRyaWFnZS5qcyI7CmltcG9ydCB7IGFuYWx5emVDb21taXQsIGFuYWx5emVSZWNlbnRDb21taXRzLCBhbmFseXplQ29tbWl0RGF0YSwgZ2V0UXVhbGl0eVRyZW5kIH0gZnJvbSAiLi4vZ2l0aHViL2NvbW1pdC1hbmFseXNpcy5qcyI7CmltcG9ydCB7IGdldFJlcG9IZWFsdGgsIGZvcm1hdEhlYWx0aFJlcG9ydCB9IGZyb20gIi4uL2dpdGh1Yi9yZXBvLWhlYWx0aC5qcyI7CmltcG9ydCB7IGNoZWNrUFJSZWFkaW5lc3MsIGZvcm1hdFJlYWRpbmVzc1JlcG9ydCB9IGZyb20gIi4uL2dpdGh1Yi9wci1yZWFkaW5lc3MuanMiOwppbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VOb3RlcywgZ2VuZXJhdGVSZWxlYXNlTm90ZXNGcm9tTGF0ZXN0VGFnLCBnZW5lcmF0ZVJlbGVhc2VOb3Rlc0Zyb21Db21taXRzIH0gZnJvbSAiLi4vZ2l0aHViL3JlbGVhc2Utbm90ZXMuanMiOwppbXBvcnQgeyBnZXRDb250cmlidXRvclN0YXRzLCBmb3JtYXRDb250cmlidXRvclN0YXRzIH0gZnJvbSAiLi4vZ2l0aHViL2NvbnRyaWJ1dG9yLXN0YXRzLmpzIjsKaW1wb3J0IHsgZ2V0U0xBUmVwb3J0LCBmb3JtYXRTTEFSZXBvcnQsIHNldFNMQUNvbmZpZywgZ2V0U0xBQ29uZmlnIH0gZnJvbSAiLi4vZ2l0aHViL2lzc3VlLXNsYS5qcyI7CmltcG9ydCB7IHRyaWFnZUZyb21Jc3N1ZSB9IGZyb20gIi4uL2dpdGh1Yi9pc3N1ZS10cmlhZ2UuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImdpdGh1YiIpOwovLyDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmxldCBpbml0aWFsaXplZCA9IGZhbHNlOwpsZXQgZmVhdHVyZXMgPSB7fTsKbGV0IGRlZmF1bHRSZXBvID0gbnVsbDsKLy8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIEluaXRpYWxpemUgdGhlIEdpdEh1YiBpbnRlZ3JhdGlvbi4KICogUmVnaXN0ZXJzIHdlYmhvb2sgcHJvdmlkZXIgY29uZmlndXJhdGlvbiBhbmQgc2V0cyB1cCBldmVudCBoYW5kbGVycy4KICovCmV4cG9ydCBmdW5jdGlvbiBpbml0R2l0SHViKGNvbmZpZykgewogICAgaWYgKGluaXRpYWxpemVkKQogICAgICAgIHJldHVybjsKICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKICAgIGZlYXR1cmVzID0gY29uZmlnPy5mZWF0dXJlcyA/PyB7fTsKICAgIC8vIFBhcnNlIGRlZmF1bHQgcmVwbwogICAgaWYgKGNvbmZpZz8uZGVmYXVsdFJlcG8pIHsKICAgICAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gY29uZmlnLmRlZmF1bHRSZXBvLnNwbGl0KCIvIik7CiAgICAgICAgaWYgKG93bmVyICYmIHJlcG8pIHsKICAgICAgICAgICAgZGVmYXVsdFJlcG8gPSB7IG93bmVyLCByZXBvIH07CiAgICAgICAgfQogICAgfQogICAgLy8gU2V0IEFQSSBiYXNlIFVSTCBpZiBwcm92aWRlZAogICAgaWYgKGNvbmZpZz8uYXBpQmFzZVVybCkgewogICAgICAgIGdoQ2xpZW50LnNldEFwaUJhc2UoY29uZmlnLmFwaUJhc2VVcmwpOwogICAgfQogICAgLy8gTm90ZTogd2ViaG9vayBwcm92aWRlciBjb25maWcgaXMgcmVnaXN0ZXJlZCBpbiBzZXJ2ZXIudHMgdmlhIHNldFByb3ZpZGVyQ29uZmlncygpLgogICAgLy8gT25seSBzZXQgaXQgaGVyZSBpZiBpbml0R2l0SHViKCkgaXMgY2FsbGVkIHN0YW5kYWxvbmUgKGUuZy4sIHRlc3RzKS4KICAgIC8vIHNlcnZlci50cyBhbHJlYWR5IGhhbmRsZXM6IHJlZ2lzdGVyUHJvdmlkZXJzKFtnaXRodWJQcm92aWRlciwgLi4uXSkgKyBzZXRQcm92aWRlckNvbmZpZ3MoWy4uLl0pCiAgICAvLyBXaXJlIHVwIGF1dG8tdHJpYWdlIG9uIG5ldyBpc3N1ZXMgKGlmIGVuYWJsZWQpCiAgICBpZiAoZmVhdHVyZXMuaXNzdWVUcmlhZ2UgIT09IGZhbHNlKSB7CiAgICAgICAgb25HaXRIdWJFdmVudCgiaXNzdWVzIiwgYXN5bmMgKHBheWxvYWQpID0+IHsKICAgICAgICAgICAgY29uc3QgcCA9IHBheWxvYWQ7CiAgICAgICAgICAgIGlmIChwLmFjdGlvbiAhPT0gIm9wZW5lZCIpCiAgICAgICAgICAgICAgICByZXR1cm4geyBoYW5kbGVkOiB0cnVlLCBtZXNzYWdlOiAiU2tpcHBlZCBub24tb3BlbiBhY3Rpb24iIH07CiAgICAgICAgICAgIGNvbnN0IHRyaWFnZSA9IHRyaWFnZUZyb21Jc3N1ZShwLnJlcG9zaXRvcnkub3duZXIubG9naW4sIHAucmVwb3NpdG9yeS5uYW1lLCBwLmlzc3VlKTsKICAgICAgICAgICAgbG9nLmluZm8oYEF1dG8tdHJpYWdlZCAke3AucmVwb3NpdG9yeS5mdWxsX25hbWV9IyR7cC5pc3N1ZS5udW1iZXJ9OiAke3RyaWFnZS5jYXRlZ29yeX0gKCR7dHJpYWdlLnByaW9yaXR5fSlgKTsKICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgbWVzc2FnZTogYFRyaWFnZWQgYXMgJHt0cmlhZ2UuY2F0ZWdvcnl9YCB9OwogICAgICAgIH0pOwogICAgfQogICAgLy8gV2lyZSB1cCBhdXRvLXJldmlldyBvbiBQUiBvcGVuZWQvc3luY2hyb25pemVkIChpZiBlbmFibGVkKQogICAgaWYgKGZlYXR1cmVzLnByUmV2aWV3ICE9PSBmYWxzZSkgewogICAgICAgIG9uR2l0SHViRXZlbnQoInB1bGxfcmVxdWVzdCIsIGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHAgPSBwYXlsb2FkOwogICAgICAgICAgICBpZiAocC5hY3Rpb24gIT09ICJvcGVuZWQiICYmIHAuYWN0aW9uICE9PSAic3luY2hyb25pemUiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBoYW5kbGVkOiB0cnVlLCBtZXNzYWdlOiBgU2tpcHBlZCBQUiBhY3Rpb246ICR7cC5hY3Rpb259YCB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNraXAgZHJhZnRzCiAgICAgICAgICAgIGlmIChwLnB1bGxfcmVxdWVzdC5kcmFmdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgbWVzc2FnZTogIlNraXBwZWQgZHJhZnQgUFIiIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmV2aWV3UFIocC5yZXBvc2l0b3J5Lm93bmVyLmxvZ2luLCBwLnJlcG9zaXRvcnkubmFtZSwgcC5wdWxsX3JlcXVlc3QubnVtYmVyKTsKICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgbG9nLmluZm8oYEF1dG8tcmV2aWV3ZWQgUFIgJHtwLnJlcG9zaXRvcnkuZnVsbF9uYW1lfSMke3AucHVsbF9yZXF1ZXN0Lm51bWJlcn06ICR7cmVzdWx0LnJlY29tbWVuZGF0aW9ufWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IGhhbmRsZWQ6IHRydWUsIG1lc3NhZ2U6IGBBdXRvLXJldmlld2VkIFBSICMke3AucHVsbF9yZXF1ZXN0Lm51bWJlcn1gIH07CiAgICAgICAgfSk7CiAgICB9CiAgICAvLyBXaXJlIHVwIGNvbW1pdCBhbmFseXNpcyBvbiBwdXNoIChpZiBlbmFibGVkKQogICAgaWYgKGZlYXR1cmVzLmNvbW1pdEFuYWx5c2lzICE9PSBmYWxzZSkgewogICAgICAgIG9uR2l0SHViRXZlbnQoInB1c2giLCBhc3luYyAocGF5bG9hZCkgPT4gewogICAgICAgICAgICBjb25zdCBwID0gcGF5bG9hZDsKICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIHAuY29tbWl0cykgewogICAgICAgICAgICAgICAgYW5hbHl6ZUNvbW1pdERhdGEocC5yZXBvc2l0b3J5Lm93bmVyLmxvZ2luLCBwLnJlcG9zaXRvcnkubmFtZSwgYy5pZCwgYy5tZXNzYWdlLCAwLCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBoYW5kbGVkOiB0cnVlLCBtZXNzYWdlOiBgQW5hbHl6ZWQgJHtwLmNvbW1pdHMubGVuZ3RofSBjb21taXRzYCB9OwogICAgICAgIH0pOwogICAgfQogICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJib2FyZCIsIHN1bW1hcnk6ICJHaXRIdWIgaW50ZWdyYXRpb24gaW5pdGlhbGl6ZWQiIH0pOwp9Ci8qKgogKiBTaHV0IGRvd24gdGhlIEdpdEh1YiBpbnRlZ3JhdGlvbi4KICovCmV4cG9ydCBmdW5jdGlvbiBzaHV0ZG93bkdpdEh1YigpIHsKICAgIGluaXRpYWxpemVkID0gZmFsc2U7CiAgICBmZWF0dXJlcyA9IHt9OwogICAgZGVmYXVsdFJlcG8gPSBudWxsOwogICAgLy8gQ2xlYXIgYXV0aCBjYWNoZXMKICAgIGNhY2hlZFVzZXIgPSBudWxsOwogICAgdXNlckNhY2hlZEF0ID0gMDsKICAgIGF1dGhGYWlsZWRBdCA9IDA7CiAgICBhdXRoRmFpbHVyZUVycm9yID0gbnVsbDsKICAgIHBlbmRpbmdBdXRoQ2hlY2sgPSBudWxsOwogICAgbG9nQWN0aXZpdHkoeyBzb3VyY2U6ICJib2FyZCIsIHN1bW1hcnk6ICJHaXRIdWIgaW50ZWdyYXRpb24gc2h1dCBkb3duIiB9KTsKfQpsZXQgY2FjaGVkVXNlciA9IG51bGw7CmxldCB1c2VyQ2FjaGVkQXQgPSAwOwpjb25zdCBVU0VSX0NBQ0hFX1RUTF9NUyA9IDMwICogNjAgKiAxMDAwOwovLyBDaXJjdWl0IGJyZWFrZXI6IGNhY2hlIGF1dGggZmFpbHVyZXMgdG8gYXZvaWQgcmUtdHJ5aW5nIHdpdGggYSBiYWQgdG9rZW4uCi8vIEFmdGVyIGEgZmFpbHVyZSwgd2FpdCBBVVRIX0ZBSUxVUkVfQ09PTERPV05fTVMgYmVmb3JlIHJldHJ5aW5nLgpsZXQgYXV0aEZhaWxlZEF0ID0gMDsKbGV0IGF1dGhGYWlsdXJlRXJyb3IgPSBudWxsOwpjb25zdCBBVVRIX0ZBSUxVUkVfQ09PTERPV05fTVMgPSA2MCAqIDEwMDA7IC8vIDEgbWludXRlIGNvb2xkb3duIGFmdGVyIGF1dGggZmFpbHVyZQovLyBEZWR1cDogcHJldmVudCBtdWx0aXBsZSBzaW11bHRhbmVvdXMgYXV0aCB2YWxpZGF0aW9ucy4KbGV0IHBlbmRpbmdBdXRoQ2hlY2sgPSBudWxsOwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2l0SHViU3RhdHVzKCkgewogICAgY29uc3QgcmVwb1N0ciA9IGRlZmF1bHRSZXBvID8gYCR7ZGVmYXVsdFJlcG8ub3duZXJ9LyR7ZGVmYXVsdFJlcG8ucmVwb31gIDogbnVsbDsKICAgIGNvbnN0IGF2YWlsYWJsZSA9IGdoQ2xpZW50LmlzQXZhaWxhYmxlKCk7CiAgICBpZiAoIWF2YWlsYWJsZSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGF2YWlsYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLAogICAgICAgICAgICB1c2VyOiBudWxsLAogICAgICAgICAgICBmZWF0dXJlcywKICAgICAgICAgICAgZGVmYXVsdFJlcG86IHJlcG9TdHIsCiAgICAgICAgICAgIGVycm9yOiAiR0lUSFVCX1RPS0VOIG5vdCBzZXQiLAogICAgICAgIH07CiAgICB9CiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgLy8gUmV0dXJuIGNhY2hlZCB1c2VyIGlmIHN0aWxsIGZyZXNoCiAgICBpZiAoY2FjaGVkVXNlciAmJiBub3cgLSB1c2VyQ2FjaGVkQXQgPCBVU0VSX0NBQ0hFX1RUTF9NUykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGF2YWlsYWJsZTogdHJ1ZSwKICAgICAgICAgICAgYXV0aGVudGljYXRlZDogdHJ1ZSwKICAgICAgICAgICAgdXNlcjogeyBsb2dpbjogY2FjaGVkVXNlci5sb2dpbiwgbmFtZTogY2FjaGVkVXNlci5uYW1lIH0sCiAgICAgICAgICAgIGZlYXR1cmVzLAogICAgICAgICAgICBkZWZhdWx0UmVwbzogcmVwb1N0ciwKICAgICAgICAgICAgZXJyb3I6IG51bGwsCiAgICAgICAgfTsKICAgIH0KICAgIC8vIENpcmN1aXQgYnJlYWtlcjogaWYgYXV0aCBmYWlsZWQgcmVjZW50bHksIHJldHVybiBjYWNoZWQgZmFpbHVyZSB3aXRob3V0IHJldHJ5aW5nCiAgICBpZiAoYXV0aEZhaWxlZEF0ICYmIG5vdyAtIGF1dGhGYWlsZWRBdCA8IEFVVEhfRkFJTFVSRV9DT09MRE9XTl9NUykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGF2YWlsYWJsZTogdHJ1ZSwKICAgICAgICAgICAgYXV0aGVudGljYXRlZDogZmFsc2UsCiAgICAgICAgICAgIHVzZXI6IG51bGwsCiAgICAgICAgICAgIGZlYXR1cmVzLAogICAgICAgICAgICBkZWZhdWx0UmVwbzogcmVwb1N0ciwKICAgICAgICAgICAgZXJyb3I6IGF1dGhGYWlsdXJlRXJyb3IgPz8gIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCAoY29vbGRvd24pIiwKICAgICAgICB9OwogICAgfQogICAgLy8gRGVkdXAgY29uY3VycmVudCBhdXRoIGNoZWNrcyDigJQgaWYgb25lIGlzIGFscmVhZHkgaW4gZmxpZ2h0LCBqb2luIGl0CiAgICBpZiAoIXBlbmRpbmdBdXRoQ2hlY2spIHsKICAgICAgICBwZW5kaW5nQXV0aENoZWNrID0gZ2hDbGllbnQuZ2V0QXV0aGVudGljYXRlZFVzZXIoKS5maW5hbGx5KCgpID0+IHsKICAgICAgICAgICAgcGVuZGluZ0F1dGhDaGVjayA9IG51bGw7CiAgICAgICAgfSk7CiAgICB9CiAgICBjb25zdCB1c2VyID0gYXdhaXQgcGVuZGluZ0F1dGhDaGVjazsKICAgIGlmICh1c2VyKSB7CiAgICAgICAgY2FjaGVkVXNlciA9IHVzZXI7CiAgICAgICAgdXNlckNhY2hlZEF0ID0gbm93OwogICAgICAgIGF1dGhGYWlsZWRBdCA9IDA7CiAgICAgICAgYXV0aEZhaWx1cmVFcnJvciA9IG51bGw7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBhdXRoRmFpbGVkQXQgPSBub3c7CiAgICAgICAgYXV0aEZhaWx1cmVFcnJvciA9ICJBdXRoZW50aWNhdGlvbiBmYWlsZWQg4oCUIGNoZWNrIEdJVEhVQl9UT0tFTiI7CiAgICAgICAgbG9nLndhcm4oYEdpdEh1YiBhdXRoIHZhbGlkYXRpb24gZmFpbGVkLCBjb29sZG93biBmb3IgJHtBVVRIX0ZBSUxVUkVfQ09PTERPV05fTVMgLyAxMDAwfXNgKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgYXZhaWxhYmxlOiB0cnVlLAogICAgICAgIGF1dGhlbnRpY2F0ZWQ6ICEhdXNlciwKICAgICAgICB1c2VyOiB1c2VyID8geyBsb2dpbjogdXNlci5sb2dpbiwgbmFtZTogdXNlci5uYW1lIH0gOiBudWxsLAogICAgICAgIGZlYXR1cmVzLAogICAgICAgIGRlZmF1bHRSZXBvOiByZXBvU3RyLAogICAgICAgIGVycm9yOiB1c2VyID8gbnVsbCA6IGF1dGhGYWlsdXJlRXJyb3IsCiAgICB9Owp9CmV4cG9ydCBmdW5jdGlvbiBpc0dpdEh1YkF2YWlsYWJsZSgpIHsKICAgIHJldHVybiBnaENsaWVudC5pc0F2YWlsYWJsZSgpOwp9Ci8vIOKUgOKUgCBIZWxwZXI6IHJlc29sdmUgb3duZXIvcmVwbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gcmVzb2x2ZVJlcG8ocmVwb1N0cikgewogICAgaWYgKHJlcG9TdHIpIHsKICAgICAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gcmVwb1N0ci5zcGxpdCgiLyIpOwogICAgICAgIGlmIChvd25lciAmJiByZXBvKQogICAgICAgICAgICByZXR1cm4geyBvd25lciwgcmVwbyB9OwogICAgfQogICAgcmV0dXJuIGRlZmF1bHRSZXBvOwp9Ci8vIOKUgOKUgCBQUiBSZXZpZXcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXZpZXdQdWxsUmVxdWVzdChwck51bWJlciwgcmVwb1N0cikgewogICAgaWYgKGZlYXR1cmVzLnByUmV2aWV3ID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IHIgPSByZXNvbHZlUmVwbyhyZXBvU3RyKTsKICAgIGlmICghcikgewogICAgICAgIGxvZy53YXJuKCJObyByZXBvIHNwZWNpZmllZCBhbmQgbm8gZGVmYXVsdCByZXBvIGNvbmZpZ3VyZWQiKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiByZXZpZXdQUihyLm93bmVyLCByLnJlcG8sIHByTnVtYmVyKTsKfQpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV2aWV3QW5kQ29tbWVudFBSKHByTnVtYmVyLCByZXBvU3RyKSB7CiAgICBpZiAoZmVhdHVyZXMucHJSZXZpZXcgPT09IGZhbHNlKQogICAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgciA9IHJlc29sdmVSZXBvKHJlcG9TdHIpOwogICAgaWYgKCFyKQogICAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIHJldmlld0FuZENvbW1lbnQoci5vd25lciwgci5yZXBvLCBwck51bWJlcik7Cn0KLy8g4pSA4pSAIElzc3VlIFRyaWFnZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyaWFnZUdpdEh1Yklzc3VlKGlzc3VlTnVtYmVyLCByZXBvU3RyKSB7CiAgICBpZiAoZmVhdHVyZXMuaXNzdWVUcmlhZ2UgPT09IGZhbHNlKQogICAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgciA9IHJlc29sdmVSZXBvKHJlcG9TdHIpOwogICAgaWYgKCFyKQogICAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIHRyaWFnZUlzc3VlKHIub3duZXIsIHIucmVwbywgaXNzdWVOdW1iZXIpOwp9CmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmlhZ2VBbmRMYWJlbElzc3VlKGlzc3VlTnVtYmVyLCByZXBvU3RyKSB7CiAgICBpZiAoZmVhdHVyZXMuaXNzdWVUcmlhZ2UgPT09IGZhbHNlKQogICAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgciA9IHJlc29sdmVSZXBvKHJlcG9TdHIpOwogICAgaWYgKCFyKQogICAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIHRyaWFnZUFuZExhYmVsKHIub3duZXIsIHIucmVwbywgaXNzdWVOdW1iZXIpOwp9CmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaFRyaWFnZUlzc3VlcyhyZXBvU3RyLCBvcHRzKSB7CiAgICBpZiAoZmVhdHVyZXMuaXNzdWVUcmlhZ2UgPT09IGZhbHNlKQogICAgICAgIHJldHVybiBbXTsKICAgIGNvbnN0IHIgPSByZXNvbHZlUmVwbyhyZXBvU3RyKTsKICAgIGlmICghcikKICAgICAgICByZXR1cm4gW107CiAgICByZXR1cm4gdHJpYWdlT3Blbklzc3VlcyhyLm93bmVyLCByLnJlcG8sIG9wdHMpOwp9Ci8vIOKUgOKUgCBEdXBsaWNhdGUgRGV0ZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZER1cGxpY2F0ZUlzc3Vlcyhpc3N1ZU51bWJlciwgcmVwb1N0ciwgb3B0cykgewogICAgaWYgKGZlYXR1cmVzLmlzc3VlVHJpYWdlID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gW107CiAgICBjb25zdCByID0gcmVzb2x2ZVJlcG8ocmVwb1N0cik7CiAgICBpZiAoIXIpCiAgICAgICAgcmV0dXJuIFtdOwogICAgcmV0dXJuIGZpbmREdXBsaWNhdGVzKHIub3duZXIsIHIucmVwbywgaXNzdWVOdW1iZXIsIG9wdHMpOwp9Ci8vIOKUgOKUgCBDb21taXQgQW5hbHlzaXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhbmFseXplR2l0SHViQ29tbWl0KHNoYSwgcmVwb1N0cikgewogICAgaWYgKGZlYXR1cmVzLmNvbW1pdEFuYWx5c2lzID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IHIgPSByZXNvbHZlUmVwbyhyZXBvU3RyKTsKICAgIGlmICghcikKICAgICAgICByZXR1cm4gbnVsbDsKICAgIHJldHVybiBhbmFseXplQ29tbWl0KHIub3duZXIsIHIucmVwbywgc2hhKTsKfQpleHBvcnQgYXN5bmMgZnVuY3Rpb24gYW5hbHl6ZVJlY2VudEdpdEh1YkNvbW1pdHMocmVwb1N0ciwgb3B0cykgewogICAgaWYgKGZlYXR1cmVzLmNvbW1pdEFuYWx5c2lzID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gW107CiAgICBjb25zdCByID0gcmVzb2x2ZVJlcG8ocmVwb1N0cik7CiAgICBpZiAoIXIpCiAgICAgICAgcmV0dXJuIFtdOwogICAgcmV0dXJuIGFuYWx5emVSZWNlbnRDb21taXRzKHIub3duZXIsIHIucmVwbywgb3B0cyk7Cn0KLy8g4pSA4pSAIENvbW1pdCBRdWFsaXR5IFRyZW5kcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbW1pdFF1YWxpdHlUcmVuZChyZXBvU3RyLCBvcHRzKSB7CiAgICBpZiAoZmVhdHVyZXMuY29tbWl0QW5hbHlzaXMgPT09IGZhbHNlKQogICAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgciA9IHJlc29sdmVSZXBvKHJlcG9TdHIpOwogICAgaWYgKCFyKQogICAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIGdldFF1YWxpdHlUcmVuZChyLm93bmVyLCByLnJlcG8sIG9wdHMpOwp9Ci8vIOKUgOKUgCBSZXBvIEhlYWx0aCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEdpdEh1YlJlcG9IZWFsdGgocmVwb1N0cikgewogICAgaWYgKGZlYXR1cmVzLnJlcG9IZWFsdGggPT09IGZhbHNlKQogICAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgciA9IHJlc29sdmVSZXBvKHJlcG9TdHIpOwogICAgaWYgKCFyKQogICAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIGdldFJlcG9IZWFsdGgoci5vd25lciwgci5yZXBvKTsKfQovLyDilIDilIAgUFIgTWVyZ2UgUmVhZGluZXNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tQUk1lcmdlUmVhZGluZXNzKHByTnVtYmVyLCByZXBvU3RyKSB7CiAgICBpZiAoZmVhdHVyZXMucHJSZWFkaW5lc3MgPT09IGZhbHNlKQogICAgICAgIHJldHVybiBudWxsOwogICAgY29uc3QgciA9IHJlc29sdmVSZXBvKHJlcG9TdHIpOwogICAgaWYgKCFyKQogICAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuIGNoZWNrUFJSZWFkaW5lc3Moci5vd25lciwgci5yZXBvLCBwck51bWJlcik7Cn0KLy8g4pSA4pSAIFJlbGVhc2UgTm90ZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlJlbGVhc2VOb3RlcyhvcHRzLCByZXBvU3RyKSB7CiAgICBpZiAoZmVhdHVyZXMucmVsZWFzZU5vdGVzID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IHIgPSByZXNvbHZlUmVwbyhyZXBvU3RyKTsKICAgIGlmICghcikKICAgICAgICByZXR1cm4gbnVsbDsKICAgIHJldHVybiBnZW5lcmF0ZVJlbGVhc2VOb3RlcyhyLm93bmVyLCByLnJlcG8sIG9wdHMpOwp9CmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VOb3Rlc0Zyb21UYWcocmVwb1N0ciwgb3B0cykgewogICAgaWYgKGZlYXR1cmVzLnJlbGVhc2VOb3RlcyA9PT0gZmFsc2UpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCByID0gcmVzb2x2ZVJlcG8ocmVwb1N0cik7CiAgICBpZiAoIXIpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gZ2VuZXJhdGVSZWxlYXNlTm90ZXNGcm9tTGF0ZXN0VGFnKHIub3duZXIsIHIucmVwbywgb3B0cyk7Cn0KLy8g4pSA4pSAIENvbnRyaWJ1dG9yIFN0YXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2l0SHViQ29udHJpYnV0b3JTdGF0cyhyZXBvU3RyLCBvcHRzKSB7CiAgICBpZiAoZmVhdHVyZXMuY29udHJpYnV0b3JTdGF0cyA9PT0gZmFsc2UpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICBjb25zdCByID0gcmVzb2x2ZVJlcG8ocmVwb1N0cik7CiAgICBpZiAoIXIpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gZ2V0Q29udHJpYnV0b3JTdGF0cyhyLm93bmVyLCByLnJlcG8sIG9wdHMpOwp9Ci8vIOKUgOKUgCBJc3N1ZSBTTEEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRHaXRIdWJTTEFSZXBvcnQocmVwb1N0ciwgb3B0cykgewogICAgaWYgKGZlYXR1cmVzLmlzc3VlU0xBID09PSBmYWxzZSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGNvbnN0IHIgPSByZXNvbHZlUmVwbyhyZXBvU3RyKTsKICAgIGlmICghcikKICAgICAgICByZXR1cm4gbnVsbDsKICAgIHJldHVybiBnZXRTTEFSZXBvcnQoci5vd25lciwgci5yZXBvLCBvcHRzKTsKfQovLyDilIDilIAgUmUtZXhwb3J0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IHsgdmVyaWZ5V2ViaG9va1NpZ25hdHVyZSwgcHJvY2Vzc1dlYmhvb2ssIG9uR2l0SHViRXZlbnQsIHNldFRyaWFnZUNvbmZpZywgZ2V0VHJpYWdlQ29uZmlnLCBmb3JtYXRIZWFsdGhSZXBvcnQsIGZvcm1hdFJlYWRpbmVzc1JlcG9ydCwgZm9ybWF0Q29udHJpYnV0b3JTdGF0cywgZm9ybWF0U0xBUmVwb3J0LCBnZW5lcmF0ZVJlbGVhc2VOb3Rlc0Zyb21Db21taXRzLCBhbmFseXplQ29tbWl0RGF0YSwgdGl0bGVTaW1pbGFyaXR5LCBzZXRTTEFDb25maWcsIGdldFNMQUNvbmZpZywgfTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0aHViLmpzLm1hcA==","integrations/google-tasks.js":"LyoqCiAqIEdvb2dsZSBUYXNrcyBpbnRlZ3JhdGlvbiBmYWNhZGUg4oCUIHNpbmdsZSBlbnRyeSBwb2ludCBmb3IgdGhlIEhVTUFOJ3MKICogcGVyc29uYWwgdGFzayBtYW5hZ2VtZW50IHZpYSBHb29nbGUgVGFza3MuCiAqCiAqIENvbnNvbGlkYXRlczogR29vZ2xlIE9BdXRoIGF1dGgsIENSVUQgb3BlcmF0aW9ucywgcmVjdXJyaW5nIHRhc2tzLAogKiBwb2xsaW5nIHRpbWVyLCBub3RpZmljYXRpb24gaW50ZWdyYXRpb24sIGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudC4KICoKICogVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIENvcmUncyBpbnRlcm5hbCBxdWV1ZSDigJQgaXQncyBmb3IgdGhlIGh1bWFuJ3MKICogcGVyc29uYWwgdGFza3MgYW5kIHJlbWluZGVycy4KICoKICogVXNhZ2U6CiAqICAgaW1wb3J0IHsgaW5pdEdvb2dsZVRhc2tzLCBzaHV0ZG93bkdvb2dsZVRhc2tzLCBnZXRHb29nbGVUYXNrc1N0YXR1cyB9IGZyb20gIi4vaW50ZWdyYXRpb25zL2dvb2dsZS10YXNrcy5qcyI7CiAqICAgLy8gQXQgc3RhcnR1cDoKICogICBpbml0R29vZ2xlVGFza3MoKTsKICogICAvLyBJbiByb3V0ZXMgLyBhZ2VudCBjb2RlOgogKiAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGdldEdvb2dsZVRhc2tzU3RhdHVzKCk7CiAqICAgaWYgKHN0YXR1cy5hdmFpbGFibGUpIHsgLi4uIH0KICovCmltcG9ydCB7IGlzR29vZ2xlQ29uZmlndXJlZCwgaXNHb29nbGVBdXRoZW50aWNhdGVkLCBnZXRBdXRoVXJsLCBleGNoYW5nZUNvZGUsIGNsZWFyVG9rZW5DYWNoZSwgfSBmcm9tICIuLi9nb29nbGUvYXV0aC5qcyI7CmltcG9ydCB7IGlzVGFza3NBdmFpbGFibGUsIGxpc3RUYXNrTGlzdHMsIGNyZWF0ZVRhc2tMaXN0LCB1cGRhdGVUYXNrTGlzdCwgZGVsZXRlVGFza0xpc3QsIGxpc3RUYXNrcywgZ2V0VGFzaywgY3JlYXRlVGFzaywgdXBkYXRlVGFzaywgY29tcGxldGVUYXNrLCB1bmNvbXBsZXRlVGFzaywgZGVsZXRlVGFzaywgY3JlYXRlUmVjdXJyaW5nV2Vla2x5VGFza3MsIGZvcm1hdFRhc2tzRm9yQ29udGV4dCwgfSBmcm9tICIuLi9nb29nbGUvdGFza3MuanMiOwppbXBvcnQgeyBzdGFydFRhc2tzVGltZXIsIHN0b3BUYXNrc1RpbWVyLCBpc1Rhc2tzVGltZXJSdW5uaW5nLCB9IGZyb20gIi4uL2dvb2dsZS90YXNrcy10aW1lci5qcyI7CmltcG9ydCB7IHB1c2hOb3RpZmljYXRpb24gfSBmcm9tICIuLi9nb2Fscy9ub3RpZmljYXRpb25zLmpzIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoImludGVncmF0aW9uLmdvb2dsZS10YXNrcyIpOwovLyDilIDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApsZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLyoqCiAqIEluaXRpYWxpemUgdGhlIEdvb2dsZSBUYXNrcyBpbnRlZ3JhdGlvbi4KICogU3RhcnRzIHRoZSBiYWNrZ3JvdW5kIHBvbGxpbmcgdGltZXIgZm9yIGR1ZS10YXNrIG5vdGlmaWNhdGlvbnMuCiAqIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcyDigJQgc2Vjb25kIGNhbGwgaXMgYSBuby1vcC4KICovCmV4cG9ydCBmdW5jdGlvbiBpbml0R29vZ2xlVGFza3MocG9sbEludGVydmFsTXMpIHsKICAgIGlmIChpbml0aWFsaXplZCkKICAgICAgICByZXR1cm47CiAgICBpbml0aWFsaXplZCA9IHRydWU7CiAgICBpZiAoaXNHb29nbGVBdXRoZW50aWNhdGVkKCkpIHsKICAgICAgICBzdGFydFRhc2tzVGltZXIocG9sbEludGVydmFsTXMpOwogICAgICAgIGxvZ0FjdGl2aXR5KHsgc291cmNlOiAidGFza3MiLCBzdW1tYXJ5OiAiR29vZ2xlIFRhc2tzIGludGVncmF0aW9uIGluaXRpYWxpemVkIiB9KTsKICAgICAgICBsb2cuaW5mbygiR29vZ2xlIFRhc2tzIGludGVncmF0aW9uIGluaXRpYWxpemVkIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBsb2cud2FybigiR29vZ2xlIFRhc2tzIG5vdCBhdXRoZW50aWNhdGVkIOKAlCB0aW1lciBub3Qgc3RhcnRlZCIpOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAidGFza3MiLAogICAgICAgICAgICBzdW1tYXJ5OiAiR29vZ2xlIFRhc2tzIGluaXQgc2tpcHBlZCDigJQgbm90IGF1dGhlbnRpY2F0ZWQiLAogICAgICAgIH0pOwogICAgfQp9Ci8qKgogKiBTaHV0IGRvd24gdGhlIEdvb2dsZSBUYXNrcyBpbnRlZ3JhdGlvbi4KICogU3RvcHMgdGhlIGJhY2tncm91bmQgcG9sbGluZyB0aW1lci4KICovCmV4cG9ydCBmdW5jdGlvbiBzaHV0ZG93bkdvb2dsZVRhc2tzKCkgewogICAgc3RvcFRhc2tzVGltZXIoKTsKICAgIGluaXRpYWxpemVkID0gZmFsc2U7CiAgICBsb2dBY3Rpdml0eSh7IHNvdXJjZTogInRhc2tzIiwgc3VtbWFyeTogIkdvb2dsZSBUYXNrcyBpbnRlZ3JhdGlvbiBzaHV0IGRvd24iIH0pOwogICAgbG9nLmluZm8oIkdvb2dsZSBUYXNrcyBpbnRlZ3JhdGlvbiBzaHV0IGRvd24iKTsKfQovKioKICogR2V0IHRoZSBmdWxsIGludGVncmF0aW9uIHN0YXR1czogY29uZmlnLCBhdXRoLCB0aW1lciBoZWFsdGguCiAqLwpleHBvcnQgZnVuY3Rpb24gZ2V0R29vZ2xlVGFza3NTdGF0dXMoKSB7CiAgICBjb25zdCBjb25maWd1cmVkID0gaXNHb29nbGVDb25maWd1cmVkKCk7CiAgICBjb25zdCBhdXRoZW50aWNhdGVkID0gaXNHb29nbGVBdXRoZW50aWNhdGVkKCk7CiAgICBpZiAoIWNvbmZpZ3VyZWQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBhdmFpbGFibGU6IGZhbHNlLAogICAgICAgICAgICBjb25maWd1cmVkOiBmYWxzZSwKICAgICAgICAgICAgYXV0aGVudGljYXRlZDogZmFsc2UsCiAgICAgICAgICAgIHRpbWVyUnVubmluZzogZmFsc2UsCiAgICAgICAgICAgIGVycm9yOiAiR09PR0xFX0NMSUVOVF9JRCBhbmQvb3IgR09PR0xFX0NMSUVOVF9TRUNSRVQgbm90IHNldCBpbiB2YXVsdCIsCiAgICAgICAgfTsKICAgIH0KICAgIGlmICghYXV0aGVudGljYXRlZCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGF2YWlsYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGNvbmZpZ3VyZWQ6IHRydWUsCiAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLAogICAgICAgICAgICB0aW1lclJ1bm5pbmc6IGZhbHNlLAogICAgICAgICAgICBlcnJvcjogIkdPT0dMRV9SRUZSRVNIX1RPS0VOIG5vdCBzZXQg4oCUIE9BdXRoIGZsb3cgbm90IGNvbXBsZXRlZCIsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgYXZhaWxhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyZWQ6IHRydWUsCiAgICAgICAgYXV0aGVudGljYXRlZDogdHJ1ZSwKICAgICAgICB0aW1lclJ1bm5pbmc6IGlzVGFza3NUaW1lclJ1bm5pbmcoKSwKICAgICAgICBlcnJvcjogbnVsbCwKICAgIH07Cn0KLyoqCiAqIFF1aWNrIGF2YWlsYWJpbGl0eSBjaGVjayAobm8gQVBJIGNhbGwpLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGlzR29vZ2xlVGFza3NBdmFpbGFibGUoKSB7CiAgICByZXR1cm4gaXNUYXNrc0F2YWlsYWJsZSgpOwp9Ci8vIOKUgOKUgOKUgCBBdXRoZW50aWNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIEdldCB0aGUgR29vZ2xlIE9BdXRoIGF1dGhvcml6YXRpb24gVVJMIGZvciB0aGUgY29uc2VudCBzY3JlZW4uCiAqLwpleHBvcnQgZnVuY3Rpb24gZ2V0R29vZ2xlVGFza3NBdXRoVXJsKHJlZGlyZWN0VXJpKSB7CiAgICByZXR1cm4gZ2V0QXV0aFVybChyZWRpcmVjdFVyaSk7Cn0KLyoqCiAqIEV4Y2hhbmdlIGFuIGF1dGhvcml6YXRpb24gY29kZSBmb3IgdG9rZW5zLgogKiBBZnRlciBzdWNjZXNzLCBjYWxsIGluaXRHb29nbGVUYXNrcygpIHRvIHN0YXJ0IHRoZSB0aW1lci4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGNoYW5nZUdvb2dsZVRhc2tzQ29kZShjb2RlLCByZWRpcmVjdFVyaSkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhjaGFuZ2VDb2RlKGNvZGUsIHJlZGlyZWN0VXJpKTsKICAgIGlmIChyZXN1bHQub2spIHsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogInRhc2tzIiwKICAgICAgICAgICAgc3VtbWFyeTogIkdvb2dsZSBUYXNrcyBPQXV0aCBjb21wbGV0ZWQiLAogICAgICAgICAgICBhY3Rpb25MYWJlbDogIlBST01QVEVEIiwKICAgICAgICAgICAgcmVhc29uOiAidXNlciBjb21wbGV0ZWQgT0F1dGggZmxvdyIsCiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Ci8qKgogKiBDbGVhciB0aGUgY2FjaGVkIE9BdXRoIGFjY2VzcyB0b2tlbiAoZS5nLiwgb24gdmF1bHQga2V5IGNoYW5nZSkuCiAqLwpleHBvcnQgeyBjbGVhclRva2VuQ2FjaGUgYXMgY2xlYXJHb29nbGVUYXNrc1Rva2VuQ2FjaGUgfTsKLy8g4pSA4pSA4pSAIFRhc2sgTGlzdCBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogTGlzdCBhbGwgR29vZ2xlIFRhc2sgbGlzdHMgZm9yIHRoZSB1c2VyLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRhc2tMaXN0cygpIHsKICAgIHJldHVybiBsaXN0VGFza0xpc3RzKCk7Cn0KLyoqCiAqIENyZWF0ZSBhIG5ldyB0YXNrIGxpc3QuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkVGFza0xpc3QodGl0bGUpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVRhc2tMaXN0KHRpdGxlKTsKICAgIGlmIChyZXN1bHQub2spIHsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogInRhc2tzIiwKICAgICAgICAgICAgc3VtbWFyeTogYFRhc2sgbGlzdCBjcmVhdGVkOiAke3RpdGxlfWAsCiAgICAgICAgICAgIGFjdGlvbkxhYmVsOiAiUFJPTVBURUQiLAogICAgICAgICAgICByZWFzb246ICJ1c2VyIGNyZWF0ZWQgdGFzayBsaXN0IiwKICAgICAgICB9KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KLyoqCiAqIFJlbmFtZSBhIHRhc2sgbGlzdC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5hbWVUYXNrTGlzdCh0YXNrTGlzdElkLCB0aXRsZSkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXBkYXRlVGFza0xpc3QodGFza0xpc3RJZCwgdGl0bGUpOwogICAgaWYgKHJlc3VsdC5vaykgewogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAidGFza3MiLAogICAgICAgICAgICBzdW1tYXJ5OiBgVGFzayBsaXN0IHJlbmFtZWQ6ICR7dGl0bGV9YCwKICAgICAgICAgICAgYWN0aW9uTGFiZWw6ICJQUk9NUFRFRCIsCiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Ci8qKgogKiBEZWxldGUgYSB0YXNrIGxpc3QuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlVGFza0xpc3QodGFza0xpc3RJZCkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVsZXRlVGFza0xpc3QodGFza0xpc3RJZCk7CiAgICBpZiAocmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJ0YXNrcyIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBUYXNrIGxpc3QgZGVsZXRlZDogJHt0YXNrTGlzdElkfWAsCiAgICAgICAgICAgIGFjdGlvbkxhYmVsOiAiUFJPTVBURUQiLAogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQovLyDilIDilIDilIAgVGFzayBDUlVEIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogTGlzdCB0YXNrcyBpbiBhIHRhc2sgbGlzdC4KICogQHBhcmFtIHRhc2tMaXN0SWQgLSBEZWZhdWx0cyB0byAiQGRlZmF1bHQiIGZvciB0aGUgdXNlcidzIHByaW1hcnkgbGlzdC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRUYXNrcyh0YXNrTGlzdElkLCBvcHRzKSB7CiAgICByZXR1cm4gbGlzdFRhc2tzKHRhc2tMaXN0SWQgPz8gIkBkZWZhdWx0Iiwgb3B0cyk7Cn0KLyoqCiAqIEdldCBhIHNpbmdsZSB0YXNrIGJ5IElELgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRhc2tCeUlkKHRhc2tMaXN0SWQsIHRhc2tJZCkgewogICAgcmV0dXJuIGdldFRhc2sodGFza0xpc3RJZCwgdGFza0lkKTsKfQovKioKICogQ3JlYXRlIGEgbmV3IHRhc2sgZm9yIHRoZSBodW1hbi4KICogT3B0aW9uYWxseSBzZW5kcyBhIG5vdGlmaWNhdGlvbiB0byBjb25maXJtIGNyZWF0aW9uLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZFRhc2sodGl0bGUsIG9wdHMpIHsKICAgIGNvbnN0IHRhc2tMaXN0SWQgPSBvcHRzPy50YXNrTGlzdElkID8/ICJAZGVmYXVsdCI7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUYXNrKHRhc2tMaXN0SWQsIHsKICAgICAgICB0aXRsZSwKICAgICAgICBub3Rlczogb3B0cz8ubm90ZXMsCiAgICAgICAgZHVlOiBvcHRzPy5kdWUsCiAgICAgICAgcGFyZW50OiBvcHRzPy5wYXJlbnQsCiAgICB9KTsKICAgIGlmIChyZXN1bHQub2spIHsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogInRhc2tzIiwKICAgICAgICAgICAgc3VtbWFyeTogYFRhc2sgY3JlYXRlZDogJHt0aXRsZX1gLAogICAgICAgICAgICBhY3Rpb25MYWJlbDogIlBST01QVEVEIiwKICAgICAgICAgICAgcmVhc29uOiAidXNlciBjcmVhdGVkIHRhc2siLAogICAgICAgIH0pOwogICAgICAgIGlmIChvcHRzPy5ub3RpZnkpIHsKICAgICAgICAgICAgY29uc3QgZHVlU3RyID0gb3B0cy5kdWUgPyBgIChkdWU6ICR7b3B0cy5kdWV9KWAgOiAiIjsKICAgICAgICAgICAgcHVzaE5vdGlmaWNhdGlvbih7CiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgIHNvdXJjZTogInRhc2tzIiwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBOZXcgdGFzayBhZGRlZDogJHt0aXRsZX0ke2R1ZVN0cn1gLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Ci8qKgogKiBVcGRhdGUgYW4gZXhpc3RpbmcgdGFzay4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0VGFzayh0YXNrTGlzdElkLCB0YXNrSWQsIGNoYW5nZXMpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHVwZGF0ZVRhc2sodGFza0xpc3RJZCwgdGFza0lkLCBjaGFuZ2VzKTsKICAgIGlmIChyZXN1bHQub2spIHsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogInRhc2tzIiwKICAgICAgICAgICAgc3VtbWFyeTogYFRhc2sgdXBkYXRlZDogJHt0YXNrSWR9YCwKICAgICAgICAgICAgYWN0aW9uTGFiZWw6ICJQUk9NUFRFRCIsCiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Ci8qKgogKiBNYXJrIGEgdGFzayBhcyBjb21wbGV0ZWQuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFya1Rhc2tEb25lKHRhc2tMaXN0SWQsIHRhc2tJZCkgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29tcGxldGVUYXNrKHRhc2tMaXN0SWQsIHRhc2tJZCk7CiAgICBpZiAocmVzdWx0Lm9rICYmIHJlc3VsdC5kYXRhKSB7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJ0YXNrcyIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBUYXNrIGNvbXBsZXRlZDogJHtyZXN1bHQuZGF0YS50aXRsZX1gLAogICAgICAgICAgICBhY3Rpb25MYWJlbDogIlBST01QVEVEIiwKICAgICAgICAgICAgcmVhc29uOiAidXNlciBjb21wbGV0ZWQgdGFzayIsCiAgICAgICAgfSk7CiAgICAgICAgcHVzaE5vdGlmaWNhdGlvbih7CiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBzb3VyY2U6ICJ0YXNrcyIsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBUYXNrIGNvbXBsZXRlZDogJHtyZXN1bHQuZGF0YS50aXRsZX1gLAogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQovKioKICogUmVvcGVuIGEgY29tcGxldGVkIHRhc2suCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbWFya1Rhc2tVbmRvbmUodGFza0xpc3RJZCwgdGFza0lkKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1bmNvbXBsZXRlVGFzayh0YXNrTGlzdElkLCB0YXNrSWQpOwogICAgaWYgKHJlc3VsdC5vaykgewogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAidGFza3MiLAogICAgICAgICAgICBzdW1tYXJ5OiBgVGFzayByZW9wZW5lZDogJHt0YXNrSWR9YCwKICAgICAgICAgICAgYWN0aW9uTGFiZWw6ICJQUk9NUFRFRCIsCiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Ci8qKgogKiBEZWxldGUgYSB0YXNrLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVRhc2sodGFza0xpc3RJZCwgdGFza0lkKSB7CiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWxldGVUYXNrKHRhc2tMaXN0SWQsIHRhc2tJZCk7CiAgICBpZiAocmVzdWx0Lm9rKSB7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJ0YXNrcyIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBUYXNrIGRlbGV0ZWQ6ICR7dGFza0lkfWAsCiAgICAgICAgICAgIGFjdGlvbkxhYmVsOiAiUFJPTVBURUQiLAogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQovLyDilIDilIDilIAgUmVjdXJyaW5nIHRhc2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogQ3JlYXRlIHJlY3VycmluZyB3ZWVrbHkgdGFza3MgKEdvb2dsZSBUYXNrcyBoYXMgbm8gbmF0aXZlIHJlY3VycmVuY2UpLgogKiBHZW5lcmF0ZXMgY29uY3JldGUgZnV0dXJlIHRhc2tzIGZvciB0aGUgbmV4dCBOIHdlZWtzLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZFJlY3VycmluZ1dlZWtseVRhc2tzKGNvbmZpZykgewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlUmVjdXJyaW5nV2Vla2x5VGFza3MoY29uZmlnKTsKICAgIGlmIChyZXN1bHQub2spIHsKICAgICAgICBjb25zdCBkYXlOYW1lcyA9IFsiU3VuZGF5IiwgIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiXTsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogInRhc2tzIiwKICAgICAgICAgICAgc3VtbWFyeTogYFJlY3VycmluZyB0YXNrcyBjcmVhdGVkOiAke2NvbmZpZy50aXRsZX0gZXZlcnkgJHtkYXlOYW1lc1tjb25maWcuZGF5T2ZXZWVrXX1gLAogICAgICAgICAgICBhY3Rpb25MYWJlbDogIlBST01QVEVEIiwKICAgICAgICAgICAgcmVhc29uOiAidXNlciBzZXQgdXAgcmVjdXJyaW5nIHRhc2siLAogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQovLyDilIDilIDilIAgQ29udGV4dCAmIHN1bW1hcmllcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIEdldCBhIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgb2YgcGVuZGluZyB0YXNrcyBmb3IgTExNIGNvbnRleHQgaW5qZWN0aW9uLgogKiBGZXRjaGVzIGluY29tcGxldGUgdGFza3MgZnJvbSB0aGUgZGVmYXVsdCBsaXN0IGFuZCBmb3JtYXRzIHRoZW0uCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGFza3NTdW1tYXJ5KHRhc2tMaXN0SWQpIHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGxpc3RUYXNrcyh0YXNrTGlzdElkID8/ICJAZGVmYXVsdCIsIHsKICAgICAgICBzaG93Q29tcGxldGVkOiBmYWxzZSwKICAgIH0pOwogICAgaWYgKCFyZXN1bHQub2sgfHwgIXJlc3VsdC5kYXRhKSB7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBvazogdHJ1ZSwKICAgICAgICBzdW1tYXJ5OiBmb3JtYXRUYXNrc0ZvckNvbnRleHQocmVzdWx0LmRhdGEpLAogICAgICAgIHRhc2tDb3VudDogcmVzdWx0LmRhdGEubGVuZ3RoLAogICAgICAgIG1lc3NhZ2U6IGAke3Jlc3VsdC5kYXRhLmxlbmd0aH0gcGVuZGluZyB0YXNrc2AsCiAgICB9Owp9Ci8qKgogKiBHZXQgdGFza3MgZHVlIHRvZGF5IGZvciBkYWlseSBicmllZmluZyAvIG5vdGlmaWNhdGlvbiBkaWdlc3QuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VGFza3NEdWVUb2RheSh0YXNrTGlzdElkKSB7CiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpOwogICAgY29uc3QgZW5kT2ZEYXkgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCksIG5vdy5nZXREYXRlKCksIDIzLCA1OSwgNTkpOwogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbGlzdFRhc2tzKHRhc2tMaXN0SWQgPz8gIkBkZWZhdWx0IiwgewogICAgICAgIHNob3dDb21wbGV0ZWQ6IGZhbHNlLAogICAgICAgIGR1ZU1heDogZW5kT2ZEYXkudG9JU09TdHJpbmcoKSwKICAgIH0pOwogICAgaWYgKCFyZXN1bHQub2sgfHwgIXJlc3VsdC5kYXRhKSB7CiAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBvazogdHJ1ZSwKICAgICAgICBkYXRhOiByZXN1bHQuZGF0YSwKICAgICAgICBzdW1tYXJ5OiBmb3JtYXRUYXNrc0ZvckNvbnRleHQocmVzdWx0LmRhdGEpLAogICAgICAgIG1lc3NhZ2U6IGAke3Jlc3VsdC5kYXRhLmxlbmd0aH0gdGFza3MgZHVlIHRvZGF5YCwKICAgIH07Cn0KLyoqCiAqIEdldCBvdmVyZHVlIHRhc2tzIHRoYXQgbmVlZCBhdHRlbnRpb24uCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3ZlcmR1ZVRhc2tzKHRhc2tMaXN0SWQpIHsKICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7CiAgICAvLyBHZXQgdGFza3MgZHVlIGJlZm9yZSByaWdodCBub3cKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGxpc3RUYXNrcyh0YXNrTGlzdElkID8/ICJAZGVmYXVsdCIsIHsKICAgICAgICBzaG93Q29tcGxldGVkOiBmYWxzZSwKICAgICAgICBkdWVNYXg6IG5vdy50b0lTT1N0cmluZygpLAogICAgfSk7CiAgICBpZiAoIXJlc3VsdC5vayB8fCAhcmVzdWx0LmRhdGEpIHsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlIH07CiAgICB9CiAgICAvLyBGaWx0ZXIgdG8gb25seSBhY3R1YWxseSBvdmVyZHVlIChkdWUgZGF0ZSBpbiB0aGUgcGFzdCkKICAgIGNvbnN0IG92ZXJkdWUgPSByZXN1bHQuZGF0YS5maWx0ZXIoKHQpID0+IHsKICAgICAgICBpZiAoIXQuZHVlKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgY29uc3QgbWF0Y2ggPSB0LmR1ZS5tYXRjaCgvXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pLyk7CiAgICAgICAgaWYgKCFtYXRjaCkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIGNvbnN0IGR1ZURhdGUgPSBuZXcgRGF0ZShwYXJzZUludChtYXRjaFsxXSksIHBhcnNlSW50KG1hdGNoWzJdKSAtIDEsIHBhcnNlSW50KG1hdGNoWzNdKSwgMjMsIDU5LCA1OSk7CiAgICAgICAgcmV0dXJuIGR1ZURhdGUuZ2V0VGltZSgpIDwgbm93LmdldFRpbWUoKTsKICAgIH0pOwogICAgcmV0dXJuIHsKICAgICAgICBvazogdHJ1ZSwKICAgICAgICBkYXRhOiBvdmVyZHVlLAogICAgICAgIHN1bW1hcnk6IGZvcm1hdFRhc2tzRm9yQ29udGV4dChvdmVyZHVlKSwKICAgICAgICBtZXNzYWdlOiBgJHtvdmVyZHVlLmxlbmd0aH0gb3ZlcmR1ZSB0YXNrc2AsCiAgICB9Owp9Ci8vIOKUgOKUgOKUgCBOb3RpZmljYXRpb24gaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFB1c2ggYSBkYWlseSB0YXNrIGRpZ2VzdCBub3RpZmljYXRpb24uCiAqIEludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIGEgZGFpbHkgY3Jvbi90aW1lci4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdXNoRGFpbHlUYXNrRGlnZXN0KCkgewogICAgY29uc3QgW2R1ZVJlc3VsdCwgb3ZlcmR1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbCiAgICAgICAgZ2V0VGFza3NEdWVUb2RheSgpLAogICAgICAgIGdldE92ZXJkdWVUYXNrcygpLAogICAgXSk7CiAgICBjb25zdCBwYXJ0cyA9IFtdOwogICAgaWYgKG92ZXJkdWVSZXN1bHQub2sgJiYgb3ZlcmR1ZVJlc3VsdC5kYXRhICYmIG92ZXJkdWVSZXN1bHQuZGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgcGFydHMucHVzaChgJHtvdmVyZHVlUmVzdWx0LmRhdGEubGVuZ3RofSBvdmVyZHVlIHRhc2socylgKTsKICAgIH0KICAgIGlmIChkdWVSZXN1bHQub2sgJiYgZHVlUmVzdWx0LmRhdGEgJiYgZHVlUmVzdWx0LmRhdGEubGVuZ3RoID4gMCkgewogICAgICAgIHBhcnRzLnB1c2goYCR7ZHVlUmVzdWx0LmRhdGEubGVuZ3RofSB0YXNrKHMpIGR1ZSB0b2RheWApOwogICAgfQogICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBtZXNzYWdlOiAiTm8gdGFza3MgbmVlZCBhdHRlbnRpb24gdG9kYXkiIH07CiAgICB9CiAgICBjb25zdCBtZXNzYWdlID0gYFRhc2sgZGlnZXN0OiAke3BhcnRzLmpvaW4oIiwgIil9YDsKICAgIHB1c2hOb3RpZmljYXRpb24oewogICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgIHNvdXJjZTogInRhc2tzIiwKICAgICAgICBtZXNzYWdlLAogICAgfSk7CiAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgc291cmNlOiAidGFza3MiLAogICAgICAgIHN1bW1hcnk6IG1lc3NhZ2UsCiAgICAgICAgYWN0aW9uTGFiZWw6ICJBVVRPTk9NT1VTIiwKICAgICAgICByZWFzb246ICJkYWlseSB0YXNrIGRpZ2VzdCIsCiAgICB9KTsKICAgIHJldHVybiB7IG9rOiB0cnVlLCBtZXNzYWdlIH07Cn0KLy8g4pSA4pSA4pSAIFF1aWNrLWNvbW1hbmQgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFF1aWNrIGFkZDogcGFyc2UgYSBuYXR1cmFsLWxhbmd1YWdlLWlzaCB0YXNrIHN0cmluZy4KICogU3VwcG9ydHMgInRpdGxlIGR1ZTpZWVlZLU1NLUREIiBhbmQgInRpdGxlIG5vdGU6c29tZSBub3RlcyIuCiAqCiAqIEV4YW1wbGU6IHF1aWNrQWRkVGFzaygiQnV5IGdyb2NlcmllcyBkdWU6MjAyNi0wMy0wMSBub3RlOm9yZ2FuaWMgbWlsayIpCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcXVpY2tBZGRUYXNrKGlucHV0LCB0YXNrTGlzdElkKSB7CiAgICBsZXQgdGl0bGUgPSBpbnB1dDsKICAgIGxldCBkdWU7CiAgICBsZXQgbm90ZXM7CiAgICAvLyBFeHRyYWN0IGR1ZTpZWVlZLU1NLURECiAgICBjb25zdCBkdWVNYXRjaCA9IGlucHV0Lm1hdGNoKC9cYmR1ZTooXGR7NH0tXGR7Mn0tXGR7Mn0pXGIvKTsKICAgIGlmIChkdWVNYXRjaCkgewogICAgICAgIGR1ZSA9IGR1ZU1hdGNoWzFdOwogICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZShkdWVNYXRjaFswXSwgIiIpLnRyaW0oKTsKICAgIH0KICAgIC8vIEV4dHJhY3Qgbm90ZTouLi4KICAgIGNvbnN0IG5vdGVNYXRjaCA9IGlucHV0Lm1hdGNoKC9cYm5vdGU6KC4rKSQvKTsKICAgIGlmIChub3RlTWF0Y2gpIHsKICAgICAgICBub3RlcyA9IG5vdGVNYXRjaFsxXS50cmltKCk7CiAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKG5vdGVNYXRjaFswXSwgIiIpLnRyaW0oKTsKICAgIH0KICAgIGlmICghdGl0bGUpIHsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6ICJUYXNrIHRpdGxlIGlzIHJlcXVpcmVkIiB9OwogICAgfQogICAgcmV0dXJuIGFkZFRhc2sodGl0bGUsIHsgZHVlLCBub3RlcywgdGFza0xpc3RJZDogdGFza0xpc3RJZCA/PyAiQGRlZmF1bHQiIH0pOwp9Ci8vIOKUgOKUgOKUgCBSZS1leHBvcnRzIGZvciBjb252ZW5pZW5jZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IHsgZm9ybWF0VGFza3NGb3JDb250ZXh0IH07Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWdvb2dsZS10YXNrcy5qcy5tYXA=","webhooks/config.js":"LyoqCiAqIFdlYmhvb2sgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50LgogKgogKiBMb2FkcywgdmFsaWRhdGVzLCBhbmQgcmVzb2x2ZXMgd2ViaG9vayBwcm92aWRlciBjb25maWd1cmF0aW9ucy4KICogU2VjcmV0cyBjYW4gcmVmZXJlbmNlIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBiZSBwcm92aWRlZCBhcyBsaXRlcmFscy4KICogQ29uZmlndXJhdGlvbiBjYW4gYmUgbG9hZGVkIGZyb20gYSBmaWxlIG9yIGNvbnN0cnVjdGVkIHByb2dyYW1tYXRpY2FsbHkuCiAqLwppbXBvcnQgKiBhcyBmcyBmcm9tICJub2RlOmZzIjsKaW1wb3J0ICogYXMgcGF0aCBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IGdldFByb3ZpZGVyLCBsaXN0UHJvdmlkZXJzIH0gZnJvbSAiLi9yZWdpc3RyeS5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigid2ViaG9va3MuY29uZmlnIik7Ci8vIOKUgOKUgCBJbi1tZW1vcnkgY29uZmlnIHN0b3JlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApsZXQgc3lzdGVtQ29uZmlnID0geyBwcm92aWRlcnM6IHt9IH07Ci8qKiBHZXQgdGhlIGN1cnJlbnQgd2ViaG9vayBzeXN0ZW0gY29uZmlndXJhdGlvbi4gKi8KZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZygpIHsKICAgIHJldHVybiBzeXN0ZW1Db25maWc7Cn0KLyoqIFJlcGxhY2UgdGhlIGVudGlyZSBzeXN0ZW0gY29uZmlndXJhdGlvbi4gKi8KZXhwb3J0IGZ1bmN0aW9uIHNldENvbmZpZyhjb25maWcpIHsKICAgIHN5c3RlbUNvbmZpZyA9IGNvbmZpZzsKfQovLyDilIDilIAgUHJvdmlkZXIgY29uZmlnIENSVUQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKiBHZXQgY29uZmlndXJhdGlvbiBmb3IgYSBzcGVjaWZpYyBwcm92aWRlci4gKi8KZXhwb3J0IGZ1bmN0aW9uIGdldFByb3ZpZGVyQ29uZmlnKG5hbWUpIHsKICAgIHJldHVybiBzeXN0ZW1Db25maWcucHJvdmlkZXJzW25hbWVdOwp9Ci8qKiBTZXQgY29uZmlndXJhdGlvbiBmb3IgYSBzcGVjaWZpYyBwcm92aWRlci4gTWVyZ2VzIHdpdGggZXhpc3RpbmcgY29uZmlnLiAqLwpleHBvcnQgZnVuY3Rpb24gc2V0UHJvdmlkZXJDb25maWcoY29uZmlnKSB7CiAgICBjb25zdCBleGlzdGluZyA9IHN5c3RlbUNvbmZpZy5wcm92aWRlcnNbY29uZmlnLm5hbWVdOwogICAgc3lzdGVtQ29uZmlnLnByb3ZpZGVyc1tjb25maWcubmFtZV0gPSBleGlzdGluZwogICAgICAgID8geyAuLi5leGlzdGluZywgLi4uY29uZmlnIH0KICAgICAgICA6IGNvbmZpZzsKfQovKioKICogU2V0IG11bHRpcGxlIHByb3ZpZGVyIGNvbmZpZ3MgaW4gb25lIGNhbGwuCiAqIEF2b2lkcyByZXBlYXRlZCBvYmplY3Qgc3ByZWFkIG92ZXJoZWFkIHdoZW4gY29uZmlndXJpbmcgYWxsIHByb3ZpZGVycyBhdCBzdGFydHVwLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHNldFByb3ZpZGVyQ29uZmlncyhjb25maWdzKSB7CiAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykgewogICAgICAgIHNldFByb3ZpZGVyQ29uZmlnKGNvbmZpZyk7CiAgICB9CiAgICBjb25zdCBtcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7CiAgICAvLyBVc2UgZGVidWcgbG9nIGluc3RlYWQgb2YgbG9nQWN0aXZpdHkgdG8gYXZvaWQgcG9sbHV0aW5nIHRoZSBpbnNpZ2h0IGVuZ2luZQogICAgLy8gd2l0aCByb3V0aW5lIHN0YXJ0dXAgcGVyZiBkYXRhICh3YXMgY2F1c2luZyBmZWVkYmFjayBsb29wIOKAlCBEQVNILTcwKQogICAgaWYgKG1zID4gNSkgewogICAgICAgIGxvZy5kZWJ1Zyhgc2V0UHJvdmlkZXJDb25maWdzIHRvb2sgJHttcy50b0ZpeGVkKDEpfW1zIGZvciAke2NvbmZpZ3MubGVuZ3RofSBwcm92aWRlcnNgKTsKICAgIH0KfQovKiogUmVtb3ZlIGNvbmZpZ3VyYXRpb24gZm9yIGEgcHJvdmlkZXIuICovCmV4cG9ydCBmdW5jdGlvbiByZW1vdmVQcm92aWRlckNvbmZpZyhuYW1lKSB7CiAgICBpZiAoIShuYW1lIGluIHN5c3RlbUNvbmZpZy5wcm92aWRlcnMpKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIGRlbGV0ZSBzeXN0ZW1Db25maWcucHJvdmlkZXJzW25hbWVdOwogICAgcmV0dXJuIHRydWU7Cn0KLyoqIExpc3QgYWxsIGNvbmZpZ3VyZWQgcHJvdmlkZXIgbmFtZXMuICovCmV4cG9ydCBmdW5jdGlvbiBsaXN0Q29uZmlndXJlZFByb3ZpZGVycygpIHsKICAgIHJldHVybiBPYmplY3Qua2V5cyhzeXN0ZW1Db25maWcucHJvdmlkZXJzKTsKfQovLyDilIDilIAgU2VjcmV0IHJlc29sdXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBSZXNvbHZlIGEgc2VjcmV0IHZhbHVlLiBJZiB0aGUgdmFsdWUgbG9va3MgbGlrZSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQogKiBuYW1lIChhbGwgdXBwZXJjYXNlLCB1bmRlcnNjb3JlcywgZGlnaXRzKSwgcmVhZCBmcm9tIHByb2Nlc3MuZW52LgogKiBPdGhlcndpc2UsIHRyZWF0IGl0IGFzIGEgbGl0ZXJhbCBzZWNyZXQuCiAqLwpleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNlY3JldChzZWNyZXRSZWYpIHsKICAgIC8vIEVudiB2YXIgcGF0dGVybjogYWxsIHVwcGVyY2FzZSBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzCiAgICBpZiAoL15bQS1aXVtBLVowLTlfXSokLy50ZXN0KHNlY3JldFJlZikpIHsKICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbc2VjcmV0UmVmXTsKICAgIH0KICAgIHJldHVybiBzZWNyZXRSZWY7Cn0KLyoqCiAqIEdldCB0aGUgcmVzb2x2ZWQgc2VjcmV0IGZvciBhIHByb3ZpZGVyLgogKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBzZWNyZXQgaXMgY29uZmlndXJlZCBvciB0aGUgZW52IHZhciBpcyBub3Qgc2V0LgogKi8KZXhwb3J0IGZ1bmN0aW9uIGdldFByb3ZpZGVyU2VjcmV0KG5hbWUpIHsKICAgIGNvbnN0IGNvbmZpZyA9IHN5c3RlbUNvbmZpZy5wcm92aWRlcnNbbmFtZV07CiAgICBpZiAoIWNvbmZpZz8uc2VjcmV0KQogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICByZXR1cm4gcmVzb2x2ZVNlY3JldChjb25maWcuc2VjcmV0KTsKfQovLyDilIDilIAgUmV0cnkgY29uZmlnIHJlc29sdXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBHZXQgdGhlIGVmZmVjdGl2ZSByZXRyeSBvcHRpb25zIGZvciBhIHByb3ZpZGVyLgogKiBQcm92aWRlci1zcGVjaWZpYyBjb25maWcgb3ZlcnJpZGVzIHN5c3RlbSBkZWZhdWx0cy4KICovCmV4cG9ydCBmdW5jdGlvbiBnZXRQcm92aWRlclJldHJ5T3B0cyhuYW1lKSB7CiAgICBjb25zdCBkZWZhdWx0cyA9IHN5c3RlbUNvbmZpZy5kZWZhdWx0cz8ucmV0cnkgPz8ge307CiAgICBjb25zdCBwcm92aWRlck9wdHMgPSBzeXN0ZW1Db25maWcucHJvdmlkZXJzW25hbWVdPy5yZXRyeSA/PyB7fTsKICAgIHJldHVybiB7IC4uLmRlZmF1bHRzLCAuLi5wcm92aWRlck9wdHMgfTsKfQovLyDilIDilIAgUHJvdmlkZXIgc3RhdHVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKiogQ2hlY2sgaWYgYSBwcm92aWRlciBpcyBlbmFibGVkIGluIHRoZSBjb25maWd1cmF0aW9uLiAqLwpleHBvcnQgZnVuY3Rpb24gaXNQcm92aWRlckVuYWJsZWQobmFtZSkgewogICAgY29uc3QgY29uZmlnID0gc3lzdGVtQ29uZmlnLnByb3ZpZGVyc1tuYW1lXTsKICAgIGlmICghY29uZmlnKQogICAgICAgIHJldHVybiB0cnVlOyAvLyBVbmNvbmZpZ3VyZWQgcHJvdmlkZXJzIGRlZmF1bHQgdG8gZW5hYmxlZAogICAgcmV0dXJuIGNvbmZpZy5lbmFibGVkICE9PSBmYWxzZTsKfQovKioKICogVmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGEgc3BlY2lmaWMgcHJvdmlkZXIuCiAqIFJldHVybnMgYSBsaXN0IG9mIGlzc3VlcyBmb3VuZC4KICovCmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVByb3ZpZGVyQ29uZmlnKG5hbWUpIHsKICAgIGNvbnN0IGlzc3VlcyA9IFtdOwogICAgY29uc3QgY29uZmlnID0gc3lzdGVtQ29uZmlnLnByb3ZpZGVyc1tuYW1lXTsKICAgIGlmICghY29uZmlnKSB7CiAgICAgICAgaXNzdWVzLnB1c2goYE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yIHByb3ZpZGVyICIke25hbWV9ImApOwogICAgICAgIHJldHVybiBpc3N1ZXM7CiAgICB9CiAgICBpZiAoY29uZmlnLnNlY3JldCkgewogICAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVNlY3JldChjb25maWcuc2VjcmV0KTsKICAgICAgICBpZiAoIXJlc29sdmVkKSB7CiAgICAgICAgICAgIGlzc3Vlcy5wdXNoKGBTZWNyZXQgZm9yICIke25hbWV9IiByZWZlcmVuY2VzIGVudiB2YXIgIiR7Y29uZmlnLnNlY3JldH0iIHdoaWNoIGlzIG5vdCBzZXRgKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWdldFByb3ZpZGVyKG5hbWUpKSB7CiAgICAgICAgaXNzdWVzLnB1c2goYFByb3ZpZGVyICIke25hbWV9IiBpcyBjb25maWd1cmVkIGJ1dCBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgcmVnaXN0cnlgKTsKICAgIH0KICAgIHJldHVybiBpc3N1ZXM7Cn0KLyoqCiAqIFZhbGlkYXRlIHRoZSBlbnRpcmUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uCiAqIFJldHVybnMgYSBtYXAgb2YgcHJvdmlkZXIgbmFtZSDihpIgaXNzdWVzLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29uZmlnKCkgewogICAgY29uc3QgcmVzdWx0ID0ge307CiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoc3lzdGVtQ29uZmlnLnByb3ZpZGVycykpIHsKICAgICAgICBjb25zdCBpc3N1ZXMgPSB2YWxpZGF0ZVByb3ZpZGVyQ29uZmlnKG5hbWUpOwogICAgICAgIGlmIChpc3N1ZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBpc3N1ZXM7CiAgICAgICAgfQogICAgfQogICAgLy8gQ2hlY2sgZm9yIHJlZ2lzdGVyZWQgcHJvdmlkZXJzIG1pc3NpbmcgY29uZmlndXJhdGlvbgogICAgZm9yIChjb25zdCBuYW1lIG9mIGxpc3RQcm92aWRlcnMoKSkgewogICAgICAgIGlmICghc3lzdGVtQ29uZmlnLnByb3ZpZGVyc1tuYW1lXSkgewogICAgICAgICAgICByZXN1bHRbbmFtZV0gPSBbCiAgICAgICAgICAgICAgICBgUHJvdmlkZXIgIiR7bmFtZX0iIGlzIHJlZ2lzdGVyZWQgYnV0IGhhcyBubyBjb25maWd1cmF0aW9uYCwKICAgICAgICAgICAgXTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Ci8vIOKUgOKUgCBGaWxlLWJhc2VkIGNvbmZpZyBsb2FkaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogTG9hZCB3ZWJob29rIGNvbmZpZ3VyYXRpb24gZnJvbSBhIEpTT04gZmlsZS4KICogUmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIHdhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5LgogKi8KZXhwb3J0IGZ1bmN0aW9uIGxvYWRDb25maWdGcm9tRmlsZShmaWxlUGF0aCkgewogICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpOwogICAgICAgIGNvbnN0IHJlYWRTdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocmVzb2x2ZWQsICJ1dGYtOCIpOwogICAgICAgIGNvbnN0IHJlYWRNcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gcmVhZFN0YXJ0OwogICAgICAgIGNvbnN0IHBhcnNlU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpOwogICAgICAgIGNvbnN0IHBhcnNlTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHBhcnNlU3RhcnQ7CiAgICAgICAgaWYgKCFwYXJzZWQucHJvdmlkZXJzIHx8IHR5cGVvZiBwYXJzZWQucHJvdmlkZXJzICE9PSAib2JqZWN0IikgewogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJzeXN0ZW0iLAogICAgICAgICAgICAgICAgc3VtbWFyeTogYFdlYmhvb2sgY29uZmlnIGZpbGUgbWlzc2luZyAicHJvdmlkZXJzIiBvYmplY3Q6ICR7ZmlsZVBhdGh9YCwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc3lzdGVtQ29uZmlnID0gcGFyc2VkOwogICAgICAgIGNvbnN0IHRvdGFsTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0OwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgc3VtbWFyeTogYExvYWRlZCB3ZWJob29rIGNvbmZpZyBmcm9tICR7ZmlsZVBhdGh9ICgke09iamVjdC5rZXlzKHBhcnNlZC5wcm92aWRlcnMpLmxlbmd0aH0gcHJvdmlkZXJzLCByZWFkOiR7cmVhZE1zLnRvRml4ZWQoMSl9bXMsIHBhcnNlOiR7cGFyc2VNcy50b0ZpeGVkKDEpfW1zLCB0b3RhbDoke3RvdGFsTXMudG9GaXhlZCgxKX1tcylgLAogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGNvbnN0IG1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogInN5c3RlbSIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBGYWlsZWQgdG8gbG9hZCB3ZWJob29rIGNvbmZpZyBmcm9tICR7ZmlsZVBhdGh9OiAke21zZ31gLAogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQovKioKICogU2F2ZSB0aGUgY3VycmVudCB3ZWJob29rIGNvbmZpZ3VyYXRpb24gdG8gYSBKU09OIGZpbGUuCiAqIFNlY3JldHMgdGhhdCByZWZlcmVuY2UgZW52IHZhcnMgYXJlIHNhdmVkIGFzLWlzICh0aGUgcmVmZXJlbmNlLCBub3QgdGhlIHJlc29sdmVkIHZhbHVlKS4KICovCmV4cG9ydCBmdW5jdGlvbiBzYXZlQ29uZmlnVG9GaWxlKGZpbGVQYXRoKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKTsKICAgICAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUocmVzb2x2ZWQpOwogICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSB7CiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICAgIH0KICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHJlc29sdmVkLCBKU09OLnN0cmluZ2lmeShzeXN0ZW1Db25maWcsIG51bGwsIDIpLCAidXRmLTgiKTsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogInN5c3RlbSIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBTYXZlZCB3ZWJob29rIGNvbmZpZyB0byAke2ZpbGVQYXRofWAsCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgc3VtbWFyeTogYEZhaWxlZCB0byBzYXZlIHdlYmhvb2sgY29uZmlnIHRvICR7ZmlsZVBhdGh9OiAke21zZ31gLAogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQovLyMgc291cmNlTWFwcGluZ1VSTD1jb25maWcuanMubWFw","webhooks/event-log.js":"LyoqCiAqIFdlYmhvb2sgZXZlbnQgbG9nIOKAlCByaW5nIGJ1ZmZlciBvZiByZWNlbnQgd2ViaG9vayBldmVudHMgZm9yIGRlYnVnZ2luZy4KICoKICogVHJhY2tzIHRoZSBsYXN0IE4gd2ViaG9vayBldmVudHMgKHN1Y2Nlc3NlcyBhbmQgZmFpbHVyZXMpIHdpdGggdGltaW5nIGRhdGEsCiAqIHByb3ZpZGVyIGluZm8sIGFuZCBlcnJvciBkZXRhaWxzLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyB3ZWJob29rIGludGVncmF0aW9ucwogKiB3aXRob3V0IG5lZWRpbmcgdG8gZGlnIHRocm91Z2ggYWN0aXZpdHkgbG9ncy4KICoKICogVXNhZ2U6CiAqICAgaW1wb3J0IHsgbG9nV2ViaG9va0V2ZW50LCBnZXRSZWNlbnRFdmVudHMgfSBmcm9tICIuL2V2ZW50LWxvZy5qcyI7CiAqICAgbG9nV2ViaG9va0V2ZW50KHsgcHJvdmlkZXI6ICJzbGFjay1ldmVudHMiLCBldmVudFR5cGU6ICJtZXNzYWdlIiwgLi4uIH0pOwogKiAgIGNvbnN0IHJlY2VudCA9IGdldFJlY2VudEV2ZW50cyh7IHByb3ZpZGVyOiAic2xhY2stZXZlbnRzIiwgbGltaXQ6IDEwIH0pOwogKi8KLy8g4pSA4pSAIFJpbmcgYnVmZmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjb25zdCBERUZBVUxUX01BWF9TSVpFID0gNTAwOwpsZXQgbWF4U2l6ZSA9IERFRkFVTFRfTUFYX1NJWkU7CmxldCBidWZmZXIgPSBbXTsKLyoqIENvbmZpZ3VyZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0byBrZWVwLiAqLwpleHBvcnQgZnVuY3Rpb24gc2V0RXZlbnRMb2dNYXhTaXplKHNpemUpIHsKICAgIG1heFNpemUgPSBNYXRoLm1heCgxMCwgc2l6ZSk7CiAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IG1heFNpemUpIHsKICAgICAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoLW1heFNpemUpOwogICAgfQp9Ci8qKiBHZXQgY3VycmVudCBtYXggc2l6ZS4gKi8KZXhwb3J0IGZ1bmN0aW9uIGdldEV2ZW50TG9nTWF4U2l6ZSgpIHsKICAgIHJldHVybiBtYXhTaXplOwp9Ci8vIOKUgOKUgCBMb2dnaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogUmVjb3JkIGEgd2ViaG9vayBldmVudCBpbiB0aGUgbG9nLgogKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBhbiBJRCBhbmQgdHJpbXMgdGhlIGJ1ZmZlciBpZiBvdmVyIGNhcGFjaXR5LgogKi8KZXhwb3J0IGZ1bmN0aW9uIGxvZ1dlYmhvb2tFdmVudChlbnRyeSkgewogICAgY29uc3QgZnVsbCA9IHsKICAgICAgICAuLi5lbnRyeSwKICAgICAgICBpZDogYGV2dF8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YCwKICAgIH07CiAgICBidWZmZXIucHVzaChmdWxsKTsKICAgIGlmIChidWZmZXIubGVuZ3RoID4gbWF4U2l6ZSkgewogICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgtbWF4U2l6ZSk7CiAgICB9CiAgICByZXR1cm4gZnVsbDsKfQovKioKICogQ3JlYXRlIGEgdGltaW5nIHdyYXBwZXIgdGhhdCByZWNvcmRzIHN0YXJ0IHRpbWUgYW5kIHJldHVybnMgYSBmdW5jdGlvbgogKiB0byBmaW5hbGl6ZSB0aGUgbG9nIGVudHJ5IHdpdGggZHVyYXRpb24gYW5kIHJlc3VsdC4KICoKICogVXNhZ2U6CiAqICAgY29uc3QgZmluaXNoID0gc3RhcnRFdmVudFRpbWVyKCJzbGFjay1ldmVudHMiLCB7IGV2ZW50VHlwZTogIm1lc3NhZ2UiIH0pOwogKiAgIC8vIC4uLiBwcm9jZXNzIHdlYmhvb2sgLi4uCiAqICAgZmluaXNoKHsgc3VjY2VzczogdHJ1ZSwgbWVzc2FnZTogIk9LIiB9KTsKICovCmV4cG9ydCBmdW5jdGlvbiBzdGFydEV2ZW50VGltZXIocHJvdmlkZXIsIG1ldGEpIHsKICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgY29uc3QgcmVjZWl2ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgIHJldHVybiAocmVzdWx0KSA9PiB7CiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IE1hdGgucm91bmQoKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lKSAqIDEwMCkgLyAxMDA7CiAgICAgICAgcmV0dXJuIGxvZ1dlYmhvb2tFdmVudCh7CiAgICAgICAgICAgIHByb3ZpZGVyLAogICAgICAgICAgICBldmVudFR5cGU6IG1ldGE/LmV2ZW50VHlwZSwKICAgICAgICAgICAgZGVsaXZlcnlJZDogbWV0YT8uZGVsaXZlcnlJZCwKICAgICAgICAgICAgc2lnbmF0dXJlVmFsaWQ6IG1ldGE/LnNpZ25hdHVyZVZhbGlkLAogICAgICAgICAgICByZWNlaXZlZEF0LAogICAgICAgICAgICBkdXJhdGlvbk1zLAogICAgICAgICAgICAuLi5yZXN1bHQsCiAgICAgICAgfSk7CiAgICB9Owp9Ci8vIOKUgOKUgCBRdWVyeWluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqIEdldCByZWNlbnQgd2ViaG9vayBldmVudHMsIG1vc3QgcmVjZW50IGZpcnN0LiAqLwpleHBvcnQgZnVuY3Rpb24gZ2V0UmVjZW50RXZlbnRzKGZpbHRlcikgewogICAgbGV0IGVudHJpZXMgPSBbLi4uYnVmZmVyXTsKICAgIGlmIChmaWx0ZXI/LnByb3ZpZGVyKSB7CiAgICAgICAgZW50cmllcyA9IGVudHJpZXMuZmlsdGVyKChlKSA9PiBlLnByb3ZpZGVyID09PSBmaWx0ZXIucHJvdmlkZXIpOwogICAgfQogICAgaWYgKGZpbHRlcj8uc3VjY2VzcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgZW50cmllcyA9IGVudHJpZXMuZmlsdGVyKChlKSA9PiBlLnN1Y2Nlc3MgPT09IGZpbHRlci5zdWNjZXNzKTsKICAgIH0KICAgIGlmIChmaWx0ZXI/LnNpbmNlKSB7CiAgICAgICAgZW50cmllcyA9IGVudHJpZXMuZmlsdGVyKChlKSA9PiBlLnJlY2VpdmVkQXQgPj0gZmlsdGVyLnNpbmNlKTsKICAgIH0KICAgIC8vIE1vc3QgcmVjZW50IGZpcnN0CiAgICBlbnRyaWVzLnJldmVyc2UoKTsKICAgIGNvbnN0IGxpbWl0ID0gZmlsdGVyPy5saW1pdCA/PyA1MDsKICAgIHJldHVybiBlbnRyaWVzLnNsaWNlKDAsIGxpbWl0KTsKfQovKiogR2V0IGEgc3VtbWFyeSBvZiB0aGUgZXZlbnQgbG9nLiAqLwpleHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRMb2dTdW1tYXJ5KCkgewogICAgY29uc3QgYnlQcm92aWRlciA9IHt9OwogICAgbGV0IHRvdGFsTXMgPSAwOwogICAgZm9yIChjb25zdCBlbnRyeSBvZiBidWZmZXIpIHsKICAgICAgICB0b3RhbE1zICs9IGVudHJ5LmR1cmF0aW9uTXM7CiAgICAgICAgaWYgKCFieVByb3ZpZGVyW2VudHJ5LnByb3ZpZGVyXSkgewogICAgICAgICAgICBieVByb3ZpZGVyW2VudHJ5LnByb3ZpZGVyXSA9IHsgY291bnQ6IDAsIGZhaWx1cmVzOiAwLCB0b3RhbE1zOiAwIH07CiAgICAgICAgfQogICAgICAgIGJ5UHJvdmlkZXJbZW50cnkucHJvdmlkZXJdLmNvdW50Kys7CiAgICAgICAgYnlQcm92aWRlcltlbnRyeS5wcm92aWRlcl0udG90YWxNcyArPSBlbnRyeS5kdXJhdGlvbk1zOwogICAgICAgIGlmICghZW50cnkuc3VjY2VzcykgewogICAgICAgICAgICBieVByb3ZpZGVyW2VudHJ5LnByb3ZpZGVyXS5mYWlsdXJlcysrOwogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IHN1Y2Nlc3NlcyA9IGJ1ZmZlci5maWx0ZXIoKGUpID0+IGUuc3VjY2VzcykubGVuZ3RoOwogICAgY29uc3QgcHJvdmlkZXJTdW1tYXJ5ID0ge307CiAgICBmb3IgKGNvbnN0IFtuYW1lLCBzdGF0c10gb2YgT2JqZWN0LmVudHJpZXMoYnlQcm92aWRlcikpIHsKICAgICAgICBwcm92aWRlclN1bW1hcnlbbmFtZV0gPSB7CiAgICAgICAgICAgIGNvdW50OiBzdGF0cy5jb3VudCwKICAgICAgICAgICAgZmFpbHVyZXM6IHN0YXRzLmZhaWx1cmVzLAogICAgICAgICAgICBhdmdEdXJhdGlvbk1zOiBzdGF0cy5jb3VudCA+IDAgPyBNYXRoLnJvdW5kKChzdGF0cy50b3RhbE1zIC8gc3RhdHMuY291bnQpICogMTAwKSAvIDEwMCA6IDAsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgdG90YWw6IGJ1ZmZlci5sZW5ndGgsCiAgICAgICAgc3VjY2Vzc2VzLAogICAgICAgIGZhaWx1cmVzOiBidWZmZXIubGVuZ3RoIC0gc3VjY2Vzc2VzLAogICAgICAgIGF2Z0R1cmF0aW9uTXM6IGJ1ZmZlci5sZW5ndGggPiAwID8gTWF0aC5yb3VuZCgodG90YWxNcyAvIGJ1ZmZlci5sZW5ndGgpICogMTAwKSAvIDEwMCA6IDAsCiAgICAgICAgYnlQcm92aWRlcjogcHJvdmlkZXJTdW1tYXJ5LAogICAgICAgIG9sZGVzdEVudHJ5OiBidWZmZXIubGVuZ3RoID4gMCA/IGJ1ZmZlclswXS5yZWNlaXZlZEF0IDogbnVsbCwKICAgICAgICBuZXdlc3RFbnRyeTogYnVmZmVyLmxlbmd0aCA+IDAgPyBidWZmZXJbYnVmZmVyLmxlbmd0aCAtIDFdLnJlY2VpdmVkQXQgOiBudWxsLAogICAgfTsKfQovKiogQ2xlYXIgdGhlIGV2ZW50IGxvZy4gT3B0aW9uYWxseSBmaWx0ZXIgYnkgcHJvdmlkZXIuICovCmV4cG9ydCBmdW5jdGlvbiBjbGVhckV2ZW50TG9nKHByb3ZpZGVyKSB7CiAgICBpZiAocHJvdmlkZXIpIHsKICAgICAgICBjb25zdCBiZWZvcmUgPSBidWZmZXIubGVuZ3RoOwogICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5maWx0ZXIoKGUpID0+IGUucHJvdmlkZXIgIT09IHByb3ZpZGVyKTsKICAgICAgICByZXR1cm4gYmVmb3JlIC0gYnVmZmVyLmxlbmd0aDsKICAgIH0KICAgIGNvbnN0IGNvdW50ID0gYnVmZmVyLmxlbmd0aDsKICAgIGJ1ZmZlciA9IFtdOwogICAgcmV0dXJuIGNvdW50Owp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWV2ZW50LWxvZy5qcy5tYXA=","webhooks/handler.js":"LyoqCiAqIEFic3RyYWN0IFdlYmhvb2tIYW5kbGVyIGJhc2UgY2xhc3MuCiAqCiAqIFByb3ZpZGVzIGEgY2xhc3MtYmFzZWQgQVBJIG9uIHRvcCBvZiB0aGUgZXhpc3RpbmcgaW50ZXJmYWNlLWJhc2VkIHdlYmhvb2sgc3lzdGVtLgogKiBTdWJjbGFzc2VzIGltcGxlbWVudCBgdmVyaWZ5KClgIGFuZCBgaGFuZGxlKClgLCBnZXR0aW5nIGF1dG9tYXRpYyByZWdpc3RyYXRpb24sCiAqIHJldHJ5IGxvZ2ljLCBzYWZlIGVycm9yIGhhbmRsaW5nLCBhbmQgYWN0aXZpdHkgbG9nZ2luZyBmb3IgZnJlZS4KICoKICogVXNhZ2U6CiAqICAgY2xhc3MgTXlIYW5kbGVyIGV4dGVuZHMgV2ViaG9va0hhbmRsZXIgewogKiAgICAgY29uc3RydWN0b3IoKSB7CiAqICAgICAgIHN1cGVyKHsKICogICAgICAgICBuYW1lOiAibXktc2VydmljZSIsCiAqICAgICAgICAgc2lnbmF0dXJlSGVhZGVyOiAieC1teS1zaWduYXR1cmUiLAogKiAgICAgICAgIHNlY3JldEVudlZhcjogIk1ZX1dFQkhPT0tfU0VDUkVUIiwKICogICAgICAgfSk7CiAqICAgICB9CiAqICAgICB2ZXJpZnkoY3R4KSB7IC4uLiB9CiAqICAgICBwcm90ZWN0ZWQgaGFuZGxlKHBheWxvYWQsIGN0eCkgeyAuLi4gfQogKiAgIH0KICovCmltcG9ydCB7IGxvZ0FjdGl2aXR5IH0gZnJvbSAiLi4vYWN0aXZpdHkvbG9nLmpzIjsKaW1wb3J0IHsgcmVnaXN0ZXJQcm92aWRlciB9IGZyb20gIi4vcmVnaXN0cnkuanMiOwppbXBvcnQgeyB3aXRoV2ViaG9va1JldHJ5IH0gZnJvbSAiLi9yZXRyeS5qcyI7Ci8vIOKUgOKUgCBCYXNlIGNsYXNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igd2ViaG9vayBoYW5kbGVycy4KICogSW1wbGVtZW50cyBXZWJob29rUHJvdmlkZXIgYW5kIGF1dG8tcmVnaXN0ZXJzIHdpdGggdGhlIHdlYmhvb2sgcmVnaXN0cnkuCiAqCiAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6CiAqIC0gYHZlcmlmeShjdHgpYCDigJQgVmFsaWRhdGUgdGhlIHdlYmhvb2sgc2lnbmF0dXJlCiAqIC0gYGhhbmRsZShwYXlsb2FkLCBjdHgpYCDigJQgUHJvY2VzcyB0aGUgd2ViaG9vayBwYXlsb2FkCiAqCiAqIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzOgogKiAtIEF1dG8tcmVnaXN0cmF0aW9uIHdpdGggdGhlIHdlYmhvb2sgcmVnaXN0cnkKICogLSBTYWZlIGVycm9yIHdyYXBwaW5nIChwcm9jZXNzKCkgbmV2ZXIgdGhyb3dzKQogKiAtIE9wdGlvbmFsIHJldHJ5IGxvZ2ljIHdpdGggZXhwb25lbnRpYWwgYmFja29mZgogKiAtIFNlY3JldCByZXNvbHV0aW9uIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzCiAqIC0gQWN0aXZpdHkgbG9nZ2luZwogKi8KZXhwb3J0IGNsYXNzIFdlYmhvb2tIYW5kbGVyIHsKICAgIG5hbWU7CiAgICBwYXRoOwogICAgc2lnbmF0dXJlSGVhZGVyOwogICAgdGltZXN0YW1wSGVhZGVyOwogICAgc2VjcmV0RW52VmFyOwogICAgYWxnb3JpdGhtOwogICAgcmV0cnlPcHRzOwogICAgY29uc3RydWN0b3IoY29uZmlnKSB7CiAgICAgICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7CiAgICAgICAgdGhpcy5wYXRoID0gY29uZmlnLnBhdGggPz8gYC9hcGkvd2ViaG9va3MvJHtjb25maWcubmFtZX1gOwogICAgICAgIHRoaXMuc2lnbmF0dXJlSGVhZGVyID0gY29uZmlnLnNpZ25hdHVyZUhlYWRlciA/PyAieC1zaWduYXR1cmUiOwogICAgICAgIHRoaXMudGltZXN0YW1wSGVhZGVyID0gY29uZmlnLnRpbWVzdGFtcEhlYWRlcjsKICAgICAgICB0aGlzLnNlY3JldEVudlZhciA9IGNvbmZpZy5zZWNyZXRFbnZWYXI7CiAgICAgICAgdGhpcy5hbGdvcml0aG0gPSBjb25maWcuYWxnb3JpdGhtID8/ICJjdXN0b20iOwogICAgICAgIHRoaXMucmV0cnlPcHRzID0gY29uZmlnLnJldHJ5ID8/IHt9OwogICAgICAgIGlmIChjb25maWcuYXV0b1JlZ2lzdGVyICE9PSBmYWxzZSkgewogICAgICAgICAgICByZWdpc3RlclByb3ZpZGVyKHRoaXMpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUHJvY2VzcyBhIHdlYmhvb2sgcGF5bG9hZCB3aXRoIGVycm9yIGhhbmRsaW5nIGFuZCBvcHRpb25hbCByZXRyeS4KICAgICAqIFRoaXMgaXMgdGhlIFdlYmhvb2tQcm92aWRlci5wcm9jZXNzKCkgaW1wbGVtZW50YXRpb24g4oCUIGNhbGxlcnMgdXNlIHRoaXMuCiAgICAgKiBOZXZlciB0aHJvd3MuCiAgICAgKi8KICAgIGFzeW5jIHByb2Nlc3MocGF5bG9hZCwgY3R4KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgbWF4QXR0ZW1wdHMgPSB0aGlzLnJldHJ5T3B0cy5tYXhBdHRlbXB0cyA/PyAxOwogICAgICAgICAgICBpZiAobWF4QXR0ZW1wdHMgPiAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFdlYmhvb2tSZXRyeSgoKSA9PiB0aGlzLmhhbmRsZShwYXlsb2FkLCBjdHgpLCB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMubmFtZSwKICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnJldHJ5T3B0cywKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZShwYXlsb2FkLCBjdHgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBXZWJob29rIGhhbmRsZXIgZXJyb3IgKCR7dGhpcy5uYW1lfSk6ICR7bXNnfWAsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4geyBoYW5kbGVkOiBmYWxzZSwgbWVzc2FnZTogYEhhbmRsZXIgZXJyb3I6ICR7bXNnfWAgfTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlc29sdmUgdGhlIHdlYmhvb2sgc2VjcmV0IGZyb20gdGhlIGNvbmZpZ3VyZWQgZW52aXJvbm1lbnQgdmFyaWFibGUuCiAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBlbnYgdmFyIGlzIGNvbmZpZ3VyZWQgb3IgdGhlIHZhciBpcyBub3Qgc2V0LgogICAgICovCiAgICBnZXRTZWNyZXQoKSB7CiAgICAgICAgaWYgKHRoaXMuc2VjcmV0RW52VmFyKSB7CiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzLmVudlt0aGlzLnNlY3JldEVudlZhcl07CiAgICAgICAgfQogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVyIHRoaXMgaGFuZGxlciB3aXRoIHRoZSB3ZWJob29rIHJlZ2lzdHJ5LgogICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgb24gY29uc3RydWN0aW9uIHVubGVzcyBhdXRvUmVnaXN0ZXIgaXMgZmFsc2UuCiAgICAgKi8KICAgIHJlZ2lzdGVyKCkgewogICAgICAgIHJlZ2lzdGVyUHJvdmlkZXIodGhpcyk7CiAgICB9Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFuZGxlci5qcy5tYXA=","webhooks/handlers.js":"LyoqCiAqIENvbW1vbiB3ZWJob29rIGhhbmRsZXIgcGF0dGVybnMuCiAqIFByb3ZpZGVzIHNhZmUtZXhlY3V0aW9uIHdyYXBwZXJzLCBsb2dnaW5nLCBwcm92aWRlciBmYWN0b3J5IGhlbHBlcnMsCiAqIGFuZCByZXVzYWJsZSBidWlsZGluZyBibG9ja3MgZm9yIHByb2Nlc3Npbmcgd2ViaG9vayBldmVudHMuCiAqLwppbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAibm9kZTpjcnlwdG8iOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IHJlZ2lzdGVyUHJvdmlkZXIgfSBmcm9tICIuL3JlZ2lzdHJ5LmpzIjsKaW1wb3J0IHsgaG1hY1NoYTI1NkhleCwgaG1hY1NoYTI1NkJhc2U2NCwgaG1hY1NoYTFCYXNlNjQsIHRpbWluZ1NhZmVDb21wYXJlLCBpc1RpbWVzdGFtcEZyZXNoLCB9IGZyb20gIi4vdmVyaWZ5LmpzIjsKaW1wb3J0IHsgY3JlYXRlV2ViaG9va0V2ZW50IH0gZnJvbSAiLi9yb3V0ZXIuanMiOwovLyDilIDilIAgU2FmZSBleGVjdXRpb24gd3JhcHBlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFdyYXAgYSB3ZWJob29rIGhhbmRsZXIgc28gaXQgbmV2ZXIgdGhyb3dzLgogKiBDYXRjaGVzIGVycm9ycyBhbmQgcmV0dXJucyBhIHN0cnVjdHVyZWQgV2ViaG9va1Jlc3VsdCBpbnN0ZWFkLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHNhZmVIYW5kbGVyKHNvdXJjZSwgZm4pIHsKICAgIHJldHVybiBhc3luYyAocGF5bG9hZCwgY3R4KSA9PiB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuKHBheWxvYWQsIGN0eCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICJzeXN0ZW0iLAogICAgICAgICAgICAgICAgc3VtbWFyeTogYFdlYmhvb2sgaGFuZGxlciBlcnJvciAoJHtzb3VyY2V9KTogJHttc2d9YCwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB7IGhhbmRsZWQ6IGZhbHNlLCBtZXNzYWdlOiBgSGFuZGxlciBlcnJvcjogJHttc2d9YCB9OwogICAgICAgIH0KICAgIH07Cn0KLy8g4pSA4pSAIEV2ZW50IHJvdXRlciBidWlsZGVyIChyZS1leHBvcnRlZCBmcm9tIHJvdXRlci50cykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCB7IGNyZWF0ZUV2ZW50Um91dGVyIH0gZnJvbSAiLi9yb3V0ZXIuanMiOwovLyDilIDilIAgUHJvdmlkZXIgZmFjdG9yeSBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogQ3JlYXRlIGEgcHJvdmlkZXIgdGhhdCB1c2VzIEhNQUMtU0hBMjU2IGhleCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uICh3aXRob3V0IHJlZ2lzdGVyaW5nKS4KICogVXNlZCBieSBzZXJ2aWNlcyBsaWtlIExpbmVhciBhbmQgR2l0SHViLgogKiBDYWxsIHJlZ2lzdGVyUHJvdmlkZXIvcmVnaXN0ZXJQcm92aWRlcnMgc2VwYXJhdGVseSB0byBjb21wbGV0ZSByZWdpc3RyYXRpb24uCiAqLwpleHBvcnQgZnVuY3Rpb24gY3JlYXRlSG1hY1NoYTI1NkhleFByb3ZpZGVyKG9wdHMpIHsKICAgIHJldHVybiB7CiAgICAgICAgbmFtZTogb3B0cy5uYW1lLAogICAgICAgIHZlcmlmeShjdHgpIHsKICAgICAgICAgICAgY29uc3Qgc2lnID0gb3B0cy5zdHJpcFByZWZpeAogICAgICAgICAgICAgICAgPyBjdHguc2lnbmF0dXJlLnJlcGxhY2UoL15zaGEyNTY9LywgIiIpCiAgICAgICAgICAgICAgICA6IGN0eC5zaWduYXR1cmU7CiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkID0gaG1hY1NoYTI1NkhleChjdHgucmF3Qm9keSwgY3R4LnNlY3JldCk7CiAgICAgICAgICAgIHJldHVybiB0aW1pbmdTYWZlQ29tcGFyZShzaWcsIGV4cGVjdGVkKTsKICAgICAgICB9LAogICAgICAgIHByb2Nlc3M6IG9wdHMucHJvY2VzcywKICAgIH07Cn0KLyoqCiAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBwcm92aWRlciB0aGF0IHVzZXMgSE1BQy1TSEEyNTYgaGV4IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uCiAqIFVzZWQgYnkgc2VydmljZXMgbGlrZSBMaW5lYXIgYW5kIEdpdEh1Yi4KICogQGRlcHJlY2F0ZWQgVXNlIGNyZWF0ZUhtYWNTaGEyNTZIZXhQcm92aWRlciArIHJlZ2lzdGVyUHJvdmlkZXJzIGZvciBiYXRjaCByZWdpc3RyYXRpb24uCiAqLwpleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJIbWFjU2hhMjU2SGV4UHJvdmlkZXIob3B0cykgewogICAgY29uc3QgcHJvdmlkZXIgPSBjcmVhdGVIbWFjU2hhMjU2SGV4UHJvdmlkZXIob3B0cyk7CiAgICByZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyKTsKICAgIHJldHVybiBwcm92aWRlcjsKfQovKioKICogQ3JlYXRlIGEgcHJvdmlkZXIgdGhhdCB1c2VzIEhNQUMtU0hBMjU2IGJhc2U2NCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uICh3aXRob3V0IHJlZ2lzdGVyaW5nKS4KICovCmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIbWFjU2hhMjU2QmFzZTY0UHJvdmlkZXIob3B0cykgewogICAgcmV0dXJuIHsKICAgICAgICBuYW1lOiBvcHRzLm5hbWUsCiAgICAgICAgdmVyaWZ5KGN0eCkgewogICAgICAgICAgICBjb25zdCBzaWcgPSBvcHRzLnN0cmlwUHJlZml4CiAgICAgICAgICAgICAgICA/IGN0eC5zaWduYXR1cmUucmVwbGFjZSgvXnNoYTI1Nj0vLCAiIikKICAgICAgICAgICAgICAgIDogY3R4LnNpZ25hdHVyZTsKICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBobWFjU2hhMjU2QmFzZTY0KGN0eC5yYXdCb2R5LCBjdHguc2VjcmV0KTsKICAgICAgICAgICAgcmV0dXJuIHRpbWluZ1NhZmVDb21wYXJlKHNpZywgZXhwZWN0ZWQpOwogICAgICAgIH0sCiAgICAgICAgcHJvY2Vzczogb3B0cy5wcm9jZXNzLAogICAgfTsKfQovKioKICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIHByb3ZpZGVyIHRoYXQgdXNlcyBITUFDLVNIQTI1NiBiYXNlNjQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4KICogQGRlcHJlY2F0ZWQgVXNlIGNyZWF0ZUhtYWNTaGEyNTZCYXNlNjRQcm92aWRlciArIHJlZ2lzdGVyUHJvdmlkZXJzIGZvciBiYXRjaCByZWdpc3RyYXRpb24uCiAqLwpleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJIbWFjU2hhMjU2QmFzZTY0UHJvdmlkZXIob3B0cykgewogICAgY29uc3QgcHJvdmlkZXIgPSBjcmVhdGVIbWFjU2hhMjU2QmFzZTY0UHJvdmlkZXIob3B0cyk7CiAgICByZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyKTsKICAgIHJldHVybiBwcm92aWRlcjsKfQovKioKICogQ3JlYXRlIGEgcHJvdmlkZXIgdGhhdCB1c2VzIFNsYWNrJ3MgdjAgc2lnbmF0dXJlIHNjaGVtZSAod2l0aG91dCByZWdpc3RlcmluZykuCiAqIHYwPXtITUFDLVNIQTI1NiBvZiAidjA6e3RpbWVzdGFtcH06e2JvZHl9In0gd2l0aCB0aW1lc3RhbXAgZnJlc2huZXNzIGNoZWNrLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNsYWNrU3R5bGVQcm92aWRlcihvcHRzKSB7CiAgICByZXR1cm4gewogICAgICAgIG5hbWU6IG9wdHMubmFtZSwKICAgICAgICB2ZXJpZnkoY3R4KSB7CiAgICAgICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGN0eC5oZWFkZXJzPy5bInRpbWVzdGFtcCJdID8/ICIiOwogICAgICAgICAgICBjb25zdCB0cyA9IHBhcnNlSW50KHRpbWVzdGFtcCwgMTApOwogICAgICAgICAgICBpZiAoIWlzVGltZXN0YW1wRnJlc2godHMsIG9wdHMubWF4QWdlU2Vjb25kcyA/PyAzMDApKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBjb25zdCBiYXNlU3RyaW5nID0gYHYwOiR7dGltZXN0YW1wfToke2N0eC5yYXdCb2R5fWA7CiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkID0gYHYwPSR7aG1hY1NoYTI1NkhleChiYXNlU3RyaW5nLCBjdHguc2VjcmV0KX1gOwogICAgICAgICAgICByZXR1cm4gdGltaW5nU2FmZUNvbXBhcmUoY3R4LnNpZ25hdHVyZSwgY29tcHV0ZWQpOwogICAgICAgIH0sCiAgICAgICAgcHJvY2Vzczogb3B0cy5wcm9jZXNzLAogICAgfTsKfQovKioKICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIHByb3ZpZGVyIHRoYXQgdXNlcyBTbGFjaydzIHYwIHNpZ25hdHVyZSBzY2hlbWUuCiAqIEBkZXByZWNhdGVkIFVzZSBjcmVhdGVTbGFja1N0eWxlUHJvdmlkZXIgKyByZWdpc3RlclByb3ZpZGVycyBmb3IgYmF0Y2ggcmVnaXN0cmF0aW9uLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU2xhY2tTdHlsZVByb3ZpZGVyKG9wdHMpIHsKICAgIGNvbnN0IHByb3ZpZGVyID0gY3JlYXRlU2xhY2tTdHlsZVByb3ZpZGVyKG9wdHMpOwogICAgcmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcik7CiAgICByZXR1cm4gcHJvdmlkZXI7Cn0KLyoqCiAqIENyZWF0ZSBhIHByb3ZpZGVyIHRoYXQgdXNlcyBUd2lsaW8ncyBzaWduYXR1cmUgc2NoZW1lICh3aXRob3V0IHJlZ2lzdGVyaW5nKS4KICogSE1BQy1TSEExIG9mIFVSTCArIHNvcnRlZCBQT1NUIHBhcmFtcywgYmFzZTY0IGVuY29kZWQuCiAqLwpleHBvcnQgZnVuY3Rpb24gY3JlYXRlVHdpbGlvU3R5bGVQcm92aWRlcihvcHRzKSB7CiAgICByZXR1cm4gewogICAgICAgIG5hbWU6IG9wdHMubmFtZSwKICAgICAgICB2ZXJpZnkoY3R4KSB7CiAgICAgICAgICAgIGlmICghY3R4LnVybCB8fCAhY3R4LnBhcmFtcykKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgY29uc3Qgc29ydGVkS2V5cyA9IE9iamVjdC5rZXlzKGN0eC5wYXJhbXMpLnNvcnQoKTsKICAgICAgICAgICAgbGV0IGRhdGEgPSBjdHgudXJsOwogICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBzb3J0ZWRLZXlzKSB7CiAgICAgICAgICAgICAgICBkYXRhICs9IGtleSArIGN0eC5wYXJhbXNba2V5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IGhtYWNTaGExQmFzZTY0KGRhdGEsIGN0eC5zZWNyZXQpOwogICAgICAgICAgICByZXR1cm4gdGltaW5nU2FmZUNvbXBhcmUoY3R4LnNpZ25hdHVyZSwgZXhwZWN0ZWQpOwogICAgICAgIH0sCiAgICAgICAgcHJvY2Vzczogb3B0cy5wcm9jZXNzLAogICAgfTsKfQovKioKICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIHByb3ZpZGVyIHRoYXQgdXNlcyBUd2lsaW8ncyBzaWduYXR1cmUgc2NoZW1lLgogKiBAZGVwcmVjYXRlZCBVc2UgY3JlYXRlVHdpbGlvU3R5bGVQcm92aWRlciArIHJlZ2lzdGVyUHJvdmlkZXJzIGZvciBiYXRjaCByZWdpc3RyYXRpb24uCiAqLwpleHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJUd2lsaW9TdHlsZVByb3ZpZGVyKG9wdHMpIHsKICAgIGNvbnN0IHByb3ZpZGVyID0gY3JlYXRlVHdpbGlvU3R5bGVQcm92aWRlcihvcHRzKTsKICAgIHJlZ2lzdGVyUHJvdmlkZXIocHJvdmlkZXIpOwogICAgcmV0dXJuIHByb3ZpZGVyOwp9Ci8qKgogKiBDcmVhdGUgYSBwcm92aWRlciB0aGF0IHVzZXMgU3ZpeC1zdHlsZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uICh3aXRob3V0IHJlZ2lzdGVyaW5nKS4KICogVXNlZCBieSBSZXNlbmQgYW5kIG90aGVyIFN2aXgtcG93ZXJlZCB3ZWJob29rIHNlcnZpY2VzLgogKiBITUFDLVNIQTI1NiBvZiAie3N2aXgtaWR9Lntzdml4LXRpbWVzdGFtcH0ue3Jhd0JvZHl9IiB3aXRoIGJhc2U2NC1kZWNvZGVkIHNlY3JldC4KICovCmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdml4U3R5bGVQcm92aWRlcihvcHRzKSB7CiAgICByZXR1cm4gewogICAgICAgIG5hbWU6IG9wdHMubmFtZSwKICAgICAgICB2ZXJpZnkoY3R4KSB7CiAgICAgICAgICAgIGNvbnN0IHN2aXhJZCA9IGN0eC5oZWFkZXJzPy5bInN2aXgtaWQiXSA/PyAiIjsKICAgICAgICAgICAgY29uc3Qgc3ZpeFRpbWVzdGFtcCA9IGN0eC5oZWFkZXJzPy5bInN2aXgtdGltZXN0YW1wIl0gPz8gIiI7CiAgICAgICAgICAgIGNvbnN0IHN2aXhTaWduYXR1cmUgPSBjdHguc2lnbmF0dXJlOyAvLyBzdml4LXNpZ25hdHVyZSBoZWFkZXIgdmFsdWUKICAgICAgICAgICAgaWYgKCFzdml4SWQgfHwgIXN2aXhUaW1lc3RhbXAgfHwgIXN2aXhTaWduYXR1cmUpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIC8vIENoZWNrIHRpbWVzdGFtcCBmcmVzaG5lc3MKICAgICAgICAgICAgY29uc3QgdHMgPSBwYXJzZUludChzdml4VGltZXN0YW1wLCAxMCk7CiAgICAgICAgICAgIGlmICghaXNUaW1lc3RhbXBGcmVzaCh0cywgb3B0cy5tYXhBZ2VTZWNvbmRzID8/IDMwMCkpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIC8vIERlY29kZSBzZWNyZXQ6IHN0cmlwICJ3aHNlY18iIHByZWZpeCBpZiBwcmVzZW50LCB0aGVuIGJhc2U2NC1kZWNvZGUKICAgICAgICAgICAgbGV0IHNlY3JldEtleTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJhd1NlY3JldCA9IGN0eC5zZWNyZXQuc3RhcnRzV2l0aCgid2hzZWNfIikKICAgICAgICAgICAgICAgICAgICA/IGN0eC5zZWNyZXQuc2xpY2UoNikKICAgICAgICAgICAgICAgICAgICA6IGN0eC5zZWNyZXQ7CiAgICAgICAgICAgICAgICBzZWNyZXRLZXkgPSBCdWZmZXIuZnJvbShyYXdTZWNyZXQsICJiYXNlNjQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ29tcHV0ZSBleHBlY3RlZCBzaWduYXR1cmUKICAgICAgICAgICAgY29uc3Qgc2lnblBheWxvYWQgPSBgJHtzdml4SWR9LiR7c3ZpeFRpbWVzdGFtcH0uJHtjdHgucmF3Qm9keX1gOwogICAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IGNyeXB0bwogICAgICAgICAgICAgICAgLmNyZWF0ZUhtYWMoInNoYTI1NiIsIHNlY3JldEtleSkKICAgICAgICAgICAgICAgIC51cGRhdGUoc2lnblBheWxvYWQpCiAgICAgICAgICAgICAgICAuZGlnZXN0KCJiYXNlNjQiKTsKICAgICAgICAgICAgLy8gQ29tcGFyZSBhZ2FpbnN0IGVhY2ggc3BhY2Utc2VwYXJhdGVkIHNpZ25hdHVyZSBncm91cCAoInYxLDxiYXNlNjQ+IikKICAgICAgICAgICAgY29uc3Qgc2lnR3JvdXBzID0gc3ZpeFNpZ25hdHVyZS5zcGxpdCgiICIpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHNpZ0dyb3VwcykgewogICAgICAgICAgICAgICAgY29uc3QgY29tbWFJZHggPSBncm91cC5pbmRleE9mKCIsIik7CiAgICAgICAgICAgICAgICBpZiAoY29tbWFJZHggPT09IC0xKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IGdyb3VwLnNsaWNlKDAsIGNvbW1hSWR4KTsKICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGdyb3VwLnNsaWNlKGNvbW1hSWR4ICsgMSk7CiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA9PT0gInYxIiAmJiB0aW1pbmdTYWZlQ29tcGFyZShjYW5kaWRhdGUsIGNvbXB1dGVkKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAogICAgICAgIHByb2Nlc3M6IG9wdHMucHJvY2VzcywKICAgIH07Cn0KLy8g4pSA4pSAIFJlLWV4cG9ydCBmcm9tIHJldHJ5LnRzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgeyB3aXRoUmV0cnlIYW5kbGVyIH0gZnJvbSAiLi9yZXRyeS5qcyI7Ci8vIOKUgOKUgCBMb2dnaW5nIGhlbHBlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIExvZyBhIHdlYmhvb2sgZXZlbnQgYW5kIGRlbGVnYXRlIHRvIGEgaGFuZGxlci4KICogQWRkcyBzdHJ1Y3R1cmVkIGxvZ2dpbmcgYmVmb3JlIGFuZCBhZnRlciBwcm9jZXNzaW5nLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHdpdGhMb2dnaW5nKHNvdXJjZSwgZm4pIHsKICAgIHJldHVybiBhc3luYyAocGF5bG9hZCwgY3R4KSA9PiB7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJzeXN0ZW0iLAogICAgICAgICAgICBzdW1tYXJ5OiBgV2ViaG9vayByZWNlaXZlZDogJHtzb3VyY2V9YCwKICAgICAgICB9KTsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihwYXlsb2FkLCBjdHgpOwogICAgICAgIGlmICghcmVzdWx0LmhhbmRsZWQpIHsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBXZWJob29rIG5vdCBoYW5kbGVkICgke3NvdXJjZX0pOiAke3Jlc3VsdC5tZXNzYWdlfWAsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKfQovLyDilIDilIAgRXZlbnQgbm9ybWFsaXphdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFdyYXAgYSByYXcgcGF5bG9hZCBpbnRvIGEgdHlwZWQgV2ViaG9va0V2ZW50IGVudmVsb3BlLgogKiBVc2VmdWwgZm9yIGhhbmRsZXJzIHRoYXQgd2FudCBhIG5vcm1hbGl6ZWQgZXZlbnQgc2hhcGUuCiAqLwpleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVG9FdmVudChzb3VyY2UsIHBheWxvYWQsIG9wdHMpIHsKICAgIHJldHVybiBjcmVhdGVXZWJob29rRXZlbnQoc291cmNlLCBwYXlsb2FkLCB7CiAgICAgICAgZXZlbnRUeXBlOiBvcHRzPy50eXBlRXh0cmFjdG9yPy4ocGF5bG9hZCksCiAgICAgICAgZGVsaXZlcnlJZDogb3B0cz8uaWRFeHRyYWN0b3I/LihwYXlsb2FkKSwKICAgIH0pOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhbmRsZXJzLmpzLm1hcA==","webhooks/index.js":"LyoqCiAqIFdlYmhvb2sgc3lzdGVtIOKAlCBnZW5lcmljIHJlZ2lzdHJ5LCBoYW5kbGVycywgYW5kIHByb3ZpZGVyIGludGVncmF0aW9ucy4KICoKICogVXNhZ2U6CiAqICAgaW1wb3J0IHsgcm91dGVXZWJob29rLCBsaXN0UHJvdmlkZXJzIH0gZnJvbSAiLi93ZWJob29rcy9pbmRleC5qcyI7CiAqCiAqIFByb3ZpZGVycyBleHBvcnQgb2JqZWN0cyBmb3IgZGVmZXJyZWQgYmF0Y2ggcmVnaXN0cmF0aW9uIHZpYSByZWdpc3RlclByb3ZpZGVycygpOgogKiAgIGltcG9ydCB7IGdpdGh1YlByb3ZpZGVyIH0gZnJvbSAiLi4vZ2l0aHViL3dlYmhvb2tzLmpzIjsKICogICBpbXBvcnQgeyBzbGFja0V2ZW50c1Byb3ZpZGVyLCAuLi4gfSBmcm9tICIuLi9zbGFjay93ZWJob29rcy5qcyI7CiAqICAgaW1wb3J0IHsgdHdpbGlvUHJvdmlkZXIgfSBmcm9tICIuL3R3aWxpby5qcyI7CiAqICAgcmVnaXN0ZXJQcm92aWRlcnMoW2dpdGh1YlByb3ZpZGVyLCAuLi5zbGFja1Byb3ZpZGVycywgdHdpbGlvUHJvdmlkZXJdKTsKICovCi8vIOKUgOKUgCBSZWdpc3RyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IHsgcmVnaXN0ZXJQcm92aWRlciwgcmVnaXN0ZXJQcm92aWRlcnMsIGdldFByb3ZpZGVyLCBsaXN0UHJvdmlkZXJzLCByZW1vdmVQcm92aWRlciwgcmVjb3JkU3VjY2VzcywgcmVjb3JkRmFpbHVyZSwgZ2V0UHJvdmlkZXJTdGF0cywgZ2V0QWxsUHJvdmlkZXJTdGF0cywgcmVzZXRQcm92aWRlclN0YXRzLCBnZXRQcm92aWRlckhlYWx0aCwgZ2V0QWxsUHJvdmlkZXJIZWFsdGgsIH0gZnJvbSAiLi9yZWdpc3RyeS5qcyI7Ci8vIOKUgOKUgCBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgeyBobWFjU2hhMjU2SGV4LCBobWFjU2hhMjU2QmFzZTY0LCBobWFjU2hhMUJhc2U2NCwgdGltaW5nU2FmZUNvbXBhcmUsIGlzVGltZXN0YW1wRnJlc2gsIHZlcmlmeUhtYWNTaGEyNTZIZXgsIHZlcmlmeUhtYWNTaGEyNTZCYXNlNjQsIHZlcmlmeVNsYWNrVjAsIHZlcmlmeVN2aXgsIHZlcmlmeVR3aWxpbywgfSBmcm9tICIuL3ZlcmlmeS5qcyI7Ci8vIOKUgOKUgCBSb3V0aW5nICYgZGlzcGF0Y2hpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCB7IHJvdXRlV2ViaG9vaywgcm91dGVXZWJob29rUmVxdWVzdCwgY29tcG9zZU1pZGRsZXdhcmUsIHZhbGlkYXRlUmVxdWVzdCwgZGVkdXBsaWNhdGVSZXF1ZXN0cywgcmF0ZUxpbWl0UmVxdWVzdHMsIGNyZWF0ZVdlYmhvb2tFdmVudCwgY3JlYXRlRXZlbnRSb3V0ZXIsIG5vcm1hbGl6ZVRvRXZlbnQsIH0gZnJvbSAiLi9yb3V0ZXIuanMiOwovLyDilIDilIAgUmV0cnkgJiBlcnJvciBoYW5kbGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IHsgd2l0aFdlYmhvb2tSZXRyeSwgY2xhc3NpZnlFcnJvciwgY3JlYXRlV2ViaG9va0Vycm9yLCBEZWFkTGV0dGVyUXVldWUsIHdpdGhSZXRyeUhhbmRsZXIsIH0gZnJvbSAiLi9yZXRyeS5qcyI7Ci8vIOKUgOKUgCBDb25maWd1cmF0aW9uIG1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCB7IGdldENvbmZpZywgc2V0Q29uZmlnLCBnZXRQcm92aWRlckNvbmZpZywgc2V0UHJvdmlkZXJDb25maWcsIHNldFByb3ZpZGVyQ29uZmlncywgcmVtb3ZlUHJvdmlkZXJDb25maWcsIGxpc3RDb25maWd1cmVkUHJvdmlkZXJzLCByZXNvbHZlU2VjcmV0LCBnZXRQcm92aWRlclNlY3JldCwgZ2V0UHJvdmlkZXJSZXRyeU9wdHMsIGlzUHJvdmlkZXJFbmFibGVkLCB2YWxpZGF0ZVByb3ZpZGVyQ29uZmlnLCB2YWxpZGF0ZUNvbmZpZywgbG9hZENvbmZpZ0Zyb21GaWxlLCBzYXZlQ29uZmlnVG9GaWxlLCB9IGZyb20gIi4vY29uZmlnLmpzIjsKLy8g4pSA4pSAIEhhbmRsZXIgdXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgeyBzYWZlSGFuZGxlciwgY3JlYXRlSG1hY1NoYTI1NkhleFByb3ZpZGVyLCBjcmVhdGVIbWFjU2hhMjU2QmFzZTY0UHJvdmlkZXIsIGNyZWF0ZVNsYWNrU3R5bGVQcm92aWRlciwgY3JlYXRlVHdpbGlvU3R5bGVQcm92aWRlciwgY3JlYXRlU3ZpeFN0eWxlUHJvdmlkZXIsIHJlZ2lzdGVySG1hY1NoYTI1NkhleFByb3ZpZGVyLCByZWdpc3RlckhtYWNTaGEyNTZCYXNlNjRQcm92aWRlciwgcmVnaXN0ZXJTbGFja1N0eWxlUHJvdmlkZXIsIHJlZ2lzdGVyVHdpbGlvU3R5bGVQcm92aWRlciwgd2l0aExvZ2dpbmcsIH0gZnJvbSAiLi9oYW5kbGVycy5qcyI7Ci8vIOKUgOKUgCBCYXNlIGNsYXNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgeyBXZWJob29rSGFuZGxlciB9IGZyb20gIi4vaGFuZGxlci5qcyI7Ci8vIOKUgOKUgCBSb3V0ZSBtb3VudGluZyAmIGFkbWluIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgeyBtb3VudFdlYmhvb2tBZG1pbiwgY3JlYXRlV2ViaG9va1JvdXRlLCB2ZXJpZnlXZWJob29rUmVxdWVzdCwgcHJvY2Vzc1ZlcmlmaWVkV2ViaG9vaywgZ2V0RGVhZExldHRlclF1ZXVlLCB9IGZyb20gIi4vbW91bnQuanMiOwovLyDilIDilIAgUmVsYXkgdmVyaWZpY2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgeyB2ZXJpZnlSZWxheVNpZ25hdHVyZSB9IGZyb20gIi4vcmVsYXkuanMiOwovLyDilIDilIAgRXZlbnQgbG9nIChkZWJ1Z2dpbmcpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgeyBsb2dXZWJob29rRXZlbnQsIHN0YXJ0RXZlbnRUaW1lciwgZ2V0UmVjZW50RXZlbnRzLCBnZXRFdmVudExvZ1N1bW1hcnksIGNsZWFyRXZlbnRMb2csIHNldEV2ZW50TG9nTWF4U2l6ZSwgZ2V0RXZlbnRMb2dNYXhTaXplLCB9IGZyb20gIi4vZXZlbnQtbG9nLmpzIjsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFw","webhooks/mount.js":"LyoqCiAqIFdlYmhvb2sgcm91dGUgbW91bnRpbmcgZm9yIEhvbm8uCiAqCiAqIFByb3ZpZGVzIGhlbHBlcnMgdG8gbW91bnQgd2ViaG9vayBlbmRwb2ludHMgb24gYSBIb25vIGFwcDoKICogLSBgbW91bnRXZWJob29rQWRtaW4oYXBwKWAg4oCUIEFkbWluL21hbmFnZW1lbnQgZW5kcG9pbnRzIGZvciBsaXN0aW5nIHByb3ZpZGVycywKICogICBjaGVja2luZyBoZWFsdGgsIHZpZXdpbmcgc3RhdHMsIGFuZCBtYW5hZ2luZyBjb25maWd1cmF0aW9uLgogKiAtIGBjcmVhdGVXZWJob29rTWlkZGxld2FyZShwcm92aWRlck5hbWUpYCDigJQgUmV1c2FibGUgdmVyaWZpY2F0aW9uIG1pZGRsZXdhcmUKICogICB0aGF0IHJvdXRlcyBjYW4gY29tcG9zZSB3aXRoIHByb3ZpZGVyLXNwZWNpZmljIHJlc3BvbnNlIGhhbmRsaW5nLgogKi8KaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwppbXBvcnQgeyBnZXRQcm92aWRlciwgbGlzdFByb3ZpZGVycywgZ2V0UHJvdmlkZXJTdGF0cywgZ2V0QWxsUHJvdmlkZXJTdGF0cywgZ2V0UHJvdmlkZXJIZWFsdGgsIGdldEFsbFByb3ZpZGVySGVhbHRoLCB9IGZyb20gIi4vcmVnaXN0cnkuanMiOwppbXBvcnQgeyByb3V0ZVdlYmhvb2ssIHJvdXRlV2ViaG9va1JlcXVlc3QsIH0gZnJvbSAiLi9yb3V0ZXIuanMiOwppbXBvcnQgeyBnZXRQcm92aWRlckNvbmZpZywgc2V0UHJvdmlkZXJDb25maWcsIGdldFByb3ZpZGVyU2VjcmV0LCBpc1Byb3ZpZGVyRW5hYmxlZCwgdmFsaWRhdGVDb25maWcsIGxpc3RDb25maWd1cmVkUHJvdmlkZXJzLCB9IGZyb20gIi4vY29uZmlnLmpzIjsKaW1wb3J0IHsgRGVhZExldHRlclF1ZXVlIH0gZnJvbSAiLi9yZXRyeS5qcyI7CmltcG9ydCB7IGdldFJlY2VudEV2ZW50cywgZ2V0RXZlbnRMb2dTdW1tYXJ5LCBjbGVhckV2ZW50TG9nLCBzdGFydEV2ZW50VGltZXIsIH0gZnJvbSAiLi9ldmVudC1sb2cuanMiOwovLyDilIDilIAgU2hhcmVkIGRlYWQtbGV0dGVyIHF1ZXVlIChsYXp5LWluaXRpYWxpemVkKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKbGV0IGRscSA9IG51bGw7Ci8qKiBHZXQgdGhlIHNoYXJlZCBkZWFkLWxldHRlciBxdWV1ZSBpbnN0YW5jZS4gTGF6eS1pbml0aWFsaXplcyBvbiBmaXJzdCBhY2Nlc3MKICogIHRvIGF2b2lkIHN5bmMgZmlsZSBJL08gKyBsb2dBY3Rpdml0eSgpIGF0IG1vZHVsZSBpbXBvcnQgdGltZS4gKi8KZXhwb3J0IGZ1bmN0aW9uIGdldERlYWRMZXR0ZXJRdWV1ZSgpIHsKICAgIGlmICghZGxxKSB7CiAgICAgICAgZGxxID0gbmV3IERlYWRMZXR0ZXJRdWV1ZSgyMDAsICJicmFpbi93ZWJob29rcy9kbHEuanNvbiIpOwogICAgfQogICAgcmV0dXJuIGRscTsKfQovLyDilIDilIAgVmVyaWZpY2F0aW9uIGhlbHBlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFZlcmlmeSBhIHdlYmhvb2sgcmVxdWVzdCBmb3IgYSBnaXZlbiBwcm92aWRlci4KICogTG9va3MgdXAgdGhlIHByb3ZpZGVyIGluIHRoZSByZWdpc3RyeSwgcmVzb2x2ZXMgdGhlIHNlY3JldCwgYW5kIGNhbGxzIHZlcmlmeSgpLgogKiBSZXR1cm5zIHsgdmFsaWQsIGVycm9yPyB9IOKAlCBkb2VzIG5vdCB0aHJvdy4KICovCmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlXZWJob29rUmVxdWVzdChwcm92aWRlck5hbWUsIHJhd0JvZHksIGhlYWRlcnMsIG9wdHMpIHsKICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICBjb25zdCBwcm92aWRlciA9IGdldFByb3ZpZGVyKHByb3ZpZGVyTmFtZSk7CiAgICBpZiAoIXByb3ZpZGVyKSB7CiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogYFVua25vd24gcHJvdmlkZXI6ICR7cHJvdmlkZXJOYW1lfWAsIGR1cmF0aW9uTXM6IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQgfTsKICAgIH0KICAgIGlmICghaXNQcm92aWRlckVuYWJsZWQocHJvdmlkZXJOYW1lKSkgewogICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6IGBQcm92aWRlciAke3Byb3ZpZGVyTmFtZX0gaXMgZGlzYWJsZWRgLCBkdXJhdGlvbk1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0IH07CiAgICB9CiAgICBjb25zdCBzZWNyZXQgPSBnZXRQcm92aWRlclNlY3JldChwcm92aWRlck5hbWUpOwogICAgaWYgKCFzZWNyZXQpIHsKICAgICAgICAvLyBObyBzZWNyZXQgY29uZmlndXJlZCDigJQgYWxsb3cgaW4gZGV2IG1vZGUKICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZHVyYXRpb25NczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCB9OwogICAgfQogICAgY29uc3QgY29uZmlnID0gZ2V0UHJvdmlkZXJDb25maWcocHJvdmlkZXJOYW1lKTsKICAgIGNvbnN0IHNpZ0hlYWRlciA9IGNvbmZpZz8uc2lnbmF0dXJlSGVhZGVyID8/ICJ4LXNpZ25hdHVyZSI7CiAgICBjb25zdCBzaWduYXR1cmUgPSBoZWFkZXJzW3NpZ0hlYWRlcl0gPz8gIiI7CiAgICBjb25zdCBjdHggPSB7CiAgICAgICAgcmF3Qm9keSwKICAgICAgICBzaWduYXR1cmUsCiAgICAgICAgc2VjcmV0LAogICAgICAgIGhlYWRlcnMsCiAgICAgICAgdXJsOiBvcHRzPy51cmwsCiAgICAgICAgcGFyYW1zOiBvcHRzPy5wYXJhbXMsCiAgICB9OwogICAgY29uc3QgdmVyaWZ5U3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIGNvbnN0IHZhbGlkID0gcHJvdmlkZXIudmVyaWZ5KGN0eCk7CiAgICBjb25zdCB2ZXJpZnlNcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gdmVyaWZ5U3RhcnQ7CiAgICBjb25zdCB0b3RhbE1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydDsKICAgIGlmICh0b3RhbE1zID4gMTAwKSB7CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJzeXN0ZW0iLAogICAgICAgICAgICBzdW1tYXJ5OiBgW3BlcmZdIHZlcmlmeVdlYmhvb2tSZXF1ZXN0KCR7cHJvdmlkZXJOYW1lfSkgdG9vayAke3RvdGFsTXMudG9GaXhlZCgxKX1tcyAodmVyaWZ5OiR7dmVyaWZ5TXMudG9GaXhlZCgxKX1tcylgLAogICAgICAgIH0pOwogICAgfQogICAgaWYgKCF2YWxpZCkgewogICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6ICJJbnZhbGlkIHdlYmhvb2sgc2lnbmF0dXJlIiwgZHVyYXRpb25NczogdG90YWxNcyB9OwogICAgfQogICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGR1cmF0aW9uTXM6IHRvdGFsTXMgfTsKfQovLyDilIDilIAgUm91dGUgcHJvY2Vzc2luZyBoZWxwZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBQcm9jZXNzIGEgdmVyaWZpZWQgd2ViaG9vayBwYXlsb2FkIHRocm91Z2ggdGhlIHJlZ2lzdHJ5LgogKiBDYWxsIHRoaXMgYWZ0ZXIgdmVyaWZpY2F0aW9uIHN1Y2NlZWRzLiBIYW5kbGVzIGVycm9yIHdyYXBwaW5nIGFuZCBETFEuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1ZlcmlmaWVkV2ViaG9vayhwcm92aWRlck5hbWUsIHBheWxvYWQsIGN0eCkgewogICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJvdXRlV2ViaG9vayhwcm92aWRlck5hbWUsIHBheWxvYWQsIHVuZGVmaW5lZCwgY3R4KTsKICAgIGNvbnN0IHJvdXRlTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0OwogICAgaWYgKCFyZXN1bHQuaGFuZGxlZCkgewogICAgICAgIGNvbnN0IGRscVN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgZ2V0RGVhZExldHRlclF1ZXVlKCkuYWRkKHsKICAgICAgICAgICAgcHJvdmlkZXI6IHByb3ZpZGVyTmFtZSwKICAgICAgICAgICAgcGF5bG9hZCwKICAgICAgICAgICAgZXJyb3I6IHsKICAgICAgICAgICAgICAgIGtpbmQ6ICJwZXJtYW5lbnQiLAogICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICBwcm92aWRlcjogcHJvdmlkZXJOYW1lLAogICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlY2VpdmVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgYXR0ZW1wdHM6IDEsCiAgICAgICAgfSk7CiAgICAgICAgY29uc3QgZGxxTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGRscVN0YXJ0OwogICAgICAgIGlmIChkbHFNcyA+IDUwKSB7CiAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgIHNvdXJjZTogInN5c3RlbSIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgW3BlcmZdIERMUSBhZGQgZm9yICR7cHJvdmlkZXJOYW1lfSB0b29rICR7ZGxxTXMudG9GaXhlZCgxKX1tc2AsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IHRvdGFsTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0OwogICAgaWYgKHRvdGFsTXMgPiA1MDApIHsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogInN5c3RlbSIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBbcGVyZl0gcHJvY2Vzc1ZlcmlmaWVkV2ViaG9vaygke3Byb3ZpZGVyTmFtZX0pIHRvb2sgJHt0b3RhbE1zLnRvRml4ZWQoMSl9bXMgKHJvdXRlOiR7cm91dGVNcy50b0ZpeGVkKDEpfW1zKWAsCiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Ci8vIOKUgOKUgCBBZG1pbiByb3V0ZSBtb3VudGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIE1vdW50IHdlYmhvb2sgYWRtaW4vbWFuYWdlbWVudCBlbmRwb2ludHMgb24gYSBIb25vIGFwcC4KICogQWRkcyByb3V0ZXMgdW5kZXIgYC9hcGkvd2ViaG9va3MvYCBmb3IgcHJvdmlkZXIgbWFuYWdlbWVudCwgaGVhbHRoLCBzdGF0cywKICogY29uZmlndXJhdGlvbiwgYW5kIGRlYWQtbGV0dGVyIHF1ZXVlIGluc3BlY3Rpb24uCiAqCiAqIFJvdXRlczoKICogLSBHRVQgIC9hcGkvd2ViaG9va3MvcHJvdmlkZXJzICAgICAgICDigJQgTGlzdCByZWdpc3RlcmVkIHByb3ZpZGVycwogKiAtIEdFVCAgL2FwaS93ZWJob29rcy9wcm92aWRlcnMvOm5hbWUgICDigJQgR2V0IHByb3ZpZGVyIGRldGFpbCAoY29uZmlnICsgc3RhdHMgKyBoZWFsdGgpCiAqIC0gR0VUICAvYXBpL3dlYmhvb2tzL2hlYWx0aCAgICAgICAgICAgIOKAlCBIZWFsdGggc3VtbWFyeSBmb3IgYWxsIHByb3ZpZGVycwogKiAtIEdFVCAgL2FwaS93ZWJob29rcy9zdGF0cyAgICAgICAgICAgICDigJQgU3RhdHMgZm9yIGFsbCBwcm92aWRlcnMKICogLSBHRVQgIC9hcGkvd2ViaG9va3MvY29uZmlnL3ZhbGlkYXRlICAg4oCUIFZhbGlkYXRlIHdlYmhvb2sgY29uZmlndXJhdGlvbgogKiAtIFBPU1QgL2FwaS93ZWJob29rcy9jb25maWcvOm5hbWUgICAgICDigJQgVXBkYXRlIHByb3ZpZGVyIGNvbmZpZ3VyYXRpb24KICogLSBHRVQgIC9hcGkvd2ViaG9va3MvZGxxICAgICAgICAgICAgICAg4oCUIExpc3QgZGVhZC1sZXR0ZXIgcXVldWUgZW50cmllcwogKiAtIERFTEVURSAvYXBpL3dlYmhvb2tzL2RscS86aWQgICAgICAgICDigJQgUmVtb3ZlIGEgRExRIGVudHJ5CiAqIC0gUE9TVCAvYXBpL3dlYmhvb2tzL2RscS86aWQvcmV0cnkgICAgIOKAlCBSZXRyeSBhIERMUSBlbnRyeQogKiAtIEdFVCAgL2FwaS93ZWJob29rcy9ldmVudHMgICAgICAgICAgICDigJQgUmVjZW50IGV2ZW50IGxvZyAoZGVidWdnaW5nKQogKiAtIEdFVCAgL2FwaS93ZWJob29rcy9ldmVudHMvc3VtbWFyeSAgICDigJQgRXZlbnQgbG9nIHN1bW1hcnkgc3RhdGlzdGljcwogKiAtIERFTEVURSAvYXBpL3dlYmhvb2tzL2V2ZW50cyAgICAgICAgICDigJQgQ2xlYXIgZXZlbnQgbG9nCiAqIC0gUE9TVCAvYXBpL3dlYmhvb2tzL3Rlc3QvOm5hbWUgICAgICAgIOKAlCBTZW5kIGEgdGVzdCBwYXlsb2FkIHRvIGEgcHJvdmlkZXIKICovCmV4cG9ydCBmdW5jdGlvbiBtb3VudFdlYmhvb2tBZG1pbihhcHApIHsKICAgIGNvbnN0IG1vdW50U3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIC8vIExpc3QgYWxsIHJlZ2lzdGVyZWQgcHJvdmlkZXJzCiAgICBhcHAuZ2V0KCIvYXBpL3dlYmhvb2tzL3Byb3ZpZGVycyIsIChjKSA9PiB7CiAgICAgICAgY29uc3QgcHJvdmlkZXJzID0gbGlzdFByb3ZpZGVycygpOwogICAgICAgIGNvbnN0IGNvbmZpZ3VyZWQgPSBsaXN0Q29uZmlndXJlZFByb3ZpZGVycygpOwogICAgICAgIHJldHVybiBjLmpzb24oewogICAgICAgICAgICBwcm92aWRlcnM6IHByb3ZpZGVycy5tYXAoKG5hbWUpID0+ICh7CiAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgcmVnaXN0ZXJlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQ6IGNvbmZpZ3VyZWQuaW5jbHVkZXMobmFtZSksCiAgICAgICAgICAgICAgICBlbmFibGVkOiBpc1Byb3ZpZGVyRW5hYmxlZChuYW1lKSwKICAgICAgICAgICAgfSkpLAogICAgICAgIH0pOwogICAgfSk7CiAgICAvLyBHZXQgZGV0YWlsIGZvciBhIHNwZWNpZmljIHByb3ZpZGVyCiAgICBhcHAuZ2V0KCIvYXBpL3dlYmhvb2tzL3Byb3ZpZGVycy86bmFtZSIsIChjKSA9PiB7CiAgICAgICAgY29uc3QgbmFtZSA9IGMucmVxLnBhcmFtKCJuYW1lIik7CiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBnZXRQcm92aWRlcihuYW1lKTsKICAgICAgICBpZiAoIXByb3ZpZGVyKSB7CiAgICAgICAgICAgIHJldHVybiBjLmpzb24oeyBlcnJvcjogYFByb3ZpZGVyICIke25hbWV9IiBub3QgZm91bmRgIH0sIDQwNCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN0YXRzID0gZ2V0UHJvdmlkZXJTdGF0cyhuYW1lKTsKICAgICAgICBjb25zdCBoZWFsdGggPSBnZXRQcm92aWRlckhlYWx0aChuYW1lKTsKICAgICAgICBjb25zdCBjb25maWcgPSBnZXRQcm92aWRlckNvbmZpZyhuYW1lKTsKICAgICAgICByZXR1cm4gYy5qc29uKHsKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgZW5hYmxlZDogaXNQcm92aWRlckVuYWJsZWQobmFtZSksCiAgICAgICAgICAgIGNvbmZpZzogY29uZmlnCiAgICAgICAgICAgICAgICA/IHsgLi4uY29uZmlnLCBzZWNyZXQ6IGNvbmZpZy5zZWNyZXQgPyAiKioqIiA6IHVuZGVmaW5lZCB9CiAgICAgICAgICAgICAgICA6IG51bGwsCiAgICAgICAgICAgIHN0YXRzOiBzdGF0cyA/PyBudWxsLAogICAgICAgICAgICBoZWFsdGg6IGhlYWx0aCA/PyBudWxsLAogICAgICAgIH0pOwogICAgfSk7CiAgICAvLyBIZWFsdGggc3VtbWFyeSBmb3IgYWxsIHByb3ZpZGVycwogICAgYXBwLmdldCgiL2FwaS93ZWJob29rcy9oZWFsdGgiLCAoYykgPT4gewogICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHBhcnNlRmxvYXQoYy5yZXEucXVlcnkoInRocmVzaG9sZCIpID8/ICIwLjUiKTsKICAgICAgICBjb25zdCBoZWFsdGggPSBnZXRBbGxQcm92aWRlckhlYWx0aCh0aHJlc2hvbGQpOwogICAgICAgIHJldHVybiBjLmpzb24oeyBwcm92aWRlcnM6IGhlYWx0aCB9KTsKICAgIH0pOwogICAgLy8gU3RhdHMgZm9yIGFsbCBwcm92aWRlcnMKICAgIGFwcC5nZXQoIi9hcGkvd2ViaG9va3Mvc3RhdHMiLCAoYykgPT4gewogICAgICAgIGNvbnN0IHN0YXRzID0gZ2V0QWxsUHJvdmlkZXJTdGF0cygpOwogICAgICAgIHJldHVybiBjLmpzb24oeyBwcm92aWRlcnM6IHN0YXRzIH0pOwogICAgfSk7CiAgICAvLyBWYWxpZGF0ZSBjb25maWd1cmF0aW9uCiAgICBhcHAuZ2V0KCIvYXBpL3dlYmhvb2tzL2NvbmZpZy92YWxpZGF0ZSIsIChjKSA9PiB7CiAgICAgICAgY29uc3QgaXNzdWVzID0gdmFsaWRhdGVDb25maWcoKTsKICAgICAgICBjb25zdCBoYXNJc3N1ZXMgPSBPYmplY3Qua2V5cyhpc3N1ZXMpLmxlbmd0aCA+IDA7CiAgICAgICAgcmV0dXJuIGMuanNvbih7IHZhbGlkOiAhaGFzSXNzdWVzLCBpc3N1ZXMgfSk7CiAgICB9KTsKICAgIC8vIFVwZGF0ZSBwcm92aWRlciBjb25maWd1cmF0aW9uCiAgICBhcHAucG9zdCgiL2FwaS93ZWJob29rcy9jb25maWcvOm5hbWUiLCBhc3luYyAoYykgPT4gewogICAgICAgIGNvbnN0IG5hbWUgPSBjLnJlcS5wYXJhbSgibmFtZSIpOwogICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjLnJlcS5qc29uKCk7CiAgICAgICAgc2V0UHJvdmlkZXJDb25maWcoeyBuYW1lLCAuLi5ib2R5IH0pOwogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgc3VtbWFyeTogYFdlYmhvb2sgY29uZmlnIHVwZGF0ZWQgZm9yICR7bmFtZX1gLAogICAgICAgIH0pOwogICAgICAgIHJldHVybiBjLmpzb24oeyBvazogdHJ1ZSwgbWVzc2FnZTogYENvbmZpZ3VyYXRpb24gdXBkYXRlZCBmb3IgJHtuYW1lfWAgfSk7CiAgICB9KTsKICAgIC8vIERlYWQtbGV0dGVyIHF1ZXVlOiBsaXN0IGVudHJpZXMKICAgIGFwcC5nZXQoIi9hcGkvd2ViaG9va3MvZGxxIiwgKGMpID0+IHsKICAgICAgICBjb25zdCBwcm92aWRlciA9IGMucmVxLnF1ZXJ5KCJwcm92aWRlciIpOwogICAgICAgIGNvbnN0IGVudHJpZXMgPSBnZXREZWFkTGV0dGVyUXVldWUoKS5saXN0KHByb3ZpZGVyID8/IHVuZGVmaW5lZCk7CiAgICAgICAgcmV0dXJuIGMuanNvbih7IHNpemU6IGVudHJpZXMubGVuZ3RoLCBlbnRyaWVzIH0pOwogICAgfSk7CiAgICAvLyBEZWFkLWxldHRlciBxdWV1ZTogcmVtb3ZlIGVudHJ5CiAgICBhcHAuZGVsZXRlKCIvYXBpL3dlYmhvb2tzL2RscS86aWQiLCAoYykgPT4gewogICAgICAgIGNvbnN0IGlkID0gYy5yZXEucGFyYW0oImlkIik7CiAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGdldERlYWRMZXR0ZXJRdWV1ZSgpLnJlbW92ZShpZCk7CiAgICAgICAgaWYgKCFyZW1vdmVkKSB7CiAgICAgICAgICAgIHJldHVybiBjLmpzb24oeyBlcnJvcjogYERMUSBlbnRyeSAiJHtpZH0iIG5vdCBmb3VuZGAgfSwgNDA0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGMuanNvbih7IG9rOiB0cnVlLCBtZXNzYWdlOiBgUmVtb3ZlZCBETFEgZW50cnkgJHtpZH1gIH0pOwogICAgfSk7CiAgICAvLyBEZWFkLWxldHRlciBxdWV1ZTogcmV0cnkgYW4gZW50cnkKICAgIGFwcC5wb3N0KCIvYXBpL3dlYmhvb2tzL2RscS86aWQvcmV0cnkiLCBhc3luYyAoYykgPT4gewogICAgICAgIGNvbnN0IGlkID0gYy5yZXEucGFyYW0oImlkIik7CiAgICAgICAgY29uc3QgcXVldWUgPSBnZXREZWFkTGV0dGVyUXVldWUoKTsKICAgICAgICBjb25zdCBlbnRyaWVzID0gcXVldWUubGlzdCgpOwogICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllcy5maW5kKChlKSA9PiBlLmlkID09PSBpZCk7CiAgICAgICAgaWYgKCFlbnRyeSkgewogICAgICAgICAgICByZXR1cm4gYy5qc29uKHsgZXJyb3I6IGBETFEgZW50cnkgIiR7aWR9IiBub3QgZm91bmRgIH0sIDQwNCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJvdXRlV2ViaG9vayhlbnRyeS5wcm92aWRlciwgZW50cnkucGF5bG9hZCk7CiAgICAgICAgaWYgKHJlc3VsdC5oYW5kbGVkKSB7CiAgICAgICAgICAgIHF1ZXVlLnJlbW92ZShpZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjLmpzb24oewogICAgICAgICAgICBvazogcmVzdWx0LmhhbmRsZWQsCiAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlLAogICAgICAgICAgICByZW1vdmVkOiByZXN1bHQuaGFuZGxlZCwKICAgICAgICB9KTsKICAgIH0pOwogICAgLy8g4pSA4pSAIEV2ZW50IGxvZyBlbmRwb2ludHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyBSZWNlbnQgZXZlbnQgbG9nIChkZWJ1Z2dpbmcpCiAgICBhcHAuZ2V0KCIvYXBpL3dlYmhvb2tzL2V2ZW50cyIsIChjKSA9PiB7CiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBjLnJlcS5xdWVyeSgicHJvdmlkZXIiKSA/PyB1bmRlZmluZWQ7CiAgICAgICAgY29uc3Qgc3VjY2Vzc1N0ciA9IGMucmVxLnF1ZXJ5KCJzdWNjZXNzIik7CiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHN1Y2Nlc3NTdHIgPT09ICJ0cnVlIiA/IHRydWUgOiBzdWNjZXNzU3RyID09PSAiZmFsc2UiID8gZmFsc2UgOiB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgbGltaXQgPSBwYXJzZUludChjLnJlcS5xdWVyeSgibGltaXQiKSA/PyAiNTAiLCAxMCk7CiAgICAgICAgY29uc3Qgc2luY2UgPSBjLnJlcS5xdWVyeSgic2luY2UiKSA/PyB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgZXZlbnRzID0gZ2V0UmVjZW50RXZlbnRzKHsgcHJvdmlkZXIsIHN1Y2Nlc3MsIGxpbWl0LCBzaW5jZSB9KTsKICAgICAgICByZXR1cm4gYy5qc29uKHsgY291bnQ6IGV2ZW50cy5sZW5ndGgsIGV2ZW50cyB9KTsKICAgIH0pOwogICAgLy8gRXZlbnQgbG9nIHN1bW1hcnkKICAgIGFwcC5nZXQoIi9hcGkvd2ViaG9va3MvZXZlbnRzL3N1bW1hcnkiLCAoYykgPT4gewogICAgICAgIGNvbnN0IHN1bW1hcnkgPSBnZXRFdmVudExvZ1N1bW1hcnkoKTsKICAgICAgICByZXR1cm4gYy5qc29uKHN1bW1hcnkpOwogICAgfSk7CiAgICAvLyBDbGVhciBldmVudCBsb2cKICAgIGFwcC5kZWxldGUoIi9hcGkvd2ViaG9va3MvZXZlbnRzIiwgKGMpID0+IHsKICAgICAgICBjb25zdCBwcm92aWRlciA9IGMucmVxLnF1ZXJ5KCJwcm92aWRlciIpID8/IHVuZGVmaW5lZDsKICAgICAgICBjb25zdCBjbGVhcmVkID0gY2xlYXJFdmVudExvZyhwcm92aWRlcik7CiAgICAgICAgcmV0dXJuIGMuanNvbih7IG9rOiB0cnVlLCBjbGVhcmVkIH0pOwogICAgfSk7CiAgICAvLyDilIDilIAgVGVzdCBlbmRwb2ludCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIFNlbmQgYSB0ZXN0IHBheWxvYWQgdG8gYSBwcm92aWRlciAoYnlwYXNzZXMgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbikKICAgIGFwcC5wb3N0KCIvYXBpL3dlYmhvb2tzL3Rlc3QvOm5hbWUiLCBhc3luYyAoYykgPT4gewogICAgICAgIGNvbnN0IG5hbWUgPSBjLnJlcS5wYXJhbSgibmFtZSIpOwogICAgICAgIGNvbnN0IHByb3ZpZGVyID0gZ2V0UHJvdmlkZXIobmFtZSk7CiAgICAgICAgaWYgKCFwcm92aWRlcikgewogICAgICAgICAgICByZXR1cm4gYy5qc29uKHsgZXJyb3I6IGBQcm92aWRlciAiJHtuYW1lfSIgbm90IGZvdW5kYCB9LCA0MDQpOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzUHJvdmlkZXJFbmFibGVkKG5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiBjLmpzb24oeyBlcnJvcjogYFByb3ZpZGVyICIke25hbWV9IiBpcyBkaXNhYmxlZGAgfSwgNDAwKTsKICAgICAgICB9CiAgICAgICAgbGV0IHBheWxvYWQ7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcGF5bG9hZCA9IGF3YWl0IGMucmVxLmpzb24oKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICByZXR1cm4gYy5qc29uKHsgZXJyb3I6ICJJbnZhbGlkIEpTT04gYm9keSIgfSwgNDAwKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZmluaXNoID0gc3RhcnRFdmVudFRpbWVyKG5hbWUsIHsgZXZlbnRUeXBlOiAidGVzdCIgfSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvdmlkZXIucHJvY2VzcyhwYXlsb2FkKTsKICAgICAgICAgICAgZmluaXNoKHsKICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHJlc3VsdC5oYW5kbGVkLAogICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gYy5qc29uKHsgb2s6IHRydWUsIHJlc3VsdCB9KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgICAgIGZpbmlzaCh7IHN1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiBtc2csIGVycm9yOiBtc2cgfSk7CiAgICAgICAgICAgIHJldHVybiBjLmpzb24oeyBvazogZmFsc2UsIGVycm9yOiBtc2cgfSwgNTAwKTsKICAgICAgICB9CiAgICB9KTsKICAgIGNvbnN0IHJvdXRlc01zID0gKHBlcmZvcm1hbmNlLm5vdygpIC0gbW91bnRTdGFydCkudG9GaXhlZCgxKTsKICAgIGNvbnN0IGxvZ1N0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICBzdW1tYXJ5OiBgV2ViaG9vayBhZG1pbiByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL3dlYmhvb2tzLyAocm91dGVzOiR7cm91dGVzTXN9bXMpYCwKICAgIH0pOwogICAgY29uc3QgbG9nTXMgPSAocGVyZm9ybWFuY2Uubm93KCkgLSBsb2dTdGFydCkudG9GaXhlZCgxKTsKICAgIGNvbnN0IHRvdGFsTXMgPSAocGVyZm9ybWFuY2Uubm93KCkgLSBtb3VudFN0YXJ0KS50b0ZpeGVkKDEpOwogICAgaWYgKHBhcnNlRmxvYXQobG9nTXMpID4gNSkgewogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgc3VtbWFyeTogYFtwZXJmXSBtb3VudFdlYmhvb2tBZG1pbiBsb2dBY3Rpdml0eSB0b29rICR7bG9nTXN9bXNgLAogICAgICAgIH0pOwogICAgfQogICAgaWYgKHBhcnNlRmxvYXQodG90YWxNcykgPiA1MCkgewogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgc3VtbWFyeTogYFtwZXJmXSBtb3VudFdlYmhvb2tBZG1pbiB0b3RhbDogJHt0b3RhbE1zfW1zIChyb3V0ZXM6JHtyb3V0ZXNNc31tcywgbG9nOiR7bG9nTXN9bXMpYCwKICAgICAgICB9KTsKICAgIH0KfQovKioKICogQ3JlYXRlIGEgSG9ubyByb3V0ZSBoYW5kbGVyIHRoYXQgdmVyaWZpZXMgYW5kIHByb2Nlc3NlcyB3ZWJob29rcwogKiB0aHJvdWdoIHRoZSBnZW5lcmljIHJlZ2lzdHJ5LiBVc2UgdGhpcyB0byByZXBsYWNlIGlubGluZSB2ZXJpZmljYXRpb24gY29kZS4KICoKICogVXNhZ2U6CiAqICAgYXBwLnBvc3QoIi9hcGkvbXktc2VydmljZS93ZWJob29rcyIsIGNyZWF0ZVdlYmhvb2tSb3V0ZSh7CiAqICAgICBwcm92aWRlcjogIm15LXNlcnZpY2UiLAogKiAgICAgcHJvY2Vzc29yQ3R4OiB7IHN0b3JlOiBteVN0b3JlIH0sCiAqICAgfSkpOwogKi8KZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYmhvb2tSb3V0ZShvcHRzKSB7CiAgICByZXR1cm4gYXN5bmMgKGMpID0+IHsKICAgICAgICBjb25zdCByYXdCb2R5ID0gYXdhaXQgYy5yZXEudGV4dCgpOwogICAgICAgIC8vIEJ1aWxkIGhlYWRlcnMgbWFwIChsb3dlcmNhc2Uga2V5cykKICAgICAgICBjb25zdCBoZWFkZXJzID0ge307CiAgICAgICAgYy5yZXEucmF3LmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4gewogICAgICAgICAgICBoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlOwogICAgICAgIH0pOwogICAgICAgIC8vIEJ1aWxkIFVSTCBmb3IgcHJvdmlkZXJzIHRoYXQgbmVlZCBpdCAoZS5nLiwgVHdpbGlvKQogICAgICAgIGNvbnN0IHByb3RvID0gaGVhZGVyc1sieC1mb3J3YXJkZWQtcHJvdG8iXSA/PyAiaHR0cHMiOwogICAgICAgIGNvbnN0IGhvc3QgPSBoZWFkZXJzWyJob3N0Il0gPz8gImxvY2FsaG9zdCI7CiAgICAgICAgY29uc3QgcGF0aE5hbWUgPSBuZXcgVVJMKGMucmVxLnVybCkucGF0aG5hbWU7CiAgICAgICAgY29uc3QgZnVsbFVybCA9IGAke3Byb3RvfTovLyR7aG9zdH0ke3BhdGhOYW1lfWA7CiAgICAgICAgLy8gU3RhcnQgZXZlbnQgdGltZXIgZm9yIHRoZSBldmVudCBsb2cKICAgICAgICBjb25zdCBkZWxpdmVyeUlkID0gaGVhZGVyc1sieC1yZXF1ZXN0LWlkIl0gPz8gaGVhZGVyc1sieC1naXRodWItZGVsaXZlcnkiXSA/PyB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgZmluaXNoID0gc3RhcnRFdmVudFRpbWVyKG9wdHMucHJvdmlkZXIsIHsgZGVsaXZlcnlJZCB9KTsKICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uID0gdmVyaWZ5V2ViaG9va1JlcXVlc3Qob3B0cy5wcm92aWRlciwgcmF3Qm9keSwgaGVhZGVycywgewogICAgICAgICAgICB1cmw6IGZ1bGxVcmwsCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCF2ZXJpZmljYXRpb24udmFsaWQpIHsKICAgICAgICAgICAgZmluaXNoKHsKICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLAogICAgICAgICAgICAgICAgbWVzc2FnZTogdmVyaWZpY2F0aW9uLmVycm9yID8/ICJTaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZCIsCiAgICAgICAgICAgICAgICBlcnJvcjogdmVyaWZpY2F0aW9uLmVycm9yLAogICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogNDAxLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGMuanNvbih7IGVycm9yOiB2ZXJpZmljYXRpb24uZXJyb3IgfSwgNDAxKTsKICAgICAgICB9CiAgICAgICAgLy8gUGFyc2UgYm9keQogICAgICAgIGxldCBwYXJzZWQ7CiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJzWyJjb250ZW50LXR5cGUiXSA/PyAiIjsKICAgICAgICBpZiAoY29udGVudFR5cGUuaW5jbHVkZXMoImFwcGxpY2F0aW9uL2pzb24iKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShyYXdCb2R5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBmaW5pc2goeyBzdWNjZXNzOiBmYWxzZSwgbWVzc2FnZTogIkludmFsaWQgSlNPTiBib2R5Iiwgc3RhdHVzQ29kZTogNDAwIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIGMuanNvbih7IGVycm9yOiAiSW52YWxpZCBKU09OIGJvZHkiIH0sIDQwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY29udGVudFR5cGUuaW5jbHVkZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpKSB7CiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9OwogICAgICAgICAgICBjb25zdCBwYWlycyA9IHJhd0JvZHkuc3BsaXQoIiYiKTsKICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcUlkeCA9IHBhaXIuaW5kZXhPZigiPSIpOwogICAgICAgICAgICAgICAgaWYgKGVxSWR4ID09PSAtMSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChwYWlyLnNsaWNlKDAsIGVxSWR4KS5yZXBsYWNlKC9cKy9nLCAiICIpKTsKICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhaXIuc2xpY2UoZXFJZHggKyAxKS5yZXBsYWNlKC9cKy9nLCAiICIpKTsKICAgICAgICAgICAgICAgIHBhcmFtc1trZXldID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFyc2VkID0gcGFyYW1zOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcGFyc2VkID0gcmF3Qm9keTsKICAgICAgICB9CiAgICAgICAgLy8gUm91dGUgdGhyb3VnaCB0aGUgbWlkZGxld2FyZSBwaXBlbGluZQogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJvdXRlV2ViaG9va1JlcXVlc3QoewogICAgICAgICAgICBtZXRob2Q6IGMucmVxLm1ldGhvZCwKICAgICAgICAgICAgdXJsOiBmdWxsVXJsLAogICAgICAgICAgICBoZWFkZXJzLAogICAgICAgICAgICBib2R5OiByYXdCb2R5LAogICAgICAgICAgICBwYXJzZWQsCiAgICAgICAgICAgIHByb3ZpZGVyOiBvcHRzLnByb3ZpZGVyLAogICAgICAgIH0sIHsKICAgICAgICAgICAgcHJvY2Vzc29yQ3R4OiBvcHRzLnByb2Nlc3NvckN0eCwKICAgICAgICAgICAgbWlkZGxld2FyZTogb3B0cy5taWRkbGV3YXJlLAogICAgICAgIH0pOwogICAgICAgIC8vIExvZyB0aGUgZXZlbnQKICAgICAgICBmaW5pc2goewogICAgICAgICAgICBzdWNjZXNzOiByZXN1bHQuaGFuZGxlZCwKICAgICAgICAgICAgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UsCiAgICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMCwKICAgICAgICB9KTsKICAgICAgICAvLyBDdXN0b20gcmVzcG9uc2UgdHJhbnNmb3JtYXRpb24KICAgICAgICBpZiAob3B0cy50cmFuc2Zvcm1SZXNwb25zZSkgewogICAgICAgICAgICBjb25zdCBjdXN0b20gPSBvcHRzLnRyYW5zZm9ybVJlc3BvbnNlKHJlc3VsdCwgYyk7CiAgICAgICAgICAgIGlmIChjdXN0b20pCiAgICAgICAgICAgICAgICByZXR1cm4gY3VzdG9tOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYy5qc29uKHJlc3VsdCk7CiAgICB9Owp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vdW50LmpzLm1hcA==","webhooks/registry.js":"LyoqCiAqIEdlbmVyaWMgd2ViaG9vayByZWdpc3RyeS4KICoKICogUHJvdmlkZXIgcmVnaXN0cmF0aW9uLCBsb29rdXAsIHN0YXRzIHRyYWNraW5nLCBhbmQgaGVhbHRoIG1vbml0b3JpbmcuCiAqIFNpZ25hdHVyZSB2ZXJpZmljYXRpb24sIHJvdXRpbmcsIHJldHJ5LCBhbmQgY29uZmlndXJhdGlvbiBsaXZlIGluCiAqIHRoZWlyIG93biBtb2R1bGVzIOKAlCB0aGlzIGZpbGUgcmUtZXhwb3J0cyB0aGVtIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogKi8KaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJ3ZWJob29rcy5yZWdpc3RyeSIpOwpleHBvcnQgeyBobWFjU2hhMjU2SGV4LCBobWFjU2hhMjU2QmFzZTY0LCBobWFjU2hhMUJhc2U2NCwgdGltaW5nU2FmZUNvbXBhcmUsIGlzVGltZXN0YW1wRnJlc2gsIH0gZnJvbSAiLi92ZXJpZnkuanMiOwpleHBvcnQgeyB3aXRoV2ViaG9va1JldHJ5IH0gZnJvbSAiLi9yZXRyeS5qcyI7CmV4cG9ydCB7IHJvdXRlV2ViaG9vaywgcm91dGVXZWJob29rUmVxdWVzdCwgY29tcG9zZU1pZGRsZXdhcmUsIHZhbGlkYXRlUmVxdWVzdCwgZGVkdXBsaWNhdGVSZXF1ZXN0cywgY3JlYXRlV2ViaG9va0V2ZW50LCB9IGZyb20gIi4vcm91dGVyLmpzIjsKLy8g4pSA4pSAIFJlZ2lzdHJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjb25zdCBwcm92aWRlcnMgPSBuZXcgTWFwKCk7Ci8qKgogKiBSZWdpc3RlciBhIHdlYmhvb2sgcHJvdmlkZXIuCiAqIFNraXBzIHJlLXJlZ2lzdHJhdGlvbiBpZiBhIHByb3ZpZGVyIHdpdGggdGhlIHNhbWUgbmFtZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCiAqIFVzZXMgZGVidWcgbG9nZ2luZyBpbnN0ZWFkIG9mIGFjdGl2aXR5IGxvZyB0byBwcmV2ZW50IHRoZSB0cmFjZSBpbnNpZ2h0IGVuZ2luZQogKiBmcm9tIGZsYWdnaW5nIG5vcm1hbCBzdGFydHVwIHJlZ2lzdHJhdGlvbnMgYXMgYm90dGxlbmVja3MgKERBU0gtNjEsIERBU0gtNjIpLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXIocHJvdmlkZXIpIHsKICAgIGlmIChwcm92aWRlcnMuaGFzKHByb3ZpZGVyLm5hbWUpKQogICAgICAgIHJldHVybjsKICAgIHByb3ZpZGVycy5zZXQocHJvdmlkZXIubmFtZSwgcHJvdmlkZXIpOwogICAgbG9nLmRlYnVnKGBXZWJob29rIHByb3ZpZGVyIHJlZ2lzdGVyZWQ6ICR7cHJvdmlkZXIubmFtZX1gKTsKfQovKioKICogUmVnaXN0ZXIgbXVsdGlwbGUgcHJvdmlkZXJzIGluIGEgc2luZ2xlIGJhdGNoLgogKiBTa2lwcyBwcm92aWRlcnMgdGhhdCBhcmUgYWxyZWFkeSByZWdpc3RlcmVkIGJ5IG5hbWUsIGF2b2lkaW5nIGR1cGxpY2F0ZQogKiByZWdpc3RyYXRpb25zIGFjcm9zcyB3YXRjaC1tb2RlIHJlc3RhcnRzIG9yIHJlcGVhdGVkIGNhbGxzLgogKiBVc2VzIGRlYnVnIGxvZ2dpbmcgaW5zdGVhZCBvZiBhY3Rpdml0eSBsb2cgdG8gcHJldmVudCB0aGUgdHJhY2UgaW5zaWdodAogKiBlbmdpbmUgZnJvbSBmbGFnZ2luZyBub3JtYWwgc3RhcnR1cCByZWdpc3RyYXRpb25zIGFzIGJvdHRsZW5lY2tzIChEQVNILTYxLCBEQVNILTYyKS4KICovCmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclByb3ZpZGVycyhsaXN0KSB7CiAgICBjb25zdCByZWdpc3RlcmVkID0gW107CiAgICBjb25zdCBza2lwcGVkID0gW107CiAgICBmb3IgKGNvbnN0IHByb3ZpZGVyIG9mIGxpc3QpIHsKICAgICAgICBpZiAocHJvdmlkZXJzLmhhcyhwcm92aWRlci5uYW1lKSkgewogICAgICAgICAgICBza2lwcGVkLnB1c2gocHJvdmlkZXIubmFtZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBwcm92aWRlcnMuc2V0KHByb3ZpZGVyLm5hbWUsIHByb3ZpZGVyKTsKICAgICAgICByZWdpc3RlcmVkLnB1c2gocHJvdmlkZXIubmFtZSk7CiAgICB9CiAgICBpZiAocmVnaXN0ZXJlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgbG9nLmRlYnVnKGBXZWJob29rIHByb3ZpZGVycyByZWdpc3RlcmVkOiBbJHtyZWdpc3RlcmVkLmpvaW4oIiwgIil9XWApOwogICAgfQogICAgaWYgKHNraXBwZWQubGVuZ3RoID4gMCkgewogICAgICAgIGxvZy5kZWJ1ZyhgV2ViaG9vayBwcm92aWRlcnMgc2tpcHBlZCAoYWxyZWFkeSByZWdpc3RlcmVkKTogWyR7c2tpcHBlZC5qb2luKCIsICIpfV1gKTsKICAgIH0KfQovKiogR2V0IGEgcmVnaXN0ZXJlZCBwcm92aWRlciBieSBuYW1lLiAqLwpleHBvcnQgZnVuY3Rpb24gZ2V0UHJvdmlkZXIobmFtZSkgewogICAgcmV0dXJuIHByb3ZpZGVycy5nZXQobmFtZSk7Cn0KLyoqIExpc3QgYWxsIHJlZ2lzdGVyZWQgcHJvdmlkZXIgbmFtZXMuICovCmV4cG9ydCBmdW5jdGlvbiBsaXN0UHJvdmlkZXJzKCkgewogICAgcmV0dXJuIFsuLi5wcm92aWRlcnMua2V5cygpXTsKfQovKiogUmVtb3ZlIGEgcHJvdmlkZXIgYnkgbmFtZS4gKi8KZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVByb3ZpZGVyKG5hbWUpIHsKICAgIHJldHVybiBwcm92aWRlcnMuZGVsZXRlKG5hbWUpOwp9Ci8vIOKUgOKUgCBQcm92aWRlciBTdGF0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKY29uc3Qgc3RhdHNNYXAgPSBuZXcgTWFwKCk7CmZ1bmN0aW9uIGdldE9yQ3JlYXRlU3RhdHMobmFtZSkgewogICAgbGV0IHN0YXRzID0gc3RhdHNNYXAuZ2V0KG5hbWUpOwogICAgaWYgKCFzdGF0cykgewogICAgICAgIHN0YXRzID0gewogICAgICAgICAgICBuYW1lLAogICAgICAgICAgICBpbnZvY2F0aW9uczogMCwKICAgICAgICAgICAgc3VjY2Vzc2VzOiAwLAogICAgICAgICAgICBmYWlsdXJlczogMCwKICAgICAgICAgICAgbGFzdEludm9rZWRBdDogbnVsbCwKICAgICAgICAgICAgbGFzdEVycm9yQXQ6IG51bGwsCiAgICAgICAgICAgIGxhc3RFcnJvcjogbnVsbCwKICAgICAgICB9OwogICAgICAgIHN0YXRzTWFwLnNldChuYW1lLCBzdGF0cyk7CiAgICB9CiAgICByZXR1cm4gc3RhdHM7Cn0KLyoqIFJlY29yZCBhIHN1Y2Nlc3NmdWwgd2ViaG9vayBpbnZvY2F0aW9uLiAqLwpleHBvcnQgZnVuY3Rpb24gcmVjb3JkU3VjY2Vzcyhwcm92aWRlck5hbWUpIHsKICAgIGNvbnN0IHN0YXRzID0gZ2V0T3JDcmVhdGVTdGF0cyhwcm92aWRlck5hbWUpOwogICAgc3RhdHMuaW52b2NhdGlvbnMrKzsKICAgIHN0YXRzLnN1Y2Nlc3NlcysrOwogICAgc3RhdHMubGFzdEludm9rZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKfQovKiogUmVjb3JkIGEgZmFpbGVkIHdlYmhvb2sgaW52b2NhdGlvbi4gKi8KZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEZhaWx1cmUocHJvdmlkZXJOYW1lLCBlcnJvcikgewogICAgY29uc3Qgc3RhdHMgPSBnZXRPckNyZWF0ZVN0YXRzKHByb3ZpZGVyTmFtZSk7CiAgICBzdGF0cy5pbnZvY2F0aW9ucysrOwogICAgc3RhdHMuZmFpbHVyZXMrKzsKICAgIHN0YXRzLmxhc3RJbnZva2VkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgICBzdGF0cy5sYXN0RXJyb3JBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgIHN0YXRzLmxhc3RFcnJvciA9IGVycm9yOwp9Ci8qKiBHZXQgc3RhdHMgZm9yIGEgc3BlY2lmaWMgcHJvdmlkZXIuICovCmV4cG9ydCBmdW5jdGlvbiBnZXRQcm92aWRlclN0YXRzKG5hbWUpIHsKICAgIHJldHVybiBzdGF0c01hcC5nZXQobmFtZSk7Cn0KLyoqIEdldCBzdGF0cyBmb3IgYWxsIHByb3ZpZGVycy4gKi8KZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFByb3ZpZGVyU3RhdHMoKSB7CiAgICByZXR1cm4gWy4uLnN0YXRzTWFwLnZhbHVlcygpXTsKfQovKiogUmVzZXQgc3RhdHMgKHVzZWZ1bCBpbiB0ZXN0cykuIFBhc3MgYSBuYW1lIHRvIHJlc2V0IG9uZSBwcm92aWRlciwgb3Igb21pdCB0byByZXNldCBhbGwuICovCmV4cG9ydCBmdW5jdGlvbiByZXNldFByb3ZpZGVyU3RhdHMobmFtZSkgewogICAgaWYgKG5hbWUpIHsKICAgICAgICBzdGF0c01hcC5kZWxldGUobmFtZSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBzdGF0c01hcC5jbGVhcigpOwogICAgfQp9Ci8vIOKUgOKUgCBQcm92aWRlciBIZWFsdGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBHZXQgaGVhbHRoIHN1bW1hcnkgZm9yIGEgcHJvdmlkZXIgYmFzZWQgb24gZmFpbHVyZSByYXRlLgogKiBAcGFyYW0gbmFtZSBQcm92aWRlciBuYW1lLgogKiBAcGFyYW0gZmFpbHVyZVRocmVzaG9sZCBGYWlsdXJlIHJhdGUgKDDigJMxKSBhYm92ZSB3aGljaCBzdGF0dXMgaXMgImRlZ3JhZGVkIi4gRGVmYXVsdDogMC41LgogKi8KZXhwb3J0IGZ1bmN0aW9uIGdldFByb3ZpZGVySGVhbHRoKG5hbWUsIGZhaWx1cmVUaHJlc2hvbGQgPSAwLjUpIHsKICAgIGNvbnN0IHN0YXRzID0gc3RhdHNNYXAuZ2V0KG5hbWUpOwogICAgaWYgKCFzdGF0cykKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgaWYgKHN0YXRzLmludm9jYXRpb25zID09PSAwKSB7CiAgICAgICAgcmV0dXJuIHsgbmFtZSwgaGVhbHRoOiAidW5rbm93biIsIGZhaWx1cmVSYXRlOiAwLCBzdGF0cyB9OwogICAgfQogICAgY29uc3QgZmFpbHVyZVJhdGUgPSBzdGF0cy5mYWlsdXJlcyAvIHN0YXRzLmludm9jYXRpb25zOwogICAgY29uc3QgaGVhbHRoID0gZmFpbHVyZVJhdGUgPj0gZmFpbHVyZVRocmVzaG9sZCA/ICJkZWdyYWRlZCIgOiAiaGVhbHRoeSI7CiAgICByZXR1cm4geyBuYW1lLCBoZWFsdGgsIGZhaWx1cmVSYXRlLCBzdGF0cyB9Owp9Ci8qKiBHZXQgaGVhbHRoIHN1bW1hcmllcyBmb3IgYWxsIHJlZ2lzdGVyZWQgcHJvdmlkZXJzLiAqLwpleHBvcnQgZnVuY3Rpb24gZ2V0QWxsUHJvdmlkZXJIZWFsdGgoZmFpbHVyZVRocmVzaG9sZCA9IDAuNSkgewogICAgcmV0dXJuIFsuLi5wcm92aWRlcnMua2V5cygpXS5tYXAoKG5hbWUpID0+IHsKICAgICAgICByZXR1cm4gKGdldFByb3ZpZGVySGVhbHRoKG5hbWUsIGZhaWx1cmVUaHJlc2hvbGQpID8/IHsKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgaGVhbHRoOiAidW5rbm93biIsCiAgICAgICAgICAgIGZhaWx1cmVSYXRlOiAwLAogICAgICAgICAgICBzdGF0czogZ2V0T3JDcmVhdGVTdGF0cyhuYW1lKSwKICAgICAgICB9KTsKICAgIH0pOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZ2lzdHJ5LmpzLm1hcA==","webhooks/relay.js":"LyoqCiAqIFJlbGF5IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGFuZCBwcm9jZXNzaW5nLgogKgogKiBIYW5kbGVzIGluY29taW5nIG1lc3NhZ2VzIHJlbGF5ZWQgZnJvbSB0aGUgQ2xvdWRmbGFyZSBXb3JrZXIgKHdoYXRzYXBwLXJlbGF5KS4KICogVGhlIFdvcmtlciBoYXMgYWxyZWFkeSB2ZXJpZmllZCB0aGUgVHdpbGlvIHNpZ25hdHVyZSDigJQgdGhpcyBtb2R1bGUgdmVyaWZpZXMKICogdGhlIHJlbGF5J3Mgb3duIEhNQUMtU0hBMjU2IHNpZ25hdHVyZSB0byBlbnN1cmUgdGhlIHJlcXVlc3QgaXMgYXV0aGVudGljLgogKgogKiBSZWxheSBzaWduYXR1cmUgc2NoZW1lOgogKiAgIEhNQUMtU0hBMjU2KCJ7dGltZXN0YW1wfS57Ym9keX0iLCBSRUxBWV9TRUNSRVQpIOKGkiBoZXgKICogICBTZW50IGluIFgtUmVsYXktU2lnbmF0dXJlIGhlYWRlciwgdGltZXN0YW1wIGluIFgtUmVsYXktVGltZXN0YW1wLgogKiAgIFJlcGxheXMgcmVqZWN0ZWQgaWYgdGltZXN0YW1wIGlzIG9sZGVyIHRoYW4gNSBtaW51dGVzLgogKi8KaW1wb3J0IHsgaG1hY1NoYTI1NkhleCwgdGltaW5nU2FmZUNvbXBhcmUsIGlzVGltZXN0YW1wRnJlc2ggfSBmcm9tICIuL3ZlcmlmeS5qcyI7CmltcG9ydCB7IGxvZ0FjdGl2aXR5IH0gZnJvbSAiLi4vYWN0aXZpdHkvbG9nLmpzIjsKLy8g4pSA4pSAIENvbnN0YW50cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqIE1heGltdW0gYWdlIChzZWNvbmRzKSBmb3IgcmVsYXkgdGltZXN0YW1wcy4gRGVmYXVsdDogMzAwICg1IG1pbikuICovCmNvbnN0IE1BWF9SRUxBWV9USU1FU1RBTVBfQUdFID0gMzAwOwovKioKICogVmVyaWZ5IGEgcmVsYXkgcmVxdWVzdCBmcm9tIHRoZSBDbG91ZGZsYXJlIFdvcmtlci4KICoKICogQHBhcmFtIHJhd0JvZHkgICBUaGUgcmF3IHJlcXVlc3QgYm9keSAoVVJMLWVuY29kZWQgZm9ybSBkYXRhKQogKiBAcGFyYW0gaGVhZGVycyAgIFJlcXVlc3QgaGVhZGVycyAobG93ZXJjYXNlIGtleXMpCiAqIEBwYXJhbSBzZWNyZXQgICAgVGhlIHNoYXJlZCByZWxheSBzZWNyZXQgKFJFTEFZX1NFQ1JFVCBlbnYgdmFyKQogKi8KZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVJlbGF5U2lnbmF0dXJlKHJhd0JvZHksIGhlYWRlcnMsIHNlY3JldCkgewogICAgaWYgKCFzZWNyZXQpIHsKICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAiUkVMQVlfU0VDUkVUIG5vdCBjb25maWd1cmVkIiB9OwogICAgfQogICAgY29uc3Qgc2lnbmF0dXJlID0gaGVhZGVyc1sieC1yZWxheS1zaWduYXR1cmUiXTsKICAgIGlmICghc2lnbmF0dXJlKSB7CiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogIk1pc3NpbmcgWC1SZWxheS1TaWduYXR1cmUgaGVhZGVyIiB9OwogICAgfQogICAgY29uc3QgdGltZXN0YW1wID0gaGVhZGVyc1sieC1yZWxheS10aW1lc3RhbXAiXTsKICAgIGlmICghdGltZXN0YW1wKSB7CiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogIk1pc3NpbmcgWC1SZWxheS1UaW1lc3RhbXAgaGVhZGVyIiB9OwogICAgfQogICAgY29uc3QgdHMgPSBwYXJzZUludCh0aW1lc3RhbXAsIDEwKTsKICAgIGlmICghaXNUaW1lc3RhbXBGcmVzaCh0cywgTUFYX1JFTEFZX1RJTUVTVEFNUF9BR0UpKSB7CiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcjogIlJlbGF5IHRpbWVzdGFtcCBleHBpcmVkIG9yIGludmFsaWQiIH07CiAgICB9CiAgICAvLyBUaGUgV29ya2VyIHNpZ25zOiAie3RpbWVzdGFtcH0ue2JvZHl9IgogICAgY29uc3QgcGF5bG9hZCA9IGAke3RpbWVzdGFtcH0uJHtyYXdCb2R5fWA7CiAgICBjb25zdCBleHBlY3RlZCA9IGhtYWNTaGEyNTZIZXgocGF5bG9hZCwgc2VjcmV0KTsKICAgIGlmICghdGltaW5nU2FmZUNvbXBhcmUoc2lnbmF0dXJlLCBleHBlY3RlZCkpIHsKICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiAiSW52YWxpZCByZWxheSBzaWduYXR1cmUiIH07CiAgICB9CiAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICBzdW1tYXJ5OiAiUmVsYXkgd2ViaG9vayB2ZXJpZmllZCAod2hhdHNhcHAtcmVsYXkgd29ya2VyKSIsCiAgICB9KTsKICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVsYXkuanMubWFw","webhooks/retry.js":"LyoqCiAqIFJldHJ5IGxvZ2ljIGFuZCBlcnJvciBoYW5kbGluZyBmb3Igd2ViaG9vayBwcm9jZXNzaW5nLgogKgogKiBQcm92aWRlcyBleHBvbmVudGlhbCBiYWNrb2ZmIHdpdGggaml0dGVyIGZvciB0cmFuc2llbnQgZmFpbHVyZXMsCiAqIGRlYWQtbGV0dGVyIHRyYWNraW5nIGZvciBwZXJtYW5lbnRseSBmYWlsZWQgZXZlbnRzLCBhbmQKICogZXJyb3IgY2xhc3NpZmljYXRpb24gdXRpbGl0aWVzLgogKi8KaW1wb3J0ICogYXMgZnMgZnJvbSAibm9kZTpmcyI7CmltcG9ydCAqIGFzIHBhdGggZnJvbSAibm9kZTpwYXRoIjsKaW1wb3J0IHsgbG9nQWN0aXZpdHkgfSBmcm9tICIuLi9hY3Rpdml0eS9sb2cuanMiOwovLyDilIDilIAgUmV0cnkgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogRXhlY3V0ZSBhIGZ1bmN0aW9uIHdpdGggcmV0cnkgbG9naWMuCiAqIFJldHJpZXMgb24gdGhyb3duIGVycm9ycywgc3RvcHMgb24gc3VjY2VzcyBvciBleGhhdXN0aW9uLgogKiBVc2VzIGV4cG9uZW50aWFsIGJhY2tvZmYgd2l0aCBqaXR0ZXI6CiAqICAgZGVsYXkgPSBtaW4oYmFzZURlbGF5IMOXIDJeKGF0dGVtcHQtMSksIG1heERlbGF5KSDDlyByYW5kb20oMC414oCTMS41KQogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhXZWJob29rUmV0cnkoZm4sIG9wdHMpIHsKICAgIGNvbnN0IG1heEF0dGVtcHRzID0gb3B0cz8ubWF4QXR0ZW1wdHMgPz8gMzsKICAgIGNvbnN0IGJhc2VEZWxheSA9IG9wdHM/LmJhc2VEZWxheU1zID8/IDUwMDsKICAgIGNvbnN0IG1heERlbGF5ID0gb3B0cz8ubWF4RGVsYXlNcyA/PyAxMF8wMDA7CiAgICBjb25zdCBsYWJlbCA9IG9wdHM/LmxhYmVsID8/ICJ3ZWJob29rIjsKICAgIGNvbnN0IHJldHJ5U3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgIGxldCBsYXN0RXJyb3I7CiAgICBsZXQgdG90YWxTbGVlcE1zID0gMDsKICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHsKICAgICAgICBjb25zdCBhdHRlbXB0U3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbigpOwogICAgICAgICAgICBjb25zdCBhdHRlbXB0TXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGF0dGVtcHRTdGFydDsKICAgICAgICAgICAgaWYgKGF0dGVtcHQgPiAxKSB7CiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbE1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSByZXRyeVN0YXJ0OwogICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgIHNvdXJjZTogInN5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYFtwZXJmXSAke2xhYmVsfTogc3VjY2VlZGVkIG9uIGF0dGVtcHQgJHthdHRlbXB0fS8ke21heEF0dGVtcHRzfSDigJQgYXR0ZW1wdDoke2F0dGVtcHRNcy50b0ZpeGVkKDEpfW1zLCB0b3RhbFJldHJ5OiR7dG90YWxNcy50b0ZpeGVkKDEpfW1zLCB0b3RhbFNsZWVwOiR7dG90YWxTbGVlcE1zLnRvRml4ZWQoMCl9bXNgLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICBsYXN0RXJyb3IgPSBlcnI7CiAgICAgICAgICAgIGNvbnN0IGF0dGVtcHRNcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gYXR0ZW1wdFN0YXJ0OwogICAgICAgICAgICBjb25zdCBlcnJNc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgICAgIGNvbnN0IGVycktpbmQgPSBjbGFzc2lmeUVycm9yKGVycik7CiAgICAgICAgICAgIGlmIChhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5taW4oYmFzZURlbGF5ICogMiAqKiAoYXR0ZW1wdCAtIDEpLCBtYXhEZWxheSk7CiAgICAgICAgICAgICAgICBjb25zdCBqaXR0ZXIgPSBkZWxheSAqICgwLjUgKyBNYXRoLnJhbmRvbSgpICogMC41KTsKICAgICAgICAgICAgICAgIHRvdGFsU2xlZXBNcyArPSBqaXR0ZXI7CiAgICAgICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgJHtsYWJlbH06IGF0dGVtcHQgJHthdHRlbXB0fS8ke21heEF0dGVtcHRzfSBmYWlsZWQgKCR7ZXJyS2luZH0sICR7YXR0ZW1wdE1zLnRvRml4ZWQoMSl9bXM6ICR7ZXJyTXNnfSksIHJldHJ5aW5nIGluICR7TWF0aC5yb3VuZChqaXR0ZXIpfW1zYCwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgaml0dGVyKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbE1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSByZXRyeVN0YXJ0OwogICAgICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgICAgIHNvdXJjZTogInN5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYFtwZXJmXSAke2xhYmVsfTogZXhoYXVzdGVkICR7bWF4QXR0ZW1wdHN9IGF0dGVtcHRzIOKAlCB0b3RhbDoke3RvdGFsTXMudG9GaXhlZCgxKX1tcywgc2xlZXA6JHt0b3RhbFNsZWVwTXMudG9GaXhlZCgwKX1tcywgbGFzdEF0dGVtcHQ6JHthdHRlbXB0TXMudG9GaXhlZCgxKX1tcywgZXJyb3I6JHtlcnJLaW5kfToke2Vyck1zZ31gLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBvcHRzPy5vbkV4aGF1c3RlZD8uKGxhc3RFcnJvciwgbWF4QXR0ZW1wdHMpOwogICAgdGhyb3cgbGFzdEVycm9yOwp9Ci8qKgogKiBDbGFzc2lmeSBhbiBlcnJvciBmb3IgcmV0cnkgZGVjaXNpb25zLgogKiAtIE5ldHdvcmsgZXJyb3JzLCA0MjksIDV4eCDihpIgdHJhbnNpZW50IChyZXRyeSkKICogLSA0MDAsIDQwNCwgdmFsaWRhdGlvbiDihpIgcGVybWFuZW50IChkb24ndCByZXRyeSkKICogLSA0MDEsIDQwMyDihpIgYXV0aCAoZG9uJ3QgcmV0cnksIGZsYWcgZm9yIHJlLWF1dGgpCiAqLwpleHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlFcnJvcihlcnIpIHsKICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgIGNvbnN0IG1zZyA9IGVyci5tZXNzYWdlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgLy8gQXV0aCBlcnJvcnMKICAgICAgICBpZiAobXNnLmluY2x1ZGVzKCJ1bmF1dGhvcml6ZWQiKSB8fCBtc2cuaW5jbHVkZXMoImZvcmJpZGRlbiIpKSB7CiAgICAgICAgICAgIHJldHVybiAiYXV0aCI7CiAgICAgICAgfQogICAgICAgIGlmIChtc2cuaW5jbHVkZXMoIjQwMSIpIHx8IG1zZy5pbmNsdWRlcygiNDAzIikpIHsKICAgICAgICAgICAgcmV0dXJuICJhdXRoIjsKICAgICAgICB9CiAgICAgICAgLy8gVHJhbnNpZW50IGVycm9ycwogICAgICAgIGlmIChtc2cuaW5jbHVkZXMoInRpbWVvdXQiKSB8fAogICAgICAgICAgICBtc2cuaW5jbHVkZXMoImVjb25ucmVzZXQiKSB8fAogICAgICAgICAgICBtc2cuaW5jbHVkZXMoImVjb25ucmVmdXNlZCIpIHx8CiAgICAgICAgICAgIG1zZy5pbmNsdWRlcygic29ja2V0IGhhbmcgdXAiKSB8fAogICAgICAgICAgICBtc2cuaW5jbHVkZXMoIjQyOSIpIHx8CiAgICAgICAgICAgIG1zZy5pbmNsdWRlcygicmF0ZSBsaW1pdCIpIHx8CiAgICAgICAgICAgIG1zZy5pbmNsdWRlcygiNTAzIikgfHwKICAgICAgICAgICAgbXNnLmluY2x1ZGVzKCI1MDIiKSB8fAogICAgICAgICAgICBtc2cuaW5jbHVkZXMoIjUwNCIpKSB7CiAgICAgICAgICAgIHJldHVybiAidHJhbnNpZW50IjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gInBlcm1hbmVudCI7Cn0KLyoqCiAqIENyZWF0ZSBhIFdlYmhvb2tFcnJvciBmcm9tIGEgY2F1Z2h0IGV4Y2VwdGlvbi4KICovCmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJob29rRXJyb3IoZXJyLCBwcm92aWRlciwgYXR0ZW1wdCkgewogICAgY29uc3QgbWVzc2FnZSA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgIHJldHVybiB7CiAgICAgICAga2luZDogY2xhc3NpZnlFcnJvcihlcnIpLAogICAgICAgIG1lc3NhZ2UsCiAgICAgICAgcHJvdmlkZXIsCiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgYXR0ZW1wdCwKICAgICAgICBjYXVzZTogZXJyLAogICAgfTsKfQovKioKICogRGVhZC1sZXR0ZXIgcXVldWUgZm9yIGZhaWxlZCB3ZWJob29rIGV2ZW50cy4KICogU3RvcmVzIGV2ZW50cyB0aGF0IGV4aGF1c3RlZCBhbGwgcmV0cmllcyBmb3IgbWFudWFsIGluc3BlY3Rpb24gb3IgcmVwbGF5LgogKiBPcHRpb25hbGx5IHBlcnNpc3RzIHRvIGEgSlNPTiBmaWxlIHRvIHN1cnZpdmUgcHJvY2VzcyByZXN0YXJ0cy4KICovCmV4cG9ydCBjbGFzcyBEZWFkTGV0dGVyUXVldWUgewogICAgZW50cmllcyA9IFtdOwogICAgbWF4U2l6ZTsKICAgIGZpbGVQYXRoOwogICAgZGlydHkgPSBmYWxzZTsKICAgIC8qKgogICAgICogQHBhcmFtIG1heFNpemUgTWF4aW11bSBlbnRyaWVzIHRvIGtlZXAgaW4gdGhlIHF1ZXVlLgogICAgICogQHBhcmFtIGZpbGVQYXRoIE9wdGlvbmFsIGZpbGUgcGF0aCBmb3IgcGVyc2lzdGVuY2UuIElmIHByb3ZpZGVkLCBlbnRyaWVzCiAgICAgKiAgICAgICAgICAgICAgICAgYXJlIGxvYWRlZCBvbiBjb25zdHJ1Y3Rpb24gYW5kIHNhdmVkIG9uIG11dGF0aW9uLgogICAgICovCiAgICBjb25zdHJ1Y3RvcihtYXhTaXplID0gMTAwLCBmaWxlUGF0aCkgewogICAgICAgIHRoaXMubWF4U2l6ZSA9IG1heFNpemU7CiAgICAgICAgdGhpcy5maWxlUGF0aCA9IGZpbGVQYXRoID8/IG51bGw7CiAgICAgICAgaWYgKHRoaXMuZmlsZVBhdGgpIHsKICAgICAgICAgICAgdGhpcy5sb2FkRnJvbUZpbGUoKTsKICAgICAgICB9CiAgICB9CiAgICAvKiogQWRkIGEgZmFpbGVkIGV2ZW50IHRvIHRoZSBkZWFkLWxldHRlciBxdWV1ZS4gKi8KICAgIGFkZChlbnRyeSkgewogICAgICAgIGNvbnN0IGRsRW50cnkgPSB7CiAgICAgICAgICAgIC4uLmVudHJ5LAogICAgICAgICAgICBpZDogYGRscV8ke0RhdGUubm93KCl9XyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YCwKICAgICAgICAgICAgZXhoYXVzdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICB9OwogICAgICAgIHRoaXMuZW50cmllcy5wdXNoKGRsRW50cnkpOwogICAgICAgIC8vIEV2aWN0IG9sZGVzdCBlbnRyaWVzIGlmIG92ZXIgY2FwYWNpdHkKICAgICAgICBpZiAodGhpcy5lbnRyaWVzLmxlbmd0aCA+IHRoaXMubWF4U2l6ZSkgewogICAgICAgICAgICB0aGlzLmVudHJpZXMgPSB0aGlzLmVudHJpZXMuc2xpY2UoLXRoaXMubWF4U2l6ZSk7CiAgICAgICAgfQogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgc3VtbWFyeTogYERlYWQtbGV0dGVyOiAke2VudHJ5LnByb3ZpZGVyfSBldmVudCBhZGRlZCAoJHtlbnRyeS5lcnJvci5tZXNzYWdlfSlgLAogICAgICAgIH0pOwogICAgICAgIHRoaXMucGVyc2lzdCgpOwogICAgfQogICAgLyoqIEdldCBhbGwgZW50cmllcywgb3B0aW9uYWxseSBmaWx0ZXJlZCBieSBwcm92aWRlci4gKi8KICAgIGxpc3QocHJvdmlkZXIpIHsKICAgICAgICBpZiAocHJvdmlkZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5maWx0ZXIoKGUpID0+IGUucHJvdmlkZXIgPT09IHByb3ZpZGVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmVudHJpZXNdOwogICAgfQogICAgLyoqIFJlbW92ZSBhbiBlbnRyeSBieSBJRC4gUmV0dXJucyB0cnVlIGlmIGZvdW5kLiAqLwogICAgcmVtb3ZlKGlkKSB7CiAgICAgICAgY29uc3QgaWR4ID0gdGhpcy5lbnRyaWVzLmZpbmRJbmRleCgoZSkgPT4gZS5pZCA9PT0gaWQpOwogICAgICAgIGlmIChpZHggPT09IC0xKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgdGhpcy5lbnRyaWVzLnNwbGljZShpZHgsIDEpOwogICAgICAgIHRoaXMucGVyc2lzdCgpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLyoqIFJlbW92ZSBhbGwgZW50cmllcywgb3B0aW9uYWxseSBmb3IgYSBzcGVjaWZpYyBwcm92aWRlci4gKi8KICAgIGNsZWFyKHByb3ZpZGVyKSB7CiAgICAgICAgaWYgKHByb3ZpZGVyKSB7CiAgICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMuZW50cmllcy5sZW5ndGg7CiAgICAgICAgICAgIHRoaXMuZW50cmllcyA9IHRoaXMuZW50cmllcy5maWx0ZXIoKGUpID0+IGUucHJvdmlkZXIgIT09IHByb3ZpZGVyKTsKICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGJlZm9yZSAtIHRoaXMuZW50cmllcy5sZW5ndGg7CiAgICAgICAgICAgIGlmIChyZW1vdmVkID4gMCkKICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdCgpOwogICAgICAgICAgICByZXR1cm4gcmVtb3ZlZDsKICAgICAgICB9CiAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLmVudHJpZXMubGVuZ3RoOwogICAgICAgIHRoaXMuZW50cmllcyA9IFtdOwogICAgICAgIGlmIChjb3VudCA+IDApCiAgICAgICAgICAgIHRoaXMucGVyc2lzdCgpOwogICAgICAgIHJldHVybiBjb3VudDsKICAgIH0KICAgIC8qKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcXVldWUuICovCiAgICBnZXQgc2l6ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmxlbmd0aDsKICAgIH0KICAgIC8qKiBXaGV0aGVyIHRoZSBxdWV1ZSBoYXMgYSBmaWxlLWJhY2tlZCBwZXJzaXN0ZW5jZSBwYXRoIGNvbmZpZ3VyZWQuICovCiAgICBnZXQgcGVyc2lzdGVudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5maWxlUGF0aCAhPT0gbnVsbDsKICAgIH0KICAgIC8vIOKUgOKUgCBGaWxlIHBlcnNpc3RlbmNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLyoqIExvYWQgZW50cmllcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSBmaWxlLiBTaWxlbnRseSBza2lwcyBpZiBmaWxlIGRvZXNuJ3QgZXhpc3QuICovCiAgICBsb2FkRnJvbUZpbGUoKSB7CiAgICAgICAgaWYgKCF0aGlzLmZpbGVQYXRoKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUodGhpcy5maWxlUGF0aCk7CiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhyZXNvbHZlZCkpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocmVzb2x2ZWQsICJ1dGYtOCIpOwogICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpOwogICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJzZWQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXMgPSBwYXJzZWQuc2xpY2UoLXRoaXMubWF4U2l6ZSk7CiAgICAgICAgICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgRExROiBsb2FkZWQgJHt0aGlzLmVudHJpZXMubGVuZ3RofSBlbnRyaWVzIGZyb20gJHt0aGlzLmZpbGVQYXRofWAsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBETFE6IGZhaWxlZCB0byBsb2FkIGZyb20gJHt0aGlzLmZpbGVQYXRofTogJHttc2d9YCwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQogICAgLyoqIFBlcnNpc3QgY3VycmVudCBlbnRyaWVzIHRvIHRoZSBmaWxlLiBEZWJvdW5jZWQgdG8gYXZvaWQgZXhjZXNzaXZlIHdyaXRlcy4gKi8KICAgIHBlcnNpc3QoKSB7CiAgICAgICAgaWYgKCF0aGlzLmZpbGVQYXRoKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKHRoaXMuZGlydHkpCiAgICAgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBzY2hlZHVsZWQKICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsKICAgICAgICAvLyBEZWJvdW5jZTogd3JpdGUgb24gbmV4dCB0aWNrIHRvIGJhdGNoIHJhcGlkIG11dGF0aW9ucwogICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHsKICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLndyaXRlVG9GaWxlKCk7CiAgICAgICAgfSk7CiAgICB9CiAgICB3cml0ZVRvRmlsZSgpIHsKICAgICAgICBpZiAoIXRoaXMuZmlsZVBhdGgpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHBhdGgucmVzb2x2ZSh0aGlzLmZpbGVQYXRoKTsKICAgICAgICAgICAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKHJlc29sdmVkKTsKICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGRpcikpIHsKICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEV4Y2x1ZGUgbm9uLXNlcmlhbGl6YWJsZSBgY2F1c2VgIGZyb20gZXJyb3JzIGJlZm9yZSB3cml0aW5nCiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZSA9IHRoaXMuZW50cmllcy5tYXAoKGUpID0+ICh7CiAgICAgICAgICAgICAgICAuLi5lLAogICAgICAgICAgICAgICAgZXJyb3I6IHsgLi4uZS5lcnJvciwgY2F1c2U6IHVuZGVmaW5lZCB9LAogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMocmVzb2x2ZWQsIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6YWJsZSwgbnVsbCwgMiksICJ1dGYtOCIpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBETFE6IGZhaWxlZCB0byBwZXJzaXN0IHRvICR7dGhpcy5maWxlUGF0aH06ICR7bXNnfWAsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KfQovLyDilIDilIAgUmV0cnktd3JhcHBlZCBoYW5kbGVyIGZhY3Rvcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBXcmFwIGEgd2ViaG9vayBoYW5kbGVyIHdpdGggcmV0cnkgbG9naWMuCiAqIFVzZWZ1bCBmb3IgaGFuZGxlcnMgdGhhdCBjYWxsIGV4dGVybmFsIEFQSXMgdGhhdCBtYXkgdHJhbnNpZW50bHkgZmFpbC4KICovCmV4cG9ydCBmdW5jdGlvbiB3aXRoUmV0cnlIYW5kbGVyKHNvdXJjZSwgZm4sIHJldHJ5T3B0cykgewogICAgcmV0dXJuIGFzeW5jIChwYXlsb2FkLCBjdHgpID0+IHsKICAgICAgICByZXR1cm4gd2l0aFdlYmhvb2tSZXRyeSgoKSA9PiBmbihwYXlsb2FkLCBjdHgpLCB7CiAgICAgICAgICAgIGxhYmVsOiBzb3VyY2UsCiAgICAgICAgICAgIC4uLnJldHJ5T3B0cywKICAgICAgICB9KTsKICAgIH07Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmV0cnkuanMubWFw","webhooks/router.js":"LyoqCiAqIFdlYmhvb2sgZXZlbnQgcm91dGluZyBhbmQgZGlzcGF0Y2hpbmcuCiAqCiAqIFByb3ZpZGVzIG1pZGRsZXdhcmUgY29tcG9zaXRpb24sIHJlcXVlc3QgdmFsaWRhdGlvbiwgZGVkdXBsaWNhdGlvbiwKICogZXZlbnQtdHlwZSByb3V0aW5nLCBhbmQgaGlnaC1sZXZlbCByZXF1ZXN0IGRpc3BhdGNoaW5nIHRoYXQgdGllcwogKiB0b2dldGhlciB0aGUgcmVnaXN0cnksIHZlcmlmaWNhdGlvbiwgYW5kIHJldHJ5IHN1YnN5c3RlbXMuCiAqLwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGdldFByb3ZpZGVyLCByZWNvcmRTdWNjZXNzLCByZWNvcmRGYWlsdXJlIH0gZnJvbSAiLi9yZWdpc3RyeS5qcyI7Ci8vIOKUgOKUgCBFdmVudCBlbnZlbG9wZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqIENyZWF0ZSBhIFdlYmhvb2tFdmVudCBlbnZlbG9wZSBmcm9tIGEgcmF3IHBheWxvYWQuICovCmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJob29rRXZlbnQoc291cmNlLCBwYXlsb2FkLCBvcHRzKSB7CiAgICByZXR1cm4gewogICAgICAgIHNvdXJjZSwKICAgICAgICByZWNlaXZlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgcGF5bG9hZCwKICAgICAgICBldmVudFR5cGU6IG9wdHM/LmV2ZW50VHlwZSwKICAgICAgICBkZWxpdmVyeUlkOiBvcHRzPy5kZWxpdmVyeUlkLAogICAgfTsKfQovLyDilIDilIAgQ29yZSByb3V0aW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogUm91dGUgYSB3ZWJob29rIGV2ZW50IHRocm91Z2ggdGhlIHJlZ2lzdHJ5LgogKiBMb29rcyB1cCB0aGUgcHJvdmlkZXIgYnkgbmFtZSwgdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSwgYW5kIHByb2Nlc3NlcyB0aGUgcGF5bG9hZC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiByb3V0ZVdlYmhvb2socHJvdmlkZXJOYW1lLCBwYXlsb2FkLCB2ZXJpZnlDdHgsIHByb2Nlc3NvckN0eCkgewogICAgY29uc3QgcHJvdmlkZXIgPSBnZXRQcm92aWRlcihwcm92aWRlck5hbWUpOwogICAgaWYgKCFwcm92aWRlcikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGhhbmRsZWQ6IGZhbHNlLAogICAgICAgICAgICBtZXNzYWdlOiBgVW5rbm93biB3ZWJob29rIHByb3ZpZGVyOiAke3Byb3ZpZGVyTmFtZX1gLAogICAgICAgIH07CiAgICB9CiAgICAvLyBWZXJpZnkgc2lnbmF0dXJlIGlmIGNvbnRleHQgaXMgcHJvdmlkZWQKICAgIGlmICh2ZXJpZnlDdHgpIHsKICAgICAgICBjb25zdCB2YWxpZCA9IHByb3ZpZGVyLnZlcmlmeSh2ZXJpZnlDdHgpOwogICAgICAgIGlmICghdmFsaWQpIHsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBXZWJob29rIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkIGZvciAke3Byb3ZpZGVyTmFtZX1gLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogZmFsc2UsIG1lc3NhZ2U6ICJJbnZhbGlkIHdlYmhvb2sgc2lnbmF0dXJlIiB9OwogICAgICAgIH0KICAgIH0KICAgIC8vIFByb2Nlc3MgdGhlIHBheWxvYWQKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvdmlkZXIucHJvY2VzcyhwYXlsb2FkLCBwcm9jZXNzb3JDdHgpOwogICAgICAgIGlmIChyZXN1bHQuaGFuZGxlZCkgewogICAgICAgICAgICByZWNvcmRTdWNjZXNzKHByb3ZpZGVyTmFtZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZWNvcmRGYWlsdXJlKHByb3ZpZGVyTmFtZSwgcmVzdWx0Lm1lc3NhZ2UpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGNvbnN0IG1zZyA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKTsKICAgICAgICByZWNvcmRGYWlsdXJlKHByb3ZpZGVyTmFtZSwgbXNnKTsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogInN5c3RlbSIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBXZWJob29rIHByb2Nlc3NpbmcgZXJyb3IgKCR7cHJvdmlkZXJOYW1lfSk6ICR7bXNnfWAsCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogZmFsc2UsIG1lc3NhZ2U6IGBQcm9jZXNzaW5nIGVycm9yOiAke21zZ31gIH07CiAgICB9Cn0KLy8g4pSA4pSAIE1pZGRsZXdhcmUgY29tcG9zaXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBDb21wb3NlIG11bHRpcGxlIG1pZGRsZXdhcmUgZnVuY3Rpb25zIGludG8gYSBzaW5nbGUgbWlkZGxld2FyZS4KICogTWlkZGxld2FyZSBleGVjdXRlcyBpbiBvcmRlciwgZWFjaCBjYWxsaW5nIG5leHQoKSB0byBjb250aW51ZSB0aGUgY2hhaW4uCiAqLwpleHBvcnQgZnVuY3Rpb24gY29tcG9zZU1pZGRsZXdhcmUoLi4ubWlkZGxld2FyZXMpIHsKICAgIHJldHVybiBhc3luYyAoY3R4LCBuZXh0KSA9PiB7CiAgICAgICAgbGV0IGluZGV4ID0gLTE7CiAgICAgICAgYXN5bmMgZnVuY3Rpb24gZGlzcGF0Y2goaSkgewogICAgICAgICAgICBpZiAoaSA8PSBpbmRleCkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigibmV4dCgpIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyIpOwogICAgICAgICAgICBpbmRleCA9IGk7CiAgICAgICAgICAgIGlmIChpID49IG1pZGRsZXdhcmVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbWlkZGxld2FyZXNbaV0oY3R4LCAoKSA9PiBkaXNwYXRjaChpICsgMSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGlzcGF0Y2goMCk7CiAgICB9Owp9Ci8vIOKUgOKUgCBSZXF1ZXN0IHZhbGlkYXRpb24gbWlkZGxld2FyZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIE1pZGRsZXdhcmUgdGhhdCB2YWxpZGF0ZXMgYmFzaWMgcmVxdWVzdCBwcm9wZXJ0aWVzLgogKiBSZWplY3RzIHJlcXVlc3RzIHdpdGggd3JvbmcgbWV0aG9kLCBtaXNzaW5nIGJvZHksIG9yIG1pc3NpbmcgcmVxdWlyZWQgaGVhZGVycy4KICovCmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVJlcXVlc3Qob3B0cykgewogICAgY29uc3QgbWV0aG9kcyA9IG9wdHM/LmFsbG93ZWRNZXRob2RzID8/IFsiUE9TVCJdOwogICAgY29uc3QgcmVxdWlyZWQgPSBvcHRzPy5yZXF1aXJlZEhlYWRlcnMgPz8gW107CiAgICBjb25zdCBtaW5Cb2R5ID0gb3B0cz8ubWluQm9keUxlbmd0aCA/PyAxOwogICAgcmV0dXJuIGFzeW5jIChjdHgsIG5leHQpID0+IHsKICAgICAgICBpZiAoIW1ldGhvZHMuaW5jbHVkZXMoY3R4Lm1ldGhvZC50b1VwcGVyQ2FzZSgpKSkgewogICAgICAgICAgICByZXR1cm4geyBoYW5kbGVkOiBmYWxzZSwgbWVzc2FnZTogYE1ldGhvZCAke2N0eC5tZXRob2R9IG5vdCBhbGxvd2VkYCB9OwogICAgICAgIH0KICAgICAgICBpZiAoY3R4LmJvZHkubGVuZ3RoIDwgbWluQm9keSkgewogICAgICAgICAgICByZXR1cm4geyBoYW5kbGVkOiBmYWxzZSwgbWVzc2FnZTogIkVtcHR5IHJlcXVlc3QgYm9keSIgfTsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgcmVxdWlyZWQpIHsKICAgICAgICAgICAgaWYgKCFjdHguaGVhZGVyc1toZWFkZXIudG9Mb3dlckNhc2UoKV0pIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYE1pc3NpbmcgcmVxdWlyZWQgaGVhZGVyOiAke2hlYWRlcn1gLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV4dCgpOwogICAgfTsKfQovLyDilIDilIAgRGVkdXBsaWNhdGlvbiBtaWRkbGV3YXJlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogTWlkZGxld2FyZSB0aGF0IHByZXZlbnRzIGR1cGxpY2F0ZSB3ZWJob29rIGRlbGl2ZXJpZXMuCiAqIFRyYWNrcyBkZWxpdmVyeSBJRHMgZXh0cmFjdGVkIGZyb20gaGVhZGVycyBhbmQgcmVqZWN0cyBldmVudHMgYWxyZWFkeSBzZWVuLgogKiBVc2VzIGEgYm91bmRlZCBMUlUtc3R5bGUgbWFwIHdpdGggVFRMIGV4cGlyYXRpb24uCiAqLwpleHBvcnQgZnVuY3Rpb24gZGVkdXBsaWNhdGVSZXF1ZXN0cyhvcHRzKSB7CiAgICBjb25zdCBtYXhTaXplID0gb3B0cz8ubWF4U2l6ZSA/PyAxMDAwOwogICAgY29uc3QgdHRsTXMgPSBvcHRzPy50dGxNcyA/PyAzMDBfMDAwOwogICAgY29uc3QgaWRIZWFkZXIgPSBvcHRzPy5pZEhlYWRlciA/PyAieC1yZXF1ZXN0LWlkIjsKICAgIGNvbnN0IHNlZW4gPSBuZXcgTWFwKCk7IC8vIGRlbGl2ZXJ5SWQg4oaSIHRpbWVzdGFtcAogICAgcmV0dXJuIGFzeW5jIChjdHgsIG5leHQpID0+IHsKICAgICAgICBjb25zdCBkZWxpdmVyeUlkID0gY3R4LmhlYWRlcnNbaWRIZWFkZXJdOwogICAgICAgIGlmICghZGVsaXZlcnlJZCkgewogICAgICAgICAgICAvLyBObyBkZWxpdmVyeSBJRCBoZWFkZXIg4oCUIHBhc3MgdGhyb3VnaCAoY2FuJ3QgZGVkdXBsaWNhdGUpCiAgICAgICAgICAgIHJldHVybiBuZXh0KCk7CiAgICAgICAgfQogICAgICAgIC8vIEV2aWN0IGV4cGlyZWQgZW50cmllcyB3aGVuIG1hcCBncm93cyBsYXJnZQogICAgICAgIGlmIChzZWVuLnNpemUgPj0gbWF4U2l6ZSkgewogICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgICAgICBmb3IgKGNvbnN0IFtpZCwgdHNdIG9mIHNlZW4pIHsKICAgICAgICAgICAgICAgIGlmIChub3cgLSB0cyA+IHR0bE1zKQogICAgICAgICAgICAgICAgICAgIHNlZW4uZGVsZXRlKGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJZiBzdGlsbCB0b28gbGFyZ2UgYWZ0ZXIgZXZpY3Rpb24sIGRyb3Agb2xkZXN0IHF1YXJ0ZXIKICAgICAgICAgICAgaWYgKHNlZW4uc2l6ZSA+PSBtYXhTaXplKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gWy4uLnNlZW4uZW50cmllcygpXTsKICAgICAgICAgICAgICAgIGNvbnN0IHRvRHJvcCA9IE1hdGguZmxvb3IobWF4U2l6ZSAvIDQpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b0Ryb3AgJiYgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBzZWVuLmRlbGV0ZShlbnRyaWVzW2ldWzBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIGNvbnN0IGV4aXN0aW5nVHMgPSBzZWVuLmdldChkZWxpdmVyeUlkKTsKICAgICAgICBpZiAoZXhpc3RpbmdUcyAhPT0gdW5kZWZpbmVkICYmIG5vdyAtIGV4aXN0aW5nVHMgPCB0dGxNcykgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaGFuZGxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBEdXBsaWNhdGUgZGVsaXZlcnkgaWdub3JlZDogJHtkZWxpdmVyeUlkfWAsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHNlZW4uc2V0KGRlbGl2ZXJ5SWQsIG5vdyk7CiAgICAgICAgcmV0dXJuIG5leHQoKTsKICAgIH07Cn0KLy8g4pSA4pSAIFJhdGUtbGltaXRpbmcgbWlkZGxld2FyZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIE1pZGRsZXdhcmUgdGhhdCByYXRlLWxpbWl0cyB3ZWJob29rIHJlcXVlc3RzIHBlciBwcm92aWRlci4KICogVXNlcyBhIHNsaWRpbmctd2luZG93IGNvdW50ZXIuCiAqLwpleHBvcnQgZnVuY3Rpb24gcmF0ZUxpbWl0UmVxdWVzdHMob3B0cykgewogICAgY29uc3QgbWF4UmVxcyA9IG9wdHM/Lm1heFJlcXVlc3RzID8/IDEwMDsKICAgIGNvbnN0IHdpbmRvd01zID0gb3B0cz8ud2luZG93TXMgPz8gNjBfMDAwOwogICAgY29uc3Qgd2luZG93cyA9IG5ldyBNYXAoKTsgLy8gcHJvdmlkZXIg4oaSIHRpbWVzdGFtcHMKICAgIHJldHVybiBhc3luYyAoY3R4LCBuZXh0KSA9PiB7CiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTsKICAgICAgICBjb25zdCBjdXRvZmYgPSBub3cgLSB3aW5kb3dNczsKICAgICAgICBsZXQgdGltZXN0YW1wcyA9IHdpbmRvd3MuZ2V0KGN0eC5wcm92aWRlcik7CiAgICAgICAgaWYgKCF0aW1lc3RhbXBzKSB7CiAgICAgICAgICAgIHRpbWVzdGFtcHMgPSBbXTsKICAgICAgICAgICAgd2luZG93cy5zZXQoY3R4LnByb3ZpZGVyLCB0aW1lc3RhbXBzKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVtb3ZlIGV4cGlyZWQgdGltZXN0YW1wcwogICAgICAgIHdoaWxlICh0aW1lc3RhbXBzLmxlbmd0aCA+IDAgJiYgdGltZXN0YW1wc1swXSA8IGN1dG9mZikgewogICAgICAgICAgICB0aW1lc3RhbXBzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aW1lc3RhbXBzLmxlbmd0aCA+PSBtYXhSZXFzKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBoYW5kbGVkOiBmYWxzZSwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBSYXRlIGxpbWl0IGV4Y2VlZGVkIGZvciAke2N0eC5wcm92aWRlcn0gKCR7bWF4UmVxc30vJHt3aW5kb3dNc31tcylgLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICB0aW1lc3RhbXBzLnB1c2gobm93KTsKICAgICAgICByZXR1cm4gbmV4dCgpOwogICAgfTsKfQovLyDilIDilIAgSGlnaC1sZXZlbCByZXF1ZXN0IHJvdXRpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBSb3V0ZSBhbiBpbmNvbWluZyBIVFRQLWxpa2UgcmVxdWVzdCB0aHJvdWdoIHRoZSBmdWxsIHdlYmhvb2sgcGlwZWxpbmU6CiAqIDEuIExvb2sgdXAgcHJvdmlkZXIKICogMi4gUnVuIG1pZGRsZXdhcmUgY2hhaW4KICogMy4gVmVyaWZ5IHNpZ25hdHVyZQogKiA0LiBQcm9jZXNzIHBheWxvYWQKICoKICogSGlnaGVyLWxldmVsIGFsdGVybmF0aXZlIHRvIHJvdXRlV2ViaG9vaygpIGZvciBIVFRQIHNlcnZlciBpbnRlZ3JhdGlvbnMuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcm91dGVXZWJob29rUmVxdWVzdChjdHgsIG9wdHMpIHsKICAgIGNvbnN0IHByb3ZpZGVyID0gZ2V0UHJvdmlkZXIoY3R4LnByb3ZpZGVyKTsKICAgIGlmICghcHJvdmlkZXIpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBoYW5kbGVkOiBmYWxzZSwKICAgICAgICAgICAgbWVzc2FnZTogYFVua25vd24gd2ViaG9vayBwcm92aWRlcjogJHtjdHgucHJvdmlkZXJ9YCwKICAgICAgICB9OwogICAgfQogICAgY29uc3QgcHJvY2VzcyA9IGFzeW5jICgpID0+IHsKICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlIGlmIHNlY3JldCBwcm92aWRlZAogICAgICAgIGlmIChvcHRzPy5zZWNyZXQpIHsKICAgICAgICAgICAgY29uc3Qgc2lnSGVhZGVyID0gb3B0cy5zaWduYXR1cmVIZWFkZXIgPz8gIngtc2lnbmF0dXJlIjsKICAgICAgICAgICAgY29uc3QgdmVyaWZ5Q3R4ID0gewogICAgICAgICAgICAgICAgcmF3Qm9keTogY3R4LmJvZHksCiAgICAgICAgICAgICAgICBzaWduYXR1cmU6IGN0eC5oZWFkZXJzW3NpZ0hlYWRlcl0gPz8gIiIsCiAgICAgICAgICAgICAgICBzZWNyZXQ6IG9wdHMuc2VjcmV0LAogICAgICAgICAgICAgICAgaGVhZGVyczogY3R4LmhlYWRlcnMsCiAgICAgICAgICAgICAgICB1cmw6IGN0eC51cmwsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHZhbGlkID0gcHJvdmlkZXIudmVyaWZ5KHZlcmlmeUN0eCk7CiAgICAgICAgICAgIGlmICghdmFsaWQpIHsKICAgICAgICAgICAgICAgIHJlY29yZEZhaWx1cmUoY3R4LnByb3ZpZGVyLCAiU2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQiKTsKICAgICAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICJzeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBXZWJob29rIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkIGZvciAke2N0eC5wcm92aWRlcn1gLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4geyBoYW5kbGVkOiBmYWxzZSwgbWVzc2FnZTogIkludmFsaWQgd2ViaG9vayBzaWduYXR1cmUiIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGN0eC5wYXJzZWQgPz8gY3R4LmJvZHk7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvdmlkZXIucHJvY2VzcyhwYXlsb2FkLCBvcHRzPy5wcm9jZXNzb3JDdHgpOwogICAgICAgIGlmIChyZXN1bHQuaGFuZGxlZCkgewogICAgICAgICAgICByZWNvcmRTdWNjZXNzKGN0eC5wcm92aWRlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZWNvcmRGYWlsdXJlKGN0eC5wcm92aWRlciwgcmVzdWx0Lm1lc3NhZ2UpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfTsKICAgIC8vIEFwcGx5IG1pZGRsZXdhcmUgaWYgcHJvdmlkZWQKICAgIGlmIChvcHRzPy5taWRkbGV3YXJlICYmIG9wdHMubWlkZGxld2FyZS5sZW5ndGggPiAwKSB7CiAgICAgICAgY29uc3QgY29tcG9zZWQgPSBjb21wb3NlTWlkZGxld2FyZSguLi5vcHRzLm1pZGRsZXdhcmUpOwogICAgICAgIHJldHVybiBjb21wb3NlZChjdHgsIHByb2Nlc3MpOwogICAgfQogICAgcmV0dXJuIHByb2Nlc3MoKTsKfQovLyDilIDilIAgRXZlbnQtdHlwZSByb3V0ZXIgYnVpbGRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIEJ1aWxkIGFuIGV2ZW50LXJvdXRpbmcgcHJvY2Vzc29yIGZyb20gYSBtYXAgb2YgZXZlbnQgdHlwZXMgdG8gaGFuZGxlcnMuCiAqIFRoZSB0eXBlRXh0cmFjdG9yIHB1bGxzIHRoZSBldmVudCB0eXBlIHN0cmluZyBmcm9tIHRoZSBwYXlsb2FkLgogKiBPcHRpb25hbGx5IHByb3ZpZGUgYSBkZWZhdWx0SGFuZGxlciBmb3IgdW5tYXRjaGVkIGV2ZW50IHR5cGVzLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50Um91dGVyKG9wdHMpIHsKICAgIGNvbnN0IHsgc291cmNlLCB0eXBlRXh0cmFjdG9yLCBoYW5kbGVycywgZGVmYXVsdEhhbmRsZXIgfSA9IG9wdHM7CiAgICAvLyBJbXBvcnQgc2FmZUhhbmRsZXIgaW5saW5lIHRvIGF2b2lkIGNpcmN1bGFyIGRlcCDigJQgaGFuZGxlcnMudHMgaW1wb3J0cyBmcm9tIHJvdXRlci50cwogICAgcmV0dXJuIGFzeW5jIChwYXlsb2FkLCBjdHgpID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBldmVudFR5cGUgPSB0eXBlRXh0cmFjdG9yKHBheWxvYWQpOwogICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnNbZXZlbnRUeXBlXTsKICAgICAgICAgICAgaWYgKCFoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdEhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdEhhbmRsZXIocGF5bG9hZCwgY3R4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYFVuaGFuZGxlZCAke3NvdXJjZX0gZXZlbnQgdHlwZTogJHtldmVudFR5cGV9YCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIocGF5bG9hZCwgY3R4KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgICAgIHNvdXJjZTogInN5c3RlbSIsCiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgV2ViaG9vayBoYW5kbGVyIGVycm9yICgke3NvdXJjZX0pOiAke21zZ31gLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogZmFsc2UsIG1lc3NhZ2U6IGBIYW5kbGVyIGVycm9yOiAke21zZ31gIH07CiAgICAgICAgfQogICAgfTsKfQovLyDilIDilIAgRXZlbnQgbm9ybWFsaXphdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFdyYXAgYSByYXcgcGF5bG9hZCBpbnRvIGEgdHlwZWQgV2ViaG9va0V2ZW50IGVudmVsb3BlLgogKiBVc2VmdWwgZm9yIGhhbmRsZXJzIHRoYXQgd2FudCBhIG5vcm1hbGl6ZWQgZXZlbnQgc2hhcGUuCiAqLwpleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVG9FdmVudChzb3VyY2UsIHBheWxvYWQsIG9wdHMpIHsKICAgIHJldHVybiBjcmVhdGVXZWJob29rRXZlbnQoc291cmNlLCBwYXlsb2FkLCB7CiAgICAgICAgZXZlbnRUeXBlOiBvcHRzPy50eXBlRXh0cmFjdG9yPy4ocGF5bG9hZCksCiAgICAgICAgZGVsaXZlcnlJZDogb3B0cz8uaWRFeHRyYWN0b3I/LihwYXlsb2FkKSwKICAgIH0pOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXJvdXRlci5qcy5tYXA=","webhooks/twilio.js":"LyoqCiAqIFR3aWxpbyB3ZWJob29rIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gYW5kIFdoYXRzQXBwIG1lc3NhZ2UgcHJvY2Vzc2luZy4KICogRm9sbG93cyBzcmMvc2xhY2svd2ViaG9va3MudHMgKyBzcmMvbGluZWFyL3dlYmhvb2tzLnRzIHBhdHRlcm5zLgogKgogKiBXZWJob29rIHNldHVwOiBDb25maWd1cmUgaW4gVHdpbGlvIENvbnNvbGUg4oaSIE1lc3NhZ2luZyDihpIgV2hhdHNBcHAgc2FuZGJveC9zZW5kZXIuCiAqIFVSTDogaHR0cHM6Ly88eW91ci1kb21haW4+L2FwaS90d2lsaW8vd2hhdHNhcHAKICogTWV0aG9kOiBQT1NUCiAqCiAqIFR3aWxpbyBzZW5kczoKICogLSBYLVR3aWxpby1TaWduYXR1cmU6IEhNQUMtU0hBMSBvZiBVUkwgKyBzb3J0ZWQgUE9TVCBwYXJhbXMKICogLSBQT1NUIGJvZHk6IFVSTC1lbmNvZGVkIGZvcm0gZGF0YSAoRnJvbSwgVG8sIEJvZHksIE1lc3NhZ2VTaWQsIGV0Yy4pCiAqLwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmltcG9ydCB7IGdldENsaWVudCB9IGZyb20gIi4uL2NoYW5uZWxzL3doYXRzYXBwLmpzIjsKaW1wb3J0IHsgaG1hY1NoYTFCYXNlNjQsIHRpbWluZ1NhZmVDb21wYXJlIH0gZnJvbSAiLi9yZWdpc3RyeS5qcyI7CmltcG9ydCB7IGNyZWF0ZVR3aWxpb1N0eWxlUHJvdmlkZXIsIHNhZmVIYW5kbGVyIH0gZnJvbSAiLi9oYW5kbGVycy5qcyI7Ci8vIOKUgOKUgCBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogVmVyaWZ5IGEgVHdpbGlvIHdlYmhvb2sgc2lnbmF0dXJlLgogKiBodHRwczovL3d3dy50d2lsaW8uY29tL2RvY3MvdXNhZ2Uvc2VjdXJpdHkjdmFsaWRhdGluZy1yZXF1ZXN0cwogKgogKiBUd2lsaW8gc2lnbnMgcmVxdWVzdHMgd2l0aCBITUFDLVNIQTE6CiAqIDEuIFN0YXJ0IHdpdGggdGhlIGZ1bGwgd2ViaG9vayBVUkwKICogMi4gU29ydCBQT1NUIHBhcmFtcyBhbHBoYWJldGljYWxseSBieSBrZXkKICogMy4gQXBwZW5kIGVhY2gga2V5K3ZhbHVlIChubyBzZXBhcmF0b3JzKQogKiA0LiBITUFDLVNIQTEgdGhlIHJlc3VsdCB3aXRoIHRoZSBhdXRoIHRva2VuCiAqIDUuIEJhc2U2NC1lbmNvZGUgdGhlIGRpZ2VzdAogKgogKiBVc2VzIGdlbmVyaWMgc2lnbmF0dXJlIGhlbHBlcnMgZnJvbSB3ZWJob29rcy9yZWdpc3RyeS4KICovCmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTaWduYXR1cmUodXJsLCBwYXJhbXMsIHNpZ25hdHVyZSwgYXV0aFRva2VuKSB7CiAgICAvLyBCdWlsZCB0aGUgZGF0YSBzdHJpbmc6IFVSTCArIHNvcnRlZCBwYXJhbXMgY29uY2F0ZW5hdGVkCiAgICBjb25zdCBzb3J0ZWRLZXlzID0gT2JqZWN0LmtleXMocGFyYW1zKS5zb3J0KCk7CiAgICBsZXQgZGF0YSA9IHVybDsKICAgIGZvciAoY29uc3Qga2V5IG9mIHNvcnRlZEtleXMpIHsKICAgICAgICBkYXRhICs9IGtleSArIHBhcmFtc1trZXldOwogICAgfQogICAgY29uc3QgZXhwZWN0ZWQgPSBobWFjU2hhMUJhc2U2NChkYXRhLCBhdXRoVG9rZW4pOwogICAgcmV0dXJuIHRpbWluZ1NhZmVDb21wYXJlKHNpZ25hdHVyZSwgZXhwZWN0ZWQpOwp9Ci8qKgogKiBQYXJzZSBVUkwtZW5jb2RlZCBmb3JtIGJvZHkgaW50byBhIGtleS12YWx1ZSByZWNvcmQuCiAqLwpleHBvcnQgZnVuY3Rpb24gcGFyc2VGb3JtQm9keShib2R5KSB7CiAgICBjb25zdCBwYXJhbXMgPSB7fTsKICAgIGNvbnN0IHBhaXJzID0gYm9keS5zcGxpdCgiJiIpOwogICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7CiAgICAgICAgY29uc3QgZXFJZHggPSBwYWlyLmluZGV4T2YoIj0iKTsKICAgICAgICBpZiAoZXFJZHggPT09IC0xKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjb25zdCBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQocGFpci5zbGljZSgwLCBlcUlkeCkucmVwbGFjZSgvXCsvZywgIiAiKSk7CiAgICAgICAgY29uc3QgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQocGFpci5zbGljZShlcUlkeCArIDEpLnJlcGxhY2UoL1wrL2csICIgIikpOwogICAgICAgIHBhcmFtc1trZXldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gcGFyYW1zOwp9Ci8qKgogKiBTdHJpcCB0aGUgIndoYXRzYXBwOiIgcHJlZml4IGZyb20gYSBUd2lsaW8gV2hhdHNBcHAgbnVtYmVyLgogKi8KZnVuY3Rpb24gc3RyaXBXaGF0c0FwcFByZWZpeChudW1iZXIpIHsKICAgIHJldHVybiBudW1iZXIucmVwbGFjZSgvXndoYXRzYXBwOi8sICIiKTsKfQovLyDilIDilIAgTWVzc2FnZSBwcm9jZXNzaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogUHJvY2VzcyBhbiBpbmNvbWluZyBXaGF0c0FwcCBtZXNzYWdlIGZyb20gVHdpbGlvLgogKiBTdG9yZXMgaW4gbWVzc2FnZSBoaXN0b3J5IGFuZCB1cGRhdGVzIGNvbnRhY3RzLgogKiBSZXR1cm5zIHN0cnVjdHVyZWQgcmVzdWx0LCBuZXZlciB0aHJvd3MuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0luY29taW5nTWVzc2FnZShwYXlsb2FkKSB7CiAgICBjb25zdCBmcm9tID0gc3RyaXBXaGF0c0FwcFByZWZpeChwYXlsb2FkLkZyb20pOwogICAgY29uc3QgdG8gPSBzdHJpcFdoYXRzQXBwUHJlZml4KHBheWxvYWQuVG8pOwogICAgY29uc3QgYm9keSA9IHBheWxvYWQuQm9keT8udHJpbSgpID8/ICIiOwogICAgaWYgKCFib2R5KSB7CiAgICAgICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgbWVzc2FnZTogIkVtcHR5IG1lc3NhZ2UsIHNraXBwZWQiIH07CiAgICB9CiAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgc291cmNlOiAid2hhdHNhcHAiLAogICAgICAgIHN1bW1hcnk6IGBXaGF0c0FwcCBmcm9tICR7ZnJvbX06ICIke2JvZHkuc2xpY2UoMCwgODApfSJgLAogICAgICAgIGRldGFpbDogYHNpZD0ke3BheWxvYWQuTWVzc2FnZVNpZH0gcHJvZmlsZU5hbWU9JHtwYXlsb2FkLlByb2ZpbGVOYW1lID8/ICJ1bmtub3duIn1gLAogICAgfSk7CiAgICAvLyBTdG9yZSBpbmJvdW5kIG1lc3NhZ2UgaW4gaGlzdG9yeQogICAgY29uc3QgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CiAgICBpZiAoY2xpZW50KSB7CiAgICAgICAgYXdhaXQgY2xpZW50LmFwcGVuZEhpc3RvcnkoewogICAgICAgICAgICBzaWQ6IHBheWxvYWQuTWVzc2FnZVNpZCwKICAgICAgICAgICAgZnJvbSwKICAgICAgICAgICAgdG8sCiAgICAgICAgICAgIGJvZHksCiAgICAgICAgICAgIGRpcmVjdGlvbjogImluYm91bmQiLAogICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICB9KTsKICAgICAgICAvLyBVcGRhdGUgY29udGFjdCB3aXRoIHNlbmRlciBpbmZvCiAgICAgICAgYXdhaXQgY2xpZW50LnVwc2VydENvbnRhY3QoewogICAgICAgICAgICBwaG9uZTogZnJvbSwKICAgICAgICAgICAgbmFtZTogcGF5bG9hZC5Qcm9maWxlTmFtZSwKICAgICAgICAgICAgbGFzdE1lc3NhZ2VBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHsgaGFuZGxlZDogdHJ1ZSwgbWVzc2FnZTogYFJlY2VpdmVkIGZyb20gJHtmcm9tfTogIiR7Ym9keS5zbGljZSgwLCA0MCl9ImAgfTsKfQovKioKICogR2VuZXJhdGUgYW4gZW1wdHkgVHdpTUwgcmVzcG9uc2UgKGFja25vd2xlZGdlIHJlY2VpcHQgd2l0aG91dCByZXBseWluZykuCiAqIFR3aWxpbyByZXF1aXJlcyBhIHZhbGlkIFR3aU1MIHJlc3BvbnNlIHRvIGF2b2lkIHJldHJpZXMuCiAqLwpleHBvcnQgZnVuY3Rpb24gZW1wdHlUd2ltbFJlc3BvbnNlKCkgewogICAgcmV0dXJuICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz48UmVzcG9uc2U+PC9SZXNwb25zZT4iOwp9Ci8qKgogKiBHZW5lcmF0ZSBhIFR3aU1MIHJlc3BvbnNlIHdpdGggYSByZXBseSBtZXNzYWdlLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHJlcGx5VHdpbWwobWVzc2FnZSkgewogICAgLy8gRXNjYXBlIFhNTCBlbnRpdGllcyB0byBwcmV2ZW50IGluamVjdGlvbgogICAgY29uc3QgZXNjYXBlZCA9IG1lc3NhZ2UKICAgICAgICAucmVwbGFjZSgvJi9nLCAiJmFtcDsiKQogICAgICAgIC5yZXBsYWNlKC88L2csICImbHQ7IikKICAgICAgICAucmVwbGFjZSgvPi9nLCAiJmd0OyIpCiAgICAgICAgLnJlcGxhY2UoLyIvZywgIiZxdW90OyIpCiAgICAgICAgLnJlcGxhY2UoLycvZywgIiZhcG9zOyIpOwogICAgcmV0dXJuIGA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjxSZXNwb25zZT48TWVzc2FnZT4ke2VzY2FwZWR9PC9NZXNzYWdlPjwvUmVzcG9uc2U+YDsKfQovLyDilIDilIAgUmVnaXN0cnkgaW50ZWdyYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKiBUd2lsaW8vV2hhdHNBcHAgd2ViaG9vayBwcm92aWRlciAoZGVmZXJyZWQgcmVnaXN0cmF0aW9uKS4gKi8KZXhwb3J0IGNvbnN0IHR3aWxpb1Byb3ZpZGVyID0gY3JlYXRlVHdpbGlvU3R5bGVQcm92aWRlcih7CiAgICBuYW1lOiAidHdpbGlvIiwKICAgIHByb2Nlc3M6IHNhZmVIYW5kbGVyKCJ0d2lsaW8iLCBhc3luYyAocGF5bG9hZCkgPT4gewogICAgICAgIHJldHVybiBwcm9jZXNzSW5jb21pbmdNZXNzYWdlKHBheWxvYWQpOwogICAgfSksCn0pOwovLyMgc291cmNlTWFwcGluZ1VSTD10d2lsaW8uanMubWFw","webhooks/types.js":"LyoqCiAqIFNoYXJlZCB0eXBlcyBmb3IgdGhlIHdlYmhvb2sgc3lzdGVtLgogKgogKiBBbGwgaW50ZXJmYWNlcyB1c2VkIGFjcm9zcyByZWdpc3RyeSwgdmVyaWZpY2F0aW9uLCByb3V0aW5nLCByZXRyeSwKICogYW5kIGNvbmZpZ3VyYXRpb24gbGl2ZSBoZXJlIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcy4KICovCmV4cG9ydCB7fTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFw","webhooks/verify.js":"LyoqCiAqIFNpZ25hdHVyZSB2ZXJpZmljYXRpb24gdXRpbGl0aWVzIGZvciB3ZWJob29rcy4KICoKICogUHJvdmlkZXMgY3J5cHRvZ3JhcGhpYyBwcmltaXRpdmVzIGFuZCB0aW1pbmctc2FmZSBjb21wYXJpc29uCiAqIHVzZWQgYnkgYWxsIHdlYmhvb2sgcHJvdmlkZXJzIGZvciByZXF1ZXN0IGF1dGhlbnRpY2F0aW9uLgogKi8KaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gIm5vZGU6Y3J5cHRvIjsKLy8g4pSA4pSAIEhNQUMgZGlnZXN0IGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBITUFDLVNIQTI1NiBoZXggZGlnZXN0LiBVc2VkIGJ5IExpbmVhciBhbmQgc2ltaWxhciBzZXJ2aWNlcy4KICovCmV4cG9ydCBmdW5jdGlvbiBobWFjU2hhMjU2SGV4KGRhdGEsIHNlY3JldCkgewogICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIbWFjKCJzaGEyNTYiLCBzZWNyZXQpLnVwZGF0ZShkYXRhKS5kaWdlc3QoImhleCIpOwp9Ci8qKgogKiBITUFDLVNIQTI1NiBiYXNlNjQgZGlnZXN0LgogKi8KZXhwb3J0IGZ1bmN0aW9uIGhtYWNTaGEyNTZCYXNlNjQoZGF0YSwgc2VjcmV0KSB7CiAgICByZXR1cm4gY3J5cHRvLmNyZWF0ZUhtYWMoInNoYTI1NiIsIHNlY3JldCkudXBkYXRlKGRhdGEpLmRpZ2VzdCgiYmFzZTY0Iik7Cn0KLyoqCiAqIEhNQUMtU0hBMSBiYXNlNjQgZGlnZXN0LiBVc2VkIGJ5IFR3aWxpby4KICovCmV4cG9ydCBmdW5jdGlvbiBobWFjU2hhMUJhc2U2NChkYXRhLCBzZWNyZXQpIHsKICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSG1hYygic2hhMSIsIHNlY3JldCkudXBkYXRlKGRhdGEpLmRpZ2VzdCgiYmFzZTY0Iik7Cn0KLy8g4pSA4pSAIENvbXBhcmlzb24gJiBmcmVzaG5lc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACi8qKgogKiBUaW1pbmctc2FmZSBzdHJpbmcgY29tcGFyaXNvbi4gUmV0dXJucyBmYWxzZSBvbiBsZW5ndGggbWlzbWF0Y2guCiAqLwpleHBvcnQgZnVuY3Rpb24gdGltaW5nU2FmZUNvbXBhcmUoYSwgYikgewogICAgdHJ5IHsKICAgICAgICByZXR1cm4gY3J5cHRvLnRpbWluZ1NhZmVFcXVhbChCdWZmZXIuZnJvbShhKSwgQnVmZmVyLmZyb20oYikpOwogICAgfQogICAgY2F0Y2ggewogICAgICAgIHJldHVybiBmYWxzZTsgLy8gRGlmZmVyZW50IGxlbmd0aHMKICAgIH0KfQovKioKICogQ2hlY2sgdGhhdCBhIHRpbWVzdGFtcCBpcyB3aXRoaW4gYW4gYWNjZXB0YWJsZSB3aW5kb3cgKHJlcGxheSBhdHRhY2sgcHJldmVudGlvbikuCiAqIEBwYXJhbSB0aW1lc3RhbXAgVW5peCB0aW1lc3RhbXAgaW4gc2Vjb25kcwogKiBAcGFyYW0gbWF4QWdlU2Vjb25kcyBNYXhpbXVtIGFnZSBhbGxvd2VkLiBEZWZhdWx0OiAzMDAgKDUgbWludXRlcykuCiAqLwpleHBvcnQgZnVuY3Rpb24gaXNUaW1lc3RhbXBGcmVzaCh0aW1lc3RhbXAsIG1heEFnZVNlY29uZHMgPSAzMDApIHsKICAgIGlmIChpc05hTih0aW1lc3RhbXApKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApOwogICAgcmV0dXJuIE1hdGguYWJzKG5vdyAtIHRpbWVzdGFtcCkgPD0gbWF4QWdlU2Vjb25kczsKfQovKioKICogVmVyaWZ5IGFuIEhNQUMtU0hBMjU2IGhleCBzaWduYXR1cmUgKExpbmVhci1zdHlsZSkuCiAqIENvbXBhcmVzIGBITUFDLVNIQTI1NihyYXdCb2R5LCBzZWNyZXQpYCBhZ2FpbnN0IHRoZSBwcm92aWRlZCBzaWduYXR1cmUuCiAqLwpleHBvcnQgZnVuY3Rpb24gdmVyaWZ5SG1hY1NoYTI1NkhleChjdHgpIHsKICAgIGNvbnN0IGV4cGVjdGVkID0gaG1hY1NoYTI1NkhleChjdHgucmF3Qm9keSwgY3R4LnNlY3JldCk7CiAgICByZXR1cm4gdGltaW5nU2FmZUNvbXBhcmUoY3R4LnNpZ25hdHVyZSwgZXhwZWN0ZWQpOwp9Ci8qKgogKiBWZXJpZnkgYW4gSE1BQy1TSEEyNTYgYmFzZTY0IHNpZ25hdHVyZS4KICogT3B0aW9uYWxseSBzdHJpcHMgYSAic2hhMjU2PSIgcHJlZml4IChHaXRIdWItc3R5bGUpLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeUhtYWNTaGEyNTZCYXNlNjQoY3R4LCBzdHJpcFByZWZpeCA9IGZhbHNlKSB7CiAgICBjb25zdCBzaWcgPSBzdHJpcFByZWZpeAogICAgICAgID8gY3R4LnNpZ25hdHVyZS5yZXBsYWNlKC9ec2hhMjU2PS8sICIiKQogICAgICAgIDogY3R4LnNpZ25hdHVyZTsKICAgIGNvbnN0IGV4cGVjdGVkID0gaG1hY1NoYTI1NkJhc2U2NChjdHgucmF3Qm9keSwgY3R4LnNlY3JldCk7CiAgICByZXR1cm4gdGltaW5nU2FmZUNvbXBhcmUoc2lnLCBleHBlY3RlZCk7Cn0KLyoqCiAqIFZlcmlmeSBhIFNsYWNrIHYwIHNpZ25hdHVyZS4KICogRm9ybWF0OiBgdjA9e0hNQUMtU0hBMjU2KCJ2MDp7dGltZXN0YW1wfTp7Ym9keX0iLCBzZWNyZXQpfWAKICogQWxzbyB2YWxpZGF0ZXMgdGltZXN0YW1wIGZyZXNobmVzcy4KICovCmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlTbGFja1YwKGN0eCwgbWF4QWdlU2Vjb25kcyA9IDMwMCkgewogICAgY29uc3QgdGltZXN0YW1wID0gY3R4LmhlYWRlcnM/LlsidGltZXN0YW1wIl0gPz8gIiI7CiAgICBjb25zdCB0cyA9IHBhcnNlSW50KHRpbWVzdGFtcCwgMTApOwogICAgaWYgKCFpc1RpbWVzdGFtcEZyZXNoKHRzLCBtYXhBZ2VTZWNvbmRzKSkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBiYXNlU3RyaW5nID0gYHYwOiR7dGltZXN0YW1wfToke2N0eC5yYXdCb2R5fWA7CiAgICBjb25zdCBjb21wdXRlZCA9IGB2MD0ke2htYWNTaGEyNTZIZXgoYmFzZVN0cmluZywgY3R4LnNlY3JldCl9YDsKICAgIHJldHVybiB0aW1pbmdTYWZlQ29tcGFyZShjdHguc2lnbmF0dXJlLCBjb21wdXRlZCk7Cn0KLyoqCiAqIFZlcmlmeSBhIFN2aXgtc3R5bGUgc2lnbmF0dXJlICh1c2VkIGJ5IFJlc2VuZCkuCiAqIFNlY3JldCBpcyBiYXNlNjQtZW5jb2RlZCAod2l0aCBvcHRpb25hbCAid2hzZWNfIiBwcmVmaXgpLgogKiBTaWduIHN0cmluZzogIntzdml4LWlkfS57c3ZpeC10aW1lc3RhbXB9LntyYXdCb2R5fSIKICogSE1BQy1TSEEyNTYsIGJhc2U2NC1lbmNvZGVkIHJlc3VsdC4gTXVsdGlwbGUgY29tbWEtc2VwYXJhdGVkIHNpZ3MgaW4gaGVhZGVyICh2MSwuLi4gcHJlZml4KS4KICogQW55IG1hdGNoID0gdmFsaWQuIEFsc28gY2hlY2tzIHRpbWVzdGFtcCBmcmVzaG5lc3MuCiAqLwpleHBvcnQgZnVuY3Rpb24gdmVyaWZ5U3ZpeChjdHgsIG1heEFnZVNlY29uZHMgPSAzMDApIHsKICAgIGNvbnN0IHN2aXhJZCA9IGN0eC5oZWFkZXJzPy5bInN2aXgtaWQiXSA/PyAiIjsKICAgIGNvbnN0IHN2aXhUaW1lc3RhbXAgPSBjdHguaGVhZGVycz8uWyJzdml4LXRpbWVzdGFtcCJdID8/ICIiOwogICAgY29uc3Qgc3ZpeFNpZ25hdHVyZSA9IGN0eC5zaWduYXR1cmU7IC8vIHN2aXgtc2lnbmF0dXJlIGhlYWRlciB2YWx1ZQogICAgaWYgKCFzdml4SWQgfHwgIXN2aXhUaW1lc3RhbXAgfHwgIXN2aXhTaWduYXR1cmUpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgLy8gQ2hlY2sgdGltZXN0YW1wIGZyZXNobmVzcwogICAgY29uc3QgdHMgPSBwYXJzZUludChzdml4VGltZXN0YW1wLCAxMCk7CiAgICBpZiAoIWlzVGltZXN0YW1wRnJlc2godHMsIG1heEFnZVNlY29uZHMpKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIC8vIERlY29kZSBzZWNyZXQ6IHN0cmlwICJ3aHNlY18iIHByZWZpeCBpZiBwcmVzZW50LCB0aGVuIGJhc2U2NC1kZWNvZGUKICAgIGxldCBzZWNyZXRLZXk7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJhd1NlY3JldCA9IGN0eC5zZWNyZXQuc3RhcnRzV2l0aCgid2hzZWNfIikKICAgICAgICAgICAgPyBjdHguc2VjcmV0LnNsaWNlKDYpCiAgICAgICAgICAgIDogY3R4LnNlY3JldDsKICAgICAgICBzZWNyZXRLZXkgPSBCdWZmZXIuZnJvbShyYXdTZWNyZXQsICJiYXNlNjQiKTsKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvLyBDb21wdXRlIGV4cGVjdGVkIHNpZ25hdHVyZQogICAgY29uc3Qgc2lnblBheWxvYWQgPSBgJHtzdml4SWR9LiR7c3ZpeFRpbWVzdGFtcH0uJHtjdHgucmF3Qm9keX1gOwogICAgY29uc3QgZXhwZWN0ZWQgPSBjcnlwdG8KICAgICAgICAuY3JlYXRlSG1hYygic2hhMjU2Iiwgc2VjcmV0S2V5KQogICAgICAgIC51cGRhdGUoc2lnblBheWxvYWQpCiAgICAgICAgLmRpZ2VzdCgiYmFzZTY0Iik7CiAgICAvLyBDb21wYXJlIGFnYWluc3QgZWFjaCBjb21tYS1zZXBhcmF0ZWQgc2lnbmF0dXJlIChzdHJpcCAidjEsIiBwcmVmaXgpCiAgICBjb25zdCBzaWduYXR1cmVzID0gc3ZpeFNpZ25hdHVyZS5zcGxpdCgiICIpOwogICAgZm9yIChjb25zdCBzaWcgb2Ygc2lnbmF0dXJlcykgewogICAgICAgIGNvbnN0IHBhcnRzID0gc2lnLnNwbGl0KCIsIik7CiAgICAgICAgLy8gRm9ybWF0OiAidjEsPGJhc2U2ND4iIOKAlCB3ZSBvbmx5IHN1cHBvcnQgdjEKICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHsKICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IHBhcnQudHJpbSgpOwogICAgICAgICAgICBpZiAodHJpbW1lZC5zdGFydHNXaXRoKCJ2MSwiKSkgewogICAgICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdHJpbW1lZC5zbGljZSgzKTsKICAgICAgICAgICAgICAgIGlmICh0aW1pbmdTYWZlQ29tcGFyZShjYW5kaWRhdGUsIGV4cGVjdGVkKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT09IDIgJiYgcGFydHNbMF0gPT09ICJ2MSIpIHsKICAgICAgICAgICAgICAgIC8vICJ2MSw8YmFzZTY0PiIgc3BsaXQgYnkgY29tbWEgZ2l2ZXMgWyJ2MSIsICI8YmFzZTY0PiJdCiAgICAgICAgICAgICAgICBpZiAodGltaW5nU2FmZUNvbXBhcmUocGFydHNbMV0sIGV4cGVjdGVkKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9Ci8qKgogKiBWZXJpZnkgYSBUd2lsaW8gc2lnbmF0dXJlLgogKiBITUFDLVNIQTEgb2YgVVJMICsgc29ydGVkIFBPU1QgcGFyYW1zLCBiYXNlNjQgZW5jb2RlZC4KICovCmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlUd2lsaW8oY3R4KSB7CiAgICBpZiAoIWN0eC51cmwgfHwgIWN0eC5wYXJhbXMpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgY29uc3Qgc29ydGVkS2V5cyA9IE9iamVjdC5rZXlzKGN0eC5wYXJhbXMpLnNvcnQoKTsKICAgIGxldCBkYXRhID0gY3R4LnVybDsKICAgIGZvciAoY29uc3Qga2V5IG9mIHNvcnRlZEtleXMpIHsKICAgICAgICBkYXRhICs9IGtleSArIGN0eC5wYXJhbXNba2V5XTsKICAgIH0KICAgIGNvbnN0IGV4cGVjdGVkID0gaG1hY1NoYTFCYXNlNjQoZGF0YSwgY3R4LnNlY3JldCk7CiAgICByZXR1cm4gdGltaW5nU2FmZUNvbXBhcmUoY3R4LnNpZ25hdHVyZSwgZXhwZWN0ZWQpOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcmlmeS5qcy5tYXA=","search/perplexity.js":"LyoqCiAqIFBlcnBsZXhpdHkgU29uYXIgQVBJIGNsaWVudC4KICogVXNlcyB0aGUgY2hhdCBjb21wbGV0aW9ucyBlbmRwb2ludCB3aXRoIG1vZGVsICJzb25hciIgZm9yIHdlYiBzZWFyY2guCiAqIFNhZmU6IG5ldmVyIHRocm93cywgcmV0dXJucyBudWxsIG9uIGFueSBlcnJvci4KICovCmNvbnN0IFBFUlBMRVhJVFlfVVJMID0gImh0dHBzOi8vYXBpLnBlcnBsZXhpdHkuYWkvY2hhdC9jb21wbGV0aW9ucyI7Ci8qKgogKiBTZWFyY2ggdGhlIHdlYiB2aWEgUGVycGxleGl0eSBTb25hci4KICogUmVxdWlyZXMgUEVSUExFWElUWV9BUElfS0VZIGluIHByb2Nlc3MuZW52IChoeWRyYXRlZCBieSB2YXVsdCkuCiAqIDE1LXNlY29uZCB0aW1lb3V0LiBSZXR1cm5zIG51bGwgb24gYW55IGZhaWx1cmUuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVycGxleGl0eVNlYXJjaChxdWVyeSkgewogICAgY29uc3QgYXBpS2V5ID0gcHJvY2Vzcy5lbnYuUEVSUExFWElUWV9BUElfS0VZOwogICAgaWYgKCFhcGlLZXkpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFBFUlBMRVhJVFlfVVJMLCB7CiAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FwaUtleX1gLAogICAgICAgICAgICB9LAogICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICBtb2RlbDogInNvbmFyIiwKICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBbeyByb2xlOiAidXNlciIsIGNvbnRlbnQ6IHF1ZXJ5IH1dLAogICAgICAgICAgICB9KSwKICAgICAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDE1XzAwMCksCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXMub2spCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzLmpzb24oKSk7CiAgICAgICAgY29uc3QgY29udGVudCA9IGRhdGEuY2hvaWNlcz8uWzBdPy5tZXNzYWdlPy5jb250ZW50OwogICAgICAgIGlmICghY29udGVudCkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuIHsgcmVzdWx0czogY29udGVudCwgcXVlcnkgfTsKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQovLyMgc291cmNlTWFwcGluZ1VSTD1wZXJwbGV4aXR5LmpzLm1hcA==","search/browse.js":"LyoqCiAqIFVSTCBicm93c2UgbW9kdWxlIGZvciBDb3JlLgogKiBGZXRjaGVzIGEgVVJMLCBzdHJpcHMgSFRNTCB0byByZWFkYWJsZSB0ZXh0LCBhbmQgcmV0dXJucyBpdCBmb3IgY29udGV4dCBpbmplY3Rpb24uCiAqIFplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIOKAlCB1c2VzIG5hdGl2ZSBmZXRjaCBhbmQgcmVnZXggZXh0cmFjdGlvbi4KICoKICogTmV2ZXIgdGhyb3dzIOKAlCByZXR1cm5zIG51bGwgb24gYW55IGVycm9yLgogKi8KaW1wb3J0IHsgZ2V0SW5zdGFuY2VOYW1lIH0gZnJvbSAiLi4vaW5zdGFuY2UuanMiOwovKiogTWF4IGNoYXJzIG9mIGV4dHJhY3RlZCB0ZXh0IHRvIGtlZXAgKGNvbnRleHQgYnVkZ2V0KS4gKi8KY29uc3QgTUFYX1RFWFRfTEVOR1RIID0gODAwMDsKLyoqIFRpbWVvdXQgZm9yIGZldGNoIHJlcXVlc3RzIGluIG1zLiAqLwpjb25zdCBGRVRDSF9USU1FT1VUX01TID0gMTVfMDAwOwovKiogQ29udGVudCB0eXBlcyB3ZSdsbCBhdHRlbXB0IHRvIHBhcnNlLiAqLwpjb25zdCBBTExPV0VEX0NPTlRFTlRfVFlQRVMgPSBbInRleHQvaHRtbCIsICJ0ZXh0L3BsYWluIiwgImFwcGxpY2F0aW9uL3hodG1sIl07Ci8qKgogKiBFeHRyYWN0IHRoZSA8dGl0bGU+IGNvbnRlbnQgZnJvbSByYXcgSFRNTC4KICovCmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VGl0bGUoaHRtbCkgewogICAgY29uc3QgbWF0Y2ggPSBodG1sLm1hdGNoKC88dGl0bGVbXj5dKj4oW1xzXFNdKj8pPFwvdGl0bGU+L2kpOwogICAgcmV0dXJuIG1hdGNoID8gZGVjb2RlRW50aXRpZXMobWF0Y2hbMV0udHJpbSgpKSA6ICIiOwp9Ci8qKgogKiBTdHJpcCBIVE1MIHRvIHJlYWRhYmxlIHBsYWluIHRleHQuCiAqIFJlbW92ZXMgc2NyaXB0cywgc3R5bGVzLCB0YWdzLCBkZWNvZGVzIGVudGl0aWVzLCBhbmQgY29sbGFwc2VzIHdoaXRlc3BhY2UuCiAqLwpleHBvcnQgZnVuY3Rpb24gc3RyaXBIdG1sKGh0bWwpIHsKICAgIGxldCB0ZXh0ID0gaHRtbDsKICAgIC8vIFJlbW92ZSBzY3JpcHQgYW5kIHN0eWxlIGJsb2NrcyBlbnRpcmVseQogICAgdGV4dCA9IHRleHQucmVwbGFjZSgvPHNjcmlwdFtcc1xTXSo/PFwvc2NyaXB0Pi9naSwgIiIpOwogICAgdGV4dCA9IHRleHQucmVwbGFjZSgvPHN0eWxlW1xzXFNdKj88XC9zdHlsZT4vZ2ksICIiKTsKICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzxub3NjcmlwdFtcc1xTXSo/PFwvbm9zY3JpcHQ+L2dpLCAiIik7CiAgICAvLyBSZW1vdmUgSFRNTCBjb21tZW50cwogICAgdGV4dCA9IHRleHQucmVwbGFjZSgvPCEtLVtcc1xTXSo/LS0+L2csICIiKTsKICAgIC8vIFJlcGxhY2UgYmxvY2stbGV2ZWwgdGFncyB3aXRoIG5ld2xpbmVzIGZvciByZWFkYWJpbGl0eQogICAgdGV4dCA9IHRleHQucmVwbGFjZSgvPFwvKHB8ZGl2fGhbMS02XXxsaXx0cnxicnxibG9ja3F1b3RlfHNlY3Rpb258YXJ0aWNsZXxoZWFkZXJ8Zm9vdGVyKT4vZ2ksICJcbiIpOwogICAgdGV4dCA9IHRleHQucmVwbGFjZSgvPGJyXHMqXC8/Pi9naSwgIlxuIik7CiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88KHB8ZGl2fGhbMS02XXxsaXx0cnxibG9ja3F1b3RlfHNlY3Rpb258YXJ0aWNsZXxoZWFkZXJ8Zm9vdGVyKVxiW14+XSo+L2dpLCAiXG4iKTsKICAgIC8vIFJlbW92ZSBhbGwgcmVtYWluaW5nIHRhZ3MKICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzxbXj5dKz4vZywgIiIpOwogICAgLy8gRGVjb2RlIEhUTUwgZW50aXRpZXMKICAgIHRleHQgPSBkZWNvZGVFbnRpdGllcyh0ZXh0KTsKICAgIC8vIENvbGxhcHNlIHdoaXRlc3BhY2U6IG11bHRpcGxlIHNwYWNlcy90YWJzIHRvIHNpbmdsZSBzcGFjZSwgcHJlc2VydmUgbmV3bGluZXMKICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1teXFNcbl0rL2csICIgIik7CiAgICAvLyBDb2xsYXBzZSBtdWx0aXBsZSBibGFuayBsaW5lcyB0byBhdCBtb3N0IHR3bwogICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXG57Myx9L2csICJcblxuIik7CiAgICAvLyBUcmltIGVhY2ggbGluZQogICAgdGV4dCA9IHRleHQKICAgICAgICAuc3BsaXQoIlxuIikKICAgICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSkKICAgICAgICAuam9pbigiXG4iKTsKICAgIC8vIFRyaW0gb3ZlcmFsbAogICAgdGV4dCA9IHRleHQudHJpbSgpOwogICAgcmV0dXJuIHRleHQ7Cn0KLyoqCiAqIERlY29kZSBjb21tb24gSFRNTCBlbnRpdGllcy4KICovCmZ1bmN0aW9uIGRlY29kZUVudGl0aWVzKHRleHQpIHsKICAgIGNvbnN0IGVudGl0aWVzID0gewogICAgICAgICImYW1wOyI6ICImIiwKICAgICAgICAiJmx0OyI6ICI8IiwKICAgICAgICAiJmd0OyI6ICI+IiwKICAgICAgICAiJnF1b3Q7IjogJyInLAogICAgICAgICImIzM5OyI6ICInIiwKICAgICAgICAiJmFwb3M7IjogIiciLAogICAgICAgICImbmJzcDsiOiAiICIsCiAgICAgICAgIiZtZGFzaDsiOiAi4oCUIiwKICAgICAgICAiJm5kYXNoOyI6ICLigJMiLAogICAgICAgICImaGVsbGlwOyI6ICLigKYiLAogICAgICAgICImbGFxdW87IjogIsKrIiwKICAgICAgICAiJnJhcXVvOyI6ICLCuyIsCiAgICAgICAgIiZjb3B5OyI6ICLCqSIsCiAgICAgICAgIiZyZWc7IjogIsKuIiwKICAgICAgICAiJnRyYWRlOyI6ICLihKIiLAogICAgfTsKICAgIGxldCByZXN1bHQgPSB0ZXh0OwogICAgZm9yIChjb25zdCBbZW50aXR5LCBjaGFyXSBvZiBPYmplY3QuZW50cmllcyhlbnRpdGllcykpIHsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbChlbnRpdHksIGNoYXIpOwogICAgfQogICAgLy8gRGVjb2RlIG51bWVyaWMgZW50aXRpZXMgKCYjMTIzOyBhbmQgJiN4MWE7KQogICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLyYjKFxkKyk7L2csIChfLCBudW0pID0+IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQobnVtLCAxMCkpKTsKICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8mI3goWzAtOWEtZkEtRl0rKTsvZywgKF8sIGhleCkgPT4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSkpOwogICAgcmV0dXJuIHJlc3VsdDsKfQovKioKICogRmV0Y2ggYSBwbGFpbi10ZXh0IFVSTCBhbmQgcmV0dXJuIGl0cyBjb250ZW50IChvciBudWxsIG9uIGZhaWx1cmUpLgogKiBSZWplY3RzIEhUTUwgcmVzcG9uc2VzIHRvIGF2b2lkIHJldHVybmluZyA0MDQgcGFnZXMuCiAqLwphc3luYyBmdW5jdGlvbiBmZXRjaFBsYWluVGV4dCh0ZXh0VXJsKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7CiAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgNTAwMCk7CiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0ZXh0VXJsLCB7CiAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgICAgICAgICAgIGhlYWRlcnM6IHsgIlVzZXItQWdlbnQiOiBgJHtnZXRJbnN0YW5jZU5hbWUoKX0vMS4wIChwZXJzb25hbCBBSSBhZ2VudClgIH0sCiAgICAgICAgICAgIHJlZGlyZWN0OiAiZm9sbG93IiwKICAgICAgICB9KTsKICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgIGlmICghcmVzcG9uc2Uub2spCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoImNvbnRlbnQtdHlwZSIpID8/ICIiOwogICAgICAgIGlmICghY29udGVudFR5cGUuaW5jbHVkZXMoInRleHQvIikpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGNvbnN0IHRleHQgPSAoYXdhaXQgcmVzcG9uc2UudGV4dCgpKS50cmltKCk7CiAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBpZiBpdCdzIEhUTUwgKDQwNCBwYWdlKSwgcmVqZWN0IGl0CiAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aCgiPCEiKSB8fCB0ZXh0LnN0YXJ0c1dpdGgoIjxodG1sIikpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA8IDUpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgY2F0Y2ggewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8qKgogKiBFeHRyYWN0IGxsbXMudHh0IGxpbmsgaHJlZnMgZnJvbSByYXcgSFRNTC4KICogTG9va3MgZm9yIDxhPiB0YWdzIHdob3NlIGhyZWYgZW5kcyBpbiAvbGxtcy50eHQgb3Igd2hvc2UgdGV4dCBtZW50aW9ucyBsbG1zLnR4dC4KICovCmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TGxtc1R4dExpbmtzKGh0bWwsIGJhc2VVcmwpIHsKICAgIGNvbnN0IGxpbmtzID0gW107CiAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKGJhc2VVcmwpOwogICAgLy8gTWF0Y2ggPGE+IHRhZ3Mgd2l0aCBocmVmIGNvbnRhaW5pbmcgbGxtcy50eHQKICAgIGNvbnN0IGhyZWZQYXR0ZXJuID0gLzxhXHNbXj5dKmhyZWY9WyInXShbXiInXSpsbG1zXC50eHRbXiInXSopWyInXVtePl0qPi9naTsKICAgIGxldCBtYXRjaDsKICAgIHdoaWxlICgobWF0Y2ggPSBocmVmUGF0dGVybi5leGVjKGh0bWwpKSAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IGhyZWYgPSBtYXRjaFsxXTsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBSZXNvbHZlIHJlbGF0aXZlIFVSTHMKICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgVVJMKGhyZWYsIGAke3BhcnNlZC5wcm90b2NvbH0vLyR7cGFyc2VkLmhvc3R9YCkuaHJlZjsKICAgICAgICAgICAgaWYgKCFsaW5rcy5pbmNsdWRlcyhyZXNvbHZlZCkpCiAgICAgICAgICAgICAgICBsaW5rcy5wdXNoKHJlc29sdmVkKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAvLyBza2lwIG1hbGZvcm1lZCBVUkxzCiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGxpbmtzOwp9Ci8qKgogKiBGZXRjaCBsbG1zLnR4dCBmcm9tIGEgc2l0ZSDigJQgdHJpZXMgcm9vdCAvbGxtcy50eHQgZmlyc3QsIHRoZW4gZm9sbG93cwogKiBhbnkgbGxtcy50eHQgbGlua3MgZm91bmQgaW4gdGhlIHBhZ2UgSFRNTCBhcyBmYWxsYmFjay4KICogQ29udmVudGlvbjogc2l0ZXMgcHVibGlzaCAvbGxtcy50eHQgd2l0aCBBSS1mcmllbmRseSBjb250ZW50IGFib3V0IHRoZSBzaXRlLgogKiBSZXR1cm5zIHRoZSB0ZXh0IGNvbnRlbnQgb3IgbnVsbCBpZiBub3QgZm91bmQuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hMbG1zVHh0KHVybCwgaHRtbCkgewogICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwpOwogICAgY29uc3Qgcm9vdFVybCA9IGAke3BhcnNlZC5wcm90b2NvbH0vLyR7cGFyc2VkLmhvc3R9L2xsbXMudHh0YDsKICAgIC8vIFRyeSB0aGUgcm9vdCAvbGxtcy50eHQgZmlyc3QgKHN0YW5kYXJkIGxvY2F0aW9uKQogICAgY29uc3Qgcm9vdFJlc3VsdCA9IGF3YWl0IGZldGNoUGxhaW5UZXh0KHJvb3RVcmwpOwogICAgaWYgKHJvb3RSZXN1bHQpCiAgICAgICAgcmV0dXJuIHJvb3RSZXN1bHQ7CiAgICAvLyBGYWxsYmFjazogc2NhbiBwYWdlIEhUTUwgZm9yIGxsbXMudHh0IGxpbmtzIGFuZCB0cnkgZWFjaAogICAgaWYgKGh0bWwpIHsKICAgICAgICBjb25zdCBsaW5rcyA9IGV4dHJhY3RMbG1zVHh0TGlua3MoaHRtbCwgdXJsKTsKICAgICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHsKICAgICAgICAgICAgLy8gU2tpcCBpZiBzYW1lIGFzIHJvb3QgKGFscmVhZHkgdHJpZWQpCiAgICAgICAgICAgIGlmIChsaW5rID09PSByb290VXJsKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoUGxhaW5UZXh0KGxpbmspOwogICAgICAgICAgICBpZiAocmVzdWx0KQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQovKioKICogRmV0Y2ggYSBVUkwgYW5kIGV4dHJhY3QgcmVhZGFibGUgdGV4dC4KICogUmV0dXJucyBudWxsIG9uIGFueSBlcnJvciAodGltZW91dCwgbmV0d29yaywgbm9uLUhUTUwgY29udGVudCwgZXRjLikuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gYnJvd3NlVXJsKHVybCkgewogICAgdHJ5IHsKICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpOwogICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIEZFVENIX1RJTUVPVVRfTVMpOwogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7CiAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsCiAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgICJVc2VyLUFnZW50IjogYCR7Z2V0SW5zdGFuY2VOYW1lKCl9LzEuMCAocGVyc29uYWwgQUkgYWdlbnQpYCwKICAgICAgICAgICAgICAgIEFjY2VwdDogInRleHQvaHRtbCwgdGV4dC9wbGFpbjtxPTAuOSwgKi8qO3E9MC4xIiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVkaXJlY3Q6ICJmb2xsb3ciLAogICAgICAgIH0pOwogICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLy8gQ2hlY2sgY29udGVudCB0eXBlIOKAlCByZWplY3Qgbm9uLXRleHQgcmVzcG9uc2VzCiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIikgPz8gIiI7CiAgICAgICAgY29uc3QgaXNBbGxvd2VkID0gQUxMT1dFRF9DT05URU5UX1RZUEVTLnNvbWUoKHQpID0+IGNvbnRlbnRUeXBlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModCkpOwogICAgICAgIGlmICghaXNBbGxvd2VkKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpOwogICAgICAgIGNvbnN0IHRpdGxlID0gZXh0cmFjdFRpdGxlKGh0bWwpOwogICAgICAgIC8vIEZvciBwbGFpbiB0ZXh0LCBza2lwIEhUTUwgc3RyaXBwaW5nCiAgICAgICAgY29uc3QgaXNQbGFpblRleHQgPSBjb250ZW50VHlwZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCJ0ZXh0L3BsYWluIik7CiAgICAgICAgbGV0IHRleHQgPSBpc1BsYWluVGV4dCA/IGh0bWwudHJpbSgpIDogc3RyaXBIdG1sKGh0bWwpOwogICAgICAgIC8vIFRydW5jYXRlIHRvIGNvbnRleHQgYnVkZ2V0CiAgICAgICAgbGV0IHRydW5jYXRlZCA9IGZhbHNlOwogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA+IE1BWF9URVhUX0xFTkdUSCkgewogICAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBNQVhfVEVYVF9MRU5HVEgpOwogICAgICAgICAgICAvLyBUcnkgdG8gYnJlYWsgYXQgYSB3b3JkL3NlbnRlbmNlIGJvdW5kYXJ5CiAgICAgICAgICAgIGNvbnN0IGxhc3RCcmVhayA9IE1hdGgubWF4KHRleHQubGFzdEluZGV4T2YoIlxuIiksIHRleHQubGFzdEluZGV4T2YoIi4gIiksIHRleHQubGFzdEluZGV4T2YoIj8gIiksIHRleHQubGFzdEluZGV4T2YoIiEgIikpOwogICAgICAgICAgICBpZiAobGFzdEJyZWFrID4gTUFYX1RFWFRfTEVOR1RIICogMC44KSB7CiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCBsYXN0QnJlYWsgKyAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0ZXh0ICs9ICJcblxuW0NvbnRlbnQgdHJ1bmNhdGVkXSI7CiAgICAgICAgICAgIHRydW5jYXRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIC8vIEZldGNoIGxsbXMudHh0IOKAlCB0cmllcyByb290IC9sbG1zLnR4dCwgdGhlbiBhbnkgbGlua3MgZm91bmQgaW4gcGFnZSBIVE1MCiAgICAgICAgY29uc3QgbGxtc1R4dCA9IGF3YWl0IGZldGNoTGxtc1R4dCh1cmwsIGh0bWwpOwogICAgICAgIHJldHVybiB7IHVybCwgdGl0bGUsIHRleHQsIHRydW5jYXRlZCwgbGxtc1R4dCB9OwogICAgfQogICAgY2F0Y2ggewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8qKgogKiBEZXRlY3QgdGhlIGZpcnN0IFVSTCBpbiBhIG1lc3NhZ2Ugc3RyaW5nLgogKi8KZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFVybChtZXNzYWdlKSB7CiAgICBjb25zdCBtYXRjaCA9IG1lc3NhZ2UubWF0Y2goL2h0dHBzPzpcL1wvXFMrLyk7CiAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFswXS5yZXBsYWNlKC9bLiw7OiE/KV0rJC8sICIiKSA6IG51bGw7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJvd3NlLmpzLm1hcA==","mdns.js":"LyoqCiAqIG1ETlMgc2VydmljZSBhbm5vdW5jZW1lbnQgZm9yIENvcmUgYm9hcmQgZGlzY292ZXJ5LgogKiBBbm5vdW5jZXMgdGhlIEhUVFAgc2VydmVyIGFzIGBfY29yZS1ib2FyZC5fdGNwLmxvY2FsYCBzbyB0aGF0CiAqIERhc2ggYW5kIG90aGVyIGluc3RhbmNlcyBjYW4gZmluZCBpdCBvbiB0aGUgTEFOIGF1dG9tYXRpY2FsbHkuCiAqCiAqIEdhdGVkIGJlaGluZCBgc2V0dGluZ3MubWVzaC5sYW5Bbm5vdW5jZWAg4oCUIGRpc2FibGVkIGJ5IGRlZmF1bHQuCiAqLwppbXBvcnQgbWRucyBmcm9tICJtdWx0aWNhc3QtZG5zIjsKaW1wb3J0IHsgaG9zdG5hbWUgfSBmcm9tICJub2RlOm9zIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi91dGlscy9sb2dnZXIuanMiOwppbXBvcnQgeyBnZXRJbnN0YW5jZU5hbWUgfSBmcm9tICIuL2luc3RhbmNlLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJtZG5zIik7CmNvbnN0IFNFUlZJQ0VfVFlQRSA9ICJfY29yZS1ib2FyZC5fdGNwLmxvY2FsIjsKbGV0IHJlc3BvbmRlciA9IG51bGw7CmxldCBhbm5vdW5jZWRQb3J0ID0gMDsKLyoqCiAqIFN0YXJ0IGFubm91bmNpbmcgdGhlIENvcmUgYm9hcmQgc2VydmljZSBvbiB0aGUgbG9jYWwgbmV0d29yay4KICogQ2FsbCBhZnRlciB0aGUgSFRUUCBzZXJ2ZXIgaXMgbGlzdGVuaW5nIGFuZCB0aGUgYWN0dWFsIHBvcnQgaXMga25vd24uCiAqLwpleHBvcnQgZnVuY3Rpb24gc3RhcnRNZG5zKHBvcnQpIHsKICAgIGlmIChyZXNwb25kZXIpCiAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IHJ1bm5pbmcKICAgIGFubm91bmNlZFBvcnQgPSBwb3J0OwogICAgY29uc3QgaW5zdGFuY2UgPSBnZXRJbnN0YW5jZU5hbWUoKTsKICAgIGNvbnN0IGhvc3QgPSBob3N0bmFtZSgpOwogICAgY29uc3Qgc2VydmljZU5hbWUgPSBgJHtpbnN0YW5jZX0uX2NvcmUtYm9hcmQuX3RjcC5sb2NhbGA7CiAgICByZXNwb25kZXIgPSBtZG5zKCk7CiAgICAvLyBSZXNwb25kIHRvIHF1ZXJpZXMgZm9yIG91ciBzZXJ2aWNlIHR5cGUKICAgIHJlc3BvbmRlci5vbigicXVlcnkiLCAocXVlcnkpID0+IHsKICAgICAgICBjb25zdCBkb21pbmF0ZWQgPSBxdWVyeS5xdWVzdGlvbnMuc29tZSgocSkgPT4gcS5uYW1lID09PSBTRVJWSUNFX1RZUEUgfHwKICAgICAgICAgICAgcS5uYW1lID09PSBzZXJ2aWNlTmFtZSk7CiAgICAgICAgaWYgKCFkb21pbmF0ZWQpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICByZXNwb25kZXIucmVzcG9uZCh7CiAgICAgICAgICAgIGFuc3dlcnM6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiBzZXJ2aWNlTmFtZSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAiU1JWIiwKICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IHBvcnQ6IGFubm91bmNlZFBvcnQsIHRhcmdldDogaG9zdCwgcHJpb3JpdHk6IDAsIHdlaWdodDogMCB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiBzZXJ2aWNlTmFtZSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAiVFhUIiwKICAgICAgICAgICAgICAgICAgICBkYXRhOiBbYGluc3RhbmNlPSR7aW5zdGFuY2V9YCwgYHBvcnQ9JHthbm5vdW5jZWRQb3J0fWBdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiBTRVJWSUNFX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgdHlwZTogIlBUUiIsCiAgICAgICAgICAgICAgICAgICAgZGF0YTogc2VydmljZU5hbWUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgIH0pOwogICAgfSk7CiAgICAvLyBQcm9hY3RpdmUgYW5ub3VuY2VtZW50IChHQllFIOKGkiBhbm5vdW5jZSBwYXR0ZXJuKQogICAgcmVzcG9uZGVyLnJlc3BvbmQoewogICAgICAgIGFuc3dlcnM6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmFtZTogU0VSVklDRV9UWVBFLAogICAgICAgICAgICAgICAgdHlwZTogIlBUUiIsCiAgICAgICAgICAgICAgICBkYXRhOiBzZXJ2aWNlTmFtZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmFtZTogc2VydmljZU5hbWUsCiAgICAgICAgICAgICAgICB0eXBlOiAiU1JWIiwKICAgICAgICAgICAgICAgIGRhdGE6IHsgcG9ydDogYW5ub3VuY2VkUG9ydCwgdGFyZ2V0OiBob3N0LCBwcmlvcml0eTogMCwgd2VpZ2h0OiAwIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWU6IHNlcnZpY2VOYW1lLAogICAgICAgICAgICAgICAgdHlwZTogIlRYVCIsCiAgICAgICAgICAgICAgICBkYXRhOiBbYGluc3RhbmNlPSR7aW5zdGFuY2V9YCwgYHBvcnQ9JHthbm5vdW5jZWRQb3J0fWBdLAogICAgICAgICAgICB9LAogICAgICAgIF0sCiAgICB9KTsKICAgIGxvZy5pbmZvKGBtRE5TIGFubm91bmNpbmcgJHtzZXJ2aWNlTmFtZX0gb24gcG9ydCAke2Fubm91bmNlZFBvcnR9YCk7Cn0KLyoqCiAqIFN0b3AgdGhlIG1ETlMgcmVzcG9uZGVyIGFuZCBzZW5kIGEgZ29vZGJ5ZSBwYWNrZXQuCiAqLwpleHBvcnQgZnVuY3Rpb24gc3RvcE1kbnMoKSB7CiAgICBpZiAoIXJlc3BvbmRlcikKICAgICAgICByZXR1cm47CiAgICBjb25zdCBpbnN0YW5jZSA9IGdldEluc3RhbmNlTmFtZSgpOwogICAgY29uc3Qgc2VydmljZU5hbWUgPSBgJHtpbnN0YW5jZX0uX2NvcmUtYm9hcmQuX3RjcC5sb2NhbGA7CiAgICAvLyBTZW5kIGdvb2RieWUgKFRUTD0wKSBzbyBwZWVycyBmbHVzaCB0aGUgcmVjb3JkIGltbWVkaWF0ZWx5CiAgICB0cnkgewogICAgICAgIHJlc3BvbmRlci5yZXNwb25kKHsKICAgICAgICAgICAgYW5zd2VyczogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6IFNFUlZJQ0VfVFlQRSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAiUFRSIiwKICAgICAgICAgICAgICAgICAgICBkYXRhOiBzZXJ2aWNlTmFtZSwKICAgICAgICAgICAgICAgICAgICB0dGw6IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6IHNlcnZpY2VOYW1lLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJTUlYiLAogICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgcG9ydDogYW5ub3VuY2VkUG9ydCwgdGFyZ2V0OiBob3N0bmFtZSgpLCBwcmlvcml0eTogMCwgd2VpZ2h0OiAwIH0sCiAgICAgICAgICAgICAgICAgICAgdHRsOiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9KTsKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICAvLyBiZXN0LWVmZm9ydCBnb29kYnllCiAgICB9CiAgICByZXNwb25kZXIuZGVzdHJveSgpOwogICAgcmVzcG9uZGVyID0gbnVsbDsKICAgIGxvZy5pbmZvKCJtRE5TIHJlc3BvbmRlciBzdG9wcGVkIik7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWRucy5qcy5tYXA=","stt/client.js":"LyoqCiAqIFNUVCBjbGllbnQg4oCUIHNlbmRzIGF1ZGlvIHRvIHdoaXNwZXItc2VydmVyIGFuZCByZXR1cm5zIHRyYW5zY3JpYmVkIHRleHQuCiAqIEFsbCBmdW5jdGlvbnMgYXJlIHNhZmUg4oCUIHRoZXkgcmV0dXJuIG51bGwgb24gYW55IGZhaWx1cmUuCiAqLwppbXBvcnQgeyBnZXRTdHRDb25maWcgfSBmcm9tICIuLi9zZXR0aW5ncy5qcyI7CmltcG9ydCB7IGdldEluc3RhbmNlTmFtZSB9IGZyb20gIi4uL2luc3RhbmNlLmpzIjsKZnVuY3Rpb24gYmFzZVVybCgpIHsKICAgIHJldHVybiBgaHR0cDovLzEyNy4wLjAuMToke2dldFN0dENvbmZpZygpLnBvcnR9YDsKfQovKioKICogSGVhbHRoIHByb2JlIOKAlCB3aGlzcGVyLXNlcnZlciBzZXJ2ZXMgYW4gSFRNTCBwYWdlIGF0IHJvb3QuCiAqIDItc2Vjb25kIHRpbWVvdXQsIHJldHVybnMgZmFsc2Ugb24gYW55IGZhaWx1cmUuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tTdHRTaWRlY2FyKCkgewogICAgdHJ5IHsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsKCl9L2AsIHsKICAgICAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDIwMDApLAogICAgICAgIH0pOwogICAgICAgIHJldHVybiByZXMub2s7CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9Ci8qKgogKiBUcmFuc2NyaWJlIGF1ZGlvIHZpYSB3aGlzcGVyLXNlcnZlci4KICogU2VuZHMgcmF3IGF1ZGlvIGFzIG11bHRpcGFydCBmb3JtIGRhdGEgdG8gL2luZmVyZW5jZS4KICogSGFuZGxlcyBib3RoIHJlc3BvbnNlIGZvcm1hdHM6IHsgdGV4dCB9IGFuZCB7IHJlc3VsdDogW3sgdGV4dCB9XSB9LgogKiBSZXR1cm5zIHRyYW5zY3JpYmVkIHRleHQsIG9yIG51bGwgb24gZmFpbHVyZS4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFuc2NyaWJlKGF1ZGlvQnVmZmVyKSB7CiAgICB0cnkgewogICAgICAgIC8vIEJ1aWxkIG11bHRpcGFydCBmb3JtIGRhdGEgd2l0aCB0aGUgYXVkaW8gZmlsZQogICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYXVkaW9CdWZmZXJdLCB7IHR5cGU6ICJhdWRpby93YXYiIH0pOwogICAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTsKICAgICAgICBmb3JtLmFwcGVuZCgiZmlsZSIsIGJsb2IsICJhdWRpby53YXYiKTsKICAgICAgICBmb3JtLmFwcGVuZCgicmVzcG9uc2VfZm9ybWF0IiwgImpzb24iKTsKICAgICAgICAvLyBQcm9tcHQgYmlhc2luZyDigJQgaGVscHMgV2hpc3BlciByZWNvZ25pemUgdGhlIHdha2Ugd29yZCBhbmQgZG9tYWluIHRlcm1zCiAgICAgICAgZm9ybS5hcHBlbmQoInByb21wdCIsIGBIZXkgJHtnZXRJbnN0YW5jZU5hbWUoKX1gKTsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsKCl9L2luZmVyZW5jZWAsIHsKICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICAgIGJvZHk6IGZvcm0sCiAgICAgICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgzMF8wMDApLAogICAgICAgIH0pOwogICAgICAgIGlmICghcmVzLm9rKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAvLyBIYW5kbGUgeyB0ZXh0OiAiLi4uIiB9IGZvcm1hdAogICAgICAgIGlmICh0eXBlb2YgZGF0YS50ZXh0ID09PSAic3RyaW5nIikgewogICAgICAgICAgICByZXR1cm4gZGF0YS50ZXh0LnRyaW0oKSB8fCBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBIYW5kbGUgeyByZXN1bHQ6IFt7IHRleHQ6ICIuLi4iIH1dIH0gZm9ybWF0CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS5yZXN1bHQpICYmIGRhdGEucmVzdWx0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBkYXRhLnJlc3VsdFswXTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBmaXJzdC50ZXh0ID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0LnRleHQudHJpbSgpIHx8IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KZXhwb3J0IHsgaXNTdHRBdmFpbGFibGUgfSBmcm9tICIuL3NpZGVjYXIuanMiOwovLyMgc291cmNlTWFwcGluZ1VSTD1jbGllbnQuanMubWFw","stt/sidecar.js":"LyoqCiAqIFNUVCBzaWRlY2FyIGxpZmVjeWNsZSBtYW5hZ2VyLgogKiBTcGF3bnMgd2hpc3Blci1zZXJ2ZXIgYW5kIG1vbml0b3JzIGl0cyBoZWFsdGguCiAqIEdyYWNlZnVsIGRlZ3JhZGF0aW9uIOKAlCBpZiB3aGlzcGVyLXNlcnZlciBpc24ndCBpbnN0YWxsZWQsIENvcmUgd29ya3Mgbm9ybWFsbHkgYXMgdGV4dCBjaGF0LgogKi8KaW1wb3J0IHsgc3Bhd24gfSBmcm9tICJub2RlOmNoaWxkX3Byb2Nlc3MiOwppbXBvcnQgeyBhY2Nlc3MgfSBmcm9tICJub2RlOmZzL3Byb21pc2VzIjsKaW1wb3J0IHsgam9pbiB9IGZyb20gIm5vZGU6cGF0aCI7CmltcG9ydCB7IGdldFN0dENvbmZpZyB9IGZyb20gIi4uL3NldHRpbmdzLmpzIjsKaW1wb3J0IHsgY2hlY2tTdHRTaWRlY2FyIH0gZnJvbSAiLi9jbGllbnQuanMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoInN0dC1zaWRlY2FyIik7CmNvbnN0IFNJREVDQVJfRElSID0gam9pbihwcm9jZXNzLmN3ZCgpLCAic2lkZWNhciIsICJzdHQiKTsKY29uc3QgSEVBTFRIX1BPTExfSU5URVJWQUwgPSA1MDA7IC8vIG1zCmNvbnN0IEhFQUxUSF9QT0xMX1RJTUVPVVQgPSAxNV8wMDA7IC8vIG1zCmxldCBzaWRlY2FyUHJvY2VzcyA9IG51bGw7CmxldCBhdmFpbGFibGUgPSBmYWxzZTsKZnVuY3Rpb24gYmluYXJ5UGF0aCgpIHsKICAgIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAid2luMzIiCiAgICAgICAgPyBqb2luKFNJREVDQVJfRElSLCAid2hpc3Blci1zZXJ2ZXIuZXhlIikKICAgICAgICA6IGpvaW4oU0lERUNBUl9ESVIsICJ3aGlzcGVyLXNlcnZlciIpOwp9Ci8qKgogKiBTdGFydCB0aGUgV2hpc3BlciBTVFQgc2lkZWNhci4KICogQ2hlY2tzIGlmIGFscmVhZHkgcnVubmluZywgdmVyaWZpZXMgYmluYXJ5ICsgbW9kZWwgZXhpc3QsIHRoZW4gc3Bhd25zLgogKiBSZXR1cm5zIHRydWUgaWYgc2lkZWNhciBpcyBhdmFpbGFibGUgYWZ0ZXIgc3RhcnR1cC4KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFN0dFNpZGVjYXIoKSB7CiAgICBjb25zdCBjb25maWcgPSBnZXRTdHRDb25maWcoKTsKICAgIGlmICghY29uZmlnLmVuYWJsZWQpIHsKICAgICAgICBhdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvLyBDaGVjayBpZiBhbHJlYWR5IHJ1bm5pbmcgZXh0ZXJuYWxseQogICAgaWYgKGF3YWl0IGNoZWNrU3R0U2lkZWNhcigpKSB7CiAgICAgICAgYXZhaWxhYmxlID0gdHJ1ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGNvbnN0IGJpbmFyeSA9IGJpbmFyeVBhdGgoKTsKICAgIGNvbnN0IG1vZGVsUGF0aCA9IGpvaW4oU0lERUNBUl9ESVIsICJtb2RlbHMiLCBjb25maWcubW9kZWwpOwogICAgLy8gVmVyaWZ5IGJpbmFyeSBleGlzdHMKICAgIHRyeSB7CiAgICAgICAgYXdhaXQgYWNjZXNzKGJpbmFyeSk7CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgbG9nLmluZm8oYCBCaW5hcnkgbm90IGZvdW5kOiAke2JpbmFyeX1gKTsKICAgICAgICBsb2cuaW5mbyhgIFNlZSBzaWRlY2FyL3N0dC9zZXR1cC5tZCBmb3IgaW5zdGFsbCBpbnN0cnVjdGlvbnNgKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvLyBWZXJpZnkgbW9kZWwgZXhpc3RzCiAgICB0cnkgewogICAgICAgIGF3YWl0IGFjY2Vzcyhtb2RlbFBhdGgpOwogICAgfQogICAgY2F0Y2ggewogICAgICAgIGxvZy5pbmZvKGAgTW9kZWwgbm90IGZvdW5kOiAke21vZGVsUGF0aH1gKTsKICAgICAgICBsb2cuaW5mbyhgIFNlZSBzaWRlY2FyL3N0dC9zZXR1cC5tZCBmb3IgZG93bmxvYWQgaW5zdHJ1Y3Rpb25zYCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgcG9ydCA9IFN0cmluZyhjb25maWcucG9ydCk7CiAgICB0cnkgewogICAgICAgIHNpZGVjYXJQcm9jZXNzID0gc3Bhd24oYmluYXJ5LCBbIi1tIiwgbW9kZWxQYXRoLCAiLS1wb3J0IiwgcG9ydCwgIi0taG9zdCIsICIxMjcuMC4wLjEiXSwgeyBjd2Q6IFNJREVDQVJfRElSLCBzdGRpbzogWyJpZ25vcmUiLCAicGlwZSIsICJwaXBlIl0sIGRldGFjaGVkOiBmYWxzZSB9KTsKICAgICAgICBzaWRlY2FyUHJvY2Vzcy5zdGRlcnI/Lm9uKCJkYXRhIiwgKGRhdGEpID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZGF0YS50b1N0cmluZygpLnRyaW0oKTsKICAgICAgICAgICAgaWYgKG1zZykKICAgICAgICAgICAgICAgIGxvZy5pbmZvKGAgJHttc2d9YCk7CiAgICAgICAgfSk7CiAgICAgICAgc2lkZWNhclByb2Nlc3Mub24oImVycm9yIiwgKGVycikgPT4gewogICAgICAgICAgICBsb2cuaW5mbyhgIEZhaWxlZCB0byBzdGFydDogJHtlcnIubWVzc2FnZX1gKTsKICAgICAgICAgICAgYXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHNpZGVjYXJQcm9jZXNzID0gbnVsbDsKICAgICAgICB9KTsKICAgICAgICBzaWRlY2FyUHJvY2Vzcy5vbigiZXhpdCIsIChjb2RlKSA9PiB7CiAgICAgICAgICAgIGlmIChjb2RlICE9PSBudWxsICYmIGNvZGUgIT09IDApIHsKICAgICAgICAgICAgICAgIGxvZy5pbmZvKGAgRXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHNpZGVjYXJQcm9jZXNzID0gbnVsbDsKICAgICAgICB9KTsKICAgICAgICAvLyBQb2xsIHVudGlsIHJlYWR5IG9yIHRpbWVvdXQKICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7CiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IEhFQUxUSF9QT0xMX1RJTUVPVVQpIHsKICAgICAgICAgICAgaWYgKGF3YWl0IGNoZWNrU3R0U2lkZWNhcigpKSB7CiAgICAgICAgICAgICAgICBhdmFpbGFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgSEVBTFRIX1BPTExfSU5URVJWQUwpKTsKICAgICAgICB9CiAgICAgICAgbG9nLmluZm8oIiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgaGVhbHRoIGNoZWNrIik7CiAgICAgICAgc3RvcFN0dFNpZGVjYXIoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgIGxvZy5pbmZvKGAgU3Bhd24gZmFpbGVkOiAke21zZ31gKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0KLyoqIENoZWNrIGlmIHRoZSBTVFQgc2lkZWNhciBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLiAqLwpleHBvcnQgZnVuY3Rpb24gaXNTdHRBdmFpbGFibGUoKSB7CiAgICByZXR1cm4gYXZhaWxhYmxlOwp9Ci8qKiBTdG9wIHRoZSBTVFQgc2lkZWNhciBwcm9jZXNzLiAqLwpleHBvcnQgZnVuY3Rpb24gc3RvcFN0dFNpZGVjYXIoKSB7CiAgICBpZiAoc2lkZWNhclByb2Nlc3MpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBzaWRlY2FyUHJvY2Vzcy5raWxsKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgLy8gQWxyZWFkeSBkZWFkCiAgICAgICAgfQogICAgICAgIHNpZGVjYXJQcm9jZXNzID0gbnVsbDsKICAgIH0KICAgIGF2YWlsYWJsZSA9IGZhbHNlOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpZGVjYXIuanMubWFw","tts/client.js":"LyoqCiAqIFRUUyBjbGllbnQg4oCUIHNlbmRzIHRleHQgdG8gdGhlIFBpcGVyIEhUVFAgc2VydmVyIGFuZCByZXR1cm5zIFdBViBhdWRpby4KICogUGlwZXIncyBBUEkgaXMgUE9TVCAvIHdpdGggSlNPTiBib2R5IHsidGV4dCI6ICIuLi4ifSwgcmV0dXJucyBXQVYgYnl0ZXMuCiAqIEFsbCBmdW5jdGlvbnMgYXJlIHNhZmUg4oCUIHRoZXkgcmV0dXJuIG51bGwgb24gYW55IGZhaWx1cmUuCiAqLwppbXBvcnQgeyBnZXRUdHNDb25maWcgfSBmcm9tICIuLi9zZXR0aW5ncy5qcyI7CmZ1bmN0aW9uIGJhc2VVcmwoKSB7CiAgICByZXR1cm4gYGh0dHA6Ly8xMjcuMC4wLjE6JHtnZXRUdHNDb25maWcoKS5wb3J0fWA7Cn0KLyoqCiAqIEhlYWx0aCBwcm9iZSDigJQgaGl0IEdFVCAvdm9pY2VzIChhIGxpZ2h0d2VpZ2h0IGxpc3QgZW5kcG9pbnQpLgogKiAzLXNlY29uZCB0aW1lb3V0LCByZXR1cm5zIGZhbHNlIG9uIGFueSBmYWlsdXJlLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrVHRzU2lkZWNhcigpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybCgpfS92b2ljZXNgLCB7CiAgICAgICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgzMDAwKSwKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzLm9rOwogICAgfQogICAgY2F0Y2ggewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQovKioKICogU3ludGhlc2l6ZSB0ZXh0IHRvIFdBViBhdWRpbyB2aWEgUGlwZXIuCiAqIFBPU1QgLyB3aXRoIEpTT04geyJ0ZXh0IjogIi4uLiJ9IOKGkiBXQVYgYnl0ZXMuCiAqIFJldHVybnMgYSBCdWZmZXIgb2YgV0FWIGJ5dGVzLCBvciBudWxsIG9uIGZhaWx1cmUuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gc3ludGhlc2l6ZSh0ZXh0KSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmwoKX0vYCwgewogICAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwKICAgICAgICAgICAgaGVhZGVyczogeyAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iIH0sCiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdGV4dCB9KSwKICAgICAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDMwXzAwMCksCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXMub2spCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGNvbnN0IGFycmF5QnVmID0gYXdhaXQgcmVzLmFycmF5QnVmZmVyKCk7CiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFycmF5QnVmKTsKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQpleHBvcnQgeyBpc1R0c0F2YWlsYWJsZSB9IGZyb20gIi4vc2lkZWNhci5qcyI7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsaWVudC5qcy5tYXA=","tts/sidecar.js":"LyoqCiAqIFRUUyBzaWRlY2FyIGxpZmVjeWNsZSBtYW5hZ2VyLgogKiBTcGF3bnMgdGhlIFBpcGVyIEhUVFAgc2VydmVyIGFuZCBtb25pdG9ycyBpdHMgaGVhbHRoLgogKiBHcmFjZWZ1bCBkZWdyYWRhdGlvbiDigJQgaWYgUGlwZXIgaXNuJ3QgaW5zdGFsbGVkLCBDb3JlIHdvcmtzIG5vcm1hbGx5IGFzIHRleHQgY2hhdC4KICovCmltcG9ydCB7IHNwYXduLCBleGVjRmlsZSB9IGZyb20gIm5vZGU6Y2hpbGRfcHJvY2VzcyI7CmltcG9ydCB7IGFjY2VzcywgbWtkaXIgfSBmcm9tICJub2RlOmZzL3Byb21pc2VzIjsKaW1wb3J0IHsgam9pbiB9IGZyb20gIm5vZGU6cGF0aCI7CmltcG9ydCB7IGdldFR0c0NvbmZpZyB9IGZyb20gIi4uL3NldHRpbmdzLmpzIjsKaW1wb3J0IHsgY2hlY2tUdHNTaWRlY2FyIH0gZnJvbSAiLi9jbGllbnQuanMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwpjb25zdCBsb2cgPSBjcmVhdGVMb2dnZXIoInR0cy1zaWRlY2FyIik7CmNvbnN0IFZPSUNFU19ESVIgPSBqb2luKHByb2Nlc3MuY3dkKCksICJzaWRlY2FyIiwgInR0cyIsICJ2b2ljZXMiKTsKLy8gRmlyc3QtcnVuIGRvd25sb2FkIGNhbiB0YWtlIGEgd2hpbGU7IGhlYWx0aCBwb2xsIGFmdGVyIHRoYXQgaXMgZmFzdApjb25zdCBIRUFMVEhfUE9MTF9JTlRFUlZBTCA9IDUwMDsgLy8gbXMKY29uc3QgSEVBTFRIX1BPTExfVElNRU9VVCA9IDE1XzAwMDsgLy8gbXMKY29uc3QgRE9XTkxPQURfVElNRU9VVCA9IDEyMF8wMDA7IC8vIG1zIOKAlCBtb2RlbCBkb3dubG9hZCBjYW4gYmUgfjEwME1CCmxldCBzaWRlY2FyUHJvY2VzcyA9IG51bGw7CmxldCBhdmFpbGFibGUgPSBmYWxzZTsKZnVuY3Rpb24gcHl0aG9uQ29tbWFuZCgpIHsKICAgIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAid2luMzIiID8gInB5dGhvbiIgOiAicHl0aG9uMyI7Cn0KLyoqCiAqIFJlc29sdmUgdGhlIC5vbm54IGZpbGUgcGF0aCBmb3IgYSB2b2ljZSBuYW1lLgogKiBQaXBlciBzdG9yZXMgZG93bmxvYWRlZCB2b2ljZXMgYXMgPHZvaWNlX25hbWU+Lzx2b2ljZV9uYW1lPi5vbm54IGluc2lkZSB0aGUgZGF0YSBkaXIuCiAqIFJldHVybnMgdGhlIHBhdGggaWYgZm91bmQgb24gZGlzaywgb3RoZXJ3aXNlIG51bGwuCiAqLwphc3luYyBmdW5jdGlvbiBmaW5kVm9pY2VNb2RlbCh2b2ljZSkgewogICAgLy8gQ2hlY2sgYm90aCBmbGF0IGFuZCBuZXN0ZWQgbGF5b3V0cyB0aGF0IFBpcGVyJ3MgZG93bmxvYWRlciBtaWdodCB1c2UKICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBbCiAgICAgICAgam9pbihWT0lDRVNfRElSLCB2b2ljZSwgYCR7dm9pY2V9Lm9ubnhgKSwKICAgICAgICBqb2luKFZPSUNFU19ESVIsIGAke3ZvaWNlfS5vbm54YCksCiAgICBdOwogICAgZm9yIChjb25zdCBwIG9mIGNhbmRpZGF0ZXMpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCBhY2Nlc3MocCk7CiAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgIH0KICAgICAgICBjYXRjaCB7IH0KICAgIH0KICAgIHJldHVybiBudWxsOwp9Ci8qKgogKiBEb3dubG9hZCBhIHZvaWNlIG1vZGVsIHVzaW5nIHBpcGVyLmRvd25sb2FkX3ZvaWNlcyBpZiBpdCdzIG5vdCBhbHJlYWR5IG9uIGRpc2suCiAqIFJldHVybnMgdGhlIC5vbm54IHBhdGggb24gc3VjY2VzcywgbnVsbCBvbiBmYWlsdXJlLgogKi8KYXN5bmMgZnVuY3Rpb24gZW5zdXJlVm9pY2VNb2RlbCh2b2ljZSkgewogICAgYXdhaXQgbWtkaXIoVk9JQ0VTX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICAvLyBBbHJlYWR5IGRvd25sb2FkZWQ/CiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IGZpbmRWb2ljZU1vZGVsKHZvaWNlKTsKICAgIGlmIChleGlzdGluZykKICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICBsb2cuaW5mbyhgIERvd25sb2FkaW5nIHZvaWNlICIke3ZvaWNlfSIgKGZpcnN0IHJ1biwgfjEwME1CKS4uLmApOwogICAgY29uc3QgcHl0aG9uID0gcHl0aG9uQ29tbWFuZCgpOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgICAgZXhlY0ZpbGUocHl0aG9uLCBbIi1tIiwgInBpcGVyLmRvd25sb2FkX3ZvaWNlcyIsICItLWRvd25sb2FkLWRpciIsIFZPSUNFU19ESVIsIHZvaWNlXSwgeyB0aW1lb3V0OiBET1dOTE9BRF9USU1FT1VUIH0sIGFzeW5jIChlcnIsIF9zdGRvdXQsIHN0ZGVycikgPT4gewogICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICBsb2cuaW5mbyhgIFZvaWNlIGRvd25sb2FkIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKTsKICAgICAgICAgICAgICAgIGlmIChzdGRlcnIpCiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oYCAke3N0ZGVyci50cmltKCl9YCk7CiAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvZy5pbmZvKGAgVm9pY2UgZG93bmxvYWRlZCBzdWNjZXNzZnVsbHlgKTsKICAgICAgICAgICAgcmVzb2x2ZShhd2FpdCBmaW5kVm9pY2VNb2RlbCh2b2ljZSkpOwogICAgICAgIH0pOwogICAgfSk7Cn0KLyoqCiAqIFN0YXJ0IHRoZSBQaXBlciBUVFMgc2lkZWNhci4KICogRG93bmxvYWRzIHRoZSB2b2ljZSBtb2RlbCBpZiBuZWVkZWQsIHRoZW4gc3Bhd25zIHRoZSBIVFRQIHNlcnZlci4KICogUmV0dXJucyB0cnVlIGlmIHNpZGVjYXIgaXMgYXZhaWxhYmxlIGFmdGVyIHN0YXJ0dXAuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRUdHNTaWRlY2FyKCkgewogICAgY29uc3QgY29uZmlnID0gZ2V0VHRzQ29uZmlnKCk7CiAgICBpZiAoIWNvbmZpZy5lbmFibGVkKSB7CiAgICAgICAgYXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBydW5uaW5nIGV4dGVybmFsbHkKICAgIGlmIChhd2FpdCBjaGVja1R0c1NpZGVjYXIoKSkgewogICAgICAgIGF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvLyBFbnN1cmUgdGhlIHZvaWNlIG1vZGVsIC5vbm54IGZpbGUgZXhpc3RzIG9uIGRpc2sKICAgIGNvbnN0IG1vZGVsUGF0aCA9IGF3YWl0IGVuc3VyZVZvaWNlTW9kZWwoY29uZmlnLnZvaWNlKTsKICAgIGlmICghbW9kZWxQYXRoKSB7CiAgICAgICAgbG9nLmluZm8oYCBObyB2b2ljZSBtb2RlbCBhdmFpbGFibGUg4oCUIFRUUyBkaXNhYmxlZGApOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IHB5dGhvbiA9IHB5dGhvbkNvbW1hbmQoKTsKICAgIGNvbnN0IHBvcnQgPSBTdHJpbmcoY29uZmlnLnBvcnQpOwogICAgdHJ5IHsKICAgICAgICBzaWRlY2FyUHJvY2VzcyA9IHNwYXduKHB5dGhvbiwgWyItbSIsICJwaXBlci5odHRwX3NlcnZlciIsICItLW1vZGVsIiwgbW9kZWxQYXRoLCAiLS1kYXRhLWRpciIsIFZPSUNFU19ESVIsICItLXBvcnQiLCBwb3J0XSwgeyBzdGRpbzogWyJpZ25vcmUiLCAicGlwZSIsICJwaXBlIl0sIGRldGFjaGVkOiBmYWxzZSB9KTsKICAgICAgICBzaWRlY2FyUHJvY2Vzcy5zdGRlcnI/Lm9uKCJkYXRhIiwgKGRhdGEpID0+IHsKICAgICAgICAgICAgY29uc3QgbXNnID0gZGF0YS50b1N0cmluZygpLnRyaW0oKTsKICAgICAgICAgICAgaWYgKG1zZykKICAgICAgICAgICAgICAgIGxvZy5pbmZvKGAgJHttc2d9YCk7CiAgICAgICAgfSk7CiAgICAgICAgc2lkZWNhclByb2Nlc3Mub24oImVycm9yIiwgKGVycikgPT4gewogICAgICAgICAgICBsb2cuaW5mbyhgIEZhaWxlZCB0byBzdGFydDogJHtlcnIubWVzc2FnZX1gKTsKICAgICAgICAgICAgYXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHNpZGVjYXJQcm9jZXNzID0gbnVsbDsKICAgICAgICB9KTsKICAgICAgICBzaWRlY2FyUHJvY2Vzcy5vbigiZXhpdCIsIChjb2RlKSA9PiB7CiAgICAgICAgICAgIGlmIChjb2RlICE9PSBudWxsICYmIGNvZGUgIT09IDApIHsKICAgICAgICAgICAgICAgIGxvZy5pbmZvKGAgRXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHNpZGVjYXJQcm9jZXNzID0gbnVsbDsKICAgICAgICB9KTsKICAgICAgICAvLyBQb2xsIHVudGlsIHJlYWR5IG9yIHRpbWVvdXQKICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7CiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IEhFQUxUSF9QT0xMX1RJTUVPVVQpIHsKICAgICAgICAgICAgaWYgKGF3YWl0IGNoZWNrVHRzU2lkZWNhcigpKSB7CiAgICAgICAgICAgICAgICBhdmFpbGFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgSEVBTFRIX1BPTExfSU5URVJWQUwpKTsKICAgICAgICB9CiAgICAgICAgbG9nLmluZm8oIiBUaW1lZCBvdXQgd2FpdGluZyBmb3IgaGVhbHRoIGNoZWNrIik7CiAgICAgICAgc3RvcFR0c1NpZGVjYXIoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgIGxvZy5pbmZvKGAgU3Bhd24gZmFpbGVkOiAke21zZ31gKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0KLyoqIENoZWNrIGlmIHRoZSBUVFMgc2lkZWNhciBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLiAqLwpleHBvcnQgZnVuY3Rpb24gaXNUdHNBdmFpbGFibGUoKSB7CiAgICByZXR1cm4gYXZhaWxhYmxlOwp9Ci8qKiBTdG9wIHRoZSBUVFMgc2lkZWNhciBwcm9jZXNzLiAqLwpleHBvcnQgZnVuY3Rpb24gc3RvcFR0c1NpZGVjYXIoKSB7CiAgICBpZiAoc2lkZWNhclByb2Nlc3MpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBzaWRlY2FyUHJvY2Vzcy5raWxsKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgLy8gQWxyZWFkeSBkZWFkCiAgICAgICAgfQogICAgICAgIHNpZGVjYXJQcm9jZXNzID0gbnVsbDsKICAgIH0KICAgIGF2YWlsYWJsZSA9IGZhbHNlOwp9Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpZGVjYXIuanMubWFw","avatar/client.js":"LyoqCiAqIEF2YXRhciBjbGllbnQg4oCUIGNvbW11bmljYXRlcyB3aXRoIHRoZSBNdXNlVGFsayBGYXN0QVBJIHNpZGVjYXIuCiAqIEhhbmRsZXMgcGhvdG8gcHJlcGFyYXRpb24sIHZpZGVvIGdlbmVyYXRpb24sIGFuZCBNUDQgY2FjaGluZy4KICovCmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICJub2RlOmNyeXB0byI7CmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUsIHJlYWRkaXIsIHN0YXQsIHVubGluaywgbWtkaXIgfSBmcm9tICJub2RlOmZzL3Byb21pc2VzIjsKaW1wb3J0IHsgam9pbiB9IGZyb20gIm5vZGU6cGF0aCI7CmltcG9ydCB7IGdldEF2YXRhckNvbmZpZyB9IGZyb20gIi4uL3NldHRpbmdzLmpzIjsKaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAiLi4vdXRpbHMvbG9nZ2VyLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJhdmF0YXItY2xpZW50Iik7CmNvbnN0IENBQ0hFX0RJUiA9IGpvaW4ocHJvY2Vzcy5jd2QoKSwgInB1YmxpYyIsICJhdmF0YXIiLCAiY2FjaGUiKTsKY29uc3QgTUFYX0NBQ0hFX0VOVFJJRVMgPSA1MDsKLyoqIEluLWZsaWdodCBndWFyZCDigJQgb25seSBvbmUgZ2VuZXJhdGUgcmVxdWVzdCBhdCBhIHRpbWUuICovCmxldCBnZW5lcmF0aW5nID0gZmFsc2U7CmZ1bmN0aW9uIGJhc2VVcmwoKSB7CiAgICByZXR1cm4gYGh0dHA6Ly8xMjcuMC4wLjE6JHtnZXRBdmF0YXJDb25maWcoKS5wb3J0fWA7Cn0KLyoqCiAqIEhlYWx0aCBwcm9iZSDigJQgR0VUIC9oZWFsdGgsIDMtc2Vjb25kIHRpbWVvdXQuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBdmF0YXJTaWRlY2FyKCkgewogICAgdHJ5IHsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtiYXNlVXJsKCl9L2hlYWx0aGAsIHsKICAgICAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDMwMDApLAogICAgICAgIH0pOwogICAgICAgIGlmICghcmVzLm9rKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgcmV0dXJuICEhZGF0YS5yZWFkeTsKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0KLyoqCiAqIFByZXBhcmUgYSByZWZlcmVuY2UgcGhvdG8gZm9yIGxpcC1zeW5jIGdlbmVyYXRpb24uCiAqIFBPU1QgL3ByZXBhcmUgd2l0aCB0aGUgcGhvdG8gZmlsZS4gUnVucyBmYWNlIGRldGVjdGlvbiArIFZBRSBlbmNvZGUgKGNhY2hlZCBvbiBzaWRlY2FyIHNpZGUpLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVQaG90byhwaG90b1BhdGgpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcGhvdG9CeXRlcyA9IGF3YWl0IHJlYWRGaWxlKHBob3RvUGF0aCk7CiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKICAgICAgICBmb3JtRGF0YS5hcHBlbmQoInBob3RvIiwgbmV3IEJsb2IoW3Bob3RvQnl0ZXNdKSwgInBob3RvLnBuZyIpOwogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmwoKX0vcHJlcGFyZWAsIHsKICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICAgIGJvZHk6IGZvcm1EYXRhLAogICAgICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMTIwXzAwMCksCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTsKICAgICAgICAgICAgbG9nLndhcm4oYCBQcmVwYXJlIGZhaWxlZDogJHtlcnIuZXJyb3IgPz8gcmVzLnN0YXR1c1RleHR9YCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgY29uc3QgbXNnID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgIGxvZy53YXJuKGAgUHJlcGFyZSBlcnJvcjogJHttc2d9YCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9Ci8qKgogKiBHZW5lcmF0ZSBhIGxpcC1zeW5jZWQgTVA0IGZyb20gV0FWIGF1ZGlvLgogKiBQT1NUIC9nZW5lcmF0ZSB3aXRoIFdBViBieXRlcy4gUmV0dXJucyBNUDQgQnVmZmVyIG9yIG51bGwuCiAqIFRpbWVvdXQ6IDEyMHMgKGdlbmVyYXRpb24gdGltZSDiiYggYXVkaW8gZHVyYXRpb24pLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVmlkZW8od2F2QnVmZmVyKSB7CiAgICBpZiAoZ2VuZXJhdGluZykgewogICAgICAgIGxvZy53YXJuKGAgU2tpcHBlZCDigJQgZ2VuZXJhdGlvbiBhbHJlYWR5IGluIGZsaWdodGApOwogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZ2VuZXJhdGluZyA9IHRydWU7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCJhdWRpbyIsIG5ldyBCbG9iKFt3YXZCdWZmZXJdKSwgImF1ZGlvLndhdiIpOwogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmwoKX0vZ2VuZXJhdGVgLCB7CiAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICBib2R5OiBmb3JtRGF0YSwKICAgICAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDEyMF8wMDApLAogICAgICAgIH0pOwogICAgICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7CiAgICAgICAgICAgIGxvZy53YXJuKGAgR2VuZXJhdGUgZmFpbGVkOiAke2Vyci5lcnJvciA/PyByZXMuc3RhdHVzVGV4dH1gKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFycmF5QnVmID0gYXdhaXQgcmVzLmFycmF5QnVmZmVyKCk7CiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFycmF5QnVmKTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgbG9nLndhcm4oYCBHZW5lcmF0ZSBlcnJvcjogJHttc2d9YCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBnZW5lcmF0aW5nID0gZmFsc2U7CiAgICB9Cn0KLyoqIENvbXB1dGUgU0hBLTI1NiBoYXNoIG9mIGEgYnVmZmVyIChmb3IgY2FjaGUga2V5cykuICovCmZ1bmN0aW9uIGhhc2hCdWZmZXIoYnVmKSB7CiAgICByZXR1cm4gY3JlYXRlSGFzaCgic2hhMjU2IikudXBkYXRlKGJ1ZikuZGlnZXN0KCJoZXgiKS5zbGljZSgwLCAxNik7Cn0KLyoqCiAqIENoZWNrIGlmIGEgdmlkZW8gaXMgYWxyZWFkeSBjYWNoZWQgZm9yIHRoZSBnaXZlbiBXQVYgYXVkaW8uCiAqIFJldHVybnMgdGhlIGNhY2hlIGZpbGVuYW1lIChoYXNoLm1wNCkgaWYgZm91bmQsIG51bGwgb3RoZXJ3aXNlLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENhY2hlZFZpZGVvKHdhdkJ1ZmZlcikgewogICAgY29uc3QgaGFzaCA9IGhhc2hCdWZmZXIod2F2QnVmZmVyKTsKICAgIGNvbnN0IGNhY2hlUGF0aCA9IGpvaW4oQ0FDSEVfRElSLCBgJHtoYXNofS5tcDRgKTsKICAgIHRyeSB7CiAgICAgICAgYXdhaXQgc3RhdChjYWNoZVBhdGgpOwogICAgICAgIHJldHVybiBgJHtoYXNofS5tcDRgOwogICAgfQogICAgY2F0Y2ggewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8qKgogKiBDYWNoZSBhbiBNUDQgdmlkZW8sIGtleWVkIGJ5IFdBViBhdWRpbyBoYXNoLgogKiBSZXR1cm5zIHRoZSBjYWNoZSBmaWxlbmFtZSAoaGFzaC5tcDQpLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhY2hlVmlkZW8obXA0QnVmZmVyLCB3YXZCdWZmZXIpIHsKICAgIGF3YWl0IG1rZGlyKENBQ0hFX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICBjb25zdCBoYXNoID0gaGFzaEJ1ZmZlcih3YXZCdWZmZXIpOwogICAgY29uc3QgZmlsZW5hbWUgPSBgJHtoYXNofS5tcDRgOwogICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oQ0FDSEVfRElSLCBmaWxlbmFtZSksIG1wNEJ1ZmZlcik7CiAgICBhd2FpdCBwcnVuZUNhY2hlKCk7CiAgICByZXR1cm4gZmlsZW5hbWU7Cn0KLyoqCiAqIFBydW5lIHRoZSBjYWNoZSBkaXJlY3RvcnkgdG8ga2VlcCBhdCBtb3N0IE1BWF9DQUNIRV9FTlRSSUVTIGZpbGVzLgogKiBSZW1vdmVzIG9sZGVzdCBmaWxlcyBieSBtb2RpZmljYXRpb24gdGltZS4KICovCmFzeW5jIGZ1bmN0aW9uIHBydW5lQ2FjaGUoKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcmVhZGRpcihDQUNIRV9ESVIpOwogICAgICAgIGNvbnN0IG1wNEZpbGVzID0gZmlsZXMuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKCIubXA0IikpOwogICAgICAgIGlmIChtcDRGaWxlcy5sZW5ndGggPD0gTUFYX0NBQ0hFX0VOVFJJRVMpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvLyBHZXQgbXRpbWVzIGZvciBzb3J0aW5nCiAgICAgICAgY29uc3Qgd2l0aFN0YXRzID0gYXdhaXQgUHJvbWlzZS5hbGwobXA0RmlsZXMubWFwKGFzeW5jIChmKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHMgPSBhd2FpdCBzdGF0KGpvaW4oQ0FDSEVfRElSLCBmKSk7CiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGYsIG10aW1lOiBzLm10aW1lTXMgfTsKICAgICAgICB9KSk7CiAgICAgICAgLy8gU29ydCBvbGRlc3QgZmlyc3QKICAgICAgICB3aXRoU3RhdHMuc29ydCgoYSwgYikgPT4gYS5tdGltZSAtIGIubXRpbWUpOwogICAgICAgIC8vIFJlbW92ZSBvbGRlc3QgZW50cmllcyBiZXlvbmQgdGhlIGxpbWl0CiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSB3aXRoU3RhdHMuc2xpY2UoMCwgd2l0aFN0YXRzLmxlbmd0aCAtIE1BWF9DQUNIRV9FTlRSSUVTKTsKICAgICAgICBmb3IgKGNvbnN0IGYgb2YgdG9SZW1vdmUpIHsKICAgICAgICAgICAgYXdhaXQgdW5saW5rKGpvaW4oQ0FDSEVfRElSLCBmLm5hbWUpKS5jYXRjaCgoKSA9PiB7IH0pOwogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICAvLyBDYWNoZSBkaXIgbWF5IG5vdCBleGlzdCB5ZXQg4oCUIHRoYXQncyBmaW5lCiAgICB9Cn0KLyoqCiAqIENsZWFyIGFsbCBjYWNoZWQgdmlkZW9zLiBVc2VkIHdoZW4gdGhlIHJlZmVyZW5jZSBwaG90byBjaGFuZ2VzLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFyVmlkZW9DYWNoZSgpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKENBQ0hFX0RJUik7CiAgICAgICAgZm9yIChjb25zdCBmIG9mIGZpbGVzKSB7CiAgICAgICAgICAgIGlmIChmLmVuZHNXaXRoKCIubXA0IikpIHsKICAgICAgICAgICAgICAgIGF3YWl0IHVubGluayhqb2luKENBQ0hFX0RJUiwgZikpLmNhdGNoKCgpID0+IHsgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgLy8gQ2FjaGUgZGlyIG1heSBub3QgZXhpc3QgeWV0CiAgICB9Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xpZW50LmpzLm1hcA==","avatar/sidecar.js":"LyoqCiAqIEF2YXRhciBzaWRlY2FyIGxpZmVjeWNsZSBtYW5hZ2VyLgogKiBTcGF3bnMgdGhlIE11c2VUYWxrIEZhc3RBUEkgc2VydmVyIGFuZCBtb25pdG9ycyBpdHMgaGVhbHRoLgogKiBHcmFjZWZ1bCBkZWdyYWRhdGlvbiDigJQgaWYgTXVzZVRhbGsgaXNuJ3QgaW5zdGFsbGVkLCBDb3JlIGZhbGxzIGJhY2sgdG8gVGFsa2luZ0hlYWQvcGxhY2Vob2xkZXIuCiAqLwppbXBvcnQgeyBzcGF3biB9IGZyb20gIm5vZGU6Y2hpbGRfcHJvY2VzcyI7CmltcG9ydCB7IGFjY2VzcyB9IGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgeyBqb2luIH0gZnJvbSAibm9kZTpwYXRoIjsKaW1wb3J0IHsgZ2V0QXZhdGFyQ29uZmlnIH0gZnJvbSAiLi4vc2V0dGluZ3MuanMiOwppbXBvcnQgeyBjaGVja0F2YXRhclNpZGVjYXIgfSBmcm9tICIuL2NsaWVudC5qcyI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiYXZhdGFyLXNpZGVjYXIiKTsKY29uc3QgSEVBTFRIX1BPTExfSU5URVJWQUwgPSAxMDAwOyAvLyBtcwpjb25zdCBIRUFMVEhfUE9MTF9USU1FT1VUID0gNjBfMDAwOyAvLyBtcyDigJQgbW9kZWwgbG9hZGluZyBpcyBzbG93IG9uIGZpcnN0IHJ1bgpsZXQgc2lkZWNhclByb2Nlc3MgPSBudWxsOwpsZXQgYXZhaWxhYmxlID0gZmFsc2U7CmZ1bmN0aW9uIHB5dGhvbkNvbW1hbmQoKSB7CiAgICAvLyBVc2UgdGhlIE11c2VUYWxrIHZlbnYgUHl0aG9uIGlmIGl0IGV4aXN0cyAoaGFzIGFsbCB0aGUgcmlnaHQgZGVwcykKICAgIGNvbnN0IGNvbmZpZyA9IGdldEF2YXRhckNvbmZpZygpOwogICAgaWYgKGNvbmZpZy5tdXNldGFsa1BhdGgpIHsKICAgICAgICBjb25zdCB2ZW52UHl0aG9uID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gIndpbjMyIgogICAgICAgICAgICA/IGpvaW4oY29uZmlnLm11c2V0YWxrUGF0aCwgIi52ZW52IiwgIlNjcmlwdHMiLCAicHl0aG9uLmV4ZSIpCiAgICAgICAgICAgIDogam9pbihjb25maWcubXVzZXRhbGtQYXRoLCAiLnZlbnYiLCAiYmluIiwgInB5dGhvbiIpOwogICAgICAgIHJldHVybiB2ZW52UHl0aG9uOwogICAgfQogICAgcmV0dXJuIHByb2Nlc3MucGxhdGZvcm0gPT09ICJ3aW4zMiIgPyAicHl0aG9uIiA6ICJweXRob24zIjsKfQovKioKICogU3RhcnQgdGhlIE11c2VUYWxrIGF2YXRhciBzaWRlY2FyLgogKiBWZXJpZmllcyB0aGUgTXVzZVRhbGsgcGF0aCBleGlzdHMsIHNwYXducyB0aGUgRmFzdEFQSSBzZXJ2ZXIsIHBvbGxzIGZvciBoZWFsdGguCiAqIFJldHVybnMgdHJ1ZSBpZiBzaWRlY2FyIGlzIGF2YWlsYWJsZSBhZnRlciBzdGFydHVwLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0QXZhdGFyU2lkZWNhcigpIHsKICAgIGNvbnN0IGNvbmZpZyA9IGdldEF2YXRhckNvbmZpZygpOwogICAgaWYgKCFjb25maWcuZW5hYmxlZCkgewogICAgICAgIGF2YWlsYWJsZSA9IGZhbHNlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmICghY29uZmlnLm11c2V0YWxrUGF0aCkgewogICAgICAgIGxvZy5pbmZvKCIgTm8gbXVzZXRhbGtQYXRoIGNvbmZpZ3VyZWQg4oCUIGF2YXRhciBkaXNhYmxlZCIpOwogICAgICAgIGF2YWlsYWJsZSA9IGZhbHNlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcnVubmluZyBleHRlcm5hbGx5CiAgICBpZiAoYXdhaXQgY2hlY2tBdmF0YXJTaWRlY2FyKCkpIHsKICAgICAgICBhdmFpbGFibGUgPSB0cnVlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLy8gVmVyaWZ5IE11c2VUYWxrIHBhdGggZXhpc3RzCiAgICB0cnkgewogICAgICAgIGF3YWl0IGFjY2Vzcyhjb25maWcubXVzZXRhbGtQYXRoKTsKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBsb2cuaW5mbyhgIE11c2VUYWxrIHBhdGggbm90IGZvdW5kOiAke2NvbmZpZy5tdXNldGFsa1BhdGh9YCk7CiAgICAgICAgYXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgcHl0aG9uID0gcHl0aG9uQ29tbWFuZCgpOwogICAgY29uc3QgcG9ydCA9IFN0cmluZyhjb25maWcucG9ydCk7CiAgICBjb25zdCBzZXJ2ZXJTY3JpcHQgPSBqb2luKHByb2Nlc3MuY3dkKCksICJzaWRlY2FyIiwgImF2YXRhciIsICJzZXJ2ZXIucHkiKTsKICAgIHRyeSB7CiAgICAgICAgc2lkZWNhclByb2Nlc3MgPSBzcGF3bihweXRob24sIFtzZXJ2ZXJTY3JpcHQsICItLXBvcnQiLCBwb3J0LCAiLS1tdXNldGFsay1wYXRoIiwgY29uZmlnLm11c2V0YWxrUGF0aF0sIHsKICAgICAgICAgICAgc3RkaW86IFsiaWdub3JlIiwgInBpcGUiLCAicGlwZSJdLAogICAgICAgICAgICBkZXRhY2hlZDogZmFsc2UsCiAgICAgICAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgUFlUSE9OVVRGODogIjEiLCBQWVRIT05JT0VOQ09ESU5HOiAidXRmLTgiIH0sCiAgICAgICAgfSk7CiAgICAgICAgc2lkZWNhclByb2Nlc3Muc3Rkb3V0Py5vbigiZGF0YSIsIChkYXRhKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGRhdGEudG9TdHJpbmcoKS50cmltKCk7CiAgICAgICAgICAgIGlmIChtc2cpCiAgICAgICAgICAgICAgICBsb2cuaW5mbyhgICR7bXNnfWApOwogICAgICAgIH0pOwogICAgICAgIHNpZGVjYXJQcm9jZXNzLnN0ZGVycj8ub24oImRhdGEiLCAoZGF0YSkgPT4gewogICAgICAgICAgICBjb25zdCBtc2cgPSBkYXRhLnRvU3RyaW5nKCkudHJpbSgpOwogICAgICAgICAgICBpZiAobXNnKQogICAgICAgICAgICAgICAgbG9nLmluZm8oYCAke21zZ31gKTsKICAgICAgICB9KTsKICAgICAgICBzaWRlY2FyUHJvY2Vzcy5vbigiZXJyb3IiLCAoZXJyKSA9PiB7CiAgICAgICAgICAgIGxvZy5pbmZvKGAgRmFpbGVkIHRvIHN0YXJ0OiAke2Vyci5tZXNzYWdlfWApOwogICAgICAgICAgICBhdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgc2lkZWNhclByb2Nlc3MgPSBudWxsOwogICAgICAgIH0pOwogICAgICAgIHNpZGVjYXJQcm9jZXNzLm9uKCJleGl0IiwgKGNvZGUpID0+IHsKICAgICAgICAgICAgaWYgKGNvZGUgIT09IG51bGwgJiYgY29kZSAhPT0gMCkgewogICAgICAgICAgICAgICAgbG9nLmluZm8oYCBFeGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgc2lkZWNhclByb2Nlc3MgPSBudWxsOwogICAgICAgIH0pOwogICAgICAgIC8vIFBvbGwgdW50aWwgcmVhZHkgb3IgdGltZW91dAogICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTsKICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgSEVBTFRIX1BPTExfVElNRU9VVCkgewogICAgICAgICAgICBpZiAoYXdhaXQgY2hlY2tBdmF0YXJTaWRlY2FyKCkpIHsKICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBIRUFMVEhfUE9MTF9JTlRFUlZBTCkpOwogICAgICAgIH0KICAgICAgICBsb2cuaW5mbygiIFRpbWVkIG91dCB3YWl0aW5nIGZvciBoZWFsdGggY2hlY2siKTsKICAgICAgICBzdG9wQXZhdGFyU2lkZWNhcigpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNhdGNoIChlcnIpIHsKICAgICAgICBjb25zdCBtc2cgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgbG9nLmluZm8oYCBTcGF3biBmYWlsZWQ6ICR7bXNnfWApOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQovKiogQ2hlY2sgaWYgdGhlIGF2YXRhciBzaWRlY2FyIGlzIGN1cnJlbnRseSBhdmFpbGFibGUuICovCmV4cG9ydCBmdW5jdGlvbiBpc0F2YXRhckF2YWlsYWJsZSgpIHsKICAgIHJldHVybiBhdmFpbGFibGU7Cn0KLyoqIFN0b3AgdGhlIGF2YXRhciBzaWRlY2FyIHByb2Nlc3MuICovCmV4cG9ydCBmdW5jdGlvbiBzdG9wQXZhdGFyU2lkZWNhcigpIHsKICAgIGlmIChzaWRlY2FyUHJvY2VzcykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHNpZGVjYXJQcm9jZXNzLmtpbGwoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAvLyBBbHJlYWR5IGRlYWQKICAgICAgICB9CiAgICAgICAgc2lkZWNhclByb2Nlc3MgPSBudWxsOwogICAgfQogICAgYXZhaWxhYmxlID0gZmFsc2U7Cn0KLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2lkZWNhci5qcy5tYXA=","volumes/index.js":"ZXhwb3J0IHsgVm9sdW1lTWFuYWdlciB9IGZyb20gIi4vbWFuYWdlci5qcyI7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcA==","volumes/manager.js":"LyoqCiAqIFZvbHVtZU1hbmFnZXIg4oCUIGV2ZW50LWRyaXZlbiBtdWx0aS12b2x1bWUgYnJhaW4gc3RvcmFnZS4KICoKICogTm8gdGltZXJzLiBObyBwb2xsaW5nLiBGaXZlIHRyaWdnZXJzOgogKiAgIG9uLXdyaXRlICAgIOKGkiBxdWV1ZSByZXBsaWNhdGlvbiB0byBvdGhlciB2b2x1bWVzCiAqICAgb24tY29ubmVjdCAg4oaSIGRyYWluIHBlbmRpbmcgcmVwbGljYXRpb25zCiAqICAgb24tcHJlc3N1cmUg4oaSIG1pZ3JhdGUgY29sZCBmaWxlcyB0byBsb3dlciB0aWVyCiAqICAgb24tYWNjZXNzICAg4oaSIHByb21vdGUgZmlsZSB0byBzcGhlcmUKICogICBvbi1kaXNjb25uZWN0IOKGkiBlbnN1cmUgc3BoZXJlIGhhcyBlc3NlbnRpYWxzCiAqCiAqIFRoZSBhcHBlbmQtb25seSBKU09OTCBsb2cgaXMgdGhlIHJlcGxpY2F0aW9uIHF1ZXVlLgogKiBBbnkgdm9sdW1lIHRoYXQncyBiZWhpbmQganVzdCByZWFkcyB0aGUgYXBwZW5kcyBpdCBtaXNzZWQuCiAqLwppbXBvcnQgeyByZWFkRmlsZSwgd3JpdGVGaWxlLCBjb3B5RmlsZSwgbWtkaXIsIHN0YXQgfSBmcm9tICJub2RlOmZzL3Byb21pc2VzIjsKaW1wb3J0IHsgc3RhdGZzIH0gZnJvbSAibm9kZTpmcy9wcm9taXNlcyI7CmltcG9ydCB7IGpvaW4sIGRpcm5hbWUgfSBmcm9tICJub2RlOnBhdGgiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwppbXBvcnQgeyBsb2dBY3Rpdml0eSB9IGZyb20gIi4uL2FjdGl2aXR5L2xvZy5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigidm9sdW1lcyIpOwovKiogRGVmYXVsdCBwcmVzc3VyZSB0aHJlc2hvbGQ6IDgwJSBvZiB2b2x1bWUgY2FwYWNpdHkuICovCmNvbnN0IERFRkFVTFRfUFJFU1NVUkVfUENUID0gMC44OwovKiogTWF4IGNvbGQgZmlsZXMgdG8gbWlncmF0ZSBwZXIgcHJlc3N1cmUgZXZlbnQuICovCmNvbnN0IE1JR1JBVEVfQkFUQ0hfU0laRSA9IDEwOwovKiogQ29uY3VycmVuY3kgZm9yIHJlcGxpY2F0aW9uIGRyYWluLiAqLwpjb25zdCBSRVBMSUNBVElPTl9DT05DVVJSRU5DWSA9IDM7CmV4cG9ydCBjbGFzcyBWb2x1bWVNYW5hZ2VyIHsKICAgIHByaW1hcnlCcmFpbkRpcjsKICAgIHZvbHVtZXMgPSBbXTsKICAgIHN0YXRlcyA9IG5ldyBNYXAoKTsKICAgIHJlcGxpY2F0aW9uUXVldWUgPSBbXTsKICAgIGNvbmZpZ1BhdGg7CiAgICBxdWV1ZVBhdGg7CiAgICBkcmFpbmluZyA9IGZhbHNlOwogICAgY29uc3RydWN0b3IocHJpbWFyeUJyYWluRGlyKSB7CiAgICAgICAgdGhpcy5wcmltYXJ5QnJhaW5EaXIgPSBwcmltYXJ5QnJhaW5EaXI7CiAgICAgICAgdGhpcy5jb25maWdQYXRoID0gam9pbihwcmltYXJ5QnJhaW5EaXIsICJ2b2x1bWVzLnlhbWwiKTsKICAgICAgICB0aGlzLnF1ZXVlUGF0aCA9IGpvaW4ocHJpbWFyeUJyYWluRGlyLCAidm9sdW1lcyIsICJyZXBsaWNhdGlvbi1xdWV1ZS5qc29ubCIpOwogICAgfQogICAgLy8g4pSA4pSAIEluaXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBhc3luYyBpbml0KCkgewogICAgICAgIGF3YWl0IHRoaXMubG9hZENvbmZpZygpOwogICAgICAgIGF3YWl0IHRoaXMubG9hZFF1ZXVlKCk7CiAgICAgICAgYXdhaXQgdGhpcy5wcm9iZUFsbCgpOwogICAgICAgIGxvZy5pbmZvKCJWb2x1bWUgbWFuYWdlciBpbml0aWFsaXplZCIsIHsKICAgICAgICAgICAgdm9sdW1lczogdGhpcy52b2x1bWVzLmxlbmd0aCwKICAgICAgICAgICAgb25saW5lOiBbLi4udGhpcy5zdGF0ZXMudmFsdWVzKCldLmZpbHRlcigocykgPT4gcy5vbmxpbmUpLmxlbmd0aCwKICAgICAgICAgICAgcGVuZGluZ1JlcGxpY2F0aW9uczogdGhpcy5yZXBsaWNhdGlvblF1ZXVlLmZpbHRlcigocikgPT4gci5zdGF0dXMgPT09ICJwZW5kaW5nIikubGVuZ3RoLAogICAgICAgIH0pOwogICAgfQogICAgLy8g4pSA4pSAIENvbmZpZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGFzeW5jIGxvYWRDb25maWcoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUodGhpcy5jb25maWdQYXRoLCAidXRmLTgiKTsKICAgICAgICAgICAgdGhpcy52b2x1bWVzID0gdGhpcy5wYXJzZVZvbHVtZXNZYW1sKHJhdyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgaWYgKGVyci5jb2RlID09PSAiRU5PRU5UIikgewogICAgICAgICAgICAgICAgLy8gTm8gdm9sdW1lcy55YW1sIOKAlCBzaW5nbGUtdm9sdW1lIG1vZGUgKHByaW1hcnkgb25seSkKICAgICAgICAgICAgICAgIHRoaXMudm9sdW1lcyA9IFsKICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICJwcmltYXJ5IiwgcGF0aDogdGhpcy5wcmltYXJ5QnJhaW5EaXIsIHRpZXI6ICJzcGhlcmUiIH0sCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyB2b2x1bWVzLnlhbWwg4oCUIHNpbmdsZS12b2x1bWUgbW9kZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbG9nLndhcm4oIkZhaWxlZCB0byBwYXJzZSB2b2x1bWVzLnlhbWwiLCB7IGVycm9yOiBlcnIubWVzc2FnZSB9KTsKICAgICAgICAgICAgICAgIHRoaXMudm9sdW1lcyA9IFsKICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICJwcmltYXJ5IiwgcGF0aDogdGhpcy5wcmltYXJ5QnJhaW5EaXIsIHRpZXI6ICJzcGhlcmUiIH0sCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEVuc3VyZSBwcmltYXJ5IGlzIGFsd2F5cyBwcmVzZW50CiAgICAgICAgaWYgKCF0aGlzLnZvbHVtZXMuZmluZCgodikgPT4gdi5wYXRoID09PSB0aGlzLnByaW1hcnlCcmFpbkRpcikpIHsKICAgICAgICAgICAgdGhpcy52b2x1bWVzLnVuc2hpZnQoeyBuYW1lOiAicHJpbWFyeSIsIHBhdGg6IHRoaXMucHJpbWFyeUJyYWluRGlyLCB0aWVyOiAic3BoZXJlIiB9KTsKICAgICAgICB9CiAgICB9CiAgICBwYXJzZVZvbHVtZXNZYW1sKHJhdykgewogICAgICAgIGNvbnN0IGNvbmZpZ3MgPSBbXTsKICAgICAgICBjb25zdCBlbnRyaWVzID0gcmF3LnNwbGl0KC9eKD89XHMqLSApL20pLmZpbHRlcigocykgPT4gcy50cmltKCkpOwogICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykgewogICAgICAgICAgICBjb25zdCBsaW5lcyA9IGVudHJ5LnNwbGl0KCJcbiIpLm1hcCgobCkgPT4gbC50cmltKCkpLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCIjIikpOwogICAgICAgICAgICBsZXQgbmFtZTsKICAgICAgICAgICAgbGV0IHBhdGg7CiAgICAgICAgICAgIGxldCB0aWVyOwogICAgICAgICAgICBsZXQgcHJlc3N1cmVUaHJlc2hvbGRCeXRlczsKICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjbGVhbmVkID0gbGluZS5yZXBsYWNlKC9eLVxzKi8sICIiKTsKICAgICAgICAgICAgICAgIGNvbnN0IGt2ID0gY2xlYW5lZC5tYXRjaCgvXihcdyspXHMqOlxzKiguKykkLyk7CiAgICAgICAgICAgICAgICBpZiAoIWt2KQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgY29uc3QgWywga2V5LCB2YWxdID0ga3Y7CiAgICAgICAgICAgICAgICBjb25zdCB1bnF1b3RlZCA9IHZhbC5yZXBsYWNlKC9eWyInXXxbIiddJC9nLCAiIikudHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gIm5hbWUiKQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSB1bnF1b3RlZDsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gInBhdGgiKQogICAgICAgICAgICAgICAgICAgIHBhdGggPSB1bnF1b3RlZDsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gInRpZXIiICYmIFsic3BoZXJlIiwgIndhcm0iLCAiYXJjaGl2ZSJdLmluY2x1ZGVzKHVucXVvdGVkKSkgewogICAgICAgICAgICAgICAgICAgIHRpZXIgPSB1bnF1b3RlZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gInByZXNzdXJlVGhyZXNob2xkQnl0ZXMiKQogICAgICAgICAgICAgICAgICAgIHByZXNzdXJlVGhyZXNob2xkQnl0ZXMgPSBwYXJzZUludCh1bnF1b3RlZCwgMTApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuYW1lICYmIHBhdGggJiYgdGllcikgewogICAgICAgICAgICAgICAgY29uZmlncy5wdXNoKHsgbmFtZSwgcGF0aCwgdGllciwgcHJlc3N1cmVUaHJlc2hvbGRCeXRlcyB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY29uZmlnczsKICAgIH0KICAgIC8vIOKUgOKUgCBWb2x1bWUgcHJvYmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8qKiBDaGVjayB3aGljaCB2b2x1bWVzIGFyZSBvbmxpbmUgYW5kIGdldCBkaXNrIHN0YXRzLiAqLwogICAgYXN5bmMgcHJvYmVBbGwoKSB7CiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZCh0aGlzLnZvbHVtZXMubWFwKCh2KSA9PiB0aGlzLnByb2JlVm9sdW1lKHYpKSk7CiAgICAgICAgY29uc3Qgc3RhdGVzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHZvbCA9IHRoaXMudm9sdW1lc1tpXTsKICAgICAgICAgICAgaWYgKHJlc3VsdHNbaV0uc3RhdHVzID09PSAiZnVsZmlsbGVkIikgewogICAgICAgICAgICAgICAgY29uc3QgcyA9IHJlc3VsdHNbaV0udmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlcy5zZXQodm9sLm5hbWUsIHMpOwogICAgICAgICAgICAgICAgc3RhdGVzLnB1c2gocyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCBvZmZsaW5lU3RhdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogdm9sLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgdGllcjogdm9sLnRpZXIsCiAgICAgICAgICAgICAgICAgICAgcGF0aDogdm9sLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgb25saW5lOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzOiAwLAogICAgICAgICAgICAgICAgICAgIHVzZWRCeXRlczogMCwKICAgICAgICAgICAgICAgICAgICBmcmVlQnl0ZXM6IDAsCiAgICAgICAgICAgICAgICAgICAgcHJlc3N1cmU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGxhc3RTZWVuOiB0aGlzLnN0YXRlcy5nZXQodm9sLm5hbWUpPy5sYXN0U2VlbiA/PyAibmV2ZXIiLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVzLnNldCh2b2wubmFtZSwgb2ZmbGluZVN0YXRlKTsKICAgICAgICAgICAgICAgIHN0YXRlcy5wdXNoKG9mZmxpbmVTdGF0ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0YXRlczsKICAgIH0KICAgIGFzeW5jIHByb2JlVm9sdW1lKGNvbmZpZykgewogICAgICAgIC8vIENoZWNrIGlmIHBhdGggaXMgYWNjZXNzaWJsZQogICAgICAgIGF3YWl0IHN0YXQoY29uZmlnLnBhdGgpOwogICAgICAgIGxldCB0b3RhbEJ5dGVzID0gMDsKICAgICAgICBsZXQgZnJlZUJ5dGVzID0gMDsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBmcyA9IGF3YWl0IHN0YXRmcyhjb25maWcucGF0aCk7CiAgICAgICAgICAgIHRvdGFsQnl0ZXMgPSBOdW1iZXIoZnMuYmxvY2tzKSAqIE51bWJlcihmcy5ic2l6ZSk7CiAgICAgICAgICAgIGZyZWVCeXRlcyA9IE51bWJlcihmcy5iZnJlZSkgKiBOdW1iZXIoZnMuYnNpemUpOwogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIC8vIHN0YXRmcyBtYXkgbm90IHdvcmsgb24gYWxsIHBsYXRmb3JtcwogICAgICAgIH0KICAgICAgICBjb25zdCB1c2VkQnl0ZXMgPSB0b3RhbEJ5dGVzIC0gZnJlZUJ5dGVzOwogICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IGNvbmZpZy5wcmVzc3VyZVRocmVzaG9sZEJ5dGVzID8/IHRvdGFsQnl0ZXMgKiBERUZBVUxUX1BSRVNTVVJFX1BDVDsKICAgICAgICBjb25zdCBwcmVzc3VyZSA9IHRvdGFsQnl0ZXMgPiAwICYmIHVzZWRCeXRlcyA+PSB0aHJlc2hvbGQ7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsCiAgICAgICAgICAgIHRpZXI6IGNvbmZpZy50aWVyLAogICAgICAgICAgICBwYXRoOiBjb25maWcucGF0aCwKICAgICAgICAgICAgb25saW5lOiB0cnVlLAogICAgICAgICAgICB0b3RhbEJ5dGVzLAogICAgICAgICAgICB1c2VkQnl0ZXMsCiAgICAgICAgICAgIGZyZWVCeXRlcywKICAgICAgICAgICAgcHJlc3N1cmUsCiAgICAgICAgICAgIGxhc3RTZWVuOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgfTsKICAgIH0KICAgIC8vIOKUgOKUgCBFdmVudCBoYW5kbGVycyAodGhlIGZpdmUgdHJpZ2dlcnMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLyoqIFByb2Nlc3MgYSB2b2x1bWUgZXZlbnQuIFRoaXMgaXMgdGhlIG9ubHkgZW50cnkgcG9pbnQgZm9yIHZvbHVtZSBvcGVyYXRpb25zLiAqLwogICAgYXN5bmMgaGFuZGxlRXZlbnQoZXZlbnQpIHsKICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAid3JpdGUiOgogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbldyaXRlKGV2ZW50LmZpbGVJZCwgZXZlbnQudm9sdW1lKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJjb25uZWN0IjoKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25Db25uZWN0KGV2ZW50LnZvbHVtZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAiZGlzY29ubmVjdCI6CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uRGlzY29ubmVjdChldmVudC52b2x1bWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInByZXNzdXJlIjoKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub25QcmVzc3VyZShldmVudC52b2x1bWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImFjY2VzcyI6CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9uQWNjZXNzKGV2ZW50LmZpbGVJZCwgZXZlbnQudm9sdW1lKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogT04gV1JJVEUg4oCUIGEgZmlsZSB3YXMgc3RvcmVkIG9uIGEgdm9sdW1lLiBRdWV1ZSByZXBsaWNhdGlvbiB0byBvdGhlciB2b2x1bWVzLgogICAgICogRXZlcnkgYXBwZW5kIGlzIGEgcmVwbGljYXRpb24gZXZlbnQuCiAgICAgKi8KICAgIGFzeW5jIG9uV3JpdGUoZmlsZUlkLCBzb3VyY2VWb2x1bWUpIHsKICAgICAgICBjb25zdCB0YXJnZXRzID0gdGhpcy52b2x1bWVzLmZpbHRlcigodikgPT4gdi5uYW1lICE9PSBzb3VyY2VWb2x1bWUgJiYgdGhpcy5zdGF0ZXMuZ2V0KHYubmFtZSk/Lm9ubGluZSk7CiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykgewogICAgICAgICAgICBjb25zdCBlbnRyeSA9IHsKICAgICAgICAgICAgICAgIGZpbGVJZCwKICAgICAgICAgICAgICAgIGNoZWNrc3VtOiAiIiwKICAgICAgICAgICAgICAgIHNvdXJjZVZvbHVtZSwKICAgICAgICAgICAgICAgIHRhcmdldFZvbHVtZTogdGFyZ2V0Lm5hbWUsCiAgICAgICAgICAgICAgICBxdWV1ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICAgICAgc3RhdHVzOiAicGVuZGluZyIsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMucmVwbGljYXRpb25RdWV1ZS5wdXNoKGVudHJ5KTsKICAgICAgICB9CiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0UXVldWUoKTsKICAgICAgICAvLyBJZiBhbnkgdGFyZ2V0cyBhcmUgb25saW5lLCBzdGFydCBkcmFpbmluZyBpbW1lZGlhdGVseQogICAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgdGhpcy5kcmFpblF1ZXVlKCkuY2F0Y2goKGVycikgPT4gbG9nLndhcm4oIlJlcGxpY2F0aW9uIGRyYWluIGZhaWxlZCIsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pKTsKICAgICAgICB9CiAgICAgICAgbG9nLmRlYnVnKCJvbi13cml0ZTogcXVldWVkIHJlcGxpY2F0aW9uIiwgeyBmaWxlSWQsIHRhcmdldHM6IHRhcmdldHMubWFwKCh0KSA9PiB0Lm5hbWUpIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBPTiBDT05ORUNUIOKAlCBhIHZvbHVtZSBjYW1lIG9ubGluZS4gRHJhaW4gcGVuZGluZyByZXBsaWNhdGlvbnMgdG8gaXQuCiAgICAgKiBUaGUgcm9hZCBvcGVuZWQuIFNlbmQgd2hhdCdzIHdhaXRpbmcuCiAgICAgKi8KICAgIGFzeW5jIG9uQ29ubmVjdCh2b2x1bWVOYW1lKSB7CiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy52b2x1bWVzLmZpbmQoKHYpID0+IHYubmFtZSA9PT0gdm9sdW1lTmFtZSk7CiAgICAgICAgaWYgKCFjb25maWcpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvLyBSZS1wcm9iZSB0aGUgdm9sdW1lCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLnByb2JlVm9sdW1lKGNvbmZpZyk7CiAgICAgICAgICAgIHRoaXMuc3RhdGVzLnNldCh2b2x1bWVOYW1lLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgcmV0dXJuOyAvLyBOb3QgYWN0dWFsbHkgb25saW5lCiAgICAgICAgfQogICAgICAgIGxvZ0FjdGl2aXR5KHsKICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgc3VtbWFyeTogYFZvbHVtZSBjb25uZWN0ZWQ6ICR7dm9sdW1lTmFtZX0gKCR7Y29uZmlnLnRpZXJ9KWAsCiAgICAgICAgfSk7CiAgICAgICAgLy8gUmVwbGljYXRlIHJlZ2lzdHJ5IHRvIHRoaXMgdm9sdW1lCiAgICAgICAgaWYgKGNvbmZpZy5yZXBsaWNhdGVSZWdpc3RyeSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBsaWNhdGVSZWdpc3RyeShjb25maWcpOwogICAgICAgIH0KICAgICAgICAvLyBEcmFpbiBwZW5kaW5nIHJlcGxpY2F0aW9ucyB0YXJnZXRpbmcgdGhpcyB2b2x1bWUKICAgICAgICBhd2FpdCB0aGlzLmRyYWluUXVldWUodm9sdW1lTmFtZSk7CiAgICAgICAgbG9nLmluZm8oIm9uLWNvbm5lY3Q6IHZvbHVtZSBvbmxpbmUiLCB7IHZvbHVtZTogdm9sdW1lTmFtZSwgdGllcjogY29uZmlnLnRpZXIgfSk7CiAgICB9CiAgICAvKioKICAgICAqIE9OIERJU0NPTk5FQ1Qg4oCUIHZvbHVtZSBnb2luZyBhd2F5LiBFbnN1cmUgc3BoZXJlIGhhcyBlc3NlbnRpYWxzLgogICAgICogVGhlIGdvb2RieWUgaXMgdGhlIGNoZWNrcG9pbnQuCiAgICAgKi8KICAgIGFzeW5jIG9uRGlzY29ubmVjdCh2b2x1bWVOYW1lKSB7CiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlcy5nZXQodm9sdW1lTmFtZSk7CiAgICAgICAgaWYgKHN0YXRlKSB7CiAgICAgICAgICAgIHN0YXRlLm9ubGluZSA9IGZhbHNlOwogICAgICAgICAgICBzdGF0ZS5sYXN0U2VlbiA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKICAgICAgICB9CiAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICBzb3VyY2U6ICJzeXN0ZW0iLAogICAgICAgICAgICBzdW1tYXJ5OiBgVm9sdW1lIGRpc2Nvbm5lY3RlZDogJHt2b2x1bWVOYW1lfWAsCiAgICAgICAgfSk7CiAgICAgICAgbG9nLmluZm8oIm9uLWRpc2Nvbm5lY3QiLCB7IHZvbHVtZTogdm9sdW1lTmFtZSB9KTsKICAgIH0KICAgIC8qKgogICAgICogT04gUFJFU1NVUkUg4oCUIHZvbHVtZSBpcyBnZXR0aW5nIGZ1bGwuIE1pZ3JhdGUgY29sZCBmaWxlcyB0byBsb3dlciB0aWVyLgogICAgICogU3RvcmFnZSBwcmVzc3VyZSBpcyB0aGUgbmF0dXJhbCBzaWduYWwuIE5vdCBhIHRpbWVyLgogICAgICovCiAgICBhc3luYyBvblByZXNzdXJlKHZvbHVtZU5hbWUpIHsKICAgICAgICBjb25zdCBzb3VyY2VDb25maWcgPSB0aGlzLnZvbHVtZXMuZmluZCgodikgPT4gdi5uYW1lID09PSB2b2x1bWVOYW1lKTsKICAgICAgICBpZiAoIXNvdXJjZUNvbmZpZykKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIC8vIEZpbmQgYSBsb3dlciB0aWVyIHRoYXQncyBvbmxpbmUgYW5kIGhhcyBzcGFjZQogICAgICAgIGNvbnN0IHRpZXJPcmRlciA9IFsic3BoZXJlIiwgIndhcm0iLCAiYXJjaGl2ZSJdOwogICAgICAgIGNvbnN0IHNvdXJjZVRpZXJJZHggPSB0aWVyT3JkZXIuaW5kZXhPZihzb3VyY2VDb25maWcudGllcik7CiAgICAgICAgY29uc3QgbG93ZXJUaWVycyA9IHRoaXMudm9sdW1lcy5maWx0ZXIoKHYpID0+IHsKICAgICAgICAgICAgY29uc3QgaWR4ID0gdGllck9yZGVyLmluZGV4T2Yodi50aWVyKTsKICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlcy5nZXQodi5uYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGlkeCA+IHNvdXJjZVRpZXJJZHggJiYgc3RhdGU/Lm9ubGluZSAmJiAhc3RhdGUucHJlc3N1cmU7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGxvd2VyVGllcnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGxvZy53YXJuKCJvbi1wcmVzc3VyZTogbm8gbG93ZXIgdGllciBhdmFpbGFibGUiLCB7IHZvbHVtZTogdm9sdW1lTmFtZSB9KTsKICAgICAgICAgICAgbG9nQWN0aXZpdHkoewogICAgICAgICAgICAgICAgc291cmNlOiAic3lzdGVtIiwKICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBTdG9yYWdlIHByZXNzdXJlIG9uICR7dm9sdW1lTmFtZX0gYnV0IG5vIGxvd2VyIHRpZXIgYXZhaWxhYmxlYCwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gbG93ZXJUaWVyc1swXTsKICAgICAgICBsb2dBY3Rpdml0eSh7CiAgICAgICAgICAgIHNvdXJjZTogInN5c3RlbSIsCiAgICAgICAgICAgIHN1bW1hcnk6IGBTdG9yYWdlIHByZXNzdXJlIG9uICR7dm9sdW1lTmFtZX0g4oCUIG1pZ3JhdGluZyBjb2xkIGZpbGVzIHRvICR7dGFyZ2V0Lm5hbWV9YCwKICAgICAgICB9KTsKICAgICAgICBsb2cuaW5mbygib24tcHJlc3N1cmU6IG1pZ3JhdGluZyBjb2xkIGZpbGVzIiwgewogICAgICAgICAgICBmcm9tOiB2b2x1bWVOYW1lLAogICAgICAgICAgICB0bzogdGFyZ2V0Lm5hbWUsCiAgICAgICAgICAgIGJhdGNoOiBNSUdSQVRFX0JBVENIX1NJWkUsCiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIE9OIEFDQ0VTUyDigJQgZmlsZSByZXF1ZXN0ZWQgZnJvbSBhIG5vbi1zcGhlcmUgdm9sdW1lLiBQcm9tb3RlIHRvIHNwaGVyZS4KICAgICAqIEFjY2Vzc2luZyBzb21ldGhpbmcgbWFrZXMgaXQgaG90LiBUaGUgYXNrIGlzIHRoZSBwcm9tb3Rpb24uCiAgICAgKi8KICAgIGFzeW5jIG9uQWNjZXNzKGZpbGVJZCwgY3VycmVudFZvbHVtZSkgewogICAgICAgIGNvbnN0IGN1cnJlbnRDb25maWcgPSB0aGlzLnZvbHVtZXMuZmluZCgodikgPT4gdi5uYW1lID09PSBjdXJyZW50Vm9sdW1lKTsKICAgICAgICBpZiAoIWN1cnJlbnRDb25maWcgfHwgY3VycmVudENvbmZpZy50aWVyID09PSAic3BoZXJlIikKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGNvbnN0IHNwaGVyZSA9IHRoaXMudm9sdW1lcy5maW5kKCh2KSA9PiB2LnRpZXIgPT09ICJzcGhlcmUiKTsKICAgICAgICBpZiAoIXNwaGVyZSB8fCAhdGhpcy5zdGF0ZXMuZ2V0KHNwaGVyZS5uYW1lKT8ub25saW5lKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgLy8gUXVldWUgYSBjb3B5IHRvIHNwaGVyZSAoZG9uJ3QgZGVsZXRlIGZyb20gY3VycmVudCDigJQgYXBwZW5kLW9ubHkpCiAgICAgICAgY29uc3QgZW50cnkgPSB7CiAgICAgICAgICAgIGZpbGVJZCwKICAgICAgICAgICAgY2hlY2tzdW06ICIiLAogICAgICAgICAgICBzb3VyY2VWb2x1bWU6IGN1cnJlbnRWb2x1bWUsCiAgICAgICAgICAgIHRhcmdldFZvbHVtZTogc3BoZXJlLm5hbWUsCiAgICAgICAgICAgIHF1ZXVlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgIHN0YXR1czogInBlbmRpbmciLAogICAgICAgIH07CiAgICAgICAgdGhpcy5yZXBsaWNhdGlvblF1ZXVlLnB1c2goZW50cnkpOwogICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdFF1ZXVlKCk7CiAgICAgICAgYXdhaXQgdGhpcy5kcmFpblF1ZXVlKHNwaGVyZS5uYW1lKTsKICAgICAgICBsb2cuZGVidWcoIm9uLWFjY2VzczogcHJvbW90aW5nIHRvIHNwaGVyZSIsIHsgZmlsZUlkLCBmcm9tOiBjdXJyZW50Vm9sdW1lIH0pOwogICAgfQogICAgLy8g4pSA4pSAIFJlcGxpY2F0aW9uIHF1ZXVlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgYXN5bmMgbG9hZFF1ZXVlKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlYWRGaWxlKHRoaXMucXVldWVQYXRoLCAidXRmLTgiKTsKICAgICAgICAgICAgY29uc3QgbGluZXMgPSByYXcuc3BsaXQoIlxuIikuZmlsdGVyKChsKSA9PiBsLnRyaW0oKSk7CiAgICAgICAgICAgIHRoaXMucmVwbGljYXRpb25RdWV1ZSA9IFtdOwogICAgICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBKU09OLnBhcnNlKGxpbmUpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5zdGF0dXMgPT09ICJwZW5kaW5nIiB8fCBlbnRyeS5zdGF0dXMgPT09ICJpbi1wcm9ncmVzcyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsaWNhdGlvblF1ZXVlLnB1c2goZW50cnkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIHRoaXMucmVwbGljYXRpb25RdWV1ZSA9IFtdOwogICAgICAgIH0KICAgIH0KICAgIGFzeW5jIHBlcnNpc3RRdWV1ZSgpIHsKICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5yZXBsaWNhdGlvblF1ZXVlLmZpbHRlcigocikgPT4gci5zdGF0dXMgPT09ICJwZW5kaW5nIiB8fCByLnN0YXR1cyA9PT0gImluLXByb2dyZXNzIik7CiAgICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZSh0aGlzLnF1ZXVlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICAgIGNvbnN0IGNvbnRlbnQgPSBwZW5kaW5nLm1hcCgocikgPT4gSlNPTi5zdHJpbmdpZnkocikpLmpvaW4oIlxuIikgKyAiXG4iOwogICAgICAgIGF3YWl0IHdyaXRlRmlsZSh0aGlzLnF1ZXVlUGF0aCwgY29udGVudCwgInV0Zi04Iik7CiAgICB9CiAgICAvKiogRHJhaW4gcGVuZGluZyByZXBsaWNhdGlvbnMsIG9wdGlvbmFsbHkgZmlsdGVyZWQgdG8gYSBzcGVjaWZpYyB0YXJnZXQuICovCiAgICBhc3luYyBkcmFpblF1ZXVlKHRhcmdldFZvbHVtZSkgewogICAgICAgIGlmICh0aGlzLmRyYWluaW5nKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5kcmFpbmluZyA9IHRydWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucmVwbGljYXRpb25RdWV1ZS5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSAicGVuZGluZyIgJiYgKCF0YXJnZXRWb2x1bWUgfHwgci50YXJnZXRWb2x1bWUgPT09IHRhcmdldFZvbHVtZSkpOwogICAgICAgICAgICBpZiAocGVuZGluZy5sZW5ndGggPT09IDApCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxvZy5pbmZvKCJEcmFpbmluZyByZXBsaWNhdGlvbiBxdWV1ZSIsIHsgY291bnQ6IHBlbmRpbmcubGVuZ3RoLCB0YXJnZXQ6IHRhcmdldFZvbHVtZSA/PyAiYWxsIiB9KTsKICAgICAgICAgICAgLy8gUHJvY2VzcyBpbiBiYXRjaGVzCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZy5sZW5ndGg7IGkgKz0gUkVQTElDQVRJT05fQ09OQ1VSUkVOQ1kpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gcGVuZGluZy5zbGljZShpLCBpICsgUkVQTElDQVRJT05fQ09OQ1VSUkVOQ1kpOwogICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGJhdGNoLm1hcCgoZW50cnkpID0+IHRoaXMucmVwbGljYXRlRmlsZShlbnRyeSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhd2FpdCB0aGlzLnBlcnNpc3RRdWV1ZSgpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgdGhpcy5kcmFpbmluZyA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIGFzeW5jIHJlcGxpY2F0ZUZpbGUoZW50cnkpIHsKICAgICAgICBlbnRyeS5zdGF0dXMgPSAiaW4tcHJvZ3Jlc3MiOwogICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMudm9sdW1lcy5maW5kKCh2KSA9PiB2Lm5hbWUgPT09IGVudHJ5LnNvdXJjZVZvbHVtZSk7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy52b2x1bWVzLmZpbmQoKHYpID0+IHYubmFtZSA9PT0gZW50cnkudGFyZ2V0Vm9sdW1lKTsKICAgICAgICBpZiAoIXNvdXJjZSB8fCAhdGFyZ2V0KSB7CiAgICAgICAgICAgIGVudHJ5LnN0YXR1cyA9ICJmYWlsZWQiOwogICAgICAgICAgICBlbnRyeS5lcnJvciA9ICJWb2x1bWUgbm90IGZvdW5kIjsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCB0YXJnZXRTdGF0ZSA9IHRoaXMuc3RhdGVzLmdldCh0YXJnZXQubmFtZSk7CiAgICAgICAgaWYgKCF0YXJnZXRTdGF0ZT8ub25saW5lKSB7CiAgICAgICAgICAgIGVudHJ5LnN0YXR1cyA9ICJwZW5kaW5nIjsgLy8gUHV0IGl0IGJhY2sg4oCUIHZvbHVtZSBub3QgcmVhZHkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBGb3Igbm93LCByZXBsaWNhdGlvbiBjb3BpZXMgdGhlIGZpbGUgdG8gdGhlIHNhbWUgcmVsYXRpdmUgcGF0aCBvbiB0aGUgdGFyZ2V0IHZvbHVtZQogICAgICAgICAgICAvLyBUaGUgYWN0dWFsIGZpbGUgcGF0aCByZXNvbHV0aW9uIHdpbGwgaW50ZWdyYXRlIHdpdGggRmlsZVJlZ2lzdHJ5CiAgICAgICAgICAgIGVudHJ5LnN0YXR1cyA9ICJkb25lIjsKICAgICAgICAgICAgbG9nLmRlYnVnKCJGaWxlIHJlcGxpY2F0ZWQiLCB7IGZpbGVJZDogZW50cnkuZmlsZUlkLCB0bzogdGFyZ2V0Lm5hbWUgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgZW50cnkuc3RhdHVzID0gImZhaWxlZCI7CiAgICAgICAgICAgIGVudHJ5LmVycm9yID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpOwogICAgICAgICAgICBsb2cud2FybigiUmVwbGljYXRpb24gZmFpbGVkIiwgeyBmaWxlSWQ6IGVudHJ5LmZpbGVJZCwgdG86IHRhcmdldC5uYW1lLCBlcnJvcjogZW50cnkuZXJyb3IgfSk7CiAgICAgICAgfQogICAgfQogICAgLyoqIENvcHkgdGhlIHJlZ2lzdHJ5IEpTT05MIHRvIGFub3RoZXIgdm9sdW1lIHNvIGl0IGNhbiBzZWxmLXJlY292ZXIuICovCiAgICBhc3luYyByZXBsaWNhdGVSZWdpc3RyeSh0YXJnZXQpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZWdpc3RyeVNvdXJjZSA9IGpvaW4odGhpcy5wcmltYXJ5QnJhaW5EaXIsICJmaWxlcyIsICJyZWdpc3RyeS5qc29ubCIpOwogICAgICAgICAgICBjb25zdCByZWdpc3RyeVRhcmdldCA9IGpvaW4odGFyZ2V0LnBhdGgsICJmaWxlcyIsICJyZWdpc3RyeS5qc29ubCIpOwogICAgICAgICAgICBhd2FpdCBta2RpcihkaXJuYW1lKHJlZ2lzdHJ5VGFyZ2V0KSwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICAgICAgICAgIGF3YWl0IGNvcHlGaWxlKHJlZ2lzdHJ5U291cmNlLCByZWdpc3RyeVRhcmdldCk7CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVnaXN0cnkgcmVwbGljYXRlZCIsIHsgdG86IHRhcmdldC5uYW1lIH0pOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGxvZy53YXJuKCJSZWdpc3RyeSByZXBsaWNhdGlvbiBmYWlsZWQiLCB7IHRvOiB0YXJnZXQubmFtZSwgZXJyb3I6IFN0cmluZyhlcnIpIH0pOwogICAgICAgIH0KICAgIH0KICAgIC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLyoqIEdldCBhbGwgdm9sdW1lIHN0YXRlcy4gKi8KICAgIGdldFN0YXRlcygpIHsKICAgICAgICByZXR1cm4gWy4uLnRoaXMuc3RhdGVzLnZhbHVlcygpXTsKICAgIH0KICAgIC8qKiBHZXQgY29uZmlnIGZvciBhbGwgdm9sdW1lcy4gKi8KICAgIGdldENvbmZpZ3MoKSB7CiAgICAgICAgcmV0dXJuIFsuLi50aGlzLnZvbHVtZXNdOwogICAgfQogICAgLyoqIEdldCB0aGUgc3BoZXJlIHZvbHVtZSAocHJpbWFyeSBob3Qgc3RvcmFnZSkuICovCiAgICBnZXRTcGhlcmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMudm9sdW1lcy5maW5kKCh2KSA9PiB2LnRpZXIgPT09ICJzcGhlcmUiKTsKICAgIH0KICAgIC8qKiBHZXQgb25saW5lIHZvbHVtZXMgb2YgYSBzcGVjaWZpYyB0aWVyLiAqLwogICAgZ2V0T25saW5lQnlUaWVyKHRpZXIpIHsKICAgICAgICByZXR1cm4gdGhpcy52b2x1bWVzLmZpbHRlcigodikgPT4gewogICAgICAgICAgICByZXR1cm4gdi50aWVyID09PSB0aWVyICYmIHRoaXMuc3RhdGVzLmdldCh2Lm5hbWUpPy5vbmxpbmU7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKiogR2V0IHZvbHVtZSBieSBuYW1lLiAqLwogICAgZ2V0Vm9sdW1lKG5hbWUpIHsKICAgICAgICByZXR1cm4gdGhpcy52b2x1bWVzLmZpbmQoKHYpID0+IHYubmFtZSA9PT0gbmFtZSk7CiAgICB9CiAgICAvKiogQ2hlY2sgaWYgYSBzcGVjaWZpYyB2b2x1bWUgaXMgdW5kZXIgcHJlc3N1cmUuICovCiAgICBpc1VuZGVyUHJlc3N1cmUodm9sdW1lTmFtZSkgewogICAgICAgIHJldHVybiB0aGlzLnN0YXRlcy5nZXQodm9sdW1lTmFtZSk/LnByZXNzdXJlID8/IGZhbHNlOwogICAgfQogICAgLyoqIEdldCBjb3VudCBvZiBwZW5kaW5nIHJlcGxpY2F0aW9ucy4gKi8KICAgIGdldFBlbmRpbmdDb3VudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZXBsaWNhdGlvblF1ZXVlLmZpbHRlcigocikgPT4gci5zdGF0dXMgPT09ICJwZW5kaW5nIikubGVuZ3RoOwogICAgfQogICAgLyoqIFJlc29sdmUgdGhlIHBoeXNpY2FsIHBhdGggZm9yIGEgZmlsZSBvbiBhIGdpdmVuIHZvbHVtZS4gKi8KICAgIHJlc29sdmVGaWxlUGF0aCh2b2x1bWUsIHJlbGF0aXZlUGF0aCkgewogICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMudm9sdW1lcy5maW5kKCh2KSA9PiB2Lm5hbWUgPT09IHZvbHVtZSk7CiAgICAgICAgaWYgKCFjb25maWcpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiBqb2luKGNvbmZpZy5wYXRoLCByZWxhdGl2ZVBhdGgpOwogICAgfQogICAgLyoqIEZpbmQgd2hpY2ggb25saW5lIHZvbHVtZSBoYXMgYSBmaWxlIChieSBjaGVja2luZyBleGlzdGVuY2UpLiAqLwogICAgYXN5bmMgbG9jYXRlRmlsZShyZWxhdGl2ZVBhdGgpIHsKICAgICAgICAvLyBDaGVjayBzcGhlcmUgZmlyc3QgKGZhc3Rlc3QgYWNjZXNzKQogICAgICAgIGNvbnN0IG9yZGVyZWQgPSBbLi4udGhpcy52b2x1bWVzXS5zb3J0KChhLCBiKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRpZXJPcmRlciA9IFsic3BoZXJlIiwgIndhcm0iLCAiYXJjaGl2ZSJdOwogICAgICAgICAgICByZXR1cm4gdGllck9yZGVyLmluZGV4T2YoYS50aWVyKSAtIHRpZXJPcmRlci5pbmRleE9mKGIudGllcik7CiAgICAgICAgfSk7CiAgICAgICAgZm9yIChjb25zdCB2b2wgb2Ygb3JkZXJlZCkgewogICAgICAgICAgICBpZiAoIXRoaXMuc3RhdGVzLmdldCh2b2wubmFtZSk/Lm9ubGluZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgYXdhaXQgc3RhdChqb2luKHZvbC5wYXRoLCByZWxhdGl2ZVBhdGgpKTsKICAgICAgICAgICAgICAgIHJldHVybiB2b2wubmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQovLyMgc291cmNlTWFwcGluZ1VSTD1tYW5hZ2VyLmpzLm1hcA==","volumes/types.js":"LyoqCiAqIFZvbHVtZSB0eXBlcyDigJQgbXVsdGktdm9sdW1lIGJyYWluIHN0b3JhZ2Ugd2l0aCBldmVudC1kcml2ZW4gdGllcmluZy4KICoKICogVGhyZWUgdGllcnM6IHNwaGVyZSAoaG90KSwgd2FybSwgYXJjaGl2ZSAoY29sZCkuCiAqIE5vIHRpbWVycy4gVHJpZ2dlcnMgYXJlOiBvbi13cml0ZSwgb24tY29ubmVjdCwgb24tcHJlc3N1cmUsIG9uLWFjY2Vzcywgb24tZGlzY29ubmVjdC4KICovCmV4cG9ydCB7fTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFw","credentials/store.js":"LyoqCiAqIENyZWRlbnRpYWxzIHN0b3JlIOKAlCBhcHBlbmQtb25seSBlbmNyeXB0ZWQgSlNPTkwgcGVyc2lzdGVuY2UgZm9yIHNlY3JldHMuCiAqIEZvbGxvd3MgQ29udGFjdFN0b3JlIHBhdHRlcm4gKHNyYy9jb250YWN0cy9zdG9yZS50cykuCiAqCiAqIEZpbGU6IGJyYWluL3ZhdWx0L2NyZWRlbnRpYWxzLmVuYy5qc29ubAogKiBVcGRhdGUgc3RyYXRlZ3k6IGFwcGVuZCBmdWxsIHVwZGF0ZWQgcmVjb3JkLiBPbiBsb2FkLCBsYXN0IG9jY3VycmVuY2UgcGVyIGlkIHdpbnMuCiAqIFZhbHVlcyBzdG9yZWQgZGlyZWN0bHkgKGVuY3J5cHRlZCBhdCByZXN0IHZpYSBicmFpbi1pbykuCiAqLwppbXBvcnQgeyBqb2luIH0gZnJvbSAibm9kZTpwYXRoIjsKaW1wb3J0IHsgc3RhdCB9IGZyb20gIm5vZGU6ZnMvcHJvbWlzZXMiOwppbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICIuLi91dGlscy9sb2dnZXIuanMiOwppbXBvcnQgeyByZWFkQnJhaW5MaW5lcywgYXBwZW5kQnJhaW5MaW5lLCBlbnN1cmVCcmFpbkpzb25sIH0gZnJvbSAiLi4vbGliL2JyYWluLWlvLmpzIjsKaW1wb3J0IHsgc2hvdWxkSHlkcmF0ZUtleSB9IGZyb20gIi4uL2ludGVncmF0aW9ucy9nYXRlLmpzIjsKY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCJjcmVkZW50aWFscy5zdG9yZSIpOwpjb25zdCBTQ0hFTUEgPSBKU09OLnN0cmluZ2lmeSh7IF9zY2hlbWE6ICJjcmVkZW50aWFscyIsIF92ZXJzaW9uOiAiMS4wIiB9KTsKLy8g4pSA4pSAIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIGdlbmVyYXRlSWQoKSB7CiAgICBjb25zdCB0cyA9IERhdGUubm93KCk7CiAgICBjb25zdCBoZXggPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zbGljZSgyLCAxMCkucGFkRW5kKDgsICIwIik7CiAgICByZXR1cm4gYGNyZWRfJHt0c31fJHtoZXh9YDsKfQovKiogTWFzayBhIHNlY3JldCB2YWx1ZTogc2hvdyBmaXJzdCA0ICsgbGFzdCA0IHdpdGggKioqKiBpbiBiZXR3ZWVuLCBvciDigKLigKLigKLigKLigKLigKLigKLigKIgaWYgc2hvcnQuICovCmV4cG9ydCBmdW5jdGlvbiBtYXNrVmFsdWUodmFsKSB7CiAgICBpZiAoIXZhbCkKICAgICAgICByZXR1cm4gIuKAouKAouKAouKAouKAouKAouKAouKAoiI7CiAgICBpZiAodmFsLmxlbmd0aCA8IDEyKQogICAgICAgIHJldHVybiAi4oCi4oCi4oCi4oCi4oCi4oCi4oCi4oCiIjsKICAgIHJldHVybiB2YWwuc2xpY2UoMCwgNCkgKyAiKioqKiIgKyB2YWwuc2xpY2UoLTQpOwp9Ci8vIOKUgOKUgCBTdG9yZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGNsYXNzIENyZWRlbnRpYWxTdG9yZSB7CiAgICBmaWxlUGF0aDsKICAgIGNhY2hlID0gbnVsbDsKICAgIG10aW1lID0gMDsKICAgIGxhc3RTdGFsZUNoZWNrTXMgPSAwOwogICAgY29uc3RydWN0b3IoYnJhaW5EaXIpIHsKICAgICAgICB0aGlzLmZpbGVQYXRoID0gam9pbihicmFpbkRpciwgInZhdWx0IiwgImNyZWRlbnRpYWxzLmVuYy5qc29ubCIpOwogICAgfQogICAgLy8g4pSA4pSAIEZpbGUgbWFuYWdlbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGFzeW5jIGVuc3VyZUZpbGUoKSB7CiAgICAgICAgYXdhaXQgZW5zdXJlQnJhaW5Kc29ubCh0aGlzLmZpbGVQYXRoLCBTQ0hFTUEpOwogICAgfQogICAgYXN5bmMgY2hlY2tTdGFsZSgpIHsKICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIGlmIChub3cgLSB0aGlzLmxhc3RTdGFsZUNoZWNrTXMgPCA1MDAwKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5sYXN0U3RhbGVDaGVja01zID0gbm93OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzID0gYXdhaXQgc3RhdCh0aGlzLmZpbGVQYXRoKTsKICAgICAgICAgICAgICAgIGlmIChzLm10aW1lTXMgPiB0aGlzLm10aW1lKQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgLy8gRmlsZSBtYXkgbm90IGV4aXN0IHlldAogICAgICAgIH0KICAgIH0KICAgIC8vIOKUgOKUgCBMb2FkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgYXN5bmMgbG9hZCgpIHsKICAgICAgICBhd2FpdCB0aGlzLmNoZWNrU3RhbGUoKTsKICAgICAgICBpZiAodGhpcy5jYWNoZSkKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGU7CiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVGaWxlKCk7CiAgICAgICAgY29uc3QgbGluZXMgPSBhd2FpdCByZWFkQnJhaW5MaW5lcyh0aGlzLmZpbGVQYXRoKTsKICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxpbmUpOwogICAgICAgICAgICAgICAgaWYgKG9iai5fc2NoZW1hKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgaWYgKCFvYmouaWQpCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICBtYXAuc2V0KG9iai5pZCwgb2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmNhY2hlID0gbWFwOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHMgPSBhd2FpdCBzdGF0KHRoaXMuZmlsZVBhdGgpOwogICAgICAgICAgICB0aGlzLm10aW1lID0gcy5tdGltZU1zOwogICAgICAgIH0KICAgICAgICBjYXRjaCB7IC8qIG9rICovIH0KICAgICAgICByZXR1cm4gbWFwOwogICAgfQogICAgaW52YWxpZGF0ZSgpIHsgdGhpcy5jYWNoZSA9IG51bGw7IH0KICAgIC8vIOKUgOKUgCBDUlVEIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgYXN5bmMgbGlzdChmaWx0ZXIpIHsKICAgICAgICBjb25zdCBtYXAgPSBhd2FpdCB0aGlzLmxvYWQoKTsKICAgICAgICBsZXQgY3JlZHMgPSBBcnJheS5mcm9tKG1hcC52YWx1ZXMoKSk7CiAgICAgICAgaWYgKGZpbHRlcj8udHlwZSkgewogICAgICAgICAgICBjcmVkcyA9IGNyZWRzLmZpbHRlcigoYykgPT4gYy50eXBlID09PSBmaWx0ZXIudHlwZSk7CiAgICAgICAgfQogICAgICAgIGlmIChmaWx0ZXI/LnN0YXR1cykgewogICAgICAgICAgICBjcmVkcyA9IGNyZWRzLmZpbHRlcigoYykgPT4gYy5zdGF0dXMgPT09IGZpbHRlci5zdGF0dXMpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY3JlZHMgPSBjcmVkcy5maWx0ZXIoKGMpID0+IGMuc3RhdHVzICE9PSAiYXJjaGl2ZWQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZpbHRlcj8uc2VhcmNoKSB7CiAgICAgICAgICAgIGNvbnN0IHEgPSBmaWx0ZXIuc2VhcmNoLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGNyZWRzID0gY3JlZHMuZmlsdGVyKChjKSA9PiBjLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fAogICAgICAgICAgICAgICAgYy5zZXJ2aWNlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHwKICAgICAgICAgICAgICAgIGMudGFncy5zb21lKCh0KSA9PiB0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpKTsKICAgICAgICB9CiAgICAgICAgY3JlZHMuc29ydCgoYSwgYikgPT4gYS5zZXJ2aWNlLmxvY2FsZUNvbXBhcmUoYi5zZXJ2aWNlKSB8fCBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTsKICAgICAgICByZXR1cm4gY3JlZHM7CiAgICB9CiAgICBhc3luYyBnZXQoaWQpIHsKICAgICAgICBjb25zdCBtYXAgPSBhd2FpdCB0aGlzLmxvYWQoKTsKICAgICAgICByZXR1cm4gbWFwLmdldChpZCkgPz8gbnVsbDsKICAgIH0KICAgIGFzeW5jIGNyZWF0ZShvcHRzKSB7CiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwogICAgICAgIGNvbnN0IGNyZWQgPSB7CiAgICAgICAgICAgIGlkOiBnZW5lcmF0ZUlkKCksCiAgICAgICAgICAgIG5hbWU6IG9wdHMubmFtZSwKICAgICAgICAgICAgc2VydmljZTogb3B0cy5zZXJ2aWNlLAogICAgICAgICAgICB0eXBlOiBvcHRzLnR5cGUsCiAgICAgICAgICAgIHZhbHVlOiBvcHRzLnZhbHVlLAogICAgICAgICAgICBlbnZWYXI6IG9wdHMuZW52VmFyLAogICAgICAgICAgICBub3Rlczogb3B0cy5ub3RlcywKICAgICAgICAgICAgdGFnczogb3B0cy50YWdzID8/IFtdLAogICAgICAgICAgICBzdGF0dXM6ICJhY3RpdmUiLAogICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdywKICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csCiAgICAgICAgfTsKICAgICAgICBhd2FpdCBhcHBlbmRCcmFpbkxpbmUodGhpcy5maWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY3JlZCkpOwogICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpOwogICAgICAgIGxvZy5pbmZvKGBDcmVhdGVkIGNyZWRlbnRpYWwgJHtjcmVkLmlkfTogJHtjcmVkLm5hbWV9ICgke2NyZWQuc2VydmljZX0pYCk7CiAgICAgICAgcmV0dXJuIGNyZWQ7CiAgICB9CiAgICBhc3luYyB1cGRhdGUoaWQsIGNoYW5nZXMpIHsKICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0KGlkKTsKICAgICAgICBpZiAoIWV4aXN0aW5nKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBjb25zdCB1cGRhdGVkID0gewogICAgICAgICAgICAuLi5leGlzdGluZywKICAgICAgICAgICAgLi4uY2hhbmdlcywKICAgICAgICAgICAgdXBkYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgfTsKICAgICAgICBhd2FpdCBhcHBlbmRCcmFpbkxpbmUodGhpcy5maWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkodXBkYXRlZCkpOwogICAgICAgIHRoaXMuaW52YWxpZGF0ZSgpOwogICAgICAgIGxvZy5pbmZvKGBVcGRhdGVkIGNyZWRlbnRpYWwgJHtpZH06ICR7dXBkYXRlZC5uYW1lfWApOwogICAgICAgIHJldHVybiB1cGRhdGVkOwogICAgfQogICAgYXN5bmMgYXJjaGl2ZShpZCkgewogICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShpZCwgeyBzdGF0dXM6ICJhcmNoaXZlZCIgfSk7CiAgICB9CiAgICAvLyDilIDilIAgSHlkcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8qKiBJbmplY3QgY3JlZGVudGlhbHMgd2l0aCBlbnZWYXIgaW50byBwcm9jZXNzLmVudiwgZmlsdGVyZWQgYnkgaW50ZWdyYXRpb24gZ2F0ZS4gKi8KICAgIGFzeW5jIGh5ZHJhdGUoKSB7CiAgICAgICAgY29uc3QgbWFwID0gYXdhaXQgdGhpcy5sb2FkKCk7CiAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICBsZXQgc2tpcHBlZCA9IDA7CiAgICAgICAgZm9yIChjb25zdCBjcmVkIG9mIG1hcC52YWx1ZXMoKSkgewogICAgICAgICAgICBpZiAoY3JlZC5zdGF0dXMgPT09ICJhY3RpdmUiICYmIGNyZWQuZW52VmFyICYmIGNyZWQudmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmIChzaG91bGRIeWRyYXRlS2V5KGNyZWQuZW52VmFyKSkgewogICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52W2NyZWQuZW52VmFyXSA9IGNyZWQudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEFjdGl2ZWx5IHJlbW92ZSBibG9ja2VkIGtleXMgZnJvbSBwcm9jZXNzLmVudgogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudltjcmVkLmVudlZhcl07CiAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjb3VudCA+IDApCiAgICAgICAgICAgIGxvZy5pbmZvKGBIeWRyYXRlZCAke2NvdW50fSBjcmVkZW50aWFsKHMpIGludG8gcHJvY2Vzcy5lbnZgKTsKICAgICAgICBpZiAoc2tpcHBlZCA+IDApCiAgICAgICAgICAgIGxvZy5pbmZvKGBTa2lwcGVkICR7c2tpcHBlZH0gY3JlZGVudGlhbChzKSDigJQgaW50ZWdyYXRpb24gZGlzYWJsZWRgKTsKICAgICAgICByZXR1cm4gY291bnQ7CiAgICB9Cn0KLy8g4pSA4pSAIFNpbmdsZXRvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKbGV0IF9zdG9yZSA9IG51bGw7CmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDcmVkZW50aWFsU3RvcmUoYnJhaW5EaXIpIHsKICAgIGlmIChfc3RvcmUpCiAgICAgICAgcmV0dXJuIF9zdG9yZTsKICAgIF9zdG9yZSA9IG5ldyBDcmVkZW50aWFsU3RvcmUoYnJhaW5EaXIpOwogICAgcmV0dXJuIF9zdG9yZTsKfQpleHBvcnQgZnVuY3Rpb24gZ2V0Q3JlZGVudGlhbFN0b3JlKCkgewogICAgcmV0dXJuIF9zdG9yZTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1zdG9yZS5qcy5tYXA=","files/gdrive.js":"LyoqCiAqIEdvb2dsZSBEcml2ZSBzeW5jIGVuZ2luZSDigJQgREFTSC02NS4KICogT25lLXdheSBiYWNrdXAgKHB1c2gpIG9yIHR3by13YXkgbWlycm9yIG1vZGUuCiAqIFVzZXMgZXhpc3RpbmcgR29vZ2xlIE9BdXRoIGZyb20gc3JjL2dvb2dsZS9hdXRoLnRzLgogKiBUcmFja2VkIHN0YXRlIGluIGJyYWluL2ZpbGVzL2dkcml2ZS1zeW5jLmpzb25sLgogKi8KaW1wb3J0IHsgcmVhZEZpbGUsIGFwcGVuZEZpbGUsIHdyaXRlRmlsZSwgbWtkaXIgfSBmcm9tICJub2RlOmZzL3Byb21pc2VzIjsKaW1wb3J0IHsgam9pbiwgZGlybmFtZSB9IGZyb20gIm5vZGU6cGF0aCI7CmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gIi4uL3V0aWxzL2xvZ2dlci5qcyI7CmltcG9ydCB7IGdldEFjY2Vzc1Rva2VuLCBpc0dvb2dsZUF1dGhlbnRpY2F0ZWQgfSBmcm9tICIuLi9nb29nbGUvYXV0aC5qcyI7CmNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcigiZmlsZXMuZ2RyaXZlIik7CmNvbnN0IERSSVZFX0FQSSA9ICJodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9kcml2ZS92MyI7CmNvbnN0IERSSVZFX1VQTE9BRF9BUEkgPSAiaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vdXBsb2FkL2RyaXZlL3YzIjsKY29uc3QgU1lOQ19TQ0hFTUEgPSBKU09OLnN0cmluZ2lmeSh7IF9zY2hlbWE6ICJnZHJpdmVfc3luYyIsIHZlcnNpb246IDEgfSk7Ci8vIOKUgOKUgCBTeW5jIHN0YXRlIHBlcnNpc3RlbmNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgY2xhc3MgR0RyaXZlU3luY1N0b3JlIHsKICAgIGNhY2hlID0gbnVsbDsKICAgIGZpbGVQYXRoOwogICAgY29uc3RydWN0b3IoYnJhaW5EaXIpIHsKICAgICAgICB0aGlzLmZpbGVQYXRoID0gam9pbihicmFpbkRpciwgImZpbGVzIiwgImdkcml2ZS1zeW5jLmpzb25sIik7CiAgICB9CiAgICBhc3luYyBlbnN1cmVGaWxlKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF3YWl0IHJlYWRGaWxlKHRoaXMuZmlsZVBhdGgsICJ1dGYtOCIpOwogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUodGhpcy5maWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICAgICAgICBhd2FpdCBhcHBlbmRGaWxlKHRoaXMuZmlsZVBhdGgsIFNZTkNfU0NIRU1BICsgIlxuIiwgInV0Zi04Iik7CiAgICAgICAgfQogICAgfQogICAgYXN5bmMgbG9hZCgpIHsKICAgICAgICBpZiAodGhpcy5jYWNoZSkKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGU7CiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVGaWxlKCk7CiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUodGhpcy5maWxlUGF0aCwgInV0Zi04Iik7CiAgICAgICAgY29uc3QgbGluZXMgPSByYXcuc3BsaXQoIlxuIikuZmlsdGVyKChsKSA9PiBsLnRyaW0oKS5sZW5ndGggPiAwKTsKICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGxpbmUpOwogICAgICAgICAgICAgICAgaWYgKG9iai5fc2NoZW1hKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgbWFwLnNldChvYmouZmlsZUlkLCBvYmopOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuY2FjaGUgPSBtYXA7CiAgICAgICAgcmV0dXJuIG1hcDsKICAgIH0KICAgIGFzeW5jIGdldChmaWxlSWQpIHsKICAgICAgICBjb25zdCBtYXAgPSBhd2FpdCB0aGlzLmxvYWQoKTsKICAgICAgICByZXR1cm4gbWFwLmdldChmaWxlSWQpID8/IG51bGw7CiAgICB9CiAgICBhc3luYyBzZXQoZW50cnkpIHsKICAgICAgICBjb25zdCBtYXAgPSBhd2FpdCB0aGlzLmxvYWQoKTsKICAgICAgICBtYXAuc2V0KGVudHJ5LmZpbGVJZCwgZW50cnkpOwogICAgICAgIGF3YWl0IGFwcGVuZEZpbGUodGhpcy5maWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoZW50cnkpICsgIlxuIiwgInV0Zi04Iik7CiAgICB9CiAgICBhc3luYyBsaXN0KCkgewogICAgICAgIGNvbnN0IG1hcCA9IGF3YWl0IHRoaXMubG9hZCgpOwogICAgICAgIHJldHVybiBbLi4ubWFwLnZhbHVlcygpXTsKICAgIH0KICAgIGFzeW5jIGNvbXBhY3QoKSB7CiAgICAgICAgY29uc3QgbWFwID0gYXdhaXQgdGhpcy5sb2FkKCk7CiAgICAgICAgY29uc3QgbGluZXMgPSBbU1lOQ19TQ0hFTUEsIC4uLlsuLi5tYXAudmFsdWVzKCldLm1hcCgoZSkgPT4gSlNPTi5zdHJpbmdpZnkoZSkpXTsKICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGhpcy5maWxlUGF0aCwgbGluZXMuam9pbigiXG4iKSArICJcbiIsICJ1dGYtOCIpOwogICAgfQp9CmFzeW5jIGZ1bmN0aW9uIGRyaXZlUmVxdWVzdChtZXRob2QsIHVybCwgYm9keSwgY29udGVudFR5cGUpIHsKICAgIGNvbnN0IGF1dGggPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbigpOwogICAgaWYgKCFhdXRoLm9rKQogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYXV0aC5tZXNzYWdlIH07CiAgICB0cnkgewogICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7CiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoLnRva2VufWAsCiAgICAgICAgfTsKICAgICAgICBpZiAoY29udGVudFR5cGUpCiAgICAgICAgICAgIGhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gY29udGVudFR5cGU7CiAgICAgICAgY29uc3QgZmV0Y2hPcHRzID0geyBtZXRob2QsIGhlYWRlcnMgfTsKICAgICAgICBpZiAoYm9keSkgewogICAgICAgICAgICBmZXRjaE9wdHMuYm9keSA9IGJvZHkgaW5zdGFuY2VvZiBCdWZmZXIKICAgICAgICAgICAgICAgID8gYm9keQogICAgICAgICAgICAgICAgOiB0eXBlb2YgYm9keSA9PT0gInN0cmluZyIKICAgICAgICAgICAgICAgICAgICA/IGJvZHkKICAgICAgICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KGJvZHkpOwogICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlICYmIHR5cGVvZiBib2R5ID09PSAib2JqZWN0IiAmJiAhKGJvZHkgaW5zdGFuY2VvZiBCdWZmZXIpKSB7CiAgICAgICAgICAgICAgICBoZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgLi4uZmV0Y2hPcHRzLCBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoMzBfMDAwKSB9KTsKICAgICAgICBpZiAoIXJlcy5vaykgewogICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKTsKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgRHJpdmUgQVBJIGVycm9yICgke3Jlcy5zdGF0dXN9KTogJHt0ZXh0fWAgfTsKICAgICAgICB9CiAgICAgICAgLy8gU29tZSByZXF1ZXN0cyByZXR1cm4gZW1wdHkgYm9keSAoMjA0KQogICAgICAgIGNvbnN0IHJlc1RleHQgPSBhd2FpdCByZXMudGV4dCgpOwogICAgICAgIGNvbnN0IGRhdGEgPSByZXNUZXh0ID8gSlNPTi5wYXJzZShyZXNUZXh0KSA6IHVuZGVmaW5lZDsKICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgZGF0YSwgbWVzc2FnZTogIk9LIiB9OwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYERyaXZlIHJlcXVlc3QgZmFpbGVkOiAke2Vyci5tZXNzYWdlfWAgfTsKICAgIH0KfQovLyDilIDilIAgVXBsb2FkIHRvIERyaXZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAovKioKICogVXBsb2FkIGEgZmlsZSB0byBHb29nbGUgRHJpdmUuCiAqIFVzZXMgc2ltcGxlIHVwbG9hZCBmb3IgZmlsZXMgPCA1TUIsIHJlc3VtYWJsZSBmb3IgbGFyZ2VyLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwbG9hZFRvRHJpdmUoZmlsZVBhdGgsIGZpbGVOYW1lLCBtaW1lVHlwZSwgZm9sZGVySWQpIHsKICAgIGlmICghaXNHb29nbGVBdXRoZW50aWNhdGVkKCkpIHsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6ICJHb29nbGUgbm90IGF1dGhlbnRpY2F0ZWQiIH07CiAgICB9CiAgICB0cnkgewogICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHJlYWRGaWxlKGZpbGVQYXRoKTsKICAgICAgICAvLyBNdWx0aXBhcnQgdXBsb2FkOiBtZXRhZGF0YSArIGZpbGUgY29udGVudAogICAgICAgIGNvbnN0IGJvdW5kYXJ5ID0gImRhc2hfZmlsZV91cGxvYWRfYm91bmRhcnkiOwogICAgICAgIGNvbnN0IG1ldGFkYXRhID0geyBuYW1lOiBmaWxlTmFtZSwgbWltZVR5cGUgfTsKICAgICAgICBpZiAoZm9sZGVySWQpCiAgICAgICAgICAgIG1ldGFkYXRhLnBhcmVudHMgPSBbZm9sZGVySWRdOwogICAgICAgIGNvbnN0IG1ldGFQYXJ0ID0gSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpOwogICAgICAgIGNvbnN0IGJvZHkgPSBCdWZmZXIuY29uY2F0KFsKICAgICAgICAgICAgQnVmZmVyLmZyb20oYC0tJHtib3VuZGFyeX1cclxuQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04XHJcblxyXG5gKSwKICAgICAgICAgICAgQnVmZmVyLmZyb20obWV0YVBhcnQpLAogICAgICAgICAgICBCdWZmZXIuZnJvbShgXHJcbi0tJHtib3VuZGFyeX1cclxuQ29udGVudC1UeXBlOiAke21pbWVUeXBlfVxyXG5cclxuYCksCiAgICAgICAgICAgIGJ1ZmZlciwKICAgICAgICAgICAgQnVmZmVyLmZyb20oYFxyXG4tLSR7Ym91bmRhcnl9LS1gKSwKICAgICAgICBdKTsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkcml2ZVJlcXVlc3QoIlBPU1QiLCBgJHtEUklWRV9VUExPQURfQVBJfS9maWxlcz91cGxvYWRUeXBlPW11bHRpcGFydGAsIGJvZHksIGBtdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9JHtib3VuZGFyeX1gKTsKICAgICAgICBpZiAoIXJlc3VsdC5vaykKICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9OwogICAgICAgIGxvZy5pbmZvKCJmaWxlIHVwbG9hZGVkIHRvIERyaXZlIiwgeyBmaWxlTmFtZSwgZHJpdmVGaWxlSWQ6IHJlc3VsdC5kYXRhPy5pZCB9KTsKICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgZHJpdmVGaWxlSWQ6IHJlc3VsdC5kYXRhPy5pZCwgbWVzc2FnZTogIlVwbG9hZGVkIHRvIERyaXZlIiB9OwogICAgfQogICAgY2F0Y2ggKGVycikgewogICAgICAgIGxvZy5lcnJvcigiRHJpdmUgdXBsb2FkIGZhaWxlZCIsIHsgZmlsZU5hbWUsIGVycm9yOiBlcnIubWVzc2FnZSB9KTsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIG1lc3NhZ2U6IGBVcGxvYWQgZmFpbGVkOiAke2Vyci5tZXNzYWdlfWAgfTsKICAgIH0KfQovKioKICogVXBkYXRlIGFuIGV4aXN0aW5nIGZpbGUgb24gR29vZ2xlIERyaXZlLgogKi8KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU9uRHJpdmUoZHJpdmVGaWxlSWQsIGZpbGVQYXRoLCBtaW1lVHlwZSkgewogICAgaWYgKCFpc0dvb2dsZUF1dGhlbnRpY2F0ZWQoKSkgewogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogIkdvb2dsZSBub3QgYXV0aGVudGljYXRlZCIgfTsKICAgIH0KICAgIHRyeSB7CiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgpOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRyaXZlUmVxdWVzdCgiUEFUQ0giLCBgJHtEUklWRV9VUExPQURfQVBJfS9maWxlcy8ke2RyaXZlRmlsZUlkfT91cGxvYWRUeXBlPW1lZGlhYCwgYnVmZmVyLCBtaW1lVHlwZSk7CiAgICAgICAgaWYgKCFyZXN1bHQub2spCiAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgfTsKICAgICAgICBsb2cuaW5mbygiZmlsZSB1cGRhdGVkIG9uIERyaXZlIiwgeyBkcml2ZUZpbGVJZCB9KTsKICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgbWVzc2FnZTogIlVwZGF0ZWQgb24gRHJpdmUiIH07CiAgICB9CiAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgbG9nLmVycm9yKCJEcml2ZSB1cGRhdGUgZmFpbGVkIiwgeyBkcml2ZUZpbGVJZCwgZXJyb3I6IGVyci5tZXNzYWdlIH0pOwogICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogYFVwZGF0ZSBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCB9OwogICAgfQp9Ci8vIOKUgOKUgCBTeW5jIGVuZ2luZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKLyoqCiAqIFJ1biBhIHN5bmMgY3ljbGU6IHB1c2ggbG9jYWwgZmlsZXMgdG8gRHJpdmUgdGhhdCBoYXZlbid0IGJlZW4gc3luY2VkCiAqIG9yIGhhdmUgY2hhbmdlZCBzaW5jZSBsYXN0IHN5bmMuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gc3luY1RvRHJpdmUoZmlsZVN0b3JlLCBzeW5jU3RvcmUsIHN0b3JhZ2VSb290LCBzZXR0aW5ncykgewogICAgaWYgKCFzZXR0aW5ncy5zeW5jRW5hYmxlZCB8fCAhaXNHb29nbGVBdXRoZW50aWNhdGVkKCkpIHsKICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIHN5bmNlZDogMCwgZXJyb3JzOiAwLCBtZXNzYWdlOiAiU3luYyBub3QgZW5hYmxlZCBvciBub3QgYXV0aGVudGljYXRlZCIgfTsKICAgIH0KICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZmlsZVN0b3JlLmxpc3QoewogICAgICAgIHN0YXR1czogImFjdGl2ZSIsCiAgICB9KTsKICAgIC8vIE9ubHkgc3luYyB1c2VyIHVwbG9hZHMgYW5kIGFnZW50LWdlbmVyYXRlZCBmaWxlcwogICAgY29uc3Qgc3luY2FibGUgPSBmaWxlcy5maWx0ZXIoKGYpID0+IGYub3JpZ2luID09PSAidXNlci11cGxvYWQiIHx8IGYub3JpZ2luID09PSAiYWdlbnQiKTsKICAgIGxldCBzeW5jZWQgPSAwOwogICAgbGV0IGVycm9ycyA9IDA7CiAgICBmb3IgKGNvbnN0IGZpbGUgb2Ygc3luY2FibGUpIHsKICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN5bmNTdG9yZS5nZXQoZmlsZS5pZCk7CiAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IHN5bmNlZCBhbmQgY2hlY2tzdW0gbWF0Y2hlcwogICAgICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZy5sb2NhbENoZWNrc3VtID09PSBmaWxlLmNoZWNrc3VtKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oc3RvcmFnZVJvb3QsIGZpbGUuc3RvcmFnZVBhdGgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChleGlzdGluZz8uZHJpdmVGaWxlSWQpIHsKICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBEcml2ZSBmaWxlCiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGRhdGVPbkRyaXZlKGV4aXN0aW5nLmRyaXZlRmlsZUlkLCBmaWxlUGF0aCwgZmlsZS5taW1lVHlwZSk7CiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5vaykgewogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJzeW5jIHVwZGF0ZSBmYWlsZWQiLCB7IGZpbGVJZDogZmlsZS5pZCwgZXJyb3I6IHJlc3VsdC5tZXNzYWdlIH0pOwogICAgICAgICAgICAgICAgICAgIGVycm9ycysrOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYXdhaXQgc3luY1N0b3JlLnNldCh7CiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBmaWxlLmlkLAogICAgICAgICAgICAgICAgICAgIGRyaXZlRmlsZUlkOiBleGlzdGluZy5kcml2ZUZpbGVJZCwKICAgICAgICAgICAgICAgICAgICBkcml2ZVZlcnNpb246IChleGlzdGluZy5kcml2ZVZlcnNpb24gPz8gMCkgKyAxLAogICAgICAgICAgICAgICAgICAgIGxvY2FsQ2hlY2tzdW06IGZpbGUuY2hlY2tzdW0sCiAgICAgICAgICAgICAgICAgICAgc3luY2VkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICJwdXNoIiwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gVXBsb2FkIG5ldyBmaWxlCiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGxvYWRUb0RyaXZlKGZpbGVQYXRoLCBmaWxlLm5hbWUsIGZpbGUubWltZVR5cGUsIHNldHRpbmdzLmZvbGRlcklkKTsKICAgICAgICAgICAgICAgIGlmICghcmVzdWx0Lm9rIHx8ICFyZXN1bHQuZHJpdmVGaWxlSWQpIHsKICAgICAgICAgICAgICAgICAgICBsb2cud2Fybigic3luYyB1cGxvYWQgZmFpbGVkIiwgeyBmaWxlSWQ6IGZpbGUuaWQsIGVycm9yOiByZXN1bHQubWVzc2FnZSB9KTsKICAgICAgICAgICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGF3YWl0IHN5bmNTdG9yZS5zZXQoewogICAgICAgICAgICAgICAgICAgIGZpbGVJZDogZmlsZS5pZCwKICAgICAgICAgICAgICAgICAgICBkcml2ZUZpbGVJZDogcmVzdWx0LmRyaXZlRmlsZUlkLAogICAgICAgICAgICAgICAgICAgIGRyaXZlVmVyc2lvbjogMSwKICAgICAgICAgICAgICAgICAgICBsb2NhbENoZWNrc3VtOiBmaWxlLmNoZWNrc3VtLAogICAgICAgICAgICAgICAgICAgIHN5bmNlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAicHVzaCIsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhd2FpdCBmaWxlU3RvcmUubG9nRXZlbnQoZmlsZS5pZCwgInN5bmNlZCIsICJzeXN0ZW0iLCAiUHVzaGVkIHRvIEdvb2dsZSBEcml2ZSIpOwogICAgICAgICAgICBzeW5jZWQrKzsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICBsb2cuZXJyb3IoInN5bmMgZXJyb3IgZm9yIGZpbGUiLCB7IGZpbGVJZDogZmlsZS5pZCwgZXJyb3I6IGVyci5tZXNzYWdlIH0pOwogICAgICAgICAgICBlcnJvcnMrKzsKICAgICAgICB9CiAgICB9CiAgICBsb2cuaW5mbygiRHJpdmUgc3luYyBjb21wbGV0ZWQiLCB7IHN5bmNlZCwgZXJyb3JzLCB0b3RhbDogc3luY2FibGUubGVuZ3RoIH0pOwogICAgcmV0dXJuIHsgb2s6IHRydWUsIHN5bmNlZCwgZXJyb3JzLCBtZXNzYWdlOiBgU3luY2VkICR7c3luY2VkfSBmaWxlcywgJHtlcnJvcnN9IGVycm9yc2AgfTsKfQovKioKICogR2V0IERyaXZlIHN5bmMgc3RhdHVzIGZvciByZXBvcnRpbmcuCiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RHJpdmVTeW5jU3RhdHVzKHN5bmNTdG9yZSwgc2V0dGluZ3MpIHsKICAgIGNvbnN0IGNvbm5lY3RlZCA9IGlzR29vZ2xlQXV0aGVudGljYXRlZCgpOwogICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHN5bmNTdG9yZS5saXN0KCk7CiAgICBjb25zdCBsYXN0U3luYyA9IGVudHJpZXMubGVuZ3RoID4gMAogICAgICAgID8gZW50cmllcy5yZWR1Y2UoKGxhdGVzdCwgZSkgPT4gKGUuc3luY2VkQXQgPiBsYXRlc3QgPyBlLnN5bmNlZEF0IDogbGF0ZXN0KSwgIiIpCiAgICAgICAgOiBudWxsOwogICAgcmV0dXJuIHsKICAgICAgICBjb25uZWN0ZWQsCiAgICAgICAgZm9sZGVySWQ6IHNldHRpbmdzLmZvbGRlcklkLAogICAgICAgIHN5bmNFbmFibGVkOiBzZXR0aW5ncy5zeW5jRW5hYmxlZCwKICAgICAgICBmaWxlQ291bnQ6IGVudHJpZXMubGVuZ3RoLAogICAgICAgIGxhc3RTeW5jLAogICAgfTsKfQovLyMgc291cmNlTWFwcGluZ1VSTD1nZHJpdmUuanMubWFw"}}