@aerokit/sdk 12.81.0 → 12.82.0

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 (376) hide show
  1. package/dist/cjs/bpm/deployer.js +1 -1
  2. package/dist/cjs/bpm/index.js +1 -1
  3. package/dist/cjs/bpm/process.js +1 -1
  4. package/dist/cjs/bpm/tasks.js +1 -1
  5. package/dist/cjs/bpm/tracer.js +1 -1
  6. package/dist/cjs/bpm/values.js +1 -1
  7. package/dist/cjs/cache/cache.js +1 -1
  8. package/dist/cjs/cache/index.js +1 -1
  9. package/dist/cjs/cms/cmis.js +1 -1
  10. package/dist/cjs/cms/index.js +1 -1
  11. package/dist/cjs/component/decorators.js +1 -1
  12. package/dist/cjs/component/index.js +1 -1
  13. package/dist/cjs/core/configurations.js +1 -1
  14. package/dist/cjs/core/context.js +1 -1
  15. package/dist/cjs/core/env.js +1 -1
  16. package/dist/cjs/core/globals.js +1 -1
  17. package/dist/cjs/core/index.js +1 -1
  18. package/dist/cjs/db/dao.js +1 -1
  19. package/dist/cjs/db/database.js +1 -1
  20. package/dist/cjs/db/decorators.js +1 -1
  21. package/dist/cjs/db/index.js +1 -1
  22. package/dist/cjs/db/insert.js +1 -1
  23. package/dist/cjs/db/orm.js +1 -1
  24. package/dist/cjs/db/ormstatements.js +1 -1
  25. package/dist/cjs/db/procedure.js +1 -1
  26. package/dist/cjs/db/query.js +1 -1
  27. package/dist/cjs/db/repository.js +1 -1
  28. package/dist/cjs/db/sequence.js +1 -1
  29. package/dist/cjs/db/sql.js +1 -1
  30. package/dist/cjs/db/store.js +1 -1
  31. package/dist/cjs/db/translator.js +1 -1
  32. package/dist/cjs/db/update.js +1 -1
  33. package/dist/cjs/etcd/client.js +1 -1
  34. package/dist/cjs/etcd/index.js +1 -1
  35. package/dist/cjs/extensions/decorators.js +1 -1
  36. package/dist/cjs/extensions/extensions.js +1 -1
  37. package/dist/cjs/extensions/index.js +1 -1
  38. package/dist/cjs/git/client.js +1 -1
  39. package/dist/cjs/git/index.js +1 -1
  40. package/dist/cjs/http/client-async.js +1 -1
  41. package/dist/cjs/http/client.js +1 -1
  42. package/dist/cjs/http/decorators.js +1 -1
  43. package/dist/cjs/http/errors/ForbiddenError.js +1 -1
  44. package/dist/cjs/http/errors/ValidationError.js +1 -1
  45. package/dist/cjs/http/errors.js +1 -1
  46. package/dist/cjs/http/index.js +1 -1
  47. package/dist/cjs/http/request.js +1 -1
  48. package/dist/cjs/http/response.js +1 -1
  49. package/dist/cjs/http/rs/resource-http-controller.js +1 -1
  50. package/dist/cjs/http/rs/resource-mappings.js +1 -1
  51. package/dist/cjs/http/rs/resource-method.js +1 -1
  52. package/dist/cjs/http/rs/resource.js +1 -1
  53. package/dist/cjs/http/rs.js +1 -1
  54. package/dist/cjs/http/session.js +1 -1
  55. package/dist/cjs/http/upload.js +1 -1
  56. package/dist/cjs/http/utils.js +1 -1
  57. package/dist/cjs/indexing/index.js +1 -1
  58. package/dist/cjs/indexing/searcher.js +1 -1
  59. package/dist/cjs/indexing/writer.js +1 -1
  60. package/dist/cjs/integrations/index.js +1 -1
  61. package/dist/cjs/integrations/integrations.js +1 -1
  62. package/dist/cjs/io/bytes.js +1 -1
  63. package/dist/cjs/io/files.js +1 -1
  64. package/dist/cjs/io/image.js +1 -1
  65. package/dist/cjs/io/index.js +1 -1
  66. package/dist/cjs/io/streams.js +1 -1
  67. package/dist/cjs/io/zip.js +1 -1
  68. package/dist/cjs/job/decorators.js +1 -1
  69. package/dist/cjs/job/index.js +1 -1
  70. package/dist/cjs/job/scheduler.js +1 -1
  71. package/dist/cjs/junit/index.js +1 -1
  72. package/dist/cjs/junit/junit.js +1 -1
  73. package/dist/cjs/kafka/consumer.js +1 -1
  74. package/dist/cjs/kafka/index.js +1 -1
  75. package/dist/cjs/kafka/producer.js +1 -1
  76. package/dist/cjs/log/index.js +1 -1
  77. package/dist/cjs/log/logging.js +1 -1
  78. package/dist/cjs/mail/client.js +1 -1
  79. package/dist/cjs/mail/index.js +1 -1
  80. package/dist/cjs/messaging/consumer.js +1 -1
  81. package/dist/cjs/messaging/decorators.js +1 -1
  82. package/dist/cjs/messaging/index.js +1 -1
  83. package/dist/cjs/messaging/producer.js +1 -1
  84. package/dist/cjs/mongodb/client.js +1 -1
  85. package/dist/cjs/mongodb/dao.js +1 -1
  86. package/dist/cjs/mongodb/index.js +1 -1
  87. package/dist/cjs/net/decorators.js +1 -1
  88. package/dist/cjs/net/index.js +1 -1
  89. package/dist/cjs/net/soap.js +1 -1
  90. package/dist/cjs/net/websockets.js +1 -1
  91. package/dist/cjs/pdf/index.js +1 -1
  92. package/dist/cjs/pdf/pdf.js +3 -3
  93. package/dist/cjs/platform/command.js +1 -1
  94. package/dist/cjs/platform/engines.js +1 -1
  95. package/dist/cjs/platform/index.js +1 -1
  96. package/dist/cjs/platform/lifecycle.js +1 -1
  97. package/dist/cjs/platform/os.js +1 -1
  98. package/dist/cjs/platform/problems.js +1 -1
  99. package/dist/cjs/platform/registry.js +1 -1
  100. package/dist/cjs/platform/repository.js +1 -1
  101. package/dist/cjs/platform/workspace.js +1 -1
  102. package/dist/cjs/qldb/index.js +1 -1
  103. package/dist/cjs/qldb/qldb.js +1 -1
  104. package/dist/cjs/rabbitmq/consumer.js +1 -1
  105. package/dist/cjs/rabbitmq/index.js +1 -1
  106. package/dist/cjs/rabbitmq/producer.js +1 -1
  107. package/dist/cjs/redis/client.js +1 -1
  108. package/dist/cjs/redis/index.js +1 -1
  109. package/dist/cjs/security/decorators.js +1 -1
  110. package/dist/cjs/security/index.js +1 -1
  111. package/dist/cjs/security/oauth.js +1 -1
  112. package/dist/cjs/security/user.js +1 -1
  113. package/dist/cjs/template/engines.js +1 -1
  114. package/dist/cjs/template/index.js +1 -1
  115. package/dist/cjs/utils/alphanumeric.js +2 -2
  116. package/dist/cjs/utils/base64.js +1 -1
  117. package/dist/cjs/utils/converter.js +1 -1
  118. package/dist/cjs/utils/digest.js +1 -1
  119. package/dist/cjs/utils/escape.js +1 -1
  120. package/dist/cjs/utils/hex.js +1 -1
  121. package/dist/cjs/utils/index.js +1 -1
  122. package/dist/cjs/utils/jsonpath.js +1 -1
  123. package/dist/cjs/utils/qrcode.js +1 -1
  124. package/dist/cjs/utils/url.js +1 -1
  125. package/dist/cjs/utils/utf8.js +1 -1
  126. package/dist/cjs/utils/uuid.js +1 -1
  127. package/dist/cjs/utils/xml.js +1 -1
  128. package/dist/dts/bpm/deployer.d.ts +35 -3
  129. package/dist/dts/bpm/index.d.ts +14 -0
  130. package/dist/dts/bpm/process.d.ts +28 -3
  131. package/dist/dts/bpm/tasks.d.ts +32 -1
  132. package/dist/dts/bpm/tracer.d.ts +35 -0
  133. package/dist/dts/bpm/values.d.ts +17 -3
  134. package/dist/dts/cache/cache.d.ts +38 -0
  135. package/dist/dts/cache/index.d.ts +10 -0
  136. package/dist/dts/cms/cmis.d.ts +28 -3
  137. package/dist/dts/cms/index.d.ts +10 -0
  138. package/dist/dts/component/decorators.d.ts +35 -5
  139. package/dist/dts/component/index.d.ts +10 -0
  140. package/dist/dts/core/configurations.d.ts +43 -4
  141. package/dist/dts/core/context.d.ts +35 -2
  142. package/dist/dts/core/env.d.ts +29 -2
  143. package/dist/dts/core/globals.d.ts +34 -2
  144. package/dist/dts/core/index.d.ts +13 -0
  145. package/dist/dts/db/database.d.ts +34 -0
  146. package/dist/dts/db/decorators.d.ts +55 -2
  147. package/dist/dts/db/index.d.ts +19 -0
  148. package/dist/dts/db/orm.d.ts +43 -0
  149. package/dist/dts/db/procedure.d.ts +37 -0
  150. package/dist/dts/db/query.d.ts +25 -1
  151. package/dist/dts/db/repository.d.ts +52 -0
  152. package/dist/dts/db/sequence.d.ts +31 -2
  153. package/dist/dts/db/sql.d.ts +33 -0
  154. package/dist/dts/db/store.d.ts +27 -0
  155. package/dist/dts/db/translator.d.ts +34 -1
  156. package/dist/dts/db/update.d.ts +38 -0
  157. package/dist/dts/etcd/client.d.ts +36 -0
  158. package/dist/dts/etcd/index.d.ts +10 -0
  159. package/dist/dts/extensions/decorators.d.ts +28 -0
  160. package/dist/dts/extensions/extensions.d.ts +30 -1
  161. package/dist/dts/extensions/index.d.ts +11 -0
  162. package/dist/dts/git/client.d.ts +28 -0
  163. package/dist/dts/git/index.d.ts +10 -0
  164. package/dist/dts/http/client-async.d.ts +29 -1
  165. package/dist/dts/http/client.d.ts +29 -1
  166. package/dist/dts/http/decorators.d.ts +38 -0
  167. package/dist/dts/http/errors/ForbiddenError.d.ts +6 -2
  168. package/dist/dts/http/errors/ValidationError.d.ts +6 -2
  169. package/dist/dts/http/errors.d.ts +14 -0
  170. package/dist/dts/http/index.d.ts +18 -0
  171. package/dist/dts/http/request.d.ts +30 -3
  172. package/dist/dts/http/response.d.ts +40 -3
  173. package/dist/dts/http/rs/resource-mappings.d.ts +30 -0
  174. package/dist/dts/http/rs.d.ts +38 -0
  175. package/dist/dts/http/session.d.ts +34 -3
  176. package/dist/dts/http/upload.d.ts +27 -2
  177. package/dist/dts/http/utils.d.ts +42 -0
  178. package/dist/dts/indexing/index.d.ts +11 -0
  179. package/dist/dts/indexing/searcher.d.ts +35 -2
  180. package/dist/dts/indexing/writer.d.ts +23 -2
  181. package/dist/dts/integrations/index.d.ts +10 -0
  182. package/dist/dts/integrations/integrations.d.ts +27 -3
  183. package/dist/dts/io/bytes.d.ts +33 -2
  184. package/dist/dts/io/files.d.ts +34 -2
  185. package/dist/dts/io/image.d.ts +27 -2
  186. package/dist/dts/io/index.d.ts +14 -0
  187. package/dist/dts/io/streams.d.ts +40 -0
  188. package/dist/dts/io/zip.d.ts +32 -0
  189. package/dist/dts/job/decorators.d.ts +29 -0
  190. package/dist/dts/job/index.d.ts +11 -0
  191. package/dist/dts/job/scheduler.d.ts +33 -2
  192. package/dist/dts/junit/index.d.ts +10 -0
  193. package/dist/dts/junit/junit.d.ts +31 -0
  194. package/dist/dts/kafka/consumer.d.ts +31 -0
  195. package/dist/dts/kafka/index.d.ts +11 -0
  196. package/dist/dts/kafka/producer.d.ts +31 -0
  197. package/dist/dts/log/index.d.ts +10 -0
  198. package/dist/dts/log/logging.d.ts +32 -0
  199. package/dist/dts/mail/client.d.ts +27 -0
  200. package/dist/dts/mail/index.d.ts +10 -0
  201. package/dist/dts/messaging/consumer.d.ts +29 -2
  202. package/dist/dts/messaging/decorators.d.ts +32 -0
  203. package/dist/dts/messaging/index.d.ts +12 -0
  204. package/dist/dts/messaging/producer.d.ts +27 -2
  205. package/dist/dts/mongodb/client.d.ts +37 -0
  206. package/dist/dts/mongodb/dao.d.ts +53 -0
  207. package/dist/dts/mongodb/index.d.ts +11 -0
  208. package/dist/dts/net/decorators.d.ts +27 -0
  209. package/dist/dts/net/index.d.ts +13 -0
  210. package/dist/dts/net/soap.d.ts +34 -0
  211. package/dist/dts/net/websockets.d.ts +34 -0
  212. package/dist/dts/pdf/index.d.ts +10 -0
  213. package/dist/dts/pdf/pdf.d.ts +41 -2
  214. package/dist/dts/platform/command.d.ts +26 -0
  215. package/dist/dts/platform/engines.d.ts +38 -0
  216. package/dist/dts/platform/index.d.ts +19 -0
  217. package/dist/dts/platform/lifecycle.d.ts +29 -0
  218. package/dist/dts/platform/os.d.ts +30 -0
  219. package/dist/dts/platform/problems.d.ts +36 -0
  220. package/dist/dts/platform/registry.d.ts +39 -0
  221. package/dist/dts/platform/repository.d.ts +40 -0
  222. package/dist/dts/platform/workspace.d.ts +42 -0
  223. package/dist/dts/qldb/index.d.ts +12 -0
  224. package/dist/dts/qldb/qldb.d.ts +14 -0
  225. package/dist/dts/rabbitmq/consumer.d.ts +24 -3
  226. package/dist/dts/rabbitmq/index.d.ts +13 -0
  227. package/dist/dts/rabbitmq/producer.d.ts +20 -3
  228. package/dist/dts/redis/client.d.ts +31 -3
  229. package/dist/dts/redis/index.d.ts +12 -0
  230. package/dist/dts/security/decorators.d.ts +34 -0
  231. package/dist/dts/security/index.d.ts +14 -0
  232. package/dist/dts/security/oauth.d.ts +27 -0
  233. package/dist/dts/security/user.d.ts +39 -0
  234. package/dist/dts/template/engines.d.ts +31 -0
  235. package/dist/dts/template/index.d.ts +12 -0
  236. package/dist/dts/utils/alphanumeric.d.ts +36 -2
  237. package/dist/dts/utils/base64.d.ts +30 -0
  238. package/dist/dts/utils/converter.d.ts +37 -2
  239. package/dist/dts/utils/digest.d.ts +31 -0
  240. package/dist/dts/utils/escape.d.ts +28 -3
  241. package/dist/dts/utils/hex.d.ts +30 -0
  242. package/dist/dts/utils/index.d.ts +23 -0
  243. package/dist/dts/utils/jsonpath.d.ts +43 -0
  244. package/dist/dts/utils/qrcode.d.ts +24 -3
  245. package/dist/dts/utils/url.d.ts +37 -3
  246. package/dist/dts/utils/utf8.d.ts +34 -3
  247. package/dist/dts/utils/uuid.d.ts +28 -2
  248. package/dist/dts/utils/xml.d.ts +31 -2
  249. package/dist/esm/bpm/deployer.mjs +1 -1
  250. package/dist/esm/bpm/index.mjs +1 -1
  251. package/dist/esm/bpm/process.mjs +1 -1
  252. package/dist/esm/bpm/tasks.mjs +1 -1
  253. package/dist/esm/bpm/tracer.mjs +1 -1
  254. package/dist/esm/bpm/values.mjs +1 -1
  255. package/dist/esm/cache/cache.mjs +1 -1
  256. package/dist/esm/cache/index.mjs +1 -1
  257. package/dist/esm/cms/cmis.mjs +1 -1
  258. package/dist/esm/cms/index.mjs +1 -1
  259. package/dist/esm/component/decorators.mjs +1 -1
  260. package/dist/esm/component/index.mjs +1 -1
  261. package/dist/esm/core/configurations.mjs +1 -1
  262. package/dist/esm/core/context.mjs +1 -1
  263. package/dist/esm/core/env.mjs +1 -1
  264. package/dist/esm/core/globals.mjs +1 -1
  265. package/dist/esm/core/index.mjs +1 -1
  266. package/dist/esm/db/dao.mjs +1 -1
  267. package/dist/esm/db/database.mjs +1 -1
  268. package/dist/esm/db/decorators.mjs +1 -1
  269. package/dist/esm/db/index.mjs +1 -1
  270. package/dist/esm/db/insert.mjs +1 -1
  271. package/dist/esm/db/orm.mjs +1 -1
  272. package/dist/esm/db/ormstatements.mjs +1 -1
  273. package/dist/esm/db/procedure.mjs +1 -1
  274. package/dist/esm/db/query.mjs +1 -1
  275. package/dist/esm/db/repository.mjs +1 -1
  276. package/dist/esm/db/sequence.mjs +1 -1
  277. package/dist/esm/db/sql.mjs +1 -1
  278. package/dist/esm/db/store.mjs +1 -1
  279. package/dist/esm/db/translator.mjs +1 -1
  280. package/dist/esm/db/update.mjs +1 -1
  281. package/dist/esm/etcd/client.mjs +1 -1
  282. package/dist/esm/etcd/index.mjs +1 -1
  283. package/dist/esm/extensions/decorators.mjs +1 -1
  284. package/dist/esm/extensions/extensions.mjs +1 -1
  285. package/dist/esm/extensions/index.mjs +1 -1
  286. package/dist/esm/git/client.mjs +1 -1
  287. package/dist/esm/git/index.mjs +1 -1
  288. package/dist/esm/http/client-async.mjs +1 -1
  289. package/dist/esm/http/client.mjs +1 -1
  290. package/dist/esm/http/decorators.mjs +1 -1
  291. package/dist/esm/http/errors/ForbiddenError.mjs +1 -1
  292. package/dist/esm/http/errors/ValidationError.mjs +1 -1
  293. package/dist/esm/http/errors.mjs +1 -1
  294. package/dist/esm/http/index.mjs +1 -1
  295. package/dist/esm/http/request.mjs +1 -1
  296. package/dist/esm/http/response.mjs +1 -1
  297. package/dist/esm/http/rs/resource-http-controller.mjs +1 -1
  298. package/dist/esm/http/rs/resource-mappings.mjs +1 -1
  299. package/dist/esm/http/rs/resource-method.mjs +1 -1
  300. package/dist/esm/http/rs/resource.mjs +1 -1
  301. package/dist/esm/http/rs.mjs +1 -1
  302. package/dist/esm/http/session.mjs +1 -1
  303. package/dist/esm/http/upload.mjs +1 -1
  304. package/dist/esm/http/utils.mjs +1 -1
  305. package/dist/esm/indexing/index.mjs +1 -1
  306. package/dist/esm/indexing/searcher.mjs +1 -1
  307. package/dist/esm/indexing/writer.mjs +1 -1
  308. package/dist/esm/integrations/index.mjs +1 -1
  309. package/dist/esm/integrations/integrations.mjs +1 -1
  310. package/dist/esm/io/bytes.mjs +1 -1
  311. package/dist/esm/io/files.mjs +1 -1
  312. package/dist/esm/io/image.mjs +1 -1
  313. package/dist/esm/io/index.mjs +1 -1
  314. package/dist/esm/io/streams.mjs +1 -1
  315. package/dist/esm/io/zip.mjs +1 -1
  316. package/dist/esm/job/decorators.mjs +1 -1
  317. package/dist/esm/job/index.mjs +1 -1
  318. package/dist/esm/job/scheduler.mjs +1 -1
  319. package/dist/esm/junit/index.mjs +1 -1
  320. package/dist/esm/junit/junit.mjs +1 -1
  321. package/dist/esm/kafka/consumer.mjs +1 -1
  322. package/dist/esm/kafka/index.mjs +1 -1
  323. package/dist/esm/kafka/producer.mjs +1 -1
  324. package/dist/esm/log/index.mjs +1 -1
  325. package/dist/esm/log/logging.mjs +1 -1
  326. package/dist/esm/mail/client.mjs +1 -1
  327. package/dist/esm/mail/index.mjs +1 -1
  328. package/dist/esm/messaging/consumer.mjs +1 -1
  329. package/dist/esm/messaging/decorators.mjs +1 -1
  330. package/dist/esm/messaging/index.mjs +1 -1
  331. package/dist/esm/messaging/producer.mjs +1 -1
  332. package/dist/esm/mongodb/client.mjs +2 -2
  333. package/dist/esm/mongodb/dao.mjs +1 -1
  334. package/dist/esm/mongodb/index.mjs +1 -1
  335. package/dist/esm/net/decorators.mjs +1 -1
  336. package/dist/esm/net/index.mjs +1 -1
  337. package/dist/esm/net/soap.mjs +1 -1
  338. package/dist/esm/net/websockets.mjs +1 -1
  339. package/dist/esm/pdf/index.mjs +1 -1
  340. package/dist/esm/pdf/pdf.mjs +3 -3
  341. package/dist/esm/platform/command.mjs +1 -1
  342. package/dist/esm/platform/engines.mjs +1 -1
  343. package/dist/esm/platform/index.mjs +1 -1
  344. package/dist/esm/platform/lifecycle.mjs +1 -1
  345. package/dist/esm/platform/os.mjs +1 -1
  346. package/dist/esm/platform/problems.mjs +1 -1
  347. package/dist/esm/platform/registry.mjs +1 -1
  348. package/dist/esm/platform/repository.mjs +1 -1
  349. package/dist/esm/platform/workspace.mjs +1 -1
  350. package/dist/esm/qldb/index.mjs +1 -1
  351. package/dist/esm/qldb/qldb.mjs +1 -1
  352. package/dist/esm/rabbitmq/consumer.mjs +1 -1
  353. package/dist/esm/rabbitmq/index.mjs +1 -1
  354. package/dist/esm/rabbitmq/producer.mjs +1 -1
  355. package/dist/esm/redis/client.mjs +1 -1
  356. package/dist/esm/redis/index.mjs +1 -1
  357. package/dist/esm/security/decorators.mjs +1 -1
  358. package/dist/esm/security/index.mjs +1 -1
  359. package/dist/esm/security/oauth.mjs +1 -1
  360. package/dist/esm/security/user.mjs +1 -1
  361. package/dist/esm/template/engines.mjs +1 -1
  362. package/dist/esm/template/index.mjs +1 -1
  363. package/dist/esm/utils/alphanumeric.mjs +2 -2
  364. package/dist/esm/utils/base64.mjs +1 -1
  365. package/dist/esm/utils/converter.mjs +1 -1
  366. package/dist/esm/utils/digest.mjs +1 -1
  367. package/dist/esm/utils/escape.mjs +1 -1
  368. package/dist/esm/utils/hex.mjs +1 -1
  369. package/dist/esm/utils/index.mjs +1 -1
  370. package/dist/esm/utils/jsonpath.mjs +1 -1
  371. package/dist/esm/utils/qrcode.mjs +1 -1
  372. package/dist/esm/utils/url.mjs +1 -1
  373. package/dist/esm/utils/utf8.mjs +1 -1
  374. package/dist/esm/utils/uuid.mjs +1 -1
  375. package/dist/esm/utils/xml.mjs +1 -1
  376. package/package.json +1 -1
@@ -792,4 +792,4 @@ function create(oDefinition, logCtxName, dataSourceName) {
792
792
  function dao(oDefinition, logCtxName, dataSourceName) {
793
793
  return create(oDefinition, logCtxName, dataSourceName);
794
794
  }
795
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RiL2Rhby50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IE9STURlZmluaXRpb24sIGdldCBhcyBnZXRPUk0gfSBmcm9tIFwiLi9vcm1cIjtcbmltcG9ydCB7IGNyZWF0ZSBhcyBjcmVhdGVPUk1TdGF0ZW1lbnRzIH0gZnJvbSBcIi4vb3Jtc3RhdGVtZW50c1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UgfSBmcm9tIFwiLi9zZXF1ZW5jZVwiO1xuaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tIFwiLi9kYXRhYmFzZVwiO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiQGFlcm9raXQvc2RrL2RiXCI7XG5pbXBvcnQgeyBVcGRhdGUgfSBmcm9tIFwiLi91cGRhdGVcIjtcbmltcG9ydCB7IEluc2VydCB9IGZyb20gXCIuL2luc2VydFwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvbG9nXCI7XG5pbXBvcnQgeyBjb25maWd1cmF0aW9ucywgZ2xvYmFscyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvY29yZVwiO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBEQU8ob3JtOiBPUk1EZWZpbml0aW9uLCBsb2dDdHhOYW1lPzogc3RyaW5nLCBkYXRhU291cmNlTmFtZT86IHN0cmluZykge1xuXHRpZiAob3JtID09PSB1bmRlZmluZWQpXG5cdFx0dGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IG9ybVsnICsgb3JtICsgJ10nKTtcblxuXHR0aGlzLm9ybSA9IGdldE9STShvcm0pO1xuXHR0aGlzLnNlcXVlbmNlTmFtZSA9IHRoaXMub3JtLnRhYmxlICsgJ18nICsgdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWUudG9VcHBlckNhc2UoKTtcblx0dGhpcy5kcm9wSWRHZW5lcmF0b3IgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIFNlcXVlbmNlLmRyb3AodGhpcy5zZXF1ZW5jZU5hbWUsIGRhdGFTb3VyY2VOYW1lKTtcblx0fTtcblx0dGhpcy5nZW5lcmF0ZUlkID0gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBTZXF1ZW5jZS5uZXh0dmFsKHRoaXMuc2VxdWVuY2VOYW1lLCB0aGlzLm9ybS50YWJsZSwgZGF0YVNvdXJjZU5hbWUpO1xuXHR9O1xuXG5cdGNvbnN0IGNvbm4gPSBEYXRhYmFzZS5nZXRDb25uZWN0aW9uKGRhdGFTb3VyY2VOYW1lKTtcblx0dHJ5IHtcblx0XHR0aGlzLm9ybXN0YXRlbWVudHMgPSBjcmVhdGVPUk1TdGF0ZW1lbnRzKHRoaXMub3JtLCBjb25uKTtcblx0fSBmaW5hbGx5IHtcblx0XHRjb25uLmNsb3NlKCk7XG5cdH1cblxuXHQvLyBzZXR1cCBsb2dnZXJOYW1lXG5cdGxldCBsb2dnZXJOYW1lID0gbG9nQ3R4TmFtZTtcblx0aWYgKCFsb2dnZXJOYW1lKSB7XG5cdFx0bG9nZ2VyTmFtZSA9ICdkYi5kYW8nO1xuXHRcdGlmICh0aGlzLm9ybS50YWJsZSlcblx0XHRcdGxvZ2dlck5hbWUgPSAnZGIuZGFvLicgKyAodGhpcy5vcm0udGFibGUudG9Mb3dlckNhc2UoKSk7XG5cdH1cblx0dGhpcy4kbG9nID0gTG9nZ2luZy5nZXRMb2dnZXIobG9nZ2VyTmFtZSk7XG5cblx0dGhpcy5leGVjdXRlID0gZnVuY3Rpb24gKHNxbEJ1aWxkZXIsIHBhcmFtZXRlckJpbmRpbmdzKSB7XG5cdFx0Y29uc3Qgc3FsID0gc3FsQnVpbGRlci5idWlsZCgpO1xuXHRcdGlmIChzcWwgPT09IHVuZGVmaW5lZCB8fCBzcWwubGVuZ3RoIDwgMSlcblx0XHRcdHRocm93IEVycm9yKFwiSWxsZWdhbCBhcmd1bWVudDogc3FsIGZyb20gc3RhdGVtZW50IGJ1aWxkZXIgaXMgaW52YWxpZFtcIiArIHNxbCArIFwiXVwiKTtcblx0XHR0aGlzLiRsb2cudHJhY2UoJ0V4ZWN1dGluZyBTUUwgU3RhdGVtZW50OiB7fScsIHNxbCk7XG5cblx0XHRjb25zdCBwYXJhbWV0ZXJzID0gc3FsQnVpbGRlci5wYXJhbWV0ZXJzICYmIHNxbEJ1aWxkZXIucGFyYW1ldGVycygpO1xuXHRcdGNvbnN0IF9wYXJhbWV0ZXJCaW5kaW5ncyA9IFtdO1xuXHRcdGlmIChwYXJhbWV0ZXJCaW5kaW5ncz8uJGZpbHRlciAmJiBwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKHBhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIuZXF1YWxzKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnRpZXNLZXlzID0gT2JqZWN0LmtleXMocGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5lcXVhbHMpO1xuXHRcdFx0XHRjb25zdCBhZGRlZFByb3BlcnRpZXNLZXlzID0gW107XG5cdFx0XHRcdHBhcmFtZXRlcnMuZm9yRWFjaChlID0+IHtcblx0XHRcdFx0XHRpZiAocHJvcGVydGllc0tleXMuaW5jbHVkZXMoZS5uYW1lKSAmJiAhYWRkZWRQcm9wZXJ0aWVzS2V5cy5pbmNsdWRlcyhlLm5hbWUpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IHBhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIuZXF1YWxzW2UubmFtZV07XG5cdFx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdFx0dmFsdWUuZm9yRWFjaCh2ID0+IHtcblx0XHRcdFx0XHRcdFx0XHRfcGFyYW1ldGVyQmluZGluZ3MucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBlLnR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogcGFyc2VWYWx1ZShlLnR5cGUsIHYpXG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0X3BhcmFtZXRlckJpbmRpbmdzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IGUudHlwZSxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogcGFyc2VWYWx1ZShlLnR5cGUsIHZhbHVlKVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGFkZGVkUHJvcGVydGllc0tleXMucHVzaChlLm5hbWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5ub3RFcXVhbHMpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLm5vdEVxdWFscyk7XG5cdFx0XHRcdGNvbnN0IGFkZGVkUHJvcGVydGllc0tleXMgPSBbXTtcblx0XHRcdFx0cGFyYW1ldGVycy5mb3JFYWNoKGUgPT4ge1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0aWVzS2V5cy5pbmNsdWRlcyhlLm5hbWUpICYmICFhZGRlZFByb3BlcnRpZXNLZXlzLmluY2x1ZGVzKGUubmFtZSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5ub3RFcXVhbHNbZS5uYW1lXTtcblx0XHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZS5mb3JFYWNoKHYgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdF9wYXJhbWV0ZXJCaW5kaW5ncy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6IGUudHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBwYXJzZVZhbHVlKGUudHlwZSwgdilcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRfcGFyYW1ldGVyQmluZGluZ3MucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogZS50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBwYXJzZVZhbHVlKGUudHlwZSwgdmFsdWUpXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YWRkZWRQcm9wZXJ0aWVzS2V5cy5wdXNoKGUubmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLmNvbnRhaW5zKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnRpZXNLZXlzID0gT2JqZWN0LmtleXMocGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5jb250YWlucyk7XG5cdFx0XHRcdGNvbnN0IGFkZGVkUHJvcGVydGllc0tleXMgPSBbXTtcblx0XHRcdFx0cGFyYW1ldGVycy5mb3JFYWNoKGUgPT4ge1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0aWVzS2V5cy5pbmNsdWRlcyhlLm5hbWUpICYmICFhZGRlZFByb3BlcnRpZXNLZXlzLmluY2x1ZGVzKGUubmFtZSkpIHtcblx0XHRcdFx0XHRcdF9wYXJhbWV0ZXJCaW5kaW5ncy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogZS50eXBlLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogYCUke3BhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIuY29udGFpbnNbZS5uYW1lXX0lYFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRhZGRlZFByb3BlcnRpZXNLZXlzLnB1c2goZS5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIuZ3JlYXRlclRoYW4pIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLmdyZWF0ZXJUaGFuKTtcblx0XHRcdFx0Y29uc3QgYWRkZWRQcm9wZXJ0aWVzS2V5cyA9IFtdO1xuXHRcdFx0XHRwYXJhbWV0ZXJzLmZvckVhY2goZSA9PiB7XG5cdFx0XHRcdFx0aWYgKHByb3BlcnRpZXNLZXlzLmluY2x1ZGVzKGUubmFtZSkgJiYgIWFkZGVkUHJvcGVydGllc0tleXMuaW5jbHVkZXMoZS5uYW1lKSkge1xuXHRcdFx0XHRcdFx0X3BhcmFtZXRlckJpbmRpbmdzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBlLnR5cGUsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiBwYXJzZVZhbHVlKGUudHlwZSwgcGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5ncmVhdGVyVGhhbltlLm5hbWVdKVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRhZGRlZFByb3BlcnRpZXNLZXlzLnB1c2goZS5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIubGVzc1RoYW4pIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLmxlc3NUaGFuKTtcblx0XHRcdFx0Y29uc3QgYWRkZWRQcm9wZXJ0aWVzS2V5cyA9IFtdO1xuXHRcdFx0XHRwYXJhbWV0ZXJzLmZvckVhY2goZSA9PiB7XG5cdFx0XHRcdFx0aWYgKHByb3BlcnRpZXNLZXlzLmluY2x1ZGVzKGUubmFtZSkgJiYgIWFkZGVkUHJvcGVydGllc0tleXMuaW5jbHVkZXMoZS5uYW1lKSkge1xuXHRcdFx0XHRcdFx0X3BhcmFtZXRlckJpbmRpbmdzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBlLnR5cGUsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiBwYXJzZVZhbHVlKGUudHlwZSwgcGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5sZXNzVGhhbltlLm5hbWVdKVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRhZGRlZFByb3BlcnRpZXNLZXlzLnB1c2goZS5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIuZ3JlYXRlclRoYW5PckVxdWFsKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnRpZXNLZXlzID0gT2JqZWN0LmtleXMocGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5ncmVhdGVyVGhhbk9yRXF1YWwpO1xuXHRcdFx0XHRjb25zdCBhZGRlZFByb3BlcnRpZXNLZXlzID0gW107XG5cdFx0XHRcdHBhcmFtZXRlcnMuZm9yRWFjaChlID0+IHtcblx0XHRcdFx0XHRpZiAocHJvcGVydGllc0tleXMuaW5jbHVkZXMoZS5uYW1lKSAmJiAhYWRkZWRQcm9wZXJ0aWVzS2V5cy5pbmNsdWRlcyhlLm5hbWUpKSB7XG5cdFx0XHRcdFx0XHRfcGFyYW1ldGVyQmluZGluZ3MucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IGUudHlwZSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6IHBhcnNlVmFsdWUoZS50eXBlLCBwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLmdyZWF0ZXJUaGFuT3JFcXVhbFtlLm5hbWVdKVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRhZGRlZFByb3BlcnRpZXNLZXlzLnB1c2goZS5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIubGVzc1RoYW5PckVxdWFsKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnRpZXNLZXlzID0gT2JqZWN0LmtleXMocGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5sZXNzVGhhbk9yRXF1YWwpO1xuXHRcdFx0XHRjb25zdCBhZGRlZFByb3BlcnRpZXNLZXlzID0gW107XG5cdFx0XHRcdHBhcmFtZXRlcnMuZm9yRWFjaChlID0+IHtcblx0XHRcdFx0XHRpZiAocHJvcGVydGllc0tleXMuaW5jbHVkZXMoZS5uYW1lKSAmJiAhYWRkZWRQcm9wZXJ0aWVzS2V5cy5pbmNsdWRlcyhlLm5hbWUpKSB7XG5cdFx0XHRcdFx0XHRfcGFyYW1ldGVyQmluZGluZ3MucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IGUudHlwZSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6IHBhcnNlVmFsdWUoZS50eXBlLCBwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLmxlc3NUaGFuT3JFcXVhbFtlLm5hbWVdKVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRhZGRlZFByb3BlcnRpZXNLZXlzLnB1c2goZS5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIExlZnQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgLT4gaXQgc2VlbXMgdGhhdCB0aGUgZmluZCgpIG1ldGhvZCB1c2VzIGl0LCBtaWdodCBiZSByZW1vdmVkIG9uY2UgcmVmYWN0b3JlZFxuXHRcdGlmIChwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciB2YWw7XG5cdFx0XHRcdGlmIChwYXJhbWV0ZXJCaW5kaW5ncykge1xuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHBhcmFtZXRlckJpbmRpbmdzKSkge1xuXHRcdFx0XHRcdFx0dmFsID0gcGFyYW1ldGVyQmluZGluZ3NbaV07XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHZhbCA9IHBhcmFtZXRlckJpbmRpbmdzW3BhcmFtZXRlcnNbaV0ubmFtZV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICgodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSAmJiBzcWwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdzZWxlY3QnKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gaSArIDE7XG5cdFx0XHRcdHRoaXMuJGxvZy50cmFjZSgnQmluZGluZyB0byBwYXJhbWV0ZXJbe31dOiB7fScsIGluZGV4LCB2YWwpO1xuXHRcdFx0XHRfcGFyYW1ldGVyQmluZGluZ3MucHVzaCh7XG5cdFx0XHRcdFx0XCJ0eXBlXCI6IHBhcmFtZXRlcnNbaV0udHlwZSxcblx0XHRcdFx0XHRcInZhbHVlXCI6IHBhcnNlVmFsdWUocGFyYW1ldGVyc1tpXS50eXBlLCB2YWwpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGxldCByZXN1bHQ7XG5cblx0XHRpZiAoc3FsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnc2VsZWN0JykpIHtcblx0XHRcdHJlc3VsdCA9IFF1ZXJ5LmV4ZWN1dGUoc3FsLCBfcGFyYW1ldGVyQmluZGluZ3MsIGRhdGFTb3VyY2VOYW1lKTtcblx0XHR9IGVsc2UgaWYgKHNxbC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2luc2VydCcpKSB7XG5cdFx0XHRyZXN1bHQgPSBJbnNlcnQuZXhlY3V0ZShzcWwsIF9wYXJhbWV0ZXJCaW5kaW5ncywgZGF0YVNvdXJjZU5hbWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQgPSBVcGRhdGUuZXhlY3V0ZShzcWwsIF9wYXJhbWV0ZXJCaW5kaW5ncywgZGF0YVNvdXJjZU5hbWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQgIT09IG51bGwgPyByZXN1bHQgOiBbXTtcblx0fTtcblxuXHRmdW5jdGlvbiBwYXJzZVZhbHVlKHR5cGUsIHZhbHVlKSB7XG5cdFx0c3dpdGNoICh0eXBlLnRvVXBwZXJDYXNlKCkpIHtcblx0XHRcdGNhc2UgJ0lOVEVHRVInOlxuXHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQodmFsdWUpO1xuXHRcdFx0Y2FzZSAnRE9VQkxFJzpcblx0XHRcdGNhc2UgJ0ZMT0FUJzpcblx0XHRcdFx0cmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xuXHRcdFx0Y2FzZSAnQk9PTEVBTic6XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHR9XG59O1xuXG5EQU8ucHJvdG90eXBlLm5vdGlmeSA9IGZ1bmN0aW9uIChldmVudCkge1xuXHRjb25zdCBmdW5jID0gdGhpc1tldmVudF07XG5cdGlmICghdGhpc1tldmVudF0pXG5cdFx0cmV0dXJuO1xuXHRpZiAodHlwZW9mIGZ1bmMgIT09ICdmdW5jdGlvbicpXG5cdFx0dGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQuIE5vdCBhIGZ1bmN0aW9uOiAnICsgZnVuYyk7XG5cdGNvbnN0IGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdGZ1bmMuYXBwbHkodGhpcywgYXJncy5zbGljZSgxKSk7XG59O1xuXG4vKipcbiAqIFByZXBhcmUgYSBKU09OIG9iamVjdCBmb3IgaW5zZXJ0IGludG8gREJcbiAqL1xuREFPLnByb3RvdHlwZS5jcmVhdGVTUUxFbnRpdHkgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG5cdGxldCBpO1xuXHRjb25zdCBwZXJzaXN0ZW50SXRlbSA9IHt9O1xuXHRjb25zdCBtYW5kYXRvcmllcyA9IHRoaXMub3JtLmdldE1hbmRhdG9yeVByb3BlcnRpZXMoKTtcblx0Zm9yIChpID0gMDsgaSA8IG1hbmRhdG9yaWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKG1hbmRhdG9yaWVzW2ldLmRiVmFsdWUpIHtcblx0XHRcdHBlcnNpc3RlbnRJdGVtW21hbmRhdG9yaWVzW2ldLm5hbWVdID0gbWFuZGF0b3JpZXNbaV0uZGJWYWx1ZS5hcHBseSh0aGlzLCBbZW50aXR5W21hbmRhdG9yaWVzW2ldLm5hbWVdLCBlbnRpdHldKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGVyc2lzdGVudEl0ZW1bbWFuZGF0b3JpZXNbaV0ubmFtZV0gPSBlbnRpdHlbbWFuZGF0b3JpZXNbaV0ubmFtZV07XG5cdFx0fVxuXHR9XG5cdGNvbnN0IG9wdGlvbmFscyA9IHRoaXMub3JtLmdldE9wdGlvbmFsUHJvcGVydGllcygpO1xuXHRmb3IgKGkgPSAwOyBpIDwgb3B0aW9uYWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKG9wdGlvbmFsc1tpXS5kYlZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHBlcnNpc3RlbnRJdGVtW29wdGlvbmFsc1tpXS5uYW1lXSA9IG9wdGlvbmFsc1tpXS5kYlZhbHVlLmFwcGx5KHRoaXMsIFtlbnRpdHlbb3B0aW9uYWxzW2ldLm5hbWVdLCBlbnRpdHldKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGVyc2lzdGVudEl0ZW1bb3B0aW9uYWxzW2ldLm5hbWVdID0gZW50aXR5W29wdGlvbmFsc1tpXS5uYW1lXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGVudGl0eVtvcHRpb25hbHNbaV0ubmFtZV07XG5cdFx0fVxuXHR9XG5cdHJldHVybiBwZXJzaXN0ZW50SXRlbTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGVudGl0eSBhcyBKU09OIG9iamVjdCBmcm9tIFJlc3VsdFNldCBjdXJyZW50IFJvd1xuICovXG5EQU8ucHJvdG90eXBlLmNyZWF0ZUVudGl0eSA9IGZ1bmN0aW9uIChyZXN1bHRTZXRFbnRyeSwgZW50aXR5UHJvcGVydHlOYW1lcykge1xuXHRjb25zdCBlbnRpdHkgPSB7fTtcblx0bGV0IHByb3BlcnRpZXMgPSB0aGlzLm9ybS5wcm9wZXJ0aWVzO1xuXHRpZiAoZW50aXR5UHJvcGVydHlOYW1lcyAmJiBlbnRpdHlQcm9wZXJ0eU5hbWVzLmxlbmd0aCA+IDApIHtcblx0XHRwcm9wZXJ0aWVzID0gcHJvcGVydGllcy5maWx0ZXIoZnVuY3Rpb24gKHByb3ApIHtcblx0XHRcdHJldHVybiBlbnRpdHlQcm9wZXJ0eU5hbWVzLmluZGV4T2YocHJvcC5uYW1lKSA+IC0xO1xuXHRcdH0pO1xuXHR9XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuXHRcdGVudGl0eVtwcm9wLm5hbWVdID0gcmVzdWx0U2V0RW50cnlbcHJvcC5jb2x1bW5OYW1lXTtcblx0XHRpZiAocHJvcC52YWx1ZSkge1xuXHRcdFx0ZW50aXR5W3Byb3AubmFtZV0gPSBwcm9wLnZhbHVlKGVudGl0eVtwcm9wLm5hbWVdKTtcblx0XHR9XG5cdH1cblx0T2JqZWN0LmtleXMoZW50aXR5KS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUpIHtcblx0XHRpZiAoZW50aXR5W3Byb3BlcnR5TmFtZV0gPT09IG51bGwpXG5cdFx0XHRlbnRpdHlbcHJvcGVydHlOYW1lXSA9IHVuZGVmaW5lZDtcblx0fSk7XG5cblx0bGV0IGVudGl0eVNlZ21lbnQgPSBcIlwiO1xuXHRpZiAoZW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSkge1xuXHRcdGVudGl0eVNlZ21lbnQgPSBcIltcIiArIGVudGl0eVt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0gKyBcIl1cIjtcblx0fVxuXHQvLyB0aGlzLiRsb2cudHJhY2UoXCJUcmFuc2Zvcm1hdGlvbiBmcm9tIHt9IERCIEpTT04gb2JqZWN0IGZpbmlzaGVkXCIsICh0aGlzLm9ybS50YWJsZSArIGVudGl0eVNlZ21lbnQpKTtcblx0cmV0dXJuIGVudGl0eTtcbn07XG5cbkRBTy5wcm90b3R5cGUudmFsaWRhdGVFbnRpdHkgPSBmdW5jdGlvbiAoZW50aXR5LCBza2lwKSB7XG5cdGlmIChlbnRpdHkgPT09IHVuZGVmaW5lZCB8fCBlbnRpdHkgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IGVudGl0eSBpcyAnICsgZW50aXR5KTtcblx0fVxuXHRpZiAoc2tpcCkge1xuXHRcdGlmIChza2lwLmNvbnN0cnVjdG9yICE9PSBBcnJheSkge1xuXHRcdFx0c2tpcCA9IFtza2lwXTtcblx0XHR9XG5cdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBza2lwLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRza2lwW2pdO1xuXHRcdH1cblx0fVxuXHRjb25zdCBtYW5kYXRvcmllcyA9IHRoaXMub3JtLmdldE1hbmRhdG9yeVByb3BlcnRpZXMoKTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtYW5kYXRvcmllcy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHByb3BOYW1lID0gbWFuZGF0b3JpZXNbaV0ubmFtZTtcblx0XHRpZiAoKHNraXAgJiYgc2tpcC5pbmRleE9mKHByb3BOYW1lKSA+IC0xKSB8fCBtYW5kYXRvcmllc1tpXS50eXBlLnRvVXBwZXJDYXNlKCkgPT09ICdCT09MRUFOJylcblx0XHRcdGNvbnRpbnVlO1xuXHRcdGNvbnN0IHByb3BWYWx1ZSA9IGVudGl0eVtwcm9wTmFtZV07XG5cdFx0aWYgKHByb3BWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BWYWx1ZSA9PT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsICcgKyBwcm9wTmFtZSArICcgYXR0cmlidXRlIHZhbHVlIGluICcgKyB0aGlzLm9ybS50YWJsZSArICcgZW50aXR5OiAnICsgcHJvcFZhbHVlKTtcblx0XHR9XG5cdH1cbn07XG5cbkRBTy5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKF9lbnRpdHkpIHtcblxuXHRjb25zdCBpZHMgPSBbXTtcblx0bGV0IGVudGl0aWVzID0gX2VudGl0eTtcblx0aWYgKF9lbnRpdHkuY29uc3RydWN0b3IgIT09IEFycmF5KSB7XG5cdFx0ZW50aXRpZXMgPSBbX2VudGl0eV07XG5cdH1cblxuXHR0aGlzLiRsb2cudHJhY2UoJ0luc2VydGluZyB7fSB7fScsIHRoaXMub3JtLnRhYmxlLCAoZW50aXRpZXMubGVuZ3RoID09PSAxID8gJ2VudGl0eScgOiAnZW50aXRpZXMnKSk7XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBlbnRpdGllcy5sZW5ndGg7IGkrKykge1xuXHRcdGxldCBlbnRpdHkgPSBlbnRpdGllc1tpXTtcblx0XHRlbnRpdHkgPSBlbnRpdGllc1tpXTtcblxuXHRcdHRoaXMudmFsaWRhdGVFbnRpdHkoZW50aXR5LCBbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdKTtcblxuXHRcdC8vY2hlY2sgZm9yIHVuaXF1ZSBjb25zdHJhaW50IHZpb2xhdGlvbnNcblx0XHRjb25zdCB1bmlxdWVzID0gdGhpcy5vcm0uZ2V0VW5pcXVlUHJvcGVydGllcygpO1xuXHRcdGZvciAobGV0IF9pID0gMDsgX2kgPCB1bmlxdWVzLmxlbmd0aDsgX2krKykge1xuXHRcdFx0Y29uc3QgcHJvcCA9IHVuaXF1ZXNbX2ldO1xuXHRcdFx0Y29uc3Qgc3QgPSB0aGlzLm9ybXN0YXRlbWVudHMuZGlhbGVjdFxuXHRcdFx0XHQuc2VsZWN0KHByb3AuY29sdW1uKVxuXHRcdFx0XHQuZnJvbSh0aGlzLm9ybS50YWJsZSlcblx0XHRcdFx0LndoZXJlKHByb3AuY29sdW1uICsgJz0/JywgW3Byb3BdKTtcblx0XHRcdGNvbnN0IHBhcmFtcyA9IHt9O1xuXHRcdFx0cGFyYW1zW3Byb3AubmFtZV0gPSBlbnRpdHlbcHJvcC5uYW1lXTtcblx0XHRcdGNvbnN0IHJzID0gdGhpcy5leGVjdXRlKHN0LCBwYXJhbXMpO1xuXHRcdFx0aWYgKHJzLmxlbmd0aCA+IDApXG5cdFx0XHRcdHRocm93IEVycm9yKCdVbmlxdWUgY29uc3RyYWludCB2aW9sYXRpb24gZm9yICcgKyBwcm9wLm5hbWUgKyAnWycgKyBlbnRpdHlbcHJvcC5uYW1lXSArICddJyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGJFbnRpdHkgPSB0aGlzLmNyZWF0ZVNRTEVudGl0eShlbnRpdHkpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHBhcmFtZXRlcmljU3RhdGVtZW50ID0gdGhpcy5vcm1zdGF0ZW1lbnRzLmluc2VydC5hcHBseSh0aGlzLm9ybXN0YXRlbWVudHMpO1xuXG5cdFx0XHRpZiAodGhpcy5vcm0uaXNBdXRvSW5jcmVtZW50UHJpbWFyeUtleSgpKSB7XG5cdFx0XHRcdGNvbnN0IGlkID0gdGhpcy5nZW5lcmF0ZUlkKCk7XG5cdFx0XHRcdGRiRW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSA9IGlkO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB1cGRhdGVkUmVjb3JkQ291bnQgPSB0aGlzLmV4ZWN1dGUocGFyYW1ldGVyaWNTdGF0ZW1lbnQsIGRiRW50aXR5KTtcblxuXHRcdFx0aWYgKCF0aGlzLm9ybS5pc0F1dG9JbmNyZW1lbnRQcmltYXJ5S2V5KCkgJiYgaXNOb3RFbXB0eUFycmF5KHVwZGF0ZWRSZWNvcmRDb3VudCkpIHtcblx0XHRcdFx0Y29uc3QgaWQgPSB1cGRhdGVkUmVjb3JkQ291bnRbMF07XG5cdFx0XHRcdGRiRW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSA9IGlkO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm5vdGlmeSgnYWZ0ZXJJbnNlcnQnLCBkYkVudGl0eSk7XG5cdFx0XHR0aGlzLm5vdGlmeSgnYmVmb3JlSW5zZXJ0QXNzb2NpYXRpb25TZXRzJywgZGJFbnRpdHkpO1xuXHRcdFx0aWYgKCh1cGRhdGVkUmVjb3JkQ291bnQgPiAwIHx8IGlzTm90RW1wdHlBcnJheSh1cGRhdGVkUmVjb3JkQ291bnQpKSAmJiB0aGlzLm9ybS5hc3NvY2lhdGlvbnMgJiYgT2JqZWN0LmtleXModGhpcy5vcm0uYXNzb2NpYXRpb25zKS5sZW5ndGgpIHtcblx0XHRcdFx0Ly9JbnNlcnQgZGVwZW5kZW5jaWVzIGlmIGFueSBhcmUgcHJvdmlkZWQgaW5saW5lIHdpdGggdGhpcyBlbnRpdHlcblx0XHRcdFx0dGhpcy4kbG9nLnRyYWNlKCdJbnNlcnRpbmcgYXNzb2NpYXRpb24gc2V0cyBmb3Ige31be31dJywgdGhpcy5vcm0udGFibGUsIGRiRW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSk7XG5cdFx0XHRcdGZvciAoY29uc3QgaWR4IGluIE9iamVjdC5rZXlzKHRoaXMub3JtLmFzc29jaWF0aW9ucykpIHtcblx0XHRcdFx0XHRjb25zdCBhc3NvY2lhdGlvbiA9IHRoaXMub3JtLmFzc29jaWF0aW9uc1tpZHhdO1xuXHRcdFx0XHRcdGNvbnN0IGFzc29jaWF0aW9uTmFtZSA9IGFzc29jaWF0aW9uWyduYW1lJ107XG5cdFx0XHRcdFx0aWYgKFt0aGlzLm9ybS5BU1NPQ0lBVElPTl9UWVBFU1snTUFOWS1UTy1NQU5ZJ10sIHRoaXMub3JtLkFTU09DSUFUSU9OX1RZUEVTWydNQU5ZLVRPLU9ORSddXS5pbmRleE9mKGFzc29jaWF0aW9uLnR5cGUpIDwgMCkge1xuXHRcdFx0XHRcdFx0aWYgKGVudGl0eVthc3NvY2lhdGlvbk5hbWVdICYmIGVudGl0eVthc3NvY2lhdGlvbk5hbWVdLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYXNzb2NpYXRpb25EYW9GYWN0b3J5RnVuYyA9IGFzc29jaWF0aW9uLnRhcmdldERhbyB8fCB0aGlzO1xuXHRcdFx0XHRcdFx0XHRpZiAoYXNzb2NpYXRpb25EYW9GYWN0b3J5RnVuYy5jb25zdHJ1Y3RvciAhPT0gRnVuY3Rpb24pXG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgRXJyb3IoJ0ludmFsaWQgT1JNOiBBc3NvY2lhdGlvbiAnICsgYXNzb2NpYXRpb25OYW1lICsgJyBkYW8gcHJvcGVydHkgaXMgZXhwZWN0ZWQgdG8gYmUgZnVuY3Rpb24uIEluc3RlYWQsIGl0IGlzOiAnICsgKHR5cGVvZiBhc3NvY2lhdGlvbkRhb0ZhY3RvcnlGdW5jKSlcblx0XHRcdFx0XHRcdFx0Y29uc3QgYXNzb2NpYXRpb25EQU8gPSBhc3NvY2lhdGlvbkRhb0ZhY3RvcnlGdW5jLmFwcGx5KHRoaXMpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLm5vdGlmeSgnYmVmb3JlSW5zZXJ0QXNzb2NpYXRpb25TZXQnLCBlbnRpdHlbYXNzb2NpYXRpb25OYW1lXSwgZW50aXR5KTtcblx0XHRcdFx0XHRcdFx0dGhpcy4kbG9nLnRyYWNlKCdJbnNlcnRpbmcge30gaW5saW5lIGVudGl0aWVzIGludG8gYXNzb2NpYXRpb24gc2V0IHt9JywgZW50aXR5W2Fzc29jaWF0aW9uTmFtZV0ubGVuZ3RoLCBhc3NvY2lhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGVudGl0eVthc3NvY2lhdGlvbk5hbWVdLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgYXNzb2NpYXRlZEVudGl0eSA9IGVudGl0eVthc3NvY2lhdGlvbk5hbWVdW2pdO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFzc29jaWF0ZWRFbnRpdHlKb2luS2V5ID0gYXNzb2NpYXRpb24uam9pbktleTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBrZXkgPSBhc3NvY2lhdGlvbi5rZXkgfHwgdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWU7XG5cdFx0XHRcdFx0XHRcdFx0YXNzb2NpYXRlZEVudGl0eVthc3NvY2lhdGVkRW50aXR5Sm9pbktleV0gPSBlbnRpdHlba2V5XTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm5vdGlmeSgnYmVmb3JlSW5zZXJ0QXNzb2NpYXRpb25TZXRFbnRpdHknLCBlbnRpdHlbYXNzb2NpYXRpb25OYW1lXSwgZGJFbnRpdHkpO1xuXG5cdFx0XHRcdFx0XHRcdFx0YXNzb2NpYXRpb25EQU8uaW5zZXJ0LmFwcGx5KGFzc29jaWF0aW9uREFPLCBbYXNzb2NpYXRlZEVudGl0eV0pO1xuXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhpcy4kbG9nLnRyYWNlKCdJbnNlcnRpbmcge30gaW5saW5lIGVudGl0aWVzIGludG8gYXNzb2NpYXRpb24gc2V0IHt9IGZpbnNpaGVkJywgZW50aXR5W2Fzc29jaWF0aW9uTmFtZV0ubGVuZ3RoLCBhc3NvY2lhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLm5vdGlmeSgnYWZ0ZXJJbnNlcnRBc3NvY2lhdGlvblNldCcsIGVudGl0eVthc3NvY2lhdGlvbk5hbWVdLCBkYkVudGl0eSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh1cGRhdGVkUmVjb3JkQ291bnQgPiAwIHx8IGlzTm90RW1wdHlBcnJheSh1cGRhdGVkUmVjb3JkQ291bnQpKSB7XG5cdFx0XHRcdGlkcy5wdXNoKGRiRW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSk7XG5cdFx0XHRcdHRoaXMuJGxvZy50cmFjZSgne31bXSBlbnRpdHkgaW5zZXJ0ZWQnLCB0aGlzLm9ybS50YWJsZSwgZGJFbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuJGxvZy50cmFjZSgnTm8gY2hhbmdlcyBpbmN1cnJlZCBpbiB7fScsIHRoaXMub3JtLnRhYmxlKTtcblx0XHRcdH1cblxuXG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0dGhpcy4kbG9nLmVycm9yKFwiSW5zZXJ0aW5nIHt9IHt9IGZhaWxlZFwiLCB0aGlzLm9ybS50YWJsZSwgKGVudGl0aWVzLmxlbmd0aCA9PT0gMSA/ICdlbnRpdHknIDogJ2VudGl0aWVzJyksIGUpO1xuXHRcdFx0dGhpcy4kbG9nLnRyYWNlKCdSb2xsaW5nIGJhY2sgY2hhbmdlcyBhZnRlciBmYWlsZWQge31be31dIGluc2VydC4gJywgdGhpcy5vcm0udGFibGUsIGRiRW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSk7XG5cdFx0XHRpZiAoZGJFbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dGhpcy5yZW1vdmUoZGJFbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0dGhpcy4kbG9nLmVycm9yKCdDb3VsZCBub3Qgcm9sbGJhY2sgY2hhbmdlcyBhZnRlciBmYWlsZWQge31be31dIGluc2VydC4gJywgdGhpcy5vcm0udGFibGUsIGRiRW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSwgZXJyKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhyb3cgZTtcblx0XHR9XG5cdH1cblxuXHRpZiAoX2VudGl0eS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpXG5cdFx0cmV0dXJuIGlkc1swXTtcblx0ZWxzZVxuXHRcdHJldHVybiBpZHM7XG59O1xuXG5mdW5jdGlvbiBpc05vdEVtcHR5QXJyYXkoYXJyYXkpIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyYXkpICYmIGFycmF5Lmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogVXBkYXRlIGVudGl0eSBmcm9tIGEgSlNPTiBvYmplY3QuIFJldHVybnMgdGhlIGlkIG9mIHRoZSB1cGRhdGVkIGVudGl0eS5cbiAqL1xuREFPLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZW50aXR5KSB7XG5cblx0dGhpcy4kbG9nLnRyYWNlKCdVcGRhdGluZyB7fVt7fV0gZW50aXR5JywgdGhpcy5vcm0udGFibGUsIGVudGl0eSAhPT0gdW5kZWZpbmVkID8gZW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSA6IGVudGl0eSk7XG5cblx0aWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkIHx8IGVudGl0eSA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBhcmd1bWVudDogZW50aXR5IGlzICcgKyBlbnRpdHkpO1xuXHR9XG5cblx0Y29uc3QgaWdub3JlZFByb3BlcnRpZXMgPSB0aGlzLm9ybS5nZXRNYW5kYXRvcnlQcm9wZXJ0aWVzKClcblx0XHQuZmlsdGVyKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5LmFsbG93ZWRPcHMgJiYgcHJvcGVydHkuYWxsb3dlZE9wcy5pbmRleE9mKCd1cGRhdGUnKSA8IDA7XG5cdFx0fSlcblx0XHQubWFwKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuXHRcdFx0cmV0dXJuIHByb3BlcnR5Lm5hbWU7XG5cdFx0fSk7XG5cdHRoaXMudmFsaWRhdGVFbnRpdHkoZW50aXR5LCBpZ25vcmVkUHJvcGVydGllcyk7XG5cblx0Y29uc3QgcGFyYW1ldGVyaWNTdGF0ZW1lbnQgPSB0aGlzLm9ybXN0YXRlbWVudHMudXBkYXRlLmFwcGx5KHRoaXMub3Jtc3RhdGVtZW50cywgW2VudGl0eV0pO1xuXG5cdGNvbnN0IGRiRW50aXR5ID0gdGhpcy5jcmVhdGVTUUxFbnRpdHkoZW50aXR5KTtcblxuXHR0cnkge1xuXHRcdHRoaXMubm90aWZ5KCdiZWZvcmVVcGRhdGVFbnRpdHknLCBkYkVudGl0eSk7XG5cdFx0Y29uc3QgdXBkYXRlZFJlY29yZHNDb3VudCA9IHRoaXMuZXhlY3V0ZShwYXJhbWV0ZXJpY1N0YXRlbWVudCwgZGJFbnRpdHkpO1xuXHRcdGlmICh1cGRhdGVkUmVjb3Jkc0NvdW50ID4gMClcblx0XHRcdHRoaXMuJGxvZy50cmFjZSgne31be31dIGVudGl0eSB1cGRhdGVkJywgdGhpcy5vcm0udGFibGUsIGRiRW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kbG9nLnRyYWNlKCdObyBjaGFuZ2VzIGluY3VycmVkIGluIHt9JywgdGhpcy5vcm0udGFibGUpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSBjYXRjaCAoZSkge1xuXHRcdHRoaXMuJGxvZy5lcnJvcignVXBkYXRpbmcge31be31dIGZhaWxlZCcsIHRoaXMub3JtLnRhYmxlLCBlbnRpdHkgIT09IHVuZGVmaW5lZCA/IGVudGl0eVt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0gOiBlbnRpdHksIGUpO1xuXHRcdHRocm93IGU7XG5cdH1cbn07XG5cbi8qKlxuICogRGVsZXRlIGVudGl0eSBieSBpZCwgb3IgYXJyYXkgb2YgaWRzLCBvciBkZWxldGUgYWxsIChpZiBub3QgYXJndW1lbnQgaXMgcHJvdmlkZWQpXG4gKi9cbkRBTy5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXG5cdGxldCBpZHMgPSBbXTtcblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcblx0XHRpZHMgPSB0aGlzLmxpc3Qoe1xuXHRcdFx0XCIkc2VsZWN0XCI6IFt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV1cblx0XHR9KS5tYXAoZnVuY3Rpb24gKGVudCkge1xuXHRcdFx0cmV0dXJuIGVudFt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV07XG5cdFx0fS5iaW5kKHRoaXMpKTtcblx0fSBlbHNlIHtcblx0XHRpZiAoYXJndW1lbnRzWzBdLmNvbnN0cnVjdG9yICE9PSBBcnJheSkge1xuXHRcdFx0aWRzID0gW2FyZ3VtZW50c1swXV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlkcyA9IGFyZ3VtZW50c1swXTtcblx0XHR9XG5cdH1cblxuXHR0aGlzLiRsb2cudHJhY2UoJ0RlbGV0aW5nICcgKyB0aGlzLm9ybS50YWJsZSArICgoaWRzICE9PSB1bmRlZmluZWQgJiYgaWRzLmxlbmd0aCA9PT0gMSkgPyAnWycgKyBpZHNbMF0gKyAnXSBlbnRpdHknIDogaWRzLmxlbmd0aCArICcgZW50aXRpZXMnKSk7XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcblxuXHRcdGxldCBpZCA9IGlkc1tpXTtcblx0XHQvL3ByZXZlbnQgaW1wbGljaXQgdHlwZSBjb252ZXJ0aW9uXG5cdFx0aWYgKHRoaXMub3JtLmdldFByaW1hcnlLZXkoKS50eXBlLnRvVXBwZXJDYXNlKCkgIT09ICdWQVJDSEFSJylcblx0XHRcdGlkID0gcGFyc2VJbnQoaWQsIDEwKTtcblxuXHRcdGlmIChpZHMubGVuZ3RoID4gMSlcblx0XHRcdHRoaXMuJGxvZy50cmFjZSgnRGVsZXRpbmcge31be31dIGVudGl0eScsIHRoaXMub3JtLnRhYmxlLCBpZCk7XG5cblx0XHRpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50IGZvciBpZCBwYXJhbWV0ZXI6JyArIGlkKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXG5cdFx0XHR0aGlzLm5vdGlmeSgnYmVmb3JlUmVtb3ZlRW50aXR5JywgaWQpO1xuXG5cdFx0XHQvL2ZpcnN0IHdlIGF0dGVtcHQgdG8gcmVtb3ZlIGRlcG5kZW50cyBpZiBhbnlcblx0XHRcdGlmICh0aGlzLm9ybS5hc3NvY2lhdGlvbnMpIHtcblx0XHRcdFx0Ly9SZW1vdmUgYXNzb2NpYXRlZCBkZXBlbmRlbmNpZXNcblx0XHRcdFx0Zm9yIChjb25zdCBpZHggaW4gT2JqZWN0LmtleXModGhpcy5vcm0uYXNzb2NpYXRpb25zKSkge1xuXHRcdFx0XHRcdGNvbnN0IGFzc29jaWF0aW9uID0gdGhpcy5vcm0uYXNzb2NpYXRpb25zW2lkeF07XG5cdFx0XHRcdFx0Y29uc3QgYXNzb2NpYXRpb25OYW1lID0gYXNzb2NpYXRpb25bJ25hbWUnXTtcblx0XHRcdFx0XHRpZiAoW3RoaXMub3JtLkFTU09DSUFUSU9OX1RZUEVTWydNQU5ZLVRPLU1BTlknXSwgdGhpcy5vcm0uQVNTT0NJQVRJT05fVFlQRVNbJ01BTlktVE8tT05FJ11dLmluZGV4T2YoYXNzb2NpYXRpb24udHlwZSkgPCAwKSB7XG5cdFx0XHRcdFx0XHR0aGlzLiRsb2cudHJhY2UoXCJJbnNwZWN0aW5nIHt9W3t9fV0gZW50aXR5J3MgZGVwZW5kZW5jeSAne30nIGZvciBlbnRpdGllcyB0byBkZWxldGUuXCIsIHRoaXMub3JtLnRhYmxlLCBpZCwgYXNzb2NpYXRpb25OYW1lKTtcblx0XHRcdFx0XHRcdGNvbnN0IGFzc29jaWF0aW9uREFPID0gYXNzb2NpYXRpb24udGFyZ2V0RGFvID8gYXNzb2NpYXRpb24udGFyZ2V0RGFvKCkgOiB0aGlzO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2V0dGluZ3MgPSB7fTtcblx0XHRcdFx0XHRcdGxldCBqb2luSWQgPSBpZDtcblx0XHRcdFx0XHRcdC8vY2hlY2sgaWYgd2UgYXJlIGpvaW5pbmcgb24gZmllbGQsIG90aGVyIHRoYW4gcGtcblx0XHRcdFx0XHRcdGlmIChhc3NvY2lhdGlvbi5rZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgY3R4RW50aXR5ID0gdGhpcy5maW5kKGlkKTtcblx0XHRcdFx0XHRcdFx0am9pbklkID0gY3R4RW50aXR5W2Fzc29jaWF0aW9uLmtleV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRzZXR0aW5nc1thc3NvY2lhdGlvbi5qb2luS2V5XSA9IGpvaW5JZDtcblx0XHRcdFx0XHRcdGxldCBhc3NvY2lhdGVkRW50aXRpZXM7XG5cdFx0XHRcdFx0XHQvL2Fzc29jaWF0ZWRFbnRpdGllcyA9IHRoaXMuZXhwYW5kKGFzc29jaWF0aW9uTmFtZSwgaWQpO1xuXHRcdFx0XHRcdFx0YXNzb2NpYXRlZEVudGl0aWVzID0gYXNzb2NpYXRpb25EQU8ubGlzdChzZXR0aW5ncyk7XG5cdFx0XHRcdFx0XHRpZiAoYXNzb2NpYXRlZEVudGl0aWVzICYmIGFzc29jaWF0ZWRFbnRpdGllcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuJGxvZy50cmFjZShcIkRlbGV0aW5nIHt9W3t9XSBlbnRpdHkncyB7fSBkZXBlbmRlbnQge31cIiwgdGhpcy5vcm0udGFibGUsIGlkLCBhc3NvY2lhdGVkRW50aXRpZXMubGVuZ3RoLCBhc3NvY2lhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLm5vdGlmeSgnYmVmb3JlUmVtb3ZlQXNzb2NpYXRpb25TZXQnLCBhc3NvY2lhdGVkRW50aXRpZXMsIGlkKTtcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBhc3NvY2lhdGVkRW50aXRpZXMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBhc3NvY2lhdGVkRW50aXR5ID0gYXNzb2NpYXRlZEVudGl0aWVzW2pdO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMubm90aWZ5KCdiZWZvcmVSZW1vdmVBc3NvY2lhdGlvblNldEVudGl0eScsIGFzc29jaWF0ZWRFbnRpdHksIGFzc29jaWF0ZWRFbnRpdGllcywgaWQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0YXNzb2NpYXRpb25EQU8ucmVtb3ZlLmFwcGx5KGFzc29jaWF0aW9uREFPLCBbYXNzb2NpYXRlZEVudGl0eVthc3NvY2lhdGlvbkRBTy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdXSk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGlzLiRsb2cudHJhY2UoXCJ7fVt7fV0gZW50aXR5J3Mge30gZGVwZW5kZW50IHt9IHt9IGRlbGV0ZWQuXCIsIHRoaXMub3JtLnRhYmxlLCBpZCwgYXNzb2NpYXRlZEVudGl0aWVzLmxlbmd0aCwgYXNzb2NpYXRpb25OYW1lLCBhc3NvY2lhdGVkRW50aXRpZXMubGVuZ3RoID4gMSA/ICdlbnRpdGllcycgOiAnZW50aXR5Jyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvL0RlbGV0ZSBieSBwcmltYXJ5IGtleSB2YWx1ZVxuXHRcdFx0Y29uc3QgcGFyYW1ldGVyaWNTdGF0ZW1lbnQgPSB0aGlzLm9ybXN0YXRlbWVudHNbXCJkZWxldGVcIl0uYXBwbHkodGhpcy5vcm1zdGF0ZW1lbnRzLCBbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdKTtcblx0XHRcdGxldCBwYXJhbXMgPSB7fTtcblx0XHRcdHBhcmFtc1t0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0gPSBpZDtcblxuXHRcdFx0Y29uc3QgdXBkYXRlZFJlY29yZHNDb3VudCA9IHRoaXMuZXhlY3V0ZShwYXJhbWV0ZXJpY1N0YXRlbWVudCwgcGFyYW1zKTtcblxuXHRcdFx0aWYgKHVwZGF0ZWRSZWNvcmRzQ291bnQgPiAwKVxuXHRcdFx0XHR0aGlzLiRsb2cudHJhY2UoJ3t9W3t9XSBlbnRpdHkgZGVsZXRlZCcsIHRoaXMub3JtLnRhYmxlLCBpZCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuJGxvZy50cmFjZSgnTm8gY2hhbmdlcyBpbmN1cnJlZCBpbiB7fScsIHRoaXMub3JtLnRhYmxlKTtcblxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHRoaXMuJGxvZy5lcnJvcignRGVsZXRpbmcge31be31dIGVudGl0eSBmYWlsZWQnLHRoaXMub3JtLnRhYmxlLCBpZCwgZSk7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH1cblxuXHR9XG5cbn07XG5cbkRBTy5wcm90b3R5cGUuZXhwYW5kID0gZnVuY3Rpb24gKGV4cGFuc2lvblBhdGgsIGNvbnRleHQpIHtcblx0bGV0IGk7XG5cdGxldCBzZXR0aW5ncztcblx0bGV0IGtleTtcblx0bGV0IGpvaW5JZDtcblx0dGhpcy4kbG9nLnRyYWNlKCdFeHBhbmRpbmcgZm9yIGFzc29jaWF0aW9uIHBhdGgge30gYW5kIGNvbnRleHQgZW50aXR5IHt9JywgZXhwYW5zaW9uUGF0aCwgKHR5cGVvZiBhcmd1bWVudHNbMV0gIT09ICdvYmplY3QnID8gJ2lkICcgOiAnJykgKyBKU09OLnN0cmluZ2lmeShhcmd1bWVudHNbMV0pKTtcblx0aWYgKCFleHBhbnNpb25QYXRoIHx8ICFleHBhbnNpb25QYXRoLmxlbmd0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBhcmd1bWVudDogZXhwYW5zaW9uUGF0aFsnICsgZXhwYW5zaW9uUGF0aCArICddJyk7XG5cdH1cblx0aWYgKCFjb250ZXh0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBjb250ZXh0WycgKyBjb250ZXh0ICsgJ10nKTtcblx0fVxuXHRjb25zdCBhc3NvY2lhdGlvbk5hbWUgPSBleHBhbnNpb25QYXRoLnNwbGljZSA/IGV4cGFuc2lvblBhdGguc3BsaWNlKDAsIDEpWzBdIDogZXhwYW5zaW9uUGF0aDtcblx0Y29uc3QgYXNzb2NpYXRpb24gPSB0aGlzLm9ybS5nZXRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbk5hbWUpO1xuXHRpZiAoIWFzc29jaWF0aW9uTmFtZSB8fCAhYXNzb2NpYXRpb24pXG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBVbmtub3duIGFzc29jaWF0aW9uIGZvciB0aGlzIERBTyBbJyArIGFzc29jaWF0aW9uTmFtZSArICddJyk7XG5cdGNvbnN0IGpvaW5LZXkgPSBhc3NvY2lhdGlvbi5qb2luS2V5O1xuXG5cdGxldCBjb250ZXh0RW50aXR5O1xuXHRpZiAoY29udGV4dFt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdGNvbnRleHRFbnRpdHkgPSBjb250ZXh0O1xuXHR9IGVsc2Uge1xuXHRcdGNvbnRleHRFbnRpdHkgPSB0aGlzLmZpbmQoY29udGV4dCk7XG5cdH1cblxuXHRpZiAoIWNvbnRleHRFbnRpdHkpIHtcblx0XHR0aHJvdyBFcnJvcignTm8gcmVjb3JkIGZvdW5kIGZvciBjb250ZXh0IGVudGl0eSBbJyArIGNvbnRleHQgKyAnXScpO1xuXHR9XG5cblx0Y29uc3QgYXNzb2NpYXRpb25UYXJnZXREQU8gPSBhc3NvY2lhdGlvbi50YXJnZXREYW8gPyBhc3NvY2lhdGlvbi50YXJnZXREYW8uYXBwbHkodGhpcykgOiB0aGlzO1xuXHRpZiAoIWFzc29jaWF0aW9uVGFyZ2V0REFPKVxuXHRcdHRocm93IEVycm9yKCdObyB0YXJnZXQgYXNzb2NpYXRpb24gREFPIGluc3RhbmNlIGF2YWlsYWJsZSBmb3IgYXNzb2NpYXRpb24gJyArIGFzc29jaWF0aW9uTmFtZSk7XG5cblx0bGV0IGV4cGFuc2lvbjtcblx0bGV0IGFzc29jaWF0aW9uRW50aXRpZXMgPSBbXTtcblxuXHRpZiAoYXNzb2NpYXRpb24udHlwZSA9PT0gdGhpcy5vcm0uQVNTT0NJQVRJT05fVFlQRVNbJ09ORS1UTy1PTkUnXSB8fCBhc3NvY2lhdGlvbi50eXBlID09PSB0aGlzLm9ybS5BU1NPQ0lBVElPTl9UWVBFU1snTUFOWS1UTy1PTkUnXSkge1xuXHRcdGpvaW5JZCA9IGNvbnRleHRFbnRpdHlbam9pbktleV07XG5cdFx0dGhpcy4kbG9nLnRyYWNlKCdFeHBhbmRpbmcgYXNzb2NpYXRpb24gdHlwZSB7fSBvbiB7fVt7fV0nLCBhc3NvY2lhdGlvbi50eXBlLCBqb2luS2V5LCBqb2luSWQpO1xuXHRcdGlmICghYXNzb2NpYXRpb24ua2V5IHx8IGFzc29jaWF0aW9uLmtleSA9PT0gYXNzb2NpYXRpb25UYXJnZXREQU8ub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lKVxuXHRcdFx0ZXhwYW5zaW9uID0gYXNzb2NpYXRpb25UYXJnZXREQU8uZmluZC5hcHBseShhc3NvY2lhdGlvblRhcmdldERBTywgW2pvaW5JZF0pO1xuXHRcdGVsc2Uge1xuXHRcdFx0bGV0IGxpc3RTZXR0aW5ncyA9IHt9O1xuXHRcdFx0bGlzdFNldHRpbmdzW1wiJGZpbHRlclwiXSA9IGFzc29jaWF0aW9uLmtleTtcblx0XHRcdGxpc3RTZXR0aW5nc1thc3NvY2lhdGlvbi5rZXldID0gam9pbklkO1xuXHRcdFx0ZXhwYW5zaW9uID0gYXNzb2NpYXRpb25UYXJnZXREQU8ubGlzdC5hcHBseShhc3NvY2lhdGlvblRhcmdldERBTywgW2xpc3RTZXR0aW5nc10pWzBdO1xuXHRcdH1cblxuXHRcdGlmIChleHBhbnNpb25QYXRoLmxlbmd0aCA+IDApIHtcblx0XHRcdHRoaXMuZXhwYW5kKGV4cGFuc2lvblBhdGgsIGV4cGFuc2lvbik7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGFzc29jaWF0aW9uLnR5cGUgPT09IHRoaXMub3JtLkFTU09DSUFUSU9OX1RZUEVTWydPTkUtVE8tTUFOWSddKSB7XG5cdFx0c2V0dGluZ3MgPSB7fTtcblx0XHRpZiAoYXNzb2NpYXRpb24uZGVmYXVsdHMpXG5cdFx0XHRzZXR0aW5ncyA9IGFzc29jaWF0aW9uLmRlZmF1bHRzO1xuXHRcdGtleSA9IGFzc29jaWF0aW9uLmtleSB8fCB0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZTtcblx0XHRqb2luSWQgPSBjb250ZXh0RW50aXR5W2tleV07XG5cdFx0dGhpcy4kbG9nLnRyYWNlKCdFeHBhbmRpbmcgYXNzb2NpYXRpb24gdHlwZSB7fSBvbiB7fVt7fV0nLCBhc3NvY2lhdGlvbi50eXBlLCBqb2luS2V5LCBqb2luSWQpO1xuXHRcdHNldHRpbmdzW2pvaW5LZXldID0gam9pbklkO1xuXHRcdGFzc29jaWF0aW9uRW50aXRpZXMgPSBhc3NvY2lhdGlvbkVudGl0aWVzLmNvbmNhdChhc3NvY2lhdGlvblRhcmdldERBTy5saXN0LmFwcGx5KGFzc29jaWF0aW9uVGFyZ2V0REFPLCBbc2V0dGluZ3NdKSk7XG5cblx0XHRpZiAoZXhwYW5zaW9uUGF0aC5sZW5ndGggPiAwKSB7XG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgYXNzb2NpYXRpb25FbnRpdGllcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR0aGlzLmV4cGFuZChleHBhbnNpb25QYXRoLCBhc3NvY2lhdGlvbkVudGl0aWVzW2ldKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwYW5zaW9uID0gYXNzb2NpYXRpb25FbnRpdGllcztcblx0XHR9XG5cdH0gZWxzZSBpZiAoYXNzb2NpYXRpb24udHlwZSA9PT0gdGhpcy5vcm0uQVNTT0NJQVRJT05fVFlQRVNbJ01BTlktVE8tTUFOWSddKSB7XG5cdFx0Y29uc3Qgam9pbkRBTyA9IGFzc29jaWF0aW9uLmpvaW5EYW8oKTtcblx0XHRpZiAoIWpvaW5EQU8pXG5cdFx0XHR0aHJvdyBFcnJvcignTm8gam9pbiBEQU8gaW5zdGFuY2UgYXZhaWxhYmxlIGZvciBhc3NvY2lhdGlvbiAnICsgYXNzb2NpYXRpb25OYW1lKTtcblx0XHRpZiAoIWpvaW5EQU8ubGlzdEpvaW5zKVxuXHRcdFx0dGhyb3cgRXJyb3IoJ05vIGxpc3RKb2lucyBmdW5jdGlvbiBpbiBqb2luIERBTyBpbnN0YW5jZSBhdmFpbGFibGUgZm9yIGFzc29jaWF0aW9uICcgKyBhc3NvY2lhdGlvbk5hbWUpO1xuXHRcdHNldHRpbmdzID0ge307XG5cdFx0a2V5ID0gYXNzb2NpYXRpb24ua2V5IHx8IHRoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lO1xuXHRcdGpvaW5JZCA9IGNvbnRleHRFbnRpdHlba2V5XTtcblx0XHRzZXR0aW5nc1thc3NvY2lhdGlvbi5qb2luS2V5XSA9IGpvaW5JZDtcblx0XHRhc3NvY2lhdGlvbkVudGl0aWVzID0gYXNzb2NpYXRpb25FbnRpdGllcy5jb25jYXQoam9pbkRBTy5saXN0Sm9pbnMuYXBwbHkoam9pbkRBTywgW3NldHRpbmdzLCB7IFwic291cmNlRGFvXCI6IHRoaXMsIFwiam9pbkRhb1wiOiBqb2luREFPLCBcInRhcmdldERhb1wiOiBhc3NvY2lhdGlvblRhcmdldERBTyB9XSkpO1xuXHRcdGlmIChleHBhbnNpb25QYXRoLmxlbmd0aCA+IDApIHtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhc3NvY2lhdGlvbkVudGl0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHRoaXMuZXhwYW5kKGV4cGFuc2lvblBhdGgsIGFzc29jaWF0aW9uRW50aXRpZXNbaV0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRleHBhbnNpb24gPSBhc3NvY2lhdGlvbkVudGl0aWVzO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZXhwYW5zaW9uO1xufTtcblxuLyoqXG4gKiBSZWFkcyBhIHNpbmdsZSBlbnRpdHkgYnkgaWQsIHBhcnNlZCBpbnRvIEpTT04gb2JqZWN0LlxuICogSWYgcmVxdWVzdGVkIGFzIGV4cGFuZGVkIHRoZSByZXR1cm5lZCBlbnRpdHkgd2lsbCBjb21wcmlzZSBhc3NvY2lhdGVkIChkZXBlbmRlbnQpIGVudGl0aWVzIHRvby4gXG4gKiBFeHBhbmQgY2FuIGJlIGEgc3RyaW5nIHRoYSB0aXMgYSB2YWxpZCBhc3NvY2lhdGlvbiBuYW1lIGRlZmluZWQgaW4gdGhpcyBkYW8gb3JtIG9yIGFuIGFycmF5IG9mIHN1Y2ggbmFtZXMuXG4gKi9cbkRBTy5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uIChpZCwgZXhwYW5kLCBzZWxlY3QpIHtcblx0aWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdvYmplY3QnKSB7XG5cdFx0aWQgPSBhcmd1bWVudHNbMF0uaWQ7XG5cdFx0ZXhwYW5kID0gYXJndW1lbnRzWzBdLiRleHBhbmQgfHwgYXJndW1lbnRzWzBdLmV4cGFuZDtcblx0XHRzZWxlY3QgPSBhcmd1bWVudHNbMF0uJHNlbGVjdCB8fCBhcmd1bWVudHNbMF0uc2VsZWN0O1xuXHR9XG5cblx0dGhpcy4kbG9nLnRyYWNlKCdGaW5kaW5nIHt9W3t9XSBlbnRpdHkgd2l0aCBsaXN0IHBhcmFtZXRlcnMgZXhwYW5kW3t9XSwgc2VsZWN0W3t9XScsIHRoaXMub3JtLnRhYmxlLCBpZCwgZXhwYW5kLCBzZWxlY3QpO1xuXG5cdGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50IGZvciBpZCBwYXJhbWV0ZXI6JyArIGlkKTtcblx0fVxuXG5cdHRyeSB7XG5cdFx0bGV0IGVudGl0eTtcblx0XHRpZiAoc2VsZWN0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmIChzZWxlY3QuY29uc3RydWN0b3IgIT09IEFycmF5KSB7XG5cdFx0XHRcdGlmIChzZWxlY3QuY29uc3RydWN0b3IgPT09IFN0cmluZykge1xuXHRcdFx0XHRcdHNlbGVjdCA9IHNlbGVjdC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoc2VsKSB7XG5cdFx0XHRcdFx0XHRpZiAoc2VsLmNvbnN0cnVjdG9yICE9PSBTdHJpbmcpXG5cdFx0XHRcdFx0XHRcdHRocm93IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBzZWxlY3QgYXJyYXkgY29tcG9uZW50cyBhcmUgZXhwZWN0ZWQgb3QgYmUgc3RyaW5ncyBidXQgZm91bmQgJyArICh0eXBlb2Ygc2VsKSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc2VsLnRyaW0oKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBFcnJvcignSWxsZWdhbCBhcmd1bWVudDogc2VsZWN0IGlzIGV4cGVjdGVkIHRvIGJlIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIGJ1dCB3YXMgJyArICh0eXBlb2Ygc2VsZWN0KSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Ly9lbnN1cmUgdGhhdCBqb2lua2V5cyBmb3IgcmVxdWlyZWQgZXhwYW5kcyBhcmUgYXZhaWxhYmxlIGFuZCBub3QgZmlsdGVyZWQgYnkgc2VsZWN0XG5cdFx0aWYgKHNlbGVjdCAhPT0gdW5kZWZpbmVkICYmIGV4cGFuZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZWxlY3QucHVzaCh0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZSk7XG5cdFx0XHQvL1RPRE86IGNoZWNrc1xuXHRcdFx0Lypmb3IodmFyIGkgaW4gZXhwYW5kKXtcblx0XHRcdFx0dmFyIGFzc29jaWF0aW9uID0gdGhpcy5vcm0uYXNzb2NpYXRpb25zW2V4cGFuZFtpXV07XG5cdFx0XHRcdGlmKGFzc29jaWF0aW9uICYmIHNlbGVjdC5pbmRleE9mKGFzc29jaWF0aW9uLmpvaW5LZXkpPDEpe1xuXHRcdFx0XHRcdHNlbGVjdC5wdXNoKGFzc29jaWF0aW9uLmpvaW5LZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9Ki9cblx0XHR9XG5cdFx0bGV0IGZpbmRRYlBhcmFtcyA9IHtcblx0XHRcdHNlbGVjdDogc2VsZWN0XG5cdFx0fTtcblx0XHRjb25zdCBwYXJhbWV0ZXJpY1N0YXRlbWVudCA9IHRoaXMub3Jtc3RhdGVtZW50cy5maW5kLmFwcGx5KHRoaXMub3Jtc3RhdGVtZW50cywgW2ZpbmRRYlBhcmFtc10pO1xuXHRcdGxldCBwYXJhbXMgPSB7fTtcblxuXHRcdC8vcHJldmVudCBpbXBsaWNpdCB0eXBlIGNvbnZlcnRpb25cblx0XHRpZiAodGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLnR5cGUudG9VcHBlckNhc2UoKSAhPT0gJ1ZBUkNIQVInKVxuXHRcdFx0aWQgPSBwYXJzZUludChpZCwgMTApO1xuXG5cdFx0cGFyYW1zW3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSA9IGlkO1xuXHRcdGNvbnN0IHJlc3VsdFNldCA9IHRoaXMuZXhlY3V0ZShwYXJhbWV0ZXJpY1N0YXRlbWVudCwgcGFyYW1zKTtcblxuXHRcdGlmIChyZXN1bHRTZXRbMF0pIHtcblx0XHRcdGVudGl0eSA9IHRoaXMuY3JlYXRlRW50aXR5KHJlc3VsdFNldFswXSwgc2VsZWN0KTtcblx0XHRcdGlmIChlbnRpdHkpIHtcblx0XHRcdFx0dGhpcy4kbG9nLnRyYWNlKCd7fVt7fV0gZW50aXR5IGZvdW5kJywgdGhpcy5vcm0udGFibGUsIGlkKTtcblx0XHRcdFx0dGhpcy5ub3RpZnkoJ2FmdGVyRm91bmQnLCBlbnRpdHkpO1xuXHRcdFx0XHRpZiAoZXhwYW5kICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAoZXhwYW5kLmNvbnN0cnVjdG9yICE9PSBBcnJheSkge1xuXHRcdFx0XHRcdFx0aWYgKGV4cGFuZC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdGV4cGFuZCA9IFN0cmluZyhleHBhbmQpO1xuXHRcdFx0XHRcdFx0XHRleHBhbmQgPSBleHBhbmQuc3BsaXQoJywnKS5tYXAoZnVuY3Rpb24gKGV4cCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChleHAuY29uc3RydWN0b3IgIT09IFN0cmluZylcblx0XHRcdFx0XHRcdFx0XHRcdHRocm93IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBleHBhbmQgYXJyYXkgY29tcG9uZW50cyBhcmUgZXhwZWN0ZWQgb3QgYmUgc3RyaW5ncyBidXQgZm91bmQgJyArICh0eXBlb2YgZXhwKSk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGV4cC50cmltKCk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IGV4cGFuZCBpcyBleHBlY3RlZCB0byBiZSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyBidXQgd2FzICcgKyAodHlwZW9mIGV4cGFuZCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2YXIgYXNzb2NpYXRpb25OYW1lcyA9IHRoaXMub3JtLmdldEFzc29jaWF0aW9uTmFtZXMoKTtcblx0XHRcdFx0XHRmb3IgKHZhciBpZHggaW4gYXNzb2NpYXRpb25OYW1lcykge1xuXHRcdFx0XHRcdFx0dmFyIGFzc29jaWF0aW9uTmFtZSA9IGFzc29jaWF0aW9uTmFtZXNbaWR4XTtcblx0XHRcdFx0XHRcdGlmIChleHBhbmQuaW5kZXhPZihhc3NvY2lhdGlvbk5hbWUpID4gLTEpIHtcblx0XHRcdFx0XHRcdFx0ZW50aXR5W2Fzc29jaWF0aW9uTmFtZV0gPSB0aGlzLmV4cGFuZChbYXNzb2NpYXRpb25OYW1lXSwgZW50aXR5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuJGxvZy50cmFjZSgne31be31dIGVudGl0eSBub3QgZm91bmQnLCB0aGlzLm9ybS50YWJsZSwgaWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZW50aXR5O1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0dGhpcy4kbG9nLmVycm9yKFwiRmluZGluZyB7fVt7fV0gZW50aXR5IGZhaWxlZC5cIiwgdGhpcy5vcm0udGFibGUsIGlkLCBlKTtcblx0XHR0aHJvdyBlO1xuXHR9XG59O1xuXG5EQU8ucHJvdG90eXBlLmNvdW50ID0gZnVuY3Rpb24gKHNldHRpbmdzPykge1xuXHRzZXR0aW5ncyA9IHNldHRpbmdzIHx8IHt9O1xuXG5cdGNvbnN0IHBhcmFtZXRlcmljU3RhdGVtZW50ID0gdGhpcy5vcm1zdGF0ZW1lbnRzLmNvdW50LmFwcGx5KHRoaXMub3Jtc3RhdGVtZW50cywgW3NldHRpbmdzXSk7XG5cdHRoaXMuJGxvZy50cmFjZSgnQ291bnRpbmcgJyArIHRoaXMub3JtLnRhYmxlICsgJyBlbnRpdGllcycpO1xuXG5cdGxldCBjb3VudCA9IDA7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcnMgPSB0aGlzLmV4ZWN1dGUocGFyYW1ldGVyaWNTdGF0ZW1lbnQsIHNldHRpbmdzKTtcblx0XHRpZiAocnMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly9leHBlY3RhaW9uIGlzIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IGluIHRoZSByZXN1bHQgc2V0IHdpdGggYSBzaW5nbGUgcG9ycGVydHlcblx0XHRcdGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKHJzWzBdKVswXTtcblx0XHRcdGNvdW50ID0gcGFyc2VJbnQocnNbMF1ba2V5XSwgMTApO1xuXHRcdH1cblx0fSBjYXRjaCAoZSkge1xuXHRcdHRoaXMuJGxvZy5lcnJvcignQ291bnRpbmcge30gZW50aXRpZXMgZmFpbGVkJywgdGhpcy5vcm0udGFibGUsIGUpO1xuXHRcdGUuZXJyQ29udGV4dCA9IHBhcmFtZXRlcmljU3RhdGVtZW50LnRvU3RyaW5nKCk7XG5cdFx0dGhyb3cgZTtcblx0fVxuXG5cdHRoaXMuJGxvZy50cmFjZSgne30ge30gZW50aXRpZXMgY291bnRlZCcsIFN0cmluZyhjb3VudCksIHRoaXMub3JtLnRhYmxlKTtcblxuXHRyZXR1cm4gY291bnQ7XG59O1xuXG4vKlxuICogbGlzdCBwYXJhbWV0ZXJzOlxuICogLSAkZXhwYW5kXG4gKiAtICRmaWx0ZXJcbiAqIC0gJHNlbGVjdFxuICogLSAkc29ydFxuICogLSAkb3JkZXJcbiAqIC0gJGxpbWl0XG4gKiAtICRvZmZzZXRcbiAqL1xuREFPLnByb3RvdHlwZS5saXN0ID0gZnVuY3Rpb24gKHNldHRpbmdzKSB7XG5cblx0bGV0IGtleTtcblx0c2V0dGluZ3MgPSBzZXR0aW5ncyB8fCB7fTtcblxuXHRjb25zdCBleHBhbmQgPSBzZXR0aW5ncy4kZXhwYW5kIHx8IHNldHRpbmdzLmV4cGFuZDtcblx0aWYgKGV4cGFuZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0aWYgKGV4cGFuZC5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHtcblx0XHRcdGlmIChleHBhbmQuY29uc3RydWN0b3IgPT09IFN0cmluZykge1xuXHRcdFx0XHRpZiAoZXhwYW5kLmluZGV4T2YoJywnKSA+IC0xKSB7XG5cdFx0XHRcdFx0c2V0dGluZ3MuJGV4cGFuZCA9IGV4cGFuZC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoZXhwKSB7XG5cdFx0XHRcdFx0XHRpZiAoZXhwLmNvbnN0cnVjdG9yICE9PSBTdHJpbmcpXG5cdFx0XHRcdFx0XHRcdHRocm93IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBleHBhbmQgYXJyYXkgY29tcG9uZW50cyBhcmUgZXhwZWN0ZWQgb3QgYmUgc3RyaW5ncyBidXQgZm91bmQgJyArICh0eXBlb2YgZXhwKSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZXhwLnRyaW0oKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzZXR0aW5ncy4kZXhwYW5kID0gW2V4cGFuZF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBleHBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgYnV0IHdhcyAnICsgKHR5cGVvZiBleHBhbmQpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRjb25zdCBzZWxlY3QgPSBzZXR0aW5ncy4kc2VsZWN0IHx8IHNldHRpbmdzLnNlbGVjdDtcblx0aWYgKHNlbGVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0aWYgKHNlbGVjdC5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHtcblx0XHRcdGlmIChzZWxlY3QuY29uc3RydWN0b3IgPT09IFN0cmluZykge1xuXHRcdFx0XHRpZiAoc2VsZWN0LmluZGV4T2YoJywnKSA+IC0xKSB7XG5cdFx0XHRcdFx0c2V0dGluZ3MuJHNlbGVjdCA9IHNlbGVjdC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoZXhwKSB7XG5cdFx0XHRcdFx0XHRpZiAoZXhwLmNvbnN0cnVjdG9yICE9PSBTdHJpbmcpXG5cdFx0XHRcdFx0XHRcdHRocm93IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBzZWxlY3QgYXJyYXkgY29tcG9uZW50cyBhcmUgZXhwZWN0ZWQgb3QgYmUgc3RyaW5ncyBidXQgZm91bmQgJyArICh0eXBlb2YgZXhwKSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZXhwLnRyaW0oKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzZXR0aW5ncy4kc2VsZWN0ID0gW3NlbGVjdF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBzZWxlY3QgaXMgZXhwZWN0ZWQgdG8gYmUgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgYnV0IHdhcyAnICsgKHR5cGVvZiBleHBhbmQpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXG5cdGNvbnN0IGxpc3RBcmdzID0gW107XG5cdGZvciAoa2V5IGluIHNldHRpbmdzKSB7XG5cdFx0bGlzdEFyZ3MucHVzaCgnICcgKyBrZXkgKyAnWycgKyBzZXR0aW5nc1trZXldICsgJ10nKTtcblx0fVxuXG5cdHRoaXMuJGxvZy50cmFjZSgnTGlzdGluZyB7fSBlbnRpdHkgY29sbGVjdGlvbiB3aXRoIGxpc3Qgb3BlcmF0b3JzOiB7fScsIHRoaXMub3JtLnRhYmxlLCBsaXN0QXJncy5qb2luKCcsJykpO1xuXG5cdGlmIChzZXR0aW5ncy4kc2VsZWN0ICE9PSB1bmRlZmluZWQgJiYgZXhwYW5kICE9PSB1bmRlZmluZWQpIHtcblx0XHRzZXR0aW5ncy4kc2VsZWN0LnB1c2godGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWUpO1xuXHR9XG5cblx0dmFyIHBhcmFtZXRlcmljU3RhdGVtZW50ID0gdGhpcy5vcm1zdGF0ZW1lbnRzLmxpc3QuYXBwbHkodGhpcy5vcm1zdGF0ZW1lbnRzLCBbc2V0dGluZ3NdKTtcblxuXHR0cnkge1xuXHRcdGxldCBlbnRpdGllcyA9IFtdO1xuXG5cdFx0Y29uc3QgcmVzdWx0U2V0ID0gdGhpcy5leGVjdXRlKHBhcmFtZXRlcmljU3RhdGVtZW50LCBzZXR0aW5ncyk7XG5cblx0XHRyZXN1bHRTZXQuZm9yRWFjaChmdW5jdGlvbiAocnNFbnRyeSkge1xuXHRcdFx0dmFyIGVudGl0eSA9IHRoaXMuY3JlYXRlRW50aXR5KHJzRW50cnksIHNldHRpbmdzLiRzZWxlY3QpO1xuXHRcdFx0aWYgKGV4cGFuZCkge1xuXHRcdFx0XHR2YXIgYXNzb2NpYXRpb25OYW1lcyA9IHRoaXMub3JtLmdldEFzc29jaWF0aW9uTmFtZXMoKTtcblx0XHRcdFx0Zm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgYXNzb2NpYXRpb25OYW1lcy5sZW5ndGg7IGlkeCsrKSB7XG5cdFx0XHRcdFx0dmFyIGFzc29jaWF0aW9uTmFtZSA9IGFzc29jaWF0aW9uTmFtZXNbaWR4XTtcblx0XHRcdFx0XHRpZiAoZXhwYW5kLmluZGV4T2YoYXNzb2NpYXRpb25OYW1lKSA+IC0xKSB7XG5cdFx0XHRcdFx0XHRlbnRpdHlbYXNzb2NpYXRpb25OYW1lXSA9IHRoaXMuZXhwYW5kKFthc3NvY2lhdGlvbk5hbWVdLCBlbnRpdHkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5ub3RpZnkoJ2FmdGVyRm91bmQnLCBlbnRpdHksIHNldHRpbmdzKTtcblx0XHRcdGVudGl0aWVzLnB1c2goZW50aXR5KTtcblx0XHR9LmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy4kbG9nLnRyYWNlKCd7fSB7fSBlbnRpdGllcyBmb3VuZCcsIGVudGl0aWVzLmxlbmd0aCwgdGhpcy5vcm0udGFibGUpO1xuXG5cdFx0cmV0dXJuIGVudGl0aWVzO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0dGhpcy4kbG9nLmVycm9yKFwiTGlzdGluZyB7fSBlbnRpdGllcyBmYWlsZWQuXCIsIHRoaXMub3JtLnRhYmxlLCBlKTtcblx0XHR0aHJvdyBlO1xuXHR9XG59O1xuXG5EQU8ucHJvdG90eXBlLmV4aXN0c1RhYmxlID0gZnVuY3Rpb24gKCkge1xuXHR0aGlzLiRsb2cudHJhY2UoJ0NoZWNrIGV4aXN0cyB0YWJsZSAnICsgdGhpcy5vcm0udGFibGUpO1xuXHR0cnkge1xuXHRcdGNvbnN0IHBhcmFtZXRlcmljU3RhdGVtZW50ID0gdGhpcy5vcm1zdGF0ZW1lbnRzLmNvdW50LmFwcGx5KHRoaXMub3Jtc3RhdGVtZW50cyk7XG5cdFx0Y29uc3QgcnMgPSB0aGlzLmV4ZWN1dGUocGFyYW1ldGVyaWNTdGF0ZW1lbnQpO1xuXHRcdHJldHVybiBycy5sZW5ndGggPiAwO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG5EQU8ucHJvdG90eXBlLmNyZWF0ZVRhYmxlID0gZnVuY3Rpb24gKCkge1xuXHR0aGlzLiRsb2cudHJhY2UoJ0NyZWF0aW5nIHRhYmxlIHt9JywgdGhpcy5vcm0udGFibGUpO1xuXHRjb25zdCBwYXJhbWV0ZXJpY1N0YXRlbWVudCA9IHRoaXMub3Jtc3RhdGVtZW50cy5jcmVhdGVUYWJsZS5hcHBseSh0aGlzLm9ybXN0YXRlbWVudHMpO1xuXHR0cnkge1xuXHRcdHRoaXMuZXhlY3V0ZShwYXJhbWV0ZXJpY1N0YXRlbWVudCk7XG5cdFx0dGhpcy4kbG9nLnRyYWNlKCd7fSB0YWJsZSBjcmVhdGVkJywgdGhpcy5vcm0udGFibGUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0dGhpcy4kbG9nLmVycm9yKFwiQ3JlYXRlIHRhYmxlIHt9IGZhaWxlZFwiLCB0aGlzLm9ybS50YWJsZSwgZSk7XG5cdFx0dGhyb3cgZTtcblx0fVxufTtcblxuREFPLnByb3RvdHlwZS5kcm9wVGFibGUgPSBmdW5jdGlvbiAoZHJvcElkU2VxdWVuY2UpIHtcblx0dGhpcy4kbG9nLnRyYWNlKCdEcm9wcGluZyB0YWJsZSB7fS4nLCB0aGlzLm9ybS50YWJsZSk7XG5cdGNvbnN0IHBhcmFtZXRlcmljU3RhdGVtZW50ID0gdGhpcy5vcm1zdGF0ZW1lbnRzLmRyb3BUYWJsZS5hcHBseSh0aGlzLm9ybXN0YXRlbWVudHMpO1xuXHR0cnkge1xuXHRcdHRoaXMuZXhlY3V0ZShwYXJhbWV0ZXJpY1N0YXRlbWVudCk7XG5cdFx0dGhpcy4kbG9nLnRyYWNlKCdUYWJsZSB7fSBkcm9wcGVkLicsIHRoaXMub3JtLnRhYmxlKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHRoaXMuJGxvZy5lcnJvcihcIkRyb3BwaW5nIHRhYmxlIHt9IGZhaWxlZC5cIiwgdGhpcy5vcm0udGFibGUsIGUpO1xuXHRcdHRocm93IGU7XG5cdH1cblxuXHRpZiAoZHJvcElkU2VxdWVuY2UpIHtcblx0XHR0aGlzLiRsb2cudHJhY2UoJ0Ryb3BwaW5nIHRhYmxlIHt9IHNlcXVlbmNlIHt9LicsIHRoaXMub3JtLnRhYmxlLCB0aGlzLnNlcXVlbmNlTmFtZSk7XG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMuZHJvcElkR2VuZXJhdG9yKCk7XG5cdFx0XHR0aGlzLiRsb2cudHJhY2UoJ1RhYmxlIHt9IHNlcXVlbmNlIHt9IGRyb3BwZWQuJywgdGhpcy5vcm0udGFibGUsIHRoaXMuc2VxdWVuY2VOYW1lKTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHR0aGlzLiRsb2cuZXJyb3IoXCJEcm9wcGluZyB0YWJsZSB7fSBzZXF1ZW5jZSB7fSBmYWlsZWQuXCIsIHRoaXMub3JtLnRhYmxlLCB0aGlzLnNlcXVlbmNlTmFtZSwgZSk7XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuXG4vKipcbiAqIG9EZWZpbml0aW9uIGNhbiBiZSB0YWJsZSBkZWZpbml0aW9uIG9yIHN0YW5kYXJkIG9ybSBkZWZpbml0aW9uIG9iamVjdC4gT3IgaXQgY2FuIGJlIGEgdmFsaWQgcGF0aCB0b1xuICogYSAudGFibGUgZmlsZSwgb3IgYW55IG90aGVyIHRleHQgZmlsZSBjb250aWFuaW5nIGEgc3RhbmRhcmQgZGFvIG9ybSBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKG9EZWZpbml0aW9uLCBsb2dDdHhOYW1lPzogc3RyaW5nLCBkYXRhU291cmNlTmFtZT86IHN0cmluZykge1xuXHRsZXQgb3JtO1xuXHRvcm0gPSBvRGVmaW5pdGlvbjtcblxuXHRpZiAoIWRhdGFTb3VyY2VOYW1lIHx8IGRhdGFTb3VyY2VOYW1lID09PSBudWxsKSB7XG5cdFx0ZGF0YVNvdXJjZU5hbWUgPSBjb25maWd1cmF0aW9ucy5nZXQoXCJESVJJR0lCTEVfREFUQUJBU0VfREFUQVNPVVJDRV9OQU1FX0RFRkFVTFRcIiwgXCJEZWZhdWx0REJcIik7XG5cdH1cblxuXHRsZXQgcHJvZHVjdE5hbWUgPSBnbG9iYWxzLmdldChkYXRhU291cmNlTmFtZSk7XG5cdGlmICghcHJvZHVjdE5hbWUpIHtcblx0XHRwcm9kdWN0TmFtZSA9IERhdGFiYXNlLmdldFByb2R1Y3ROYW1lKGRhdGFTb3VyY2VOYW1lKTtcblx0XHRnbG9iYWxzLnNldChkYXRhU291cmNlTmFtZSwgcHJvZHVjdE5hbWUpO1xuXHR9XG5cblx0Ly9cdH1cblx0cmV0dXJuIG5ldyBEQU8ob3JtLCBsb2dDdHhOYW1lLCBkYXRhU291cmNlTmFtZSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGFvKG9EZWZpbml0aW9uLCBsb2dDdHhOYW1lPzogc3RyaW5nLCBkYXRhU291cmNlTmFtZT86IHN0cmluZykge1xuXHRyZXR1cm4gY3JlYXRlKG9EZWZpbml0aW9uLCBsb2dDdHhOYW1lLCBkYXRhU291cmNlTmFtZSlcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUEsaUJBQTZDO0FBQzdDLDJCQUE4QztBQUM5QyxzQkFBeUI7QUFDekIsc0JBQXlCO0FBQ3pCLGdCQUFzQjtBQUN0QixvQkFBdUI7QUFDdkIsb0JBQXVCO0FBQ3ZCLGlCQUF3QjtBQUN4QixrQkFBd0M7QUFHakMsU0FBUyxJQUFJLEtBQW9CLFlBQXFCLGdCQUF5QjtBQUNyRixNQUFJLFFBQVE7QUFDWCxVQUFNLE1BQU0sMkJBQTJCLE1BQU0sR0FBRztBQUVqRCxPQUFLLFVBQU0sV0FBQUEsS0FBTyxHQUFHO0FBQ3JCLE9BQUssZUFBZSxLQUFL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QUc7QUFDWCxXQUFLLEtBQUssTUFBTSx5Q0FBeUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxjQUFjLENBQUM7QUFDN0YsWUFBTTtBQUFBLElBQ1A7QUFBQSxFQUNEO0FBRUEsU0FBTztBQUNSO0FBT08sU0FBUyxPQUFPLGFBQWEsWUFBcUIsZ0JBQXlCO0FBQ2pGLE1BQUk7QUFDSixRQUFNO0FBRU4sTUFBSSxDQUFDLGtCQUFrQixtQkFBbUIsTUFBTTtBQUMvQyxxQkFBaUIsMkJBQWUsSUFBSSw4Q0FBOEMsV0FBVztBQUFBLEVBQzlGO0FBRUEsTUFBSSxjQUFjLG9CQUFRLElBQUksY0FBYztBQUM1QyxNQUFJLENBQUMsYUFBYTtBQUNqQixrQkFBYyx5QkFBUyxlQUFlLGNBQWM7QUFDcEQsd0JBQVEsSUFBSSxnQkFBZ0IsV0FBVztBQUFBLEVBQ3hDO0FBR0EsU0FBTyxJQUFJLElBQUksS0FBSyxZQUFZLGNBQWM7QUFDL0M7QUFBQztBQUVNLFNBQVMsSUFBSSxhQUFhLFlBQXFCLGdCQUF5QjtBQUM5RSxTQUFPLE9BQU8sYUFBYSxZQUFZLGNBQWM7QUFDdEQ7IiwKICAibmFtZXMiOiBbImdldE9STSIsICJjcmVhdGVPUk1TdGF0ZW1lbnRzIl0KfQo=
795
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RiL2Rhby50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbW9kdWxlIGRiL2Rhb1xuICogQHBhY2thZ2UgQGFlcm9raXQvc2RrL2RiXG4gKiBAbmFtZSBEQU9cbiAqIEBvdmVydmlld1xuICogXG4gKiA6Ojogd2FybmluZ1xuICogVGhlIGBEQU9gIG1vZHVsZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIGBSZXBvc2l0b3J5L1N0b3JlYCBtb2R1bGVzIGluc3RlYWQgZm9yIG1hbmFnaW5nIGRhdGFiYXNlIGVudGl0aWVzIGFuZCBvcGVyYXRpb25zLlxuICogOjo6XG4gKiBcbiAqIFRoZSBgREFPYCBjbGFzcyBwcm92aWRlcyBhIGdlbmVyaWMgRGF0YSBBY2Nlc3MgT2JqZWN0IGltcGxlbWVudGF0aW9uIGZvciBwZXJmb3JtaW5nIENSVUQgb3BlcmF0aW9ucyBvbiBkYXRhYmFzZSBlbnRpdGllcyBkZWZpbmVkIGJ5IGFuIE9STSAoT2JqZWN0LVJlbGF0aW9uYWwgTWFwcGluZykgZGVmaW5pdGlvbi4gSXQgYWJzdHJhY3RzIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIGludGVyYWN0aW9ucyBhbmQgYWxsb3dzIGRldmVsb3BlcnMgdG8gd29yayB3aXRoIGVudGl0aWVzIGFzIEphdmFTY3JpcHQgb2JqZWN0cywgd2hpbGUgaGFuZGxpbmcgdGhlIGNvbnZlcnNpb24gdG8gYW5kIGZyb20gZGF0YWJhc2UgcmVjb3JkcyBzZWFtbGVzc2x5LlxuICogXG4gKiAjIyMgS2V5IEZlYXR1cmVzXG4gKiAtICoqR2VuZXJpYyBDUlVEIE9wZXJhdGlvbnMqKjogU3VwcG9ydHMgY3JlYXRlLCByZWFkLCB1cGRhdGUsIGFuZCBkZWxldGUgb3BlcmF0aW9ucyBmb3IgYW55IGVudGl0eSBkZWZpbmVkIGJ5IGFuIE9STS5cbiAqIC0gKipBc3NvY2lhdGlvbiBNYW5hZ2VtZW50Kio6IEhhbmRsZXMgZW50aXR5IGFzc29jaWF0aW9ucyAoZS5nLiwgb25lLXRvLW9uZSwgb25lLXRvLW1hbnkpIGFuZCBhbGxvd3MgZm9yIGNhc2NhZGluZyBvcGVyYXRpb25zIG9uIHJlbGF0ZWQgZW50aXRpZXMuXG4gKiAtICoqVmFsaWRhdGlvbioqOiBWYWxpZGF0ZXMgZW50aXRpZXMgYWdhaW5zdCBtYW5kYXRvcnkgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoZSBPUk0gYmVmb3JlIHBlcmZvcm1pbmcgZGF0YWJhc2Ugb3BlcmF0aW9ucy5cbiAqIC0gKipDdXN0b21pemFibGUgTG9nZ2luZyoqOiBQcm92aWRlcyBkZXRhaWxlZCBsb2dnaW5nIG9mIGRhdGFiYXNlIG9wZXJhdGlvbnMsIHdpdGggY29uZmlndXJhYmxlIGxvZ2dlciBuYW1lcyBiYXNlZCBvbiB0aGUgT1JNIHRhYmxlIG5hbWUuXG4gKiBcbiAqICMjIyBVc2UgQ2FzZXNcbiAqIC0gTWFuYWdpbmcgZGF0YWJhc2UgZW50aXRpZXMgaW4gYSBzdHJ1Y3R1cmVkIGFuZCBjb25zaXN0ZW50IG1hbm5lciBhY3Jvc3MgZGlmZmVyZW50IHRhYmxlcyBhbmQgcmVsYXRpb25zaGlwcy5cbiAqIC0gQWJzdHJhY3RpbmcgZGF0YWJhc2UgaW50ZXJhY3Rpb25zIHRvIGFsbG93IGZvciBlYXNpZXIgbWFpbnRlbmFuY2UgYW5kIHBvdGVudGlhbCBkYXRhYmFzZSBlbmdpbmUgY2hhbmdlcyBpbiB0aGUgZnV0dXJlLlxuICogLSBIYW5kbGluZyBjb21wbGV4IGVudGl0eSByZWxhdGlvbnNoaXBzIGFuZCBlbnN1cmluZyBkYXRhIGludGVncml0eSB0aHJvdWdoIHZhbGlkYXRpb24gYW5kIGFzc29jaWF0aW9uIG1hbmFnZW1lbnQuXG4gKiBcbiAqICMjIyBFeGFtcGxlIFVzYWdlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgREFPIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9kYlwiO1xuICogY29uc3QgdXNlck9STSA9IHtcbiAqIFx0XHR0YWJsZTogXCJVc2Vyc1wiLFxuICogXHRcdHByb3BlcnRpZXM6IFtcbiAqIFx0XHRcdHtuYW1lOiBcImlkXCIsIGNvbHVtbjogXCJJRFwiLCB0eXBlOiBcIklOVEVHRVJcIiwgbWFuZGF0b3J5OiB0cnVlfSxcbiAqIFx0XHRcdHtuYW1lOiBcIm5hbWVcIiwgY29sdW1uOiBcIk5BTUVcIiwgdHlwZTogXCJWQVJDSEFSXCIsIG1hbmRhdG9yeTogdHJ1ZX0sXG4gKiBcdFx0XHR7bmFtZTogXCJlbWFpbFwiLCBjb2x1bW46IFwiRU1BSUxcIiwgdHlwZTogXCJWQVJDSEFSXCIsIG1hbmRhdG9yeTogdHJ1ZSwgdW5pcXVlOiB0cnVlfVxuICogXHRcdF0sXG4gKiBcdFx0Z2V0UHJpbWFyeUtleTogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnByb3BlcnRpZXNbMF07IH0sXG4gKiBcdFx0Z2V0TWFuZGF0b3J5UHJvcGVydGllczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnByb3BlcnRpZXMuZmlsdGVyKHAgPT4gcC5tYW5kYXRvcnkpOyB9LFxuICogXHRcdGdldFVuaXF1ZVByb3BlcnRpZXM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmZpbHRlcihwID0+IHAudW5pcXVlKTsgfVxuICogfTtcbiAqIGNvbnN0IHVzZXJEQU8gPSBuZXcgREFPKHVzZXJPUk0pO1xuICogLy8gSW5zZXJ0IGEgbmV3IHVzZXJcbiAqIGNvbnN0IG5ld1VzZXJJZCA9IHVzZXJEQU8uaW5zZXJ0KHsgbmFtZTogXCJBbGljZVwiLCBlbWFpbDogXCJhbGljZUBleGFtcGxlLmNvbVwiIH0pO1xuICogLy8gVXBkYXRlIGFuIGV4aXN0aW5nIHVzZXJcbiAqIHVzZXJEQU8udXBkYXRlKHsgaWQ6IG5ld1VzZXJJZCwgbmFtZTogXCJBbGljZSBTbWl0aFwiLCBlbWFpbDogXCJhbGljZS5zbWl0aEBleGFtcGxlLmNvbVwiIH0pO1xuICogLy8gRGVsZXRlIGEgdXNlclxuICogdXNlckRBTy5kZWxldGUoeyBpZDogbmV3VXNlcklkIH0pO1xuICovXG5cInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgT1JNRGVmaW5pdGlvbiwgZ2V0IGFzIGdldE9STSB9IGZyb20gXCIuL29ybVwiO1xuaW1wb3J0IHsgY3JlYXRlIGFzIGNyZWF0ZU9STVN0YXRlbWVudHMgfSBmcm9tIFwiLi9vcm1zdGF0ZW1lbnRzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuL3NlcXVlbmNlXCI7XG5pbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gXCIuL2RhdGFiYXNlXCI7XG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAYWVyb2tpdC9zZGsvZGJcIjtcbmltcG9ydCB7IFVwZGF0ZSB9IGZyb20gXCIuL3VwZGF0ZVwiO1xuaW1wb3J0IHsgSW5zZXJ0IH0gZnJvbSBcIi4vaW5zZXJ0XCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9sb2dcIjtcbmltcG9ydCB7IGNvbmZpZ3VyYXRpb25zLCBnbG9iYWxzIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9jb3JlXCI7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIERBTyhvcm06IE9STURlZmluaXRpb24sIGxvZ0N0eE5hbWU/OiBzdHJpbmcsIGRhdGFTb3VyY2VOYW1lPzogc3RyaW5nKSB7XG5cdGlmIChvcm0gPT09IHVuZGVmaW5lZClcblx0XHR0aHJvdyBFcnJvcignSWxsZWdhbCBhcmd1bWVudDogb3JtWycgKyBvcm0gKyAnXScpO1xuXG5cdHRoaXMub3JtID0gZ2V0T1JNKG9ybSk7XG5cdHRoaXMuc2VxdWVuY2VOYW1lID0gdGhpcy5vcm0udGFibGUgKyAnXycgKyB0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZS50b1VwcGVyQ2FzZSgpO1xuXHR0aGlzLmRyb3BJZEdlbmVyYXRvciA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gU2VxdWVuY2UuZHJvcCh0aGlzLnNlcXVlbmNlTmFtZSwgZGF0YVNvdXJjZU5hbWUpO1xuXHR9O1xuXHR0aGlzLmdlbmVyYXRlSWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIFNlcXVlbmNlLm5leHR2YWwodGhpcy5zZXF1ZW5jZU5hbWUsIHRoaXMub3JtLnRhYmxlLCBkYXRhU291cmNlTmFtZSk7XG5cdH07XG5cblx0Y29uc3QgY29ubiA9IERhdGFiYXNlLmdldENvbm5lY3Rpb24oZGF0YVNvdXJjZU5hbWUpO1xuXHR0cnkge1xuXHRcdHRoaXMub3Jtc3RhdGVtZW50cyA9IGNyZWF0ZU9STVN0YXRlbWVudHModGhpcy5vcm0sIGNvbm4pO1xuXHR9IGZpbmFsbHkge1xuXHRcdGNvbm4uY2xvc2UoKTtcblx0fVxuXG5cdC8vIHNldHVwIGxvZ2dlck5hbWVcblx0bGV0IGxvZ2dlck5hbWUgPSBsb2dDdHhOYW1lO1xuXHRpZiAoIWxvZ2dlck5hbWUpIHtcblx0XHRsb2dnZXJOYW1lID0gJ2RiLmRhbyc7XG5cdFx0aWYgKHRoaXMub3JtLnRhYmxlKVxuXHRcdFx0bG9nZ2VyTmFtZSA9ICdkYi5kYW8uJyArICh0aGlzLm9ybS50YWJsZS50b0xvd2VyQ2FzZSgpKTtcblx0fVxuXHR0aGlzLiRsb2cgPSBMb2dnaW5nLmdldExvZ2dlcihsb2dnZXJOYW1lKTtcblxuXHR0aGlzLmV4ZWN1dGUgPSBmdW5jdGlvbiAoc3FsQnVpbGRlciwgcGFyYW1ldGVyQmluZGluZ3MpIHtcblx0XHRjb25zdCBzcWwgPSBzcWxCdWlsZGVyLmJ1aWxkKCk7XG5cdFx0aWYgKHNxbCA9PT0gdW5kZWZpbmVkIHx8IHNxbC5sZW5ndGggPCAxKVxuXHRcdFx0dGhyb3cgRXJyb3IoXCJJbGxlZ2FsIGFyZ3VtZW50OiBzcWwgZnJvbSBzdGF0ZW1lbnQgYnVpbGRlciBpcyBpbnZhbGlkW1wiICsgc3FsICsgXCJdXCIpO1xuXHRcdHRoaXMuJGxvZy50cmFjZSgnRXhlY3V0aW5nIFNRTCBTdGF0ZW1lbnQ6IHt9Jywgc3FsKTtcblxuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSBzcWxCdWlsZGVyLnBhcmFtZXRlcnMgJiYgc3FsQnVpbGRlci5wYXJhbWV0ZXJzKCk7XG5cdFx0Y29uc3QgX3BhcmFtZXRlckJpbmRpbmdzID0gW107XG5cdFx0aWYgKHBhcmFtZXRlckJpbmRpbmdzPy4kZmlsdGVyICYmIHBhcmFtZXRlcnMgJiYgcGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAocGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5lcXVhbHMpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLmVxdWFscyk7XG5cdFx0XHRcdGNvbnN0IGFkZGVkUHJvcGVydGllc0tleXMgPSBbXTtcblx0XHRcdFx0cGFyYW1ldGVycy5mb3JFYWNoKGUgPT4ge1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0aWVzS2V5cy5pbmNsdWRlcyhlLm5hbWUpICYmICFhZGRlZFByb3BlcnRpZXNLZXlzLmluY2x1ZGVzKGUubmFtZSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5lcXVhbHNbZS5uYW1lXTtcblx0XHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0XHR2YWx1ZS5mb3JFYWNoKHYgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdF9wYXJhbWV0ZXJCaW5kaW5ncy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6IGUudHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBwYXJzZVZhbHVlKGUudHlwZSwgdilcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRfcGFyYW1ldGVyQmluZGluZ3MucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogZS50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBwYXJzZVZhbHVlKGUudHlwZSwgdmFsdWUpXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YWRkZWRQcm9wZXJ0aWVzS2V5cy5wdXNoKGUubmFtZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLm5vdEVxdWFscykge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKHBhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIubm90RXF1YWxzKTtcblx0XHRcdFx0Y29uc3QgYWRkZWRQcm9wZXJ0aWVzS2V5cyA9IFtdO1xuXHRcdFx0XHRwYXJhbWV0ZXJzLmZvckVhY2goZSA9PiB7XG5cdFx0XHRcdFx0aWYgKHByb3BlcnRpZXNLZXlzLmluY2x1ZGVzKGUubmFtZSkgJiYgIWFkZGVkUHJvcGVydGllc0tleXMuaW5jbHVkZXMoZS5uYW1lKSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLm5vdEVxdWFsc1tlLm5hbWVdO1xuXHRcdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRcdHZhbHVlLmZvckVhY2godiA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0X3BhcmFtZXRlckJpbmRpbmdzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogZS50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHBhcnNlVmFsdWUoZS50eXBlLCB2KVxuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdF9wYXJhbWV0ZXJCaW5kaW5ncy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBlLnR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6IHBhcnNlVmFsdWUoZS50eXBlLCB2YWx1ZSlcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRhZGRlZFByb3BlcnRpZXNLZXlzLnB1c2goZS5uYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHBhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIuY29udGFpbnMpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLmNvbnRhaW5zKTtcblx0XHRcdFx0Y29uc3QgYWRkZWRQcm9wZXJ0aWVzS2V5cyA9IFtdO1xuXHRcdFx0XHRwYXJhbWV0ZXJzLmZvckVhY2goZSA9PiB7XG5cdFx0XHRcdFx0aWYgKHByb3BlcnRpZXNLZXlzLmluY2x1ZGVzKGUubmFtZSkgJiYgIWFkZGVkUHJvcGVydGllc0tleXMuaW5jbHVkZXMoZS5uYW1lKSkge1xuXHRcdFx0XHRcdFx0X3BhcmFtZXRlckJpbmRpbmdzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHR0eXBlOiBlLnR5cGUsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiBgJSR7cGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5jb250YWluc1tlLm5hbWVdfSVgXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGFkZGVkUHJvcGVydGllc0tleXMucHVzaChlLm5hbWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5ncmVhdGVyVGhhbikge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKHBhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIuZ3JlYXRlclRoYW4pO1xuXHRcdFx0XHRjb25zdCBhZGRlZFByb3BlcnRpZXNLZXlzID0gW107XG5cdFx0XHRcdHBhcmFtZXRlcnMuZm9yRWFjaChlID0+IHtcblx0XHRcdFx0XHRpZiAocHJvcGVydGllc0tleXMuaW5jbHVkZXMoZS5uYW1lKSAmJiAhYWRkZWRQcm9wZXJ0aWVzS2V5cy5pbmNsdWRlcyhlLm5hbWUpKSB7XG5cdFx0XHRcdFx0XHRfcGFyYW1ldGVyQmluZGluZ3MucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IGUudHlwZSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6IHBhcnNlVmFsdWUoZS50eXBlLCBwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLmdyZWF0ZXJUaGFuW2UubmFtZV0pXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGFkZGVkUHJvcGVydGllc0tleXMucHVzaChlLm5hbWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5sZXNzVGhhbikge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKHBhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIubGVzc1RoYW4pO1xuXHRcdFx0XHRjb25zdCBhZGRlZFByb3BlcnRpZXNLZXlzID0gW107XG5cdFx0XHRcdHBhcmFtZXRlcnMuZm9yRWFjaChlID0+IHtcblx0XHRcdFx0XHRpZiAocHJvcGVydGllc0tleXMuaW5jbHVkZXMoZS5uYW1lKSAmJiAhYWRkZWRQcm9wZXJ0aWVzS2V5cy5pbmNsdWRlcyhlLm5hbWUpKSB7XG5cdFx0XHRcdFx0XHRfcGFyYW1ldGVyQmluZGluZ3MucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IGUudHlwZSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6IHBhcnNlVmFsdWUoZS50eXBlLCBwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLmxlc3NUaGFuW2UubmFtZV0pXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGFkZGVkUHJvcGVydGllc0tleXMucHVzaChlLm5hbWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5ncmVhdGVyVGhhbk9yRXF1YWwpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLmdyZWF0ZXJUaGFuT3JFcXVhbCk7XG5cdFx0XHRcdGNvbnN0IGFkZGVkUHJvcGVydGllc0tleXMgPSBbXTtcblx0XHRcdFx0cGFyYW1ldGVycy5mb3JFYWNoKGUgPT4ge1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0aWVzS2V5cy5pbmNsdWRlcyhlLm5hbWUpICYmICFhZGRlZFByb3BlcnRpZXNLZXlzLmluY2x1ZGVzKGUubmFtZSkpIHtcblx0XHRcdFx0XHRcdF9wYXJhbWV0ZXJCaW5kaW5ncy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogZS50eXBlLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogcGFyc2VWYWx1ZShlLnR5cGUsIHBhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIuZ3JlYXRlclRoYW5PckVxdWFsW2UubmFtZV0pXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGFkZGVkUHJvcGVydGllc0tleXMucHVzaChlLm5hbWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocGFyYW1ldGVyQmluZGluZ3MuJGZpbHRlci5sZXNzVGhhbk9yRXF1YWwpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJCaW5kaW5ncy4kZmlsdGVyLmxlc3NUaGFuT3JFcXVhbCk7XG5cdFx0XHRcdGNvbnN0IGFkZGVkUHJvcGVydGllc0tleXMgPSBbXTtcblx0XHRcdFx0cGFyYW1ldGVycy5mb3JFYWNoKGUgPT4ge1xuXHRcdFx0XHRcdGlmIChwcm9wZXJ0aWVzS2V5cy5pbmNsdWRlcyhlLm5hbWUpICYmICFhZGRlZFByb3BlcnRpZXNLZXlzLmluY2x1ZGVzKGUubmFtZSkpIHtcblx0XHRcdFx0XHRcdF9wYXJhbWV0ZXJCaW5kaW5ncy5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dHlwZTogZS50eXBlLFxuXHRcdFx0XHRcdFx0XHR2YWx1ZTogcGFyc2VWYWx1ZShlLnR5cGUsIHBhcmFtZXRlckJpbmRpbmdzLiRmaWx0ZXIubGVzc1RoYW5PckVxdWFsW2UubmFtZV0pXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdGFkZGVkUHJvcGVydGllc0tleXMucHVzaChlLm5hbWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTGVmdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAtPiBpdCBzZWVtcyB0aGF0IHRoZSBmaW5kKCkgbWV0aG9kIHVzZXMgaXQsIG1pZ2h0IGJlIHJlbW92ZWQgb25jZSByZWZhY3RvcmVkXG5cdFx0aWYgKHBhcmFtZXRlcnMgJiYgcGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFyIHZhbDtcblx0XHRcdFx0aWYgKHBhcmFtZXRlckJpbmRpbmdzKSB7XG5cdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkocGFyYW1ldGVyQmluZGluZ3MpKSB7XG5cdFx0XHRcdFx0XHR2YWwgPSBwYXJhbWV0ZXJCaW5kaW5nc1tpXTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dmFsID0gcGFyYW1ldGVyQmluZGluZ3NbcGFyYW1ldGVyc1tpXS5uYW1lXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpICYmIHNxbC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ3NlbGVjdCcpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgaW5kZXggPSBpICsgMTtcblx0XHRcdFx0dGhpcy4kbG9nLnRyYWNlKCdCaW5kaW5nIHRvIHBhcmFtZXRlclt7fV06IHt9JywgaW5kZXgsIHZhbCk7XG5cdFx0XHRcdF9wYXJhbWV0ZXJCaW5kaW5ncy5wdXNoKHtcblx0XHRcdFx0XHRcInR5cGVcIjogcGFyYW1ldGVyc1tpXS50eXBlLFxuXHRcdFx0XHRcdFwidmFsdWVcIjogcGFyc2VWYWx1ZShwYXJhbWV0ZXJzW2ldLnR5cGUsIHZhbClcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHJlc3VsdDtcblxuXHRcdGlmIChzcWwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdzZWxlY3QnKSkge1xuXHRcdFx0cmVzdWx0ID0gUXVlcnkuZXhlY3V0ZShzcWwsIF9wYXJhbWV0ZXJCaW5kaW5ncywgZGF0YVNvdXJjZU5hbWUpO1xuXHRcdH0gZWxzZSBpZiAoc3FsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnaW5zZXJ0JykpIHtcblx0XHRcdHJlc3VsdCA9IEluc2VydC5leGVjdXRlKHNxbCwgX3BhcmFtZXRlckJpbmRpbmdzLCBkYXRhU291cmNlTmFtZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdCA9IFVwZGF0ZS5leGVjdXRlKHNxbCwgX3BhcmFtZXRlckJpbmRpbmdzLCBkYXRhU291cmNlTmFtZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdCAhPT0gbnVsbCA/IHJlc3VsdCA6IFtdO1xuXHR9O1xuXG5cdGZ1bmN0aW9uIHBhcnNlVmFsdWUodHlwZSwgdmFsdWUpIHtcblx0XHRzd2l0Y2ggKHR5cGUudG9VcHBlckNhc2UoKSkge1xuXHRcdFx0Y2FzZSAnSU5URUdFUic6XG5cdFx0XHRcdHJldHVybiBwYXJzZUludCh2YWx1ZSk7XG5cdFx0XHRjYXNlICdET1VCTEUnOlxuXHRcdFx0Y2FzZSAnRkxPQVQnOlxuXHRcdFx0XHRyZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG5cdFx0XHRjYXNlICdCT09MRUFOJzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdH1cbn07XG5cbkRBTy5wcm90b3R5cGUubm90aWZ5ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdGNvbnN0IGZ1bmMgPSB0aGlzW2V2ZW50XTtcblx0aWYgKCF0aGlzW2V2ZW50XSlcblx0XHRyZXR1cm47XG5cdGlmICh0eXBlb2YgZnVuYyAhPT0gJ2Z1bmN0aW9uJylcblx0XHR0aHJvdyBFcnJvcignSWxsZWdhbCBhcmd1bWVudC4gTm90IGEgZnVuY3Rpb246ICcgKyBmdW5jKTtcblx0Y29uc3QgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0ZnVuYy5hcHBseSh0aGlzLCBhcmdzLnNsaWNlKDEpKTtcbn07XG5cbi8qKlxuICogUHJlcGFyZSBhIEpTT04gb2JqZWN0IGZvciBpbnNlcnQgaW50byBEQlxuICovXG5EQU8ucHJvdG90eXBlLmNyZWF0ZVNRTEVudGl0eSA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcblx0bGV0IGk7XG5cdGNvbnN0IHBlcnNpc3RlbnRJdGVtID0ge307XG5cdGNvbnN0IG1hbmRhdG9yaWVzID0gdGhpcy5vcm0uZ2V0TWFuZGF0b3J5UHJvcGVydGllcygpO1xuXHRmb3IgKGkgPSAwOyBpIDwgbWFuZGF0b3JpZXMubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAobWFuZGF0b3JpZXNbaV0uZGJWYWx1ZSkge1xuXHRcdFx0cGVyc2lzdGVudEl0ZW1bbWFuZGF0b3JpZXNbaV0ubmFtZV0gPSBtYW5kYXRvcmllc1tpXS5kYlZhbHVlLmFwcGx5KHRoaXMsIFtlbnRpdHlbbWFuZGF0b3JpZXNbaV0ubmFtZV0sIGVudGl0eV0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwZXJzaXN0ZW50SXRlbVttYW5kYXRvcmllc1tpXS5uYW1lXSA9IGVudGl0eVttYW5kYXRvcmllc1tpXS5uYW1lXTtcblx0XHR9XG5cdH1cblx0Y29uc3Qgb3B0aW9uYWxzID0gdGhpcy5vcm0uZ2V0T3B0aW9uYWxQcm9wZXJ0aWVzKCk7XG5cdGZvciAoaSA9IDA7IGkgPCBvcHRpb25hbHMubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAob3B0aW9uYWxzW2ldLmRiVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cGVyc2lzdGVudEl0ZW1bb3B0aW9uYWxzW2ldLm5hbWVdID0gb3B0aW9uYWxzW2ldLmRiVmFsdWUuYXBwbHkodGhpcywgW2VudGl0eVtvcHRpb25hbHNbaV0ubmFtZV0sIGVudGl0eV0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwZXJzaXN0ZW50SXRlbVtvcHRpb25hbHNbaV0ubmFtZV0gPSBlbnRpdHlbb3B0aW9uYWxzW2ldLm5hbWVdID09PSB1bmRlZmluZWQgPyBudWxsIDogZW50aXR5W29wdGlvbmFsc1tpXS5uYW1lXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHBlcnNpc3RlbnRJdGVtO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgZW50aXR5IGFzIEpTT04gb2JqZWN0IGZyb20gUmVzdWx0U2V0IGN1cnJlbnQgUm93XG4gKi9cbkRBTy5wcm90b3R5cGUuY3JlYXRlRW50aXR5ID0gZnVuY3Rpb24gKHJlc3VsdFNldEVudHJ5LCBlbnRpdHlQcm9wZXJ0eU5hbWVzKSB7XG5cdGNvbnN0IGVudGl0eSA9IHt9O1xuXHRsZXQgcHJvcGVydGllcyA9IHRoaXMub3JtLnByb3BlcnRpZXM7XG5cdGlmIChlbnRpdHlQcm9wZXJ0eU5hbWVzICYmIGVudGl0eVByb3BlcnR5TmFtZXMubGVuZ3RoID4gMCkge1xuXHRcdHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbiAocHJvcCkge1xuXHRcdFx0cmV0dXJuIGVudGl0eVByb3BlcnR5TmFtZXMuaW5kZXhPZihwcm9wLm5hbWUpID4gLTE7XG5cdFx0fSk7XG5cdH1cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3QgcHJvcCA9IHByb3BlcnRpZXNbaV07XG5cdFx0ZW50aXR5W3Byb3AubmFtZV0gPSByZXN1bHRTZXRFbnRyeVtwcm9wLmNvbHVtbk5hbWVdO1xuXHRcdGlmIChwcm9wLnZhbHVlKSB7XG5cdFx0XHRlbnRpdHlbcHJvcC5uYW1lXSA9IHByb3AudmFsdWUoZW50aXR5W3Byb3AubmFtZV0pO1xuXHRcdH1cblx0fVxuXHRPYmplY3Qua2V5cyhlbnRpdHkpLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkge1xuXHRcdGlmIChlbnRpdHlbcHJvcGVydHlOYW1lXSA9PT0gbnVsbClcblx0XHRcdGVudGl0eVtwcm9wZXJ0eU5hbWVdID0gdW5kZWZpbmVkO1xuXHR9KTtcblxuXHRsZXQgZW50aXR5U2VnbWVudCA9IFwiXCI7XG5cdGlmIChlbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdKSB7XG5cdFx0ZW50aXR5U2VnbWVudCA9IFwiW1wiICsgZW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSArIFwiXVwiO1xuXHR9XG5cdC8vIHRoaXMuJGxvZy50cmFjZShcIlRyYW5zZm9ybWF0aW9uIGZyb20ge30gREIgSlNPTiBvYmplY3QgZmluaXNoZWRcIiwgKHRoaXMub3JtLnRhYmxlICsgZW50aXR5U2VnbWVudCkpO1xuXHRyZXR1cm4gZW50aXR5O1xufTtcblxuREFPLnByb3RvdHlwZS52YWxpZGF0ZUVudGl0eSA9IGZ1bmN0aW9uIChlbnRpdHksIHNraXApIHtcblx0aWYgKGVudGl0eSA9PT0gdW5kZWZpbmVkIHx8IGVudGl0eSA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBhcmd1bWVudDogZW50aXR5IGlzICcgKyBlbnRpdHkpO1xuXHR9XG5cdGlmIChza2lwKSB7XG5cdFx0aWYgKHNraXAuY29uc3RydWN0b3IgIT09IEFycmF5KSB7XG5cdFx0XHRza2lwID0gW3NraXBdO1xuXHRcdH1cblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHNraXAubGVuZ3RoOyBqKyspIHtcblx0XHRcdHNraXBbal07XG5cdFx0fVxuXHR9XG5cdGNvbnN0IG1hbmRhdG9yaWVzID0gdGhpcy5vcm0uZ2V0TWFuZGF0b3J5UHJvcGVydGllcygpO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IG1hbmRhdG9yaWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3QgcHJvcE5hbWUgPSBtYW5kYXRvcmllc1tpXS5uYW1lO1xuXHRcdGlmICgoc2tpcCAmJiBza2lwLmluZGV4T2YocHJvcE5hbWUpID4gLTEpIHx8IG1hbmRhdG9yaWVzW2ldLnR5cGUudG9VcHBlckNhc2UoKSA9PT0gJ0JPT0xFQU4nKVxuXHRcdFx0Y29udGludWU7XG5cdFx0Y29uc3QgcHJvcFZhbHVlID0gZW50aXR5W3Byb3BOYW1lXTtcblx0XHRpZiAocHJvcFZhbHVlID09PSB1bmRlZmluZWQgfHwgcHJvcFZhbHVlID09PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgJyArIHByb3BOYW1lICsgJyBhdHRyaWJ1dGUgdmFsdWUgaW4gJyArIHRoaXMub3JtLnRhYmxlICsgJyBlbnRpdHk6ICcgKyBwcm9wVmFsdWUpO1xuXHRcdH1cblx0fVxufTtcblxuREFPLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAoX2VudGl0eSkge1xuXG5cdGNvbnN0IGlkcyA9IFtdO1xuXHRsZXQgZW50aXRpZXMgPSBfZW50aXR5O1xuXHRpZiAoX2VudGl0eS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHtcblx0XHRlbnRpdGllcyA9IFtfZW50aXR5XTtcblx0fVxuXG5cdHRoaXMuJGxvZy50cmFjZSgnSW5zZXJ0aW5nIHt9IHt9JywgdGhpcy5vcm0udGFibGUsIChlbnRpdGllcy5sZW5ndGggPT09IDEgPyAnZW50aXR5JyA6ICdlbnRpdGllcycpKTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGVudGl0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0bGV0IGVudGl0eSA9IGVudGl0aWVzW2ldO1xuXHRcdGVudGl0eSA9IGVudGl0aWVzW2ldO1xuXG5cdFx0dGhpcy52YWxpZGF0ZUVudGl0eShlbnRpdHksIFt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0pO1xuXG5cdFx0Ly9jaGVjayBmb3IgdW5pcXVlIGNvbnN0cmFpbnQgdmlvbGF0aW9uc1xuXHRcdGNvbnN0IHVuaXF1ZXMgPSB0aGlzLm9ybS5nZXRVbmlxdWVQcm9wZXJ0aWVzKCk7XG5cdFx0Zm9yIChsZXQgX2kgPSAwOyBfaSA8IHVuaXF1ZXMubGVuZ3RoOyBfaSsrKSB7XG5cdFx0XHRjb25zdCBwcm9wID0gdW5pcXVlc1tfaV07XG5cdFx0XHRjb25zdCBzdCA9IHRoaXMub3Jtc3RhdGVtZW50cy5kaWFsZWN0XG5cdFx0XHRcdC5zZWxlY3QocHJvcC5jb2x1bW4pXG5cdFx0XHRcdC5mcm9tKHRoaXMub3JtLnRhYmxlKVxuXHRcdFx0XHQud2hlcmUocHJvcC5jb2x1bW4gKyAnPT8nLCBbcHJvcF0pO1xuXHRcdFx0Y29uc3QgcGFyYW1zID0ge307XG5cdFx0XHRwYXJhbXNbcHJvcC5uYW1lXSA9IGVudGl0eVtwcm9wLm5hbWVdO1xuXHRcdFx0Y29uc3QgcnMgPSB0aGlzLmV4ZWN1dGUoc3QsIHBhcmFtcyk7XG5cdFx0XHRpZiAocnMubGVuZ3RoID4gMClcblx0XHRcdFx0dGhyb3cgRXJyb3IoJ1VuaXF1ZSBjb25zdHJhaW50IHZpb2xhdGlvbiBmb3IgJyArIHByb3AubmFtZSArICdbJyArIGVudGl0eVtwcm9wLm5hbWVdICsgJ10nKTtcblx0XHR9XG5cblx0XHRjb25zdCBkYkVudGl0eSA9IHRoaXMuY3JlYXRlU1FMRW50aXR5KGVudGl0eSk7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcGFyYW1ldGVyaWNTdGF0ZW1lbnQgPSB0aGlzLm9ybXN0YXRlbWVudHMuaW5zZXJ0LmFwcGx5KHRoaXMub3Jtc3RhdGVtZW50cyk7XG5cblx0XHRcdGlmICh0aGlzLm9ybS5pc0F1dG9JbmNyZW1lbnRQcmltYXJ5S2V5KCkpIHtcblx0XHRcdFx0Y29uc3QgaWQgPSB0aGlzLmdlbmVyYXRlSWQoKTtcblx0XHRcdFx0ZGJFbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdID0gaWQ7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHVwZGF0ZWRSZWNvcmRDb3VudCA9IHRoaXMuZXhlY3V0ZShwYXJhbWV0ZXJpY1N0YXRlbWVudCwgZGJFbnRpdHkpO1xuXG5cdFx0XHRpZiAoIXRoaXMub3JtLmlzQXV0b0luY3JlbWVudFByaW1hcnlLZXkoKSAmJiBpc05vdEVtcHR5QXJyYXkodXBkYXRlZFJlY29yZENvdW50KSkge1xuXHRcdFx0XHRjb25zdCBpZCA9IHVwZGF0ZWRSZWNvcmRDb3VudFswXTtcblx0XHRcdFx0ZGJFbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdID0gaWQ7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubm90aWZ5KCdhZnRlckluc2VydCcsIGRiRW50aXR5KTtcblx0XHRcdHRoaXMubm90aWZ5KCdiZWZvcmVJbnNlcnRBc3NvY2lhdGlvblNldHMnLCBkYkVudGl0eSk7XG5cdFx0XHRpZiAoKHVwZGF0ZWRSZWNvcmRDb3VudCA+IDAgfHwgaXNOb3RFbXB0eUFycmF5KHVwZGF0ZWRSZWNvcmRDb3VudCkpICYmIHRoaXMub3JtLmFzc29jaWF0aW9ucyAmJiBPYmplY3Qua2V5cyh0aGlzLm9ybS5hc3NvY2lhdGlvbnMpLmxlbmd0aCkge1xuXHRcdFx0XHQvL0luc2VydCBkZXBlbmRlbmNpZXMgaWYgYW55IGFyZSBwcm92aWRlZCBpbmxpbmUgd2l0aCB0aGlzIGVudGl0eVxuXHRcdFx0XHR0aGlzLiRsb2cudHJhY2UoJ0luc2VydGluZyBhc3NvY2lhdGlvbiBzZXRzIGZvciB7fVt7fV0nLCB0aGlzLm9ybS50YWJsZSwgZGJFbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdKTtcblx0XHRcdFx0Zm9yIChjb25zdCBpZHggaW4gT2JqZWN0LmtleXModGhpcy5vcm0uYXNzb2NpYXRpb25zKSkge1xuXHRcdFx0XHRcdGNvbnN0IGFzc29jaWF0aW9uID0gdGhpcy5vcm0uYXNzb2NpYXRpb25zW2lkeF07XG5cdFx0XHRcdFx0Y29uc3QgYXNzb2NpYXRpb25OYW1lID0gYXNzb2NpYXRpb25bJ25hbWUnXTtcblx0XHRcdFx0XHRpZiAoW3RoaXMub3JtLkFTU09DSUFUSU9OX1RZUEVTWydNQU5ZLVRPLU1BTlknXSwgdGhpcy5vcm0uQVNTT0NJQVRJT05fVFlQRVNbJ01BTlktVE8tT05FJ11dLmluZGV4T2YoYXNzb2NpYXRpb24udHlwZSkgPCAwKSB7XG5cdFx0XHRcdFx0XHRpZiAoZW50aXR5W2Fzc29jaWF0aW9uTmFtZV0gJiYgZW50aXR5W2Fzc29jaWF0aW9uTmFtZV0ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhc3NvY2lhdGlvbkRhb0ZhY3RvcnlGdW5jID0gYXNzb2NpYXRpb24udGFyZ2V0RGFvIHx8IHRoaXM7XG5cdFx0XHRcdFx0XHRcdGlmIChhc3NvY2lhdGlvbkRhb0ZhY3RvcnlGdW5jLmNvbnN0cnVjdG9yICE9PSBGdW5jdGlvbilcblx0XHRcdFx0XHRcdFx0XHR0aHJvdyBFcnJvcignSW52YWxpZCBPUk06IEFzc29jaWF0aW9uICcgKyBhc3NvY2lhdGlvbk5hbWUgKyAnIGRhbyBwcm9wZXJ0eSBpcyBleHBlY3RlZCB0byBiZSBmdW5jdGlvbi4gSW5zdGVhZCwgaXQgaXM6ICcgKyAodHlwZW9mIGFzc29jaWF0aW9uRGFvRmFjdG9yeUZ1bmMpKVxuXHRcdFx0XHRcdFx0XHRjb25zdCBhc3NvY2lhdGlvbkRBTyA9IGFzc29jaWF0aW9uRGFvRmFjdG9yeUZ1bmMuYXBwbHkodGhpcyk7XG5cdFx0XHRcdFx0XHRcdHRoaXMubm90aWZ5KCdiZWZvcmVJbnNlcnRBc3NvY2lhdGlvblNldCcsIGVudGl0eVthc3NvY2lhdGlvbk5hbWVdLCBlbnRpdHkpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLiRsb2cudHJhY2UoJ0luc2VydGluZyB7fSBpbmxpbmUgZW50aXRpZXMgaW50byBhc3NvY2lhdGlvbiBzZXQge30nLCBlbnRpdHlbYXNzb2NpYXRpb25OYW1lXS5sZW5ndGgsIGFzc29jaWF0aW9uTmFtZSk7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgZW50aXR5W2Fzc29jaWF0aW9uTmFtZV0ubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBhc3NvY2lhdGVkRW50aXR5ID0gZW50aXR5W2Fzc29jaWF0aW9uTmFtZV1bal07XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgYXNzb2NpYXRlZEVudGl0eUpvaW5LZXkgPSBhc3NvY2lhdGlvbi5qb2luS2V5O1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGtleSA9IGFzc29jaWF0aW9uLmtleSB8fCB0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZTtcblx0XHRcdFx0XHRcdFx0XHRhc3NvY2lhdGVkRW50aXR5W2Fzc29jaWF0ZWRFbnRpdHlKb2luS2V5XSA9IGVudGl0eVtrZXldO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMubm90aWZ5KCdiZWZvcmVJbnNlcnRBc3NvY2lhdGlvblNldEVudGl0eScsIGVudGl0eVthc3NvY2lhdGlvbk5hbWVdLCBkYkVudGl0eSk7XG5cblx0XHRcdFx0XHRcdFx0XHRhc3NvY2lhdGlvbkRBTy5pbnNlcnQuYXBwbHkoYXNzb2NpYXRpb25EQU8sIFthc3NvY2lhdGVkRW50aXR5XSk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGlzLiRsb2cudHJhY2UoJ0luc2VydGluZyB7fSBpbmxpbmUgZW50aXRpZXMgaW50byBhc3NvY2lhdGlvbiBzZXQge30gZmluc2loZWQnLCBlbnRpdHlbYXNzb2NpYXRpb25OYW1lXS5sZW5ndGgsIGFzc29jaWF0aW9uTmFtZSk7XG5cdFx0XHRcdFx0XHRcdHRoaXMubm90aWZ5KCdhZnRlckluc2VydEFzc29jaWF0aW9uU2V0JywgZW50aXR5W2Fzc29jaWF0aW9uTmFtZV0sIGRiRW50aXR5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHVwZGF0ZWRSZWNvcmRDb3VudCA+IDAgfHwgaXNOb3RFbXB0eUFycmF5KHVwZGF0ZWRSZWNvcmRDb3VudCkpIHtcblx0XHRcdFx0aWRzLnB1c2goZGJFbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdKTtcblx0XHRcdFx0dGhpcy4kbG9nLnRyYWNlKCd7fVtdIGVudGl0eSBpbnNlcnRlZCcsIHRoaXMub3JtLnRhYmxlLCBkYkVudGl0eVt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy4kbG9nLnRyYWNlKCdObyBjaGFuZ2VzIGluY3VycmVkIGluIHt9JywgdGhpcy5vcm0udGFibGUpO1xuXHRcdFx0fVxuXG5cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHR0aGlzLiRsb2cuZXJyb3IoXCJJbnNlcnRpbmcge30ge30gZmFpbGVkXCIsIHRoaXMub3JtLnRhYmxlLCAoZW50aXRpZXMubGVuZ3RoID09PSAxID8gJ2VudGl0eScgOiAnZW50aXRpZXMnKSwgZSk7XG5cdFx0XHR0aGlzLiRsb2cudHJhY2UoJ1JvbGxpbmcgYmFjayBjaGFuZ2VzIGFmdGVyIGZhaWxlZCB7fVt7fV0gaW5zZXJ0LiAnLCB0aGlzLm9ybS50YWJsZSwgZGJFbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdKTtcblx0XHRcdGlmIChkYkVudGl0eVt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0pIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHR0aGlzLnJlbW92ZShkYkVudGl0eVt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0pO1xuXHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0XHR0aGlzLiRsb2cuZXJyb3IoJ0NvdWxkIG5vdCByb2xsYmFjayBjaGFuZ2VzIGFmdGVyIGZhaWxlZCB7fVt7fV0gaW5zZXJ0LiAnLCB0aGlzLm9ybS50YWJsZSwgZGJFbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdLCBlcnIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlO1xuXHRcdH1cblx0fVxuXG5cdGlmIChfZW50aXR5LmNvbnN0cnVjdG9yICE9PSBBcnJheSlcblx0XHRyZXR1cm4gaWRzWzBdO1xuXHRlbHNlXG5cdFx0cmV0dXJuIGlkcztcbn07XG5cbmZ1bmN0aW9uIGlzTm90RW1wdHlBcnJheShhcnJheSkge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheShhcnJheSkgJiYgYXJyYXkubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZW50aXR5IGZyb20gYSBKU09OIG9iamVjdC4gUmV0dXJucyB0aGUgaWQgb2YgdGhlIHVwZGF0ZWQgZW50aXR5LlxuICovXG5EQU8ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChlbnRpdHkpIHtcblxuXHR0aGlzLiRsb2cudHJhY2UoJ1VwZGF0aW5nIHt9W3t9XSBlbnRpdHknLCB0aGlzLm9ybS50YWJsZSwgZW50aXR5ICE9PSB1bmRlZmluZWQgPyBlbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdIDogZW50aXR5KTtcblxuXHRpZiAoZW50aXR5ID09PSB1bmRlZmluZWQgfHwgZW50aXR5ID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBlbnRpdHkgaXMgJyArIGVudGl0eSk7XG5cdH1cblxuXHRjb25zdCBpZ25vcmVkUHJvcGVydGllcyA9IHRoaXMub3JtLmdldE1hbmRhdG9yeVByb3BlcnRpZXMoKVxuXHRcdC5maWx0ZXIoZnVuY3Rpb24gKHByb3BlcnR5KSB7XG5cdFx0XHRyZXR1cm4gcHJvcGVydHkuYWxsb3dlZE9wcyAmJiBwcm9wZXJ0eS5hbGxvd2VkT3BzLmluZGV4T2YoJ3VwZGF0ZScpIDwgMDtcblx0XHR9KVxuXHRcdC5tYXAoZnVuY3Rpb24gKHByb3BlcnR5KSB7XG5cdFx0XHRyZXR1cm4gcHJvcGVydHkubmFtZTtcblx0XHR9KTtcblx0dGhpcy52YWxpZGF0ZUVudGl0eShlbnRpdHksIGlnbm9yZWRQcm9wZXJ0aWVzKTtcblxuXHRjb25zdCBwYXJhbWV0ZXJpY1N0YXRlbWVudCA9IHRoaXMub3Jtc3RhdGVtZW50cy51cGRhdGUuYXBwbHkodGhpcy5vcm1zdGF0ZW1lbnRzLCBbZW50aXR5XSk7XG5cblx0Y29uc3QgZGJFbnRpdHkgPSB0aGlzLmNyZWF0ZVNRTEVudGl0eShlbnRpdHkpO1xuXG5cdHRyeSB7XG5cdFx0dGhpcy5ub3RpZnkoJ2JlZm9yZVVwZGF0ZUVudGl0eScsIGRiRW50aXR5KTtcblx0XHRjb25zdCB1cGRhdGVkUmVjb3Jkc0NvdW50ID0gdGhpcy5leGVjdXRlKHBhcmFtZXRlcmljU3RhdGVtZW50LCBkYkVudGl0eSk7XG5cdFx0aWYgKHVwZGF0ZWRSZWNvcmRzQ291bnQgPiAwKVxuXHRcdFx0dGhpcy4kbG9nLnRyYWNlKCd7fVt7fV0gZW50aXR5IHVwZGF0ZWQnLCB0aGlzLm9ybS50YWJsZSwgZGJFbnRpdHlbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLiRsb2cudHJhY2UoJ05vIGNoYW5nZXMgaW5jdXJyZWQgaW4ge30nLCB0aGlzLm9ybS50YWJsZSk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9IGNhdGNoIChlKSB7XG5cdFx0dGhpcy4kbG9nLmVycm9yKCdVcGRhdGluZyB7fVt7fV0gZmFpbGVkJywgdGhpcy5vcm0udGFibGUsIGVudGl0eSAhPT0gdW5kZWZpbmVkID8gZW50aXR5W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSA6IGVudGl0eSwgZSk7XG5cdFx0dGhyb3cgZTtcblx0fVxufTtcblxuLyoqXG4gKiBEZWxldGUgZW50aXR5IGJ5IGlkLCBvciBhcnJheSBvZiBpZHMsIG9yIGRlbGV0ZSBhbGwgKGlmIG5vdCBhcmd1bWVudCBpcyBwcm92aWRlZClcbiAqL1xuREFPLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0bGV0IGlkcyA9IFtdO1xuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdGlkcyA9IHRoaXMubGlzdCh7XG5cdFx0XHRcIiRzZWxlY3RcIjogW3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXVxuXHRcdH0pLm1hcChmdW5jdGlvbiAoZW50KSB7XG5cdFx0XHRyZXR1cm4gZW50W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXTtcblx0XHR9LmJpbmQodGhpcykpO1xuXHR9IGVsc2Uge1xuXHRcdGlmIChhcmd1bWVudHNbMF0uY29uc3RydWN0b3IgIT09IEFycmF5KSB7XG5cdFx0XHRpZHMgPSBbYXJndW1lbnRzWzBdXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWRzID0gYXJndW1lbnRzWzBdO1xuXHRcdH1cblx0fVxuXG5cdHRoaXMuJGxvZy50cmFjZSgnRGVsZXRpbmcgJyArIHRoaXMub3JtLnRhYmxlICsgKChpZHMgIT09IHVuZGVmaW5lZCAmJiBpZHMubGVuZ3RoID09PSAxKSA/ICdbJyArIGlkc1swXSArICddIGVudGl0eScgOiBpZHMubGVuZ3RoICsgJyBlbnRpdGllcycpKTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuXG5cdFx0bGV0IGlkID0gaWRzW2ldO1xuXHRcdC8vcHJldmVudCBpbXBsaWNpdCB0eXBlIGNvbnZlcnRpb25cblx0XHRpZiAodGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLnR5cGUudG9VcHBlckNhc2UoKSAhPT0gJ1ZBUkNIQVInKVxuXHRcdFx0aWQgPSBwYXJzZUludChpZCwgMTApO1xuXG5cdFx0aWYgKGlkcy5sZW5ndGggPiAxKVxuXHRcdFx0dGhpcy4kbG9nLnRyYWNlKCdEZWxldGluZyB7fVt7fV0gZW50aXR5JywgdGhpcy5vcm0udGFibGUsIGlkKTtcblxuXHRcdGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQgZm9yIGlkIHBhcmFtZXRlcjonICsgaWQpO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cblx0XHRcdHRoaXMubm90aWZ5KCdiZWZvcmVSZW1vdmVFbnRpdHknLCBpZCk7XG5cblx0XHRcdC8vZmlyc3Qgd2UgYXR0ZW1wdCB0byByZW1vdmUgZGVwbmRlbnRzIGlmIGFueVxuXHRcdFx0aWYgKHRoaXMub3JtLmFzc29jaWF0aW9ucykge1xuXHRcdFx0XHQvL1JlbW92ZSBhc3NvY2lhdGVkIGRlcGVuZGVuY2llc1xuXHRcdFx0XHRmb3IgKGNvbnN0IGlkeCBpbiBPYmplY3Qua2V5cyh0aGlzLm9ybS5hc3NvY2lhdGlvbnMpKSB7XG5cdFx0XHRcdFx0Y29uc3QgYXNzb2NpYXRpb24gPSB0aGlzLm9ybS5hc3NvY2lhdGlvbnNbaWR4XTtcblx0XHRcdFx0XHRjb25zdCBhc3NvY2lhdGlvbk5hbWUgPSBhc3NvY2lhdGlvblsnbmFtZSddO1xuXHRcdFx0XHRcdGlmIChbdGhpcy5vcm0uQVNTT0NJQVRJT05fVFlQRVNbJ01BTlktVE8tTUFOWSddLCB0aGlzLm9ybS5BU1NPQ0lBVElPTl9UWVBFU1snTUFOWS1UTy1PTkUnXV0uaW5kZXhPZihhc3NvY2lhdGlvbi50eXBlKSA8IDApIHtcblx0XHRcdFx0XHRcdHRoaXMuJGxvZy50cmFjZShcIkluc3BlY3Rpbmcge31be319XSBlbnRpdHkncyBkZXBlbmRlbmN5ICd7fScgZm9yIGVudGl0aWVzIHRvIGRlbGV0ZS5cIiwgdGhpcy5vcm0udGFibGUsIGlkLCBhc3NvY2lhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0Y29uc3QgYXNzb2NpYXRpb25EQU8gPSBhc3NvY2lhdGlvbi50YXJnZXREYW8gPyBhc3NvY2lhdGlvbi50YXJnZXREYW8oKSA6IHRoaXM7XG5cdFx0XHRcdFx0XHRjb25zdCBzZXR0aW5ncyA9IHt9O1xuXHRcdFx0XHRcdFx0bGV0IGpvaW5JZCA9IGlkO1xuXHRcdFx0XHRcdFx0Ly9jaGVjayBpZiB3ZSBhcmUgam9pbmluZyBvbiBmaWVsZCwgb3RoZXIgdGhhbiBwa1xuXHRcdFx0XHRcdFx0aWYgKGFzc29jaWF0aW9uLmtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBjdHhFbnRpdHkgPSB0aGlzLmZpbmQoaWQpO1xuXHRcdFx0XHRcdFx0XHRqb2luSWQgPSBjdHhFbnRpdHlbYXNzb2NpYXRpb24ua2V5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHNldHRpbmdzW2Fzc29jaWF0aW9uLmpvaW5LZXldID0gam9pbklkO1xuXHRcdFx0XHRcdFx0bGV0IGFzc29jaWF0ZWRFbnRpdGllcztcblx0XHRcdFx0XHRcdC8vYXNzb2NpYXRlZEVudGl0aWVzID0gdGhpcy5leHBhbmQoYXNzb2NpYXRpb25OYW1lLCBpZCk7XG5cdFx0XHRcdFx0XHRhc3NvY2lhdGVkRW50aXRpZXMgPSBhc3NvY2lhdGlvbkRBTy5saXN0KHNldHRpbmdzKTtcblx0XHRcdFx0XHRcdGlmIChhc3NvY2lhdGVkRW50aXRpZXMgJiYgYXNzb2NpYXRlZEVudGl0aWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0dGhpcy4kbG9nLnRyYWNlKFwiRGVsZXRpbmcge31be31dIGVudGl0eSdzIHt9IGRlcGVuZGVudCB7fVwiLCB0aGlzLm9ybS50YWJsZSwgaWQsIGFzc29jaWF0ZWRFbnRpdGllcy5sZW5ndGgsIGFzc29jaWF0aW9uTmFtZSk7XG5cdFx0XHRcdFx0XHRcdHRoaXMubm90aWZ5KCdiZWZvcmVSZW1vdmVBc3NvY2lhdGlvblNldCcsIGFzc29jaWF0ZWRFbnRpdGllcywgaWQpO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGFzc29jaWF0ZWRFbnRpdGllcy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFzc29jaWF0ZWRFbnRpdHkgPSBhc3NvY2lhdGVkRW50aXRpZXNbal07XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5ub3RpZnkoJ2JlZm9yZVJlbW92ZUFzc29jaWF0aW9uU2V0RW50aXR5JywgYXNzb2NpYXRlZEVudGl0eSwgYXNzb2NpYXRlZEVudGl0aWVzLCBpZCk7XG5cblx0XHRcdFx0XHRcdFx0XHRhc3NvY2lhdGlvbkRBTy5yZW1vdmUuYXBwbHkoYXNzb2NpYXRpb25EQU8sIFthc3NvY2lhdGVkRW50aXR5W2Fzc29jaWF0aW9uREFPLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV1dKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRoaXMuJGxvZy50cmFjZShcInt9W3t9XSBlbnRpdHkncyB7fSBkZXBlbmRlbnQge30ge30gZGVsZXRlZC5cIiwgdGhpcy5vcm0udGFibGUsIGlkLCBhc3NvY2lhdGVkRW50aXRpZXMubGVuZ3RoLCBhc3NvY2lhdGlvbk5hbWUsIGFzc29jaWF0ZWRFbnRpdGllcy5sZW5ndGggPiAxID8gJ2VudGl0aWVzJyA6ICdlbnRpdHknKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vRGVsZXRlIGJ5IHByaW1hcnkga2V5IHZhbHVlXG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJpY1N0YXRlbWVudCA9IHRoaXMub3Jtc3RhdGVtZW50c1tcImRlbGV0ZVwiXS5hcHBseSh0aGlzLm9ybXN0YXRlbWVudHMsIFt0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZV0pO1xuXHRcdFx0bGV0IHBhcmFtcyA9IHt9O1xuXHRcdFx0cGFyYW1zW3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSA9IGlkO1xuXG5cdFx0XHRjb25zdCB1cGRhdGVkUmVjb3Jkc0NvdW50ID0gdGhpcy5leGVjdXRlKHBhcmFtZXRlcmljU3RhdGVtZW50LCBwYXJhbXMpO1xuXG5cdFx0XHRpZiAodXBkYXRlZFJlY29yZHNDb3VudCA+IDApXG5cdFx0XHRcdHRoaXMuJGxvZy50cmFjZSgne31be31dIGVudGl0eSBkZWxldGVkJywgdGhpcy5vcm0udGFibGUsIGlkKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy4kbG9nLnRyYWNlKCdObyBjaGFuZ2VzIGluY3VycmVkIGluIHt9JywgdGhpcy5vcm0udGFibGUpO1xuXG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0dGhpcy4kbG9nLmVycm9yKCdEZWxldGluZyB7fVt7fV0gZW50aXR5IGZhaWxlZCcsdGhpcy5vcm0udGFibGUsIGlkLCBlKTtcblx0XHRcdHRocm93IGU7XG5cdFx0fVxuXG5cdH1cblxufTtcblxuREFPLnByb3RvdHlwZS5leHBhbmQgPSBmdW5jdGlvbiAoZXhwYW5zaW9uUGF0aCwgY29udGV4dCkge1xuXHRsZXQgaTtcblx0bGV0IHNldHRpbmdzO1xuXHRsZXQga2V5O1xuXHRsZXQgam9pbklkO1xuXHR0aGlzLiRsb2cudHJhY2UoJ0V4cGFuZGluZyBmb3IgYXNzb2NpYXRpb24gcGF0aCB7fSBhbmQgY29udGV4dCBlbnRpdHkge30nLCBleHBhbnNpb25QYXRoLCAodHlwZW9mIGFyZ3VtZW50c1sxXSAhPT0gJ29iamVjdCcgPyAnaWQgJyA6ICcnKSArIEpTT04uc3RyaW5naWZ5KGFyZ3VtZW50c1sxXSkpO1xuXHRpZiAoIWV4cGFuc2lvblBhdGggfHwgIWV4cGFuc2lvblBhdGgubGVuZ3RoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBleHBhbnNpb25QYXRoWycgKyBleHBhbnNpb25QYXRoICsgJ10nKTtcblx0fVxuXHRpZiAoIWNvbnRleHQpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IGNvbnRleHRbJyArIGNvbnRleHQgKyAnXScpO1xuXHR9XG5cdGNvbnN0IGFzc29jaWF0aW9uTmFtZSA9IGV4cGFuc2lvblBhdGguc3BsaWNlID8gZXhwYW5zaW9uUGF0aC5zcGxpY2UoMCwgMSlbMF0gOiBleHBhbnNpb25QYXRoO1xuXHRjb25zdCBhc3NvY2lhdGlvbiA9IHRoaXMub3JtLmdldEFzc29jaWF0aW9uKGFzc29jaWF0aW9uTmFtZSk7XG5cdGlmICghYXNzb2NpYXRpb25OYW1lIHx8ICFhc3NvY2lhdGlvbilcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IFVua25vd24gYXNzb2NpYXRpb24gZm9yIHRoaXMgREFPIFsnICsgYXNzb2NpYXRpb25OYW1lICsgJ10nKTtcblx0Y29uc3Qgam9pbktleSA9IGFzc29jaWF0aW9uLmpvaW5LZXk7XG5cblx0bGV0IGNvbnRleHRFbnRpdHk7XG5cdGlmIChjb250ZXh0W3RoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Y29udGV4dEVudGl0eSA9IGNvbnRleHQ7XG5cdH0gZWxzZSB7XG5cdFx0Y29udGV4dEVudGl0eSA9IHRoaXMuZmluZChjb250ZXh0KTtcblx0fVxuXG5cdGlmICghY29udGV4dEVudGl0eSkge1xuXHRcdHRocm93IEVycm9yKCdObyByZWNvcmQgZm91bmQgZm9yIGNvbnRleHQgZW50aXR5IFsnICsgY29udGV4dCArICddJyk7XG5cdH1cblxuXHRjb25zdCBhc3NvY2lhdGlvblRhcmdldERBTyA9IGFzc29jaWF0aW9uLnRhcmdldERhbyA/IGFzc29jaWF0aW9uLnRhcmdldERhby5hcHBseSh0aGlzKSA6IHRoaXM7XG5cdGlmICghYXNzb2NpYXRpb25UYXJnZXREQU8pXG5cdFx0dGhyb3cgRXJyb3IoJ05vIHRhcmdldCBhc3NvY2lhdGlvbiBEQU8gaW5zdGFuY2UgYXZhaWxhYmxlIGZvciBhc3NvY2lhdGlvbiAnICsgYXNzb2NpYXRpb25OYW1lKTtcblxuXHRsZXQgZXhwYW5zaW9uO1xuXHRsZXQgYXNzb2NpYXRpb25FbnRpdGllcyA9IFtdO1xuXG5cdGlmIChhc3NvY2lhdGlvbi50eXBlID09PSB0aGlzLm9ybS5BU1NPQ0lBVElPTl9UWVBFU1snT05FLVRPLU9ORSddIHx8IGFzc29jaWF0aW9uLnR5cGUgPT09IHRoaXMub3JtLkFTU09DSUFUSU9OX1RZUEVTWydNQU5ZLVRPLU9ORSddKSB7XG5cdFx0am9pbklkID0gY29udGV4dEVudGl0eVtqb2luS2V5XTtcblx0XHR0aGlzLiRsb2cudHJhY2UoJ0V4cGFuZGluZyBhc3NvY2lhdGlvbiB0eXBlIHt9IG9uIHt9W3t9XScsIGFzc29jaWF0aW9uLnR5cGUsIGpvaW5LZXksIGpvaW5JZCk7XG5cdFx0aWYgKCFhc3NvY2lhdGlvbi5rZXkgfHwgYXNzb2NpYXRpb24ua2V5ID09PSBhc3NvY2lhdGlvblRhcmdldERBTy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWUpXG5cdFx0XHRleHBhbnNpb24gPSBhc3NvY2lhdGlvblRhcmdldERBTy5maW5kLmFwcGx5KGFzc29jaWF0aW9uVGFyZ2V0REFPLCBbam9pbklkXSk7XG5cdFx0ZWxzZSB7XG5cdFx0XHRsZXQgbGlzdFNldHRpbmdzID0ge307XG5cdFx0XHRsaXN0U2V0dGluZ3NbXCIkZmlsdGVyXCJdID0gYXNzb2NpYXRpb24ua2V5O1xuXHRcdFx0bGlzdFNldHRpbmdzW2Fzc29jaWF0aW9uLmtleV0gPSBqb2luSWQ7XG5cdFx0XHRleHBhbnNpb24gPSBhc3NvY2lhdGlvblRhcmdldERBTy5saXN0LmFwcGx5KGFzc29jaWF0aW9uVGFyZ2V0REFPLCBbbGlzdFNldHRpbmdzXSlbMF07XG5cdFx0fVxuXG5cdFx0aWYgKGV4cGFuc2lvblBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5leHBhbmQoZXhwYW5zaW9uUGF0aCwgZXhwYW5zaW9uKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoYXNzb2NpYXRpb24udHlwZSA9PT0gdGhpcy5vcm0uQVNTT0NJQVRJT05fVFlQRVNbJ09ORS1UTy1NQU5ZJ10pIHtcblx0XHRzZXR0aW5ncyA9IHt9O1xuXHRcdGlmIChhc3NvY2lhdGlvbi5kZWZhdWx0cylcblx0XHRcdHNldHRpbmdzID0gYXNzb2NpYXRpb24uZGVmYXVsdHM7XG5cdFx0a2V5ID0gYXNzb2NpYXRpb24ua2V5IHx8IHRoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lO1xuXHRcdGpvaW5JZCA9IGNvbnRleHRFbnRpdHlba2V5XTtcblx0XHR0aGlzLiRsb2cudHJhY2UoJ0V4cGFuZGluZyBhc3NvY2lhdGlvbiB0eXBlIHt9IG9uIHt9W3t9XScsIGFzc29jaWF0aW9uLnR5cGUsIGpvaW5LZXksIGpvaW5JZCk7XG5cdFx0c2V0dGluZ3Nbam9pbktleV0gPSBqb2luSWQ7XG5cdFx0YXNzb2NpYXRpb25FbnRpdGllcyA9IGFzc29jaWF0aW9uRW50aXRpZXMuY29uY2F0KGFzc29jaWF0aW9uVGFyZ2V0REFPLmxpc3QuYXBwbHkoYXNzb2NpYXRpb25UYXJnZXREQU8sIFtzZXR0aW5nc10pKTtcblxuXHRcdGlmIChleHBhbnNpb25QYXRoLmxlbmd0aCA+IDApIHtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhc3NvY2lhdGlvbkVudGl0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHRoaXMuZXhwYW5kKGV4cGFuc2lvblBhdGgsIGFzc29jaWF0aW9uRW50aXRpZXNbaV0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRleHBhbnNpb24gPSBhc3NvY2lhdGlvbkVudGl0aWVzO1xuXHRcdH1cblx0fSBlbHNlIGlmIChhc3NvY2lhdGlvbi50eXBlID09PSB0aGlzLm9ybS5BU1NPQ0lBVElPTl9UWVBFU1snTUFOWS1UTy1NQU5ZJ10pIHtcblx0XHRjb25zdCBqb2luREFPID0gYXNzb2NpYXRpb24uam9pbkRhbygpO1xuXHRcdGlmICgham9pbkRBTylcblx0XHRcdHRocm93IEVycm9yKCdObyBqb2luIERBTyBpbnN0YW5jZSBhdmFpbGFibGUgZm9yIGFzc29jaWF0aW9uICcgKyBhc3NvY2lhdGlvbk5hbWUpO1xuXHRcdGlmICgham9pbkRBTy5saXN0Sm9pbnMpXG5cdFx0XHR0aHJvdyBFcnJvcignTm8gbGlzdEpvaW5zIGZ1bmN0aW9uIGluIGpvaW4gREFPIGluc3RhbmNlIGF2YWlsYWJsZSBmb3IgYXNzb2NpYXRpb24gJyArIGFzc29jaWF0aW9uTmFtZSk7XG5cdFx0c2V0dGluZ3MgPSB7fTtcblx0XHRrZXkgPSBhc3NvY2lhdGlvbi5rZXkgfHwgdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWU7XG5cdFx0am9pbklkID0gY29udGV4dEVudGl0eVtrZXldO1xuXHRcdHNldHRpbmdzW2Fzc29jaWF0aW9uLmpvaW5LZXldID0gam9pbklkO1xuXHRcdGFzc29jaWF0aW9uRW50aXRpZXMgPSBhc3NvY2lhdGlvbkVudGl0aWVzLmNvbmNhdChqb2luREFPLmxpc3RKb2lucy5hcHBseShqb2luREFPLCBbc2V0dGluZ3MsIHsgXCJzb3VyY2VEYW9cIjogdGhpcywgXCJqb2luRGFvXCI6IGpvaW5EQU8sIFwidGFyZ2V0RGFvXCI6IGFzc29jaWF0aW9uVGFyZ2V0REFPIH1dKSk7XG5cdFx0aWYgKGV4cGFuc2lvblBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGFzc29jaWF0aW9uRW50aXRpZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dGhpcy5leHBhbmQoZXhwYW5zaW9uUGF0aCwgYXNzb2NpYXRpb25FbnRpdGllc1tpXSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGV4cGFuc2lvbiA9IGFzc29jaWF0aW9uRW50aXRpZXM7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBleHBhbnNpb247XG59O1xuXG4vKipcbiAqIFJlYWRzIGEgc2luZ2xlIGVudGl0eSBieSBpZCwgcGFyc2VkIGludG8gSlNPTiBvYmplY3QuXG4gKiBJZiByZXF1ZXN0ZWQgYXMgZXhwYW5kZWQgdGhlIHJldHVybmVkIGVudGl0eSB3aWxsIGNvbXByaXNlIGFzc29jaWF0ZWQgKGRlcGVuZGVudCkgZW50aXRpZXMgdG9vLiBcbiAqIEV4cGFuZCBjYW4gYmUgYSBzdHJpbmcgdGhhIHRpcyBhIHZhbGlkIGFzc29jaWF0aW9uIG5hbWUgZGVmaW5lZCBpbiB0aGlzIGRhbyBvcm0gb3IgYW4gYXJyYXkgb2Ygc3VjaCBuYW1lcy5cbiAqL1xuREFPLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKGlkLCBleHBhbmQsIHNlbGVjdCkge1xuXHRpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ29iamVjdCcpIHtcblx0XHRpZCA9IGFyZ3VtZW50c1swXS5pZDtcblx0XHRleHBhbmQgPSBhcmd1bWVudHNbMF0uJGV4cGFuZCB8fCBhcmd1bWVudHNbMF0uZXhwYW5kO1xuXHRcdHNlbGVjdCA9IGFyZ3VtZW50c1swXS4kc2VsZWN0IHx8IGFyZ3VtZW50c1swXS5zZWxlY3Q7XG5cdH1cblxuXHR0aGlzLiRsb2cudHJhY2UoJ0ZpbmRpbmcge31be31dIGVudGl0eSB3aXRoIGxpc3QgcGFyYW1ldGVycyBleHBhbmRbe31dLCBzZWxlY3Rbe31dJywgdGhpcy5vcm0udGFibGUsIGlkLCBleHBhbmQsIHNlbGVjdCk7XG5cblx0aWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQgZm9yIGlkIHBhcmFtZXRlcjonICsgaWQpO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRsZXQgZW50aXR5O1xuXHRcdGlmIChzZWxlY3QgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKHNlbGVjdC5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHtcblx0XHRcdFx0aWYgKHNlbGVjdC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7XG5cdFx0XHRcdFx0c2VsZWN0ID0gc2VsZWN0LnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChzZWwpIHtcblx0XHRcdFx0XHRcdGlmIChzZWwuY29uc3RydWN0b3IgIT09IFN0cmluZylcblx0XHRcdFx0XHRcdFx0dGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IHNlbGVjdCBhcnJheSBjb21wb25lbnRzIGFyZSBleHBlY3RlZCBvdCBiZSBzdHJpbmdzIGJ1dCBmb3VuZCAnICsgKHR5cGVvZiBzZWwpKTtcblx0XHRcdFx0XHRcdHJldHVybiBzZWwudHJpbSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50OiBzZWxlY3QgaXMgZXhwZWN0ZWQgdG8gYmUgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgYnV0IHdhcyAnICsgKHR5cGVvZiBzZWxlY3QpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvL2Vuc3VyZSB0aGF0IGpvaW5rZXlzIGZvciByZXF1aXJlZCBleHBhbmRzIGFyZSBhdmFpbGFibGUgYW5kIG5vdCBmaWx0ZXJlZCBieSBzZWxlY3Rcblx0XHRpZiAoc2VsZWN0ICE9PSB1bmRlZmluZWQgJiYgZXhwYW5kICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHNlbGVjdC5wdXNoKHRoaXMub3JtLmdldFByaW1hcnlLZXkoKS5uYW1lKTtcblx0XHRcdC8vVE9ETzogY2hlY2tzXG5cdFx0XHQvKmZvcih2YXIgaSBpbiBleHBhbmQpe1xuXHRcdFx0XHR2YXIgYXNzb2NpYXRpb24gPSB0aGlzLm9ybS5hc3NvY2lhdGlvbnNbZXhwYW5kW2ldXTtcblx0XHRcdFx0aWYoYXNzb2NpYXRpb24gJiYgc2VsZWN0LmluZGV4T2YoYXNzb2NpYXRpb24uam9pbktleSk8MSl7XG5cdFx0XHRcdFx0c2VsZWN0LnB1c2goYXNzb2NpYXRpb24uam9pbktleSk7XG5cdFx0XHRcdH1cblx0XHRcdH0qL1xuXHRcdH1cblx0XHRsZXQgZmluZFFiUGFyYW1zID0ge1xuXHRcdFx0c2VsZWN0OiBzZWxlY3Rcblx0XHR9O1xuXHRcdGNvbnN0IHBhcmFtZXRlcmljU3RhdGVtZW50ID0gdGhpcy5vcm1zdGF0ZW1lbnRzLmZpbmQuYXBwbHkodGhpcy5vcm1zdGF0ZW1lbnRzLCBbZmluZFFiUGFyYW1zXSk7XG5cdFx0bGV0IHBhcmFtcyA9IHt9O1xuXG5cdFx0Ly9wcmV2ZW50IGltcGxpY2l0IHR5cGUgY29udmVydGlvblxuXHRcdGlmICh0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkudHlwZS50b1VwcGVyQ2FzZSgpICE9PSAnVkFSQ0hBUicpXG5cdFx0XHRpZCA9IHBhcnNlSW50KGlkLCAxMCk7XG5cblx0XHRwYXJhbXNbdGhpcy5vcm0uZ2V0UHJpbWFyeUtleSgpLm5hbWVdID0gaWQ7XG5cdFx0Y29uc3QgcmVzdWx0U2V0ID0gdGhpcy5leGVjdXRlKHBhcmFtZXRlcmljU3RhdGVtZW50LCBwYXJhbXMpO1xuXG5cdFx0aWYgKHJlc3VsdFNldFswXSkge1xuXHRcdFx0ZW50aXR5ID0gdGhpcy5jcmVhdGVFbnRpdHkocmVzdWx0U2V0WzBdLCBzZWxlY3QpO1xuXHRcdFx0aWYgKGVudGl0eSkge1xuXHRcdFx0XHR0aGlzLiRsb2cudHJhY2UoJ3t9W3t9XSBlbnRpdHkgZm91bmQnLCB0aGlzLm9ybS50YWJsZSwgaWQpO1xuXHRcdFx0XHR0aGlzLm5vdGlmeSgnYWZ0ZXJGb3VuZCcsIGVudGl0eSk7XG5cdFx0XHRcdGlmIChleHBhbmQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChleHBhbmQuY29uc3RydWN0b3IgIT09IEFycmF5KSB7XG5cdFx0XHRcdFx0XHRpZiAoZXhwYW5kLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0ZXhwYW5kID0gU3RyaW5nKGV4cGFuZCk7XG5cdFx0XHRcdFx0XHRcdGV4cGFuZCA9IGV4cGFuZC5zcGxpdCgnLCcpLm1hcChmdW5jdGlvbiAoZXhwKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGV4cC5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nKVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IGV4cGFuZCBhcnJheSBjb21wb25lbnRzIGFyZSBleHBlY3RlZCBvdCBiZSBzdHJpbmdzIGJ1dCBmb3VuZCAnICsgKHR5cGVvZiBleHApKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZXhwLnRyaW0oKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBFcnJvcignSWxsZWdhbCBhcmd1bWVudDogZXhwYW5kIGlzIGV4cGVjdGVkIHRvIGJlIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIGJ1dCB3YXMgJyArICh0eXBlb2YgZXhwYW5kKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHZhciBhc3NvY2lhdGlvbk5hbWVzID0gdGhpcy5vcm0uZ2V0QXNzb2NpYXRpb25OYW1lcygpO1xuXHRcdFx0XHRcdGZvciAodmFyIGlkeCBpbiBhc3NvY2lhdGlvbk5hbWVzKSB7XG5cdFx0XHRcdFx0XHR2YXIgYXNzb2NpYXRpb25OYW1lID0gYXNzb2NpYXRpb25OYW1lc1tpZHhdO1xuXHRcdFx0XHRcdFx0aWYgKGV4cGFuZC5pbmRleE9mKGFzc29jaWF0aW9uTmFtZSkgPiAtMSkge1xuXHRcdFx0XHRcdFx0XHRlbnRpdHlbYXNzb2NpYXRpb25OYW1lXSA9IHRoaXMuZXhwYW5kKFthc3NvY2lhdGlvbk5hbWVdLCBlbnRpdHkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy4kbG9nLnRyYWNlKCd7fVt7fV0gZW50aXR5IG5vdCBmb3VuZCcsIHRoaXMub3JtLnRhYmxlLCBpZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBlbnRpdHk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHR0aGlzLiRsb2cuZXJyb3IoXCJGaW5kaW5nIHt9W3t9XSBlbnRpdHkgZmFpbGVkLlwiLCB0aGlzLm9ybS50YWJsZSwgaWQsIGUpO1xuXHRcdHRocm93IGU7XG5cdH1cbn07XG5cbkRBTy5wcm90b3R5cGUuY291bnQgPSBmdW5jdGlvbiAoc2V0dGluZ3M/KSB7XG5cdHNldHRpbmdzID0gc2V0dGluZ3MgfHwge307XG5cblx0Y29uc3QgcGFyYW1ldGVyaWNTdGF0ZW1lbnQgPSB0aGlzLm9ybXN0YXRlbWVudHMuY291bnQuYXBwbHkodGhpcy5vcm1zdGF0ZW1lbnRzLCBbc2V0dGluZ3NdKTtcblx0dGhpcy4kbG9nLnRyYWNlKCdDb3VudGluZyAnICsgdGhpcy5vcm0udGFibGUgKyAnIGVudGl0aWVzJyk7XG5cblx0bGV0IGNvdW50ID0gMDtcblx0dHJ5IHtcblx0XHRjb25zdCBycyA9IHRoaXMuZXhlY3V0ZShwYXJhbWV0ZXJpY1N0YXRlbWVudCwgc2V0dGluZ3MpO1xuXHRcdGlmIChycy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvL2V4cGVjdGFpb24gaXMgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSBvYmplY3QgaW4gdGhlIHJlc3VsdCBzZXQgd2l0aCBhIHNpbmdsZSBwb3JwZXJ0eVxuXHRcdFx0Y29uc3Qga2V5ID0gT2JqZWN0LmtleXMocnNbMF0pWzBdO1xuXHRcdFx0Y291bnQgPSBwYXJzZUludChyc1swXVtrZXldLCAxMCk7XG5cdFx0fVxuXHR9IGNhdGNoIChlKSB7XG5cdFx0dGhpcy4kbG9nLmVycm9yKCdDb3VudGluZyB7fSBlbnRpdGllcyBmYWlsZWQnLCB0aGlzLm9ybS50YWJsZSwgZSk7XG5cdFx0ZS5lcnJDb250ZXh0ID0gcGFyYW1ldGVyaWNTdGF0ZW1lbnQudG9TdHJpbmcoKTtcblx0XHR0aHJvdyBlO1xuXHR9XG5cblx0dGhpcy4kbG9nLnRyYWNlKCd7fSB7fSBlbnRpdGllcyBjb3VudGVkJywgU3RyaW5nKGNvdW50KSwgdGhpcy5vcm0udGFibGUpO1xuXG5cdHJldHVybiBjb3VudDtcbn07XG5cbi8qXG4gKiBsaXN0IHBhcmFtZXRlcnM6XG4gKiAtICRleHBhbmRcbiAqIC0gJGZpbHRlclxuICogLSAkc2VsZWN0XG4gKiAtICRzb3J0XG4gKiAtICRvcmRlclxuICogLSAkbGltaXRcbiAqIC0gJG9mZnNldFxuICovXG5EQU8ucHJvdG90eXBlLmxpc3QgPSBmdW5jdGlvbiAoc2V0dGluZ3MpIHtcblxuXHRsZXQga2V5O1xuXHRzZXR0aW5ncyA9IHNldHRpbmdzIHx8IHt9O1xuXG5cdGNvbnN0IGV4cGFuZCA9IHNldHRpbmdzLiRleHBhbmQgfHwgc2V0dGluZ3MuZXhwYW5kO1xuXHRpZiAoZXhwYW5kICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZiAoZXhwYW5kLmNvbnN0cnVjdG9yICE9PSBBcnJheSkge1xuXHRcdFx0aWYgKGV4cGFuZC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7XG5cdFx0XHRcdGlmIChleHBhbmQuaW5kZXhPZignLCcpID4gLTEpIHtcblx0XHRcdFx0XHRzZXR0aW5ncy4kZXhwYW5kID0gZXhwYW5kLnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChleHApIHtcblx0XHRcdFx0XHRcdGlmIChleHAuY29uc3RydWN0b3IgIT09IFN0cmluZylcblx0XHRcdFx0XHRcdFx0dGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IGV4cGFuZCBhcnJheSBjb21wb25lbnRzIGFyZSBleHBlY3RlZCBvdCBiZSBzdHJpbmdzIGJ1dCBmb3VuZCAnICsgKHR5cGVvZiBleHApKTtcblx0XHRcdFx0XHRcdHJldHVybiBleHAudHJpbSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNldHRpbmdzLiRleHBhbmQgPSBbZXhwYW5kXTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IGV4cGFuZCBpcyBleHBlY3RlZCB0byBiZSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyBidXQgd2FzICcgKyAodHlwZW9mIGV4cGFuZCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHNlbGVjdCA9IHNldHRpbmdzLiRzZWxlY3QgfHwgc2V0dGluZ3Muc2VsZWN0O1xuXHRpZiAoc2VsZWN0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRpZiAoc2VsZWN0LmNvbnN0cnVjdG9yICE9PSBBcnJheSkge1xuXHRcdFx0aWYgKHNlbGVjdC5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7XG5cdFx0XHRcdGlmIChzZWxlY3QuaW5kZXhPZignLCcpID4gLTEpIHtcblx0XHRcdFx0XHRzZXR0aW5ncy4kc2VsZWN0ID0gc2VsZWN0LnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChleHApIHtcblx0XHRcdFx0XHRcdGlmIChleHAuY29uc3RydWN0b3IgIT09IFN0cmluZylcblx0XHRcdFx0XHRcdFx0dGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IHNlbGVjdCBhcnJheSBjb21wb25lbnRzIGFyZSBleHBlY3RlZCBvdCBiZSBzdHJpbmdzIGJ1dCBmb3VuZCAnICsgKHR5cGVvZiBleHApKTtcblx0XHRcdFx0XHRcdHJldHVybiBleHAudHJpbSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNldHRpbmdzLiRzZWxlY3QgPSBbc2VsZWN0XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgRXJyb3IoJ0lsbGVnYWwgYXJndW1lbnQ6IHNlbGVjdCBpcyBleHBlY3RlZCB0byBiZSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyBidXQgd2FzICcgKyAodHlwZW9mIGV4cGFuZCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cblx0Y29uc3QgbGlzdEFyZ3MgPSBbXTtcblx0Zm9yIChrZXkgaW4gc2V0dGluZ3MpIHtcblx0XHRsaXN0QXJncy5wdXNoKCcgJyArIGtleSArICdbJyArIHNldHRpbmdzW2tleV0gKyAnXScpO1xuXHR9XG5cblx0dGhpcy4kbG9nLnRyYWNlKCdMaXN0aW5nIHt9IGVudGl0eSBjb2xsZWN0aW9uIHdpdGggbGlzdCBvcGVyYXRvcnM6IHt9JywgdGhpcy5vcm0udGFibGUsIGxpc3RBcmdzLmpvaW4oJywnKSk7XG5cblx0aWYgKHNldHRpbmdzLiRzZWxlY3QgIT09IHVuZGVmaW5lZCAmJiBleHBhbmQgIT09IHVuZGVmaW5lZCkge1xuXHRcdHNldHRpbmdzLiRzZWxlY3QucHVzaCh0aGlzLm9ybS5nZXRQcmltYXJ5S2V5KCkubmFtZSk7XG5cdH1cblxuXHR2YXIgcGFyYW1ldGVyaWNTdGF0ZW1lbnQgPSB0aGlzLm9ybXN0YXRlbWVudHMubGlzdC5hcHBseSh0aGlzLm9ybXN0YXRlbWVudHMsIFtzZXR0aW5nc10pO1xuXG5cdHRyeSB7XG5cdFx0bGV0IGVudGl0aWVzID0gW107XG5cblx0XHRjb25zdCByZXN1bHRTZXQgPSB0aGlzLmV4ZWN1dGUocGFyYW1ldGVyaWNTdGF0ZW1lbnQsIHNldHRpbmdzKTtcblxuXHRcdHJlc3VsdFNldC5mb3JFYWNoKGZ1bmN0aW9uIChyc0VudHJ5KSB7XG5cdFx0XHR2YXIgZW50aXR5ID0gdGhpcy5jcmVhdGVFbnRpdHkocnNFbnRyeSwgc2V0dGluZ3MuJHNlbGVjdCk7XG5cdFx0XHRpZiAoZXhwYW5kKSB7XG5cdFx0XHRcdHZhciBhc3NvY2lhdGlvbk5hbWVzID0gdGhpcy5vcm0uZ2V0QXNzb2NpYXRpb25OYW1lcygpO1xuXHRcdFx0XHRmb3IgKHZhciBpZHggPSAwOyBpZHggPCBhc3NvY2lhdGlvbk5hbWVzLmxlbmd0aDsgaWR4KyspIHtcblx0XHRcdFx0XHR2YXIgYXNzb2NpYXRpb25OYW1lID0gYXNzb2NpYXRpb25OYW1lc1tpZHhdO1xuXHRcdFx0XHRcdGlmIChleHBhbmQuaW5kZXhPZihhc3NvY2lhdGlvbk5hbWUpID4gLTEpIHtcblx0XHRcdFx0XHRcdGVudGl0eVthc3NvY2lhdGlvbk5hbWVdID0gdGhpcy5leHBhbmQoW2Fzc29jaWF0aW9uTmFtZV0sIGVudGl0eSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLm5vdGlmeSgnYWZ0ZXJGb3VuZCcsIGVudGl0eSwgc2V0dGluZ3MpO1xuXHRcdFx0ZW50aXRpZXMucHVzaChlbnRpdHkpO1xuXHRcdH0uYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLiRsb2cudHJhY2UoJ3t9IHt9IGVudGl0aWVzIGZvdW5kJywgZW50aXRpZXMubGVuZ3RoLCB0aGlzLm9ybS50YWJsZSk7XG5cblx0XHRyZXR1cm4gZW50aXRpZXM7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHR0aGlzLiRsb2cuZXJyb3IoXCJMaXN0aW5nIHt9IGVudGl0aWVzIGZhaWxlZC5cIiwgdGhpcy5vcm0udGFibGUsIGUpO1xuXHRcdHRocm93IGU7XG5cdH1cbn07XG5cbkRBTy5wcm90b3R5cGUuZXhpc3RzVGFibGUgPSBmdW5jdGlvbiAoKSB7XG5cdHRoaXMuJGxvZy50cmFjZSgnQ2hlY2sgZXhpc3RzIHRhYmxlICcgKyB0aGlzLm9ybS50YWJsZSk7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcGFyYW1ldGVyaWNTdGF0ZW1lbnQgPSB0aGlzLm9ybXN0YXRlbWVudHMuY291bnQuYXBwbHkodGhpcy5vcm1zdGF0ZW1lbnRzKTtcblx0XHRjb25zdCBycyA9IHRoaXMuZXhlY3V0ZShwYXJhbWV0ZXJpY1N0YXRlbWVudCk7XG5cdFx0cmV0dXJuIHJzLmxlbmd0aCA+IDA7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbkRBTy5wcm90b3R5cGUuY3JlYXRlVGFibGUgPSBmdW5jdGlvbiAoKSB7XG5cdHRoaXMuJGxvZy50cmFjZSgnQ3JlYXRpbmcgdGFibGUge30nLCB0aGlzLm9ybS50YWJsZSk7XG5cdGNvbnN0IHBhcmFtZXRlcmljU3RhdGVtZW50ID0gdGhpcy5vcm1zdGF0ZW1lbnRzLmNyZWF0ZVRhYmxlLmFwcGx5KHRoaXMub3Jtc3RhdGVtZW50cyk7XG5cdHRyeSB7XG5cdFx0dGhpcy5leGVjdXRlKHBhcmFtZXRlcmljU3RhdGVtZW50KTtcblx0XHR0aGlzLiRsb2cudHJhY2UoJ3t9IHRhYmxlIGNyZWF0ZWQnLCB0aGlzLm9ybS50YWJsZSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHR0aGlzLiRsb2cuZXJyb3IoXCJDcmVhdGUgdGFibGUge30gZmFpbGVkXCIsIHRoaXMub3JtLnRhYmxlLCBlKTtcblx0XHR0aHJvdyBlO1xuXHR9XG59O1xuXG5EQU8ucHJvdG90eXBlLmRyb3BUYWJsZSA9IGZ1bmN0aW9uIChkcm9wSWRTZXF1ZW5jZSkge1xuXHR0aGlzLiRsb2cudHJhY2UoJ0Ryb3BwaW5nIHRhYmxlIHt9LicsIHRoaXMub3JtLnRhYmxlKTtcblx0Y29uc3QgcGFyYW1ldGVyaWNTdGF0ZW1lbnQgPSB0aGlzLm9ybXN0YXRlbWVudHMuZHJvcFRhYmxlLmFwcGx5KHRoaXMub3Jtc3RhdGVtZW50cyk7XG5cdHRyeSB7XG5cdFx0dGhpcy5leGVjdXRlKHBhcmFtZXRlcmljU3RhdGVtZW50KTtcblx0XHR0aGlzLiRsb2cudHJhY2UoJ1RhYmxlIHt9IGRyb3BwZWQuJywgdGhpcy5vcm0udGFibGUpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0dGhpcy4kbG9nLmVycm9yKFwiRHJvcHBpbmcgdGFibGUge30gZmFpbGVkLlwiLCB0aGlzLm9ybS50YWJsZSwgZSk7XG5cdFx0dGhyb3cgZTtcblx0fVxuXG5cdGlmIChkcm9wSWRTZXF1ZW5jZSkge1xuXHRcdHRoaXMuJGxvZy50cmFjZSgnRHJvcHBpbmcgdGFibGUge30gc2VxdWVuY2Uge30uJywgdGhpcy5vcm0udGFibGUsIHRoaXMuc2VxdWVuY2VOYW1lKTtcblx0XHR0cnkge1xuXHRcdFx0dGhpcy5kcm9wSWRHZW5lcmF0b3IoKTtcblx0XHRcdHRoaXMuJGxvZy50cmFjZSgnVGFibGUge30gc2VxdWVuY2Uge30gZHJvcHBlZC4nLCB0aGlzLm9ybS50YWJsZSwgdGhpcy5zZXF1ZW5jZU5hbWUpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHRoaXMuJGxvZy5lcnJvcihcIkRyb3BwaW5nIHRhYmxlIHt9IHNlcXVlbmNlIHt9IGZhaWxlZC5cIiwgdGhpcy5vcm0udGFibGUsIHRoaXMuc2VxdWVuY2VOYW1lLCBlKTtcblx0XHRcdHRocm93IGU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cbi8qKlxuICogb0RlZmluaXRpb24gY2FuIGJlIHRhYmxlIGRlZmluaXRpb24gb3Igc3RhbmRhcmQgb3JtIGRlZmluaXRpb24gb2JqZWN0LiBPciBpdCBjYW4gYmUgYSB2YWxpZCBwYXRoIHRvXG4gKiBhIC50YWJsZSBmaWxlLCBvciBhbnkgb3RoZXIgdGV4dCBmaWxlIGNvbnRpYW5pbmcgYSBzdGFuZGFyZCBkYW8gb3JtIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUob0RlZmluaXRpb24sIGxvZ0N0eE5hbWU/OiBzdHJpbmcsIGRhdGFTb3VyY2VOYW1lPzogc3RyaW5nKSB7XG5cdGxldCBvcm07XG5cdG9ybSA9IG9EZWZpbml0aW9uO1xuXG5cdGlmICghZGF0YVNvdXJjZU5hbWUgfHwgZGF0YVNvdXJjZU5hbWUgPT09IG51bGwpIHtcblx0XHRkYXRhU291cmNlTmFtZSA9IGNvbmZpZ3VyYXRpb25zLmdldChcIkRJUklHSUJMRV9EQVRBQkFTRV9EQVRBU09VUkNFX05BTUVfREVGQVVMVFwiLCBcIkRlZmF1bHREQlwiKTtcblx0fVxuXG5cdGxldCBwcm9kdWN0TmFtZSA9IGdsb2JhbHMuZ2V0KGRhdGFTb3VyY2VOYW1lKTtcblx0aWYgKCFwcm9kdWN0TmFtZSkge1xuXHRcdHByb2R1Y3ROYW1lID0gRGF0YWJhc2UuZ2V0UHJvZHVjdE5hbWUoZGF0YVNvdXJjZU5hbWUpO1xuXHRcdGdsb2JhbHMuc2V0KGRhdGFTb3VyY2VOYW1lLCBwcm9kdWN0TmFtZSk7XG5cdH1cblxuXHQvL1x0fVxuXHRyZXR1cm4gbmV3IERBTyhvcm0sIGxvZ0N0eE5hbWUsIGRhdGFTb3VyY2VOYW1lKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkYW8ob0RlZmluaXRpb24sIGxvZ0N0eE5hbWU/OiBzdHJpbmcsIGRhdGFTb3VyY2VOYW1lPzogc3RyaW5nKSB7XG5cdHJldHVybiBjcmVhdGUob0RlZmluaXRpb24sIGxvZ0N0eE5hbWUsIGRhdGFTb3VyY2VOYW1lKVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUErQ0EsaUJBQTZDO0FBQzdDLDJCQUE4QztBQUM5QyxzQkFBeUI7QUFDekIsc0JBQXlCO0FBQ3pCLGdCQUFzQjtBQUN0QixvQkFBdUI7QUFDdkIsb0JBQXVCO0FBQ3ZCLGlCQUF3QjtBQUN4QixrQkFBd0M7QUFHakMsU0FBUyxJQUFJLEtBQW9CLFlBQXFCLGdCQUF5QjtBQUNyRixNQUFJLFFBQVE7QUFDWCxVQUFNLE1BQU0sMkJBQTJCLE1BQU0sR0FBRztBQUVqRCxPQUFLLFVBQU0sV0FBQUEsS0FBTyxHQUFHO0FBQ3JCLE9BQUssZUFBZSxLQUFLLElBQUksUUFBUSxNQUFNLEtBQUssSUFBSSxjQUFjLEVBQUUsS0FBSyxZQUFZO0FBQ3JG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QUFjLENBQUM7QUFDN0YsWUFBTTtBQUFBLElBQ1A7QUFBQSxFQUNEO0FBRUEsU0FBTztBQUNSO0FBT08sU0FBUyxPQUFPLGFBQWEsWUFBcUIsZ0JBQXlCO0FBQ2pGLE1BQUk7QUFDSixRQUFNO0FBRU4sTUFBSSxDQUFDLGtCQUFrQixtQkFBbUIsTUFBTTtBQUMvQyxxQkFBaUIsMkJBQWUsSUFBSSw4Q0FBOEMsV0FBVztBQUFBLEVBQzlGO0FBRUEsTUFBSSxjQUFjLG9CQUFRLElBQUksY0FBYztBQUM1QyxNQUFJLENBQUMsYUFBYTtBQUNqQixrQkFBYyx5QkFBUyxlQUFlLGNBQWM7QUFDcEQsd0JBQVEsSUFBSSxnQkFBZ0IsV0FBVztBQUFBLEVBQ3hDO0FBR0EsU0FBTyxJQUFJLElBQUksS0FBSyxZQUFZLGNBQWM7QUFDL0M7QUFBQztBQUVNLFNBQVMsSUFBSSxhQUFhLFlBQXFCLGdCQUF5QjtBQUM5RSxTQUFPLE9BQU8sYUFBYSxZQUFZLGNBQWM7QUFDdEQ7IiwKICAibmFtZXMiOiBbImdldE9STSIsICJjcmVhdGVPUk1TdGF0ZW1lbnRzIl0KfQo=