@aerokit/sdk 12.44.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 (399) hide show
  1. package/LICENSE +277 -0
  2. package/README.md +170 -0
  3. package/dist/cjs/bpm/deployer.js +57 -0
  4. package/dist/cjs/bpm/index.js +35 -0
  5. package/dist/cjs/bpm/process.js +636 -0
  6. package/dist/cjs/bpm/tasks.js +973 -0
  7. package/dist/cjs/bpm/values.js +82 -0
  8. package/dist/cjs/cache/cache.js +64 -0
  9. package/dist/cjs/cache/index.js +26 -0
  10. package/dist/cjs/cms/cmis.js +689 -0
  11. package/dist/cjs/cms/index.js +26 -0
  12. package/dist/cjs/component/decorators.js +126 -0
  13. package/dist/cjs/component/index.js +36 -0
  14. package/dist/cjs/core/configurations.js +110 -0
  15. package/dist/cjs/core/context.js +47 -0
  16. package/dist/cjs/core/env.js +45 -0
  17. package/dist/cjs/core/globals.js +54 -0
  18. package/dist/cjs/core/index.js +35 -0
  19. package/dist/cjs/db/dao.js +795 -0
  20. package/dist/cjs/db/database.js +904 -0
  21. package/dist/cjs/db/decorators.js +167 -0
  22. package/dist/cjs/db/index.js +72 -0
  23. package/dist/cjs/db/insert.js +51 -0
  24. package/dist/cjs/db/orm.js +245 -0
  25. package/dist/cjs/db/ormstatements.js +243 -0
  26. package/dist/cjs/db/procedure.js +112 -0
  27. package/dist/cjs/db/query.js +57 -0
  28. package/dist/cjs/db/repository.js +148 -0
  29. package/dist/cjs/db/sequence.js +59 -0
  30. package/dist/cjs/db/sql.js +516 -0
  31. package/dist/cjs/db/store.js +172 -0
  32. package/dist/cjs/db/translator.js +100 -0
  33. package/dist/cjs/db/update.js +43 -0
  34. package/dist/cjs/etcd/client.js +174 -0
  35. package/dist/cjs/etcd/index.js +26 -0
  36. package/dist/cjs/extensions/decorators.js +40 -0
  37. package/dist/cjs/extensions/extensions.js +108 -0
  38. package/dist/cjs/extensions/index.js +39 -0
  39. package/dist/cjs/git/client.js +277 -0
  40. package/dist/cjs/git/index.js +26 -0
  41. package/dist/cjs/http/client-async.js +224 -0
  42. package/dist/cjs/http/client.js +145 -0
  43. package/dist/cjs/http/decorators.js +76 -0
  44. package/dist/cjs/http/errors/ForbiddenError.js +41 -0
  45. package/dist/cjs/http/errors/ValidationError.js +41 -0
  46. package/dist/cjs/http/errors.js +26 -0
  47. package/dist/cjs/http/index.js +59 -0
  48. package/dist/cjs/http/request.js +281 -0
  49. package/dist/cjs/http/response.js +452 -0
  50. package/dist/cjs/http/rs/resource-common.js +32 -0
  51. package/dist/cjs/http/rs/resource-http-controller.js +306 -0
  52. package/dist/cjs/http/rs/resource-mappings.js +130 -0
  53. package/dist/cjs/http/rs/resource-method.js +218 -0
  54. package/dist/cjs/http/rs/resource.js +232 -0
  55. package/dist/cjs/http/rs.js +31 -0
  56. package/dist/cjs/http/session.js +124 -0
  57. package/dist/cjs/http/upload.js +144 -0
  58. package/dist/cjs/http/utils.js +106 -0
  59. package/dist/cjs/index.js +1 -0
  60. package/dist/cjs/indexing/index.js +29 -0
  61. package/dist/cjs/indexing/searcher.js +70 -0
  62. package/dist/cjs/indexing/writer.js +45 -0
  63. package/dist/cjs/integrations/index.js +26 -0
  64. package/dist/cjs/integrations/integrations.js +55 -0
  65. package/dist/cjs/io/bytes.js +101 -0
  66. package/dist/cjs/io/files.js +344 -0
  67. package/dist/cjs/io/image.js +43 -0
  68. package/dist/cjs/io/index.js +38 -0
  69. package/dist/cjs/io/streams.js +243 -0
  70. package/dist/cjs/io/zip.js +251 -0
  71. package/dist/cjs/job/decorators.js +40 -0
  72. package/dist/cjs/job/index.js +39 -0
  73. package/dist/cjs/job/scheduler.js +347 -0
  74. package/dist/cjs/junit/index.js +18 -0
  75. package/dist/cjs/junit/junit.js +67 -0
  76. package/dist/cjs/kafka/consumer.js +70 -0
  77. package/dist/cjs/kafka/index.js +29 -0
  78. package/dist/cjs/kafka/producer.js +70 -0
  79. package/dist/cjs/log/index.js +26 -0
  80. package/dist/cjs/log/logging.js +174 -0
  81. package/dist/cjs/mail/client.js +153 -0
  82. package/dist/cjs/mail/index.js +26 -0
  83. package/dist/cjs/messaging/consumer.js +83 -0
  84. package/dist/cjs/messaging/decorators.js +40 -0
  85. package/dist/cjs/messaging/index.js +42 -0
  86. package/dist/cjs/messaging/producer.js +81 -0
  87. package/dist/cjs/mongodb/client.js +627 -0
  88. package/dist/cjs/mongodb/dao.js +390 -0
  89. package/dist/cjs/mongodb/index.js +36 -0
  90. package/dist/cjs/net/decorators.js +40 -0
  91. package/dist/cjs/net/index.js +42 -0
  92. package/dist/cjs/net/soap.js +228 -0
  93. package/dist/cjs/net/websockets.js +151 -0
  94. package/dist/cjs/net/wrappers/onClose.js +2 -0
  95. package/dist/cjs/net/wrappers/onError.js +2 -0
  96. package/dist/cjs/net/wrappers/onMessage.js +2 -0
  97. package/dist/cjs/net/wrappers/onOpen.js +2 -0
  98. package/dist/cjs/pdf/index.js +26 -0
  99. package/dist/cjs/pdf/pdf.js +160 -0
  100. package/dist/cjs/platform/command.js +47 -0
  101. package/dist/cjs/platform/engines.js +70 -0
  102. package/dist/cjs/platform/index.js +47 -0
  103. package/dist/cjs/platform/lifecycle.js +49 -0
  104. package/dist/cjs/platform/os.js +51 -0
  105. package/dist/cjs/platform/problems.js +127 -0
  106. package/dist/cjs/platform/registry.js +319 -0
  107. package/dist/cjs/platform/repository.js +498 -0
  108. package/dist/cjs/platform/workspace.js +574 -0
  109. package/dist/cjs/qldb/index.js +26 -0
  110. package/dist/cjs/qldb/qldb.js +24 -0
  111. package/dist/cjs/rabbitmq/consumer.js +50 -0
  112. package/dist/cjs/rabbitmq/index.js +29 -0
  113. package/dist/cjs/rabbitmq/producer.js +38 -0
  114. package/dist/cjs/redis/client.js +190 -0
  115. package/dist/cjs/redis/index.js +26 -0
  116. package/dist/cjs/security/decorators.js +48 -0
  117. package/dist/cjs/security/index.js +40 -0
  118. package/dist/cjs/security/oauth.js +75 -0
  119. package/dist/cjs/security/user.js +88 -0
  120. package/dist/cjs/template/engines.js +139 -0
  121. package/dist/cjs/template/index.js +26 -0
  122. package/dist/cjs/utils/alphanumeric.js +107 -0
  123. package/dist/cjs/utils/base64.js +104 -0
  124. package/dist/cjs/utils/converter.js +78 -0
  125. package/dist/cjs/utils/digest.js +167 -0
  126. package/dist/cjs/utils/escape.js +160 -0
  127. package/dist/cjs/utils/hex.js +104 -0
  128. package/dist/cjs/utils/index.js +68 -0
  129. package/dist/cjs/utils/jsonpath.js +489 -0
  130. package/dist/cjs/utils/qrcode.js +41 -0
  131. package/dist/cjs/utils/url.js +82 -0
  132. package/dist/cjs/utils/utf8.js +61 -0
  133. package/dist/cjs/utils/uuid.js +48 -0
  134. package/dist/cjs/utils/xml.js +57 -0
  135. package/dist/dts/bpm/deployer.d.ts +29 -0
  136. package/dist/dts/bpm/index.d.ts +8 -0
  137. package/dist/dts/bpm/process.d.ts +433 -0
  138. package/dist/dts/bpm/tasks.d.ts +2022 -0
  139. package/dist/dts/bpm/values.d.ts +38 -0
  140. package/dist/dts/cache/cache.d.ts +30 -0
  141. package/dist/dts/cache/index.d.ts +2 -0
  142. package/dist/dts/cms/cmis.d.ts +413 -0
  143. package/dist/dts/cms/index.d.ts +2 -0
  144. package/dist/dts/component/decorators.d.ts +52 -0
  145. package/dist/dts/component/index.d.ts +2 -0
  146. package/dist/dts/core/configurations.d.ts +65 -0
  147. package/dist/dts/core/context.d.ts +19 -0
  148. package/dist/dts/core/env.d.ts +23 -0
  149. package/dist/dts/core/globals.d.ts +30 -0
  150. package/dist/dts/core/index.d.ts +8 -0
  151. package/dist/dts/db/dao.d.ts +8 -0
  152. package/dist/dts/db/database.d.ts +507 -0
  153. package/dist/dts/db/decorators.d.ts +89 -0
  154. package/dist/dts/db/index.d.ts +25 -0
  155. package/dist/dts/db/insert.d.ts +32 -0
  156. package/dist/dts/db/orm.d.ts +44 -0
  157. package/dist/dts/db/ormstatements.d.ts +4 -0
  158. package/dist/dts/db/procedure.d.ts +25 -0
  159. package/dist/dts/db/query.d.ts +48 -0
  160. package/dist/dts/db/repository.d.ts +64 -0
  161. package/dist/dts/db/sequence.d.ts +34 -0
  162. package/dist/dts/db/sql.d.ts +267 -0
  163. package/dist/dts/db/store.d.ts +138 -0
  164. package/dist/dts/db/translator.d.ts +26 -0
  165. package/dist/dts/db/update.d.ts +21 -0
  166. package/dist/dts/etcd/client.d.ts +92 -0
  167. package/dist/dts/etcd/index.d.ts +2 -0
  168. package/dist/dts/extensions/decorators.d.ts +11 -0
  169. package/dist/dts/extensions/extensions.d.ts +41 -0
  170. package/dist/dts/extensions/index.d.ts +4 -0
  171. package/dist/dts/git/client.d.ts +478 -0
  172. package/dist/dts/git/index.d.ts +2 -0
  173. package/dist/dts/http/client-async.d.ts +158 -0
  174. package/dist/dts/http/client.d.ts +180 -0
  175. package/dist/dts/http/decorators.d.ts +11 -0
  176. package/dist/dts/http/errors/ForbiddenError.d.ts +20 -0
  177. package/dist/dts/http/errors/ValidationError.d.ts +20 -0
  178. package/dist/dts/http/errors.d.ts +2 -0
  179. package/dist/dts/http/index.d.ts +16 -0
  180. package/dist/dts/http/request.d.ts +158 -0
  181. package/dist/dts/http/response.d.ts +281 -0
  182. package/dist/dts/http/rs/resource-common.d.ts +11 -0
  183. package/dist/dts/http/rs/resource-http-controller.d.ts +43 -0
  184. package/dist/dts/http/rs/resource-mappings.d.ts +70 -0
  185. package/dist/dts/http/rs/resource-method.d.ts +206 -0
  186. package/dist/dts/http/rs/resource.d.ts +126 -0
  187. package/dist/dts/http/rs.d.ts +4 -0
  188. package/dist/dts/http/session.d.ts +81 -0
  189. package/dist/dts/http/upload.d.ts +100 -0
  190. package/dist/dts/http/utils.d.ts +54 -0
  191. package/dist/dts/index.d.ts +0 -0
  192. package/dist/dts/indexing/index.d.ts +4 -0
  193. package/dist/dts/indexing/searcher.d.ts +47 -0
  194. package/dist/dts/indexing/writer.d.ts +22 -0
  195. package/dist/dts/integrations/index.d.ts +2 -0
  196. package/dist/dts/integrations/integrations.d.ts +118 -0
  197. package/dist/dts/io/bytes.d.ts +56 -0
  198. package/dist/dts/io/files.d.ts +261 -0
  199. package/dist/dts/io/image.d.ts +22 -0
  200. package/dist/dts/io/index.d.ts +10 -0
  201. package/dist/dts/io/streams.d.ts +172 -0
  202. package/dist/dts/io/zip.d.ts +178 -0
  203. package/dist/dts/job/decorators.d.ts +11 -0
  204. package/dist/dts/job/index.d.ts +4 -0
  205. package/dist/dts/job/scheduler.d.ts +250 -0
  206. package/dist/dts/junit/index.d.ts +1 -0
  207. package/dist/dts/junit/junit.d.ts +50 -0
  208. package/dist/dts/kafka/consumer.d.ts +48 -0
  209. package/dist/dts/kafka/index.d.ts +4 -0
  210. package/dist/dts/kafka/producer.d.ts +50 -0
  211. package/dist/dts/log/index.d.ts +2 -0
  212. package/dist/dts/log/logging.d.ts +102 -0
  213. package/dist/dts/mail/client.d.ts +90 -0
  214. package/dist/dts/mail/index.d.ts +2 -0
  215. package/dist/dts/messaging/consumer.d.ts +61 -0
  216. package/dist/dts/messaging/decorators.d.ts +11 -0
  217. package/dist/dts/messaging/index.d.ts +6 -0
  218. package/dist/dts/messaging/producer.d.ts +59 -0
  219. package/dist/dts/mongodb/client.d.ts +367 -0
  220. package/dist/dts/mongodb/dao.d.ts +24 -0
  221. package/dist/dts/mongodb/index.d.ts +2 -0
  222. package/dist/dts/net/decorators.d.ts +11 -0
  223. package/dist/dts/net/index.d.ts +6 -0
  224. package/dist/dts/net/soap.d.ts +115 -0
  225. package/dist/dts/net/websockets.d.ts +100 -0
  226. package/dist/dts/net/wrappers/onClose.d.ts +0 -0
  227. package/dist/dts/net/wrappers/onError.d.ts +0 -0
  228. package/dist/dts/net/wrappers/onMessage.d.ts +0 -0
  229. package/dist/dts/net/wrappers/onOpen.d.ts +0 -0
  230. package/dist/dts/pdf/index.d.ts +2 -0
  231. package/dist/dts/pdf/pdf.d.ts +72 -0
  232. package/dist/dts/platform/command.d.ts +41 -0
  233. package/dist/dts/platform/engines.d.ts +35 -0
  234. package/dist/dts/platform/index.d.ts +16 -0
  235. package/dist/dts/platform/lifecycle.d.ts +22 -0
  236. package/dist/dts/platform/os.d.ts +23 -0
  237. package/dist/dts/platform/problems.d.ts +114 -0
  238. package/dist/dts/platform/registry.d.ts +227 -0
  239. package/dist/dts/platform/repository.d.ts +354 -0
  240. package/dist/dts/platform/workspace.d.ts +421 -0
  241. package/dist/dts/qldb/index.d.ts +2 -0
  242. package/dist/dts/qldb/qldb.d.ts +1 -0
  243. package/dist/dts/rabbitmq/consumer.d.ts +25 -0
  244. package/dist/dts/rabbitmq/index.d.ts +4 -0
  245. package/dist/dts/rabbitmq/producer.d.ts +15 -0
  246. package/dist/dts/redis/client.d.ts +134 -0
  247. package/dist/dts/redis/index.d.ts +2 -0
  248. package/dist/dts/security/decorators.d.ts +4 -0
  249. package/dist/dts/security/index.d.ts +5 -0
  250. package/dist/dts/security/oauth.d.ts +39 -0
  251. package/dist/dts/security/user.d.ts +51 -0
  252. package/dist/dts/template/engines.d.ts +98 -0
  253. package/dist/dts/template/index.d.ts +2 -0
  254. package/dist/dts/utils/alphanumeric.d.ts +39 -0
  255. package/dist/dts/utils/base64.d.ts +48 -0
  256. package/dist/dts/utils/converter.d.ts +44 -0
  257. package/dist/dts/utils/digest.d.ts +50 -0
  258. package/dist/dts/utils/escape.d.ts +110 -0
  259. package/dist/dts/utils/hex.d.ts +48 -0
  260. package/dist/dts/utils/index.d.ts +23 -0
  261. package/dist/dts/utils/jsonpath.d.ts +22 -0
  262. package/dist/dts/utils/qrcode.d.ts +16 -0
  263. package/dist/dts/utils/url.d.ts +50 -0
  264. package/dist/dts/utils/utf8.d.ts +33 -0
  265. package/dist/dts/utils/uuid.d.ts +21 -0
  266. package/dist/dts/utils/xml.d.ts +22 -0
  267. package/dist/esm/bpm/deployer.mjs +38 -0
  268. package/dist/esm/bpm/index.mjs +15 -0
  269. package/dist/esm/bpm/process.mjs +617 -0
  270. package/dist/esm/bpm/tasks.mjs +954 -0
  271. package/dist/esm/bpm/values.mjs +63 -0
  272. package/dist/esm/cache/cache.mjs +45 -0
  273. package/dist/esm/cache/index.mjs +6 -0
  274. package/dist/esm/cms/cmis.mjs +660 -0
  275. package/dist/esm/cms/index.mjs +6 -0
  276. package/dist/esm/component/decorators.mjs +107 -0
  277. package/dist/esm/component/index.mjs +6 -0
  278. package/dist/esm/core/configurations.mjs +91 -0
  279. package/dist/esm/core/context.mjs +28 -0
  280. package/dist/esm/core/env.mjs +26 -0
  281. package/dist/esm/core/globals.mjs +35 -0
  282. package/dist/esm/core/index.mjs +15 -0
  283. package/dist/esm/db/dao.mjs +775 -0
  284. package/dist/esm/db/database.mjs +885 -0
  285. package/dist/esm/db/decorators.mjs +148 -0
  286. package/dist/esm/db/index.mjs +42 -0
  287. package/dist/esm/db/insert.mjs +32 -0
  288. package/dist/esm/db/orm.mjs +225 -0
  289. package/dist/esm/db/ormstatements.mjs +223 -0
  290. package/dist/esm/db/procedure.mjs +93 -0
  291. package/dist/esm/db/query.mjs +38 -0
  292. package/dist/esm/db/repository.mjs +129 -0
  293. package/dist/esm/db/sequence.mjs +40 -0
  294. package/dist/esm/db/sql.mjs +497 -0
  295. package/dist/esm/db/store.mjs +153 -0
  296. package/dist/esm/db/translator.mjs +81 -0
  297. package/dist/esm/db/update.mjs +24 -0
  298. package/dist/esm/etcd/client.mjs +155 -0
  299. package/dist/esm/etcd/index.mjs +6 -0
  300. package/dist/esm/extensions/decorators.mjs +21 -0
  301. package/dist/esm/extensions/extensions.mjs +89 -0
  302. package/dist/esm/extensions/index.mjs +9 -0
  303. package/dist/esm/git/client.mjs +258 -0
  304. package/dist/esm/git/index.mjs +6 -0
  305. package/dist/esm/http/client-async.mjs +205 -0
  306. package/dist/esm/http/client.mjs +126 -0
  307. package/dist/esm/http/decorators.mjs +47 -0
  308. package/dist/esm/http/errors/ForbiddenError.mjs +22 -0
  309. package/dist/esm/http/errors/ValidationError.mjs +22 -0
  310. package/dist/esm/http/errors.mjs +7 -0
  311. package/dist/esm/http/index.mjs +29 -0
  312. package/dist/esm/http/request.mjs +262 -0
  313. package/dist/esm/http/response.mjs +433 -0
  314. package/dist/esm/http/rs/resource-common.mjs +13 -0
  315. package/dist/esm/http/rs/resource-http-controller.mjs +287 -0
  316. package/dist/esm/http/rs/resource-mappings.mjs +111 -0
  317. package/dist/esm/http/rs/resource-method.mjs +199 -0
  318. package/dist/esm/http/rs/resource.mjs +213 -0
  319. package/dist/esm/http/rs.mjs +12 -0
  320. package/dist/esm/http/session.mjs +105 -0
  321. package/dist/esm/http/upload.mjs +125 -0
  322. package/dist/esm/http/utils.mjs +87 -0
  323. package/dist/esm/index.mjs +1 -0
  324. package/dist/esm/indexing/index.mjs +9 -0
  325. package/dist/esm/indexing/searcher.mjs +51 -0
  326. package/dist/esm/indexing/writer.mjs +26 -0
  327. package/dist/esm/integrations/index.mjs +6 -0
  328. package/dist/esm/integrations/integrations.mjs +36 -0
  329. package/dist/esm/io/bytes.mjs +82 -0
  330. package/dist/esm/io/files.mjs +325 -0
  331. package/dist/esm/io/image.mjs +24 -0
  332. package/dist/esm/io/index.mjs +18 -0
  333. package/dist/esm/io/streams.mjs +224 -0
  334. package/dist/esm/io/zip.mjs +232 -0
  335. package/dist/esm/job/decorators.mjs +21 -0
  336. package/dist/esm/job/index.mjs +9 -0
  337. package/dist/esm/job/scheduler.mjs +328 -0
  338. package/dist/esm/junit/index.mjs +2 -0
  339. package/dist/esm/junit/junit.mjs +48 -0
  340. package/dist/esm/kafka/consumer.mjs +51 -0
  341. package/dist/esm/kafka/index.mjs +9 -0
  342. package/dist/esm/kafka/producer.mjs +51 -0
  343. package/dist/esm/log/index.mjs +6 -0
  344. package/dist/esm/log/logging.mjs +155 -0
  345. package/dist/esm/mail/client.mjs +134 -0
  346. package/dist/esm/mail/index.mjs +6 -0
  347. package/dist/esm/messaging/consumer.mjs +64 -0
  348. package/dist/esm/messaging/decorators.mjs +21 -0
  349. package/dist/esm/messaging/index.mjs +12 -0
  350. package/dist/esm/messaging/producer.mjs +62 -0
  351. package/dist/esm/mongodb/client.mjs +608 -0
  352. package/dist/esm/mongodb/dao.mjs +360 -0
  353. package/dist/esm/mongodb/index.mjs +7 -0
  354. package/dist/esm/net/decorators.mjs +21 -0
  355. package/dist/esm/net/index.mjs +12 -0
  356. package/dist/esm/net/soap.mjs +209 -0
  357. package/dist/esm/net/websockets.mjs +132 -0
  358. package/dist/esm/net/wrappers/onClose.mjs +2 -0
  359. package/dist/esm/net/wrappers/onError.mjs +2 -0
  360. package/dist/esm/net/wrappers/onMessage.mjs +2 -0
  361. package/dist/esm/net/wrappers/onOpen.mjs +2 -0
  362. package/dist/esm/pdf/index.mjs +6 -0
  363. package/dist/esm/pdf/pdf.mjs +141 -0
  364. package/dist/esm/platform/command.mjs +28 -0
  365. package/dist/esm/platform/engines.mjs +51 -0
  366. package/dist/esm/platform/index.mjs +27 -0
  367. package/dist/esm/platform/lifecycle.mjs +30 -0
  368. package/dist/esm/platform/os.mjs +32 -0
  369. package/dist/esm/platform/problems.mjs +108 -0
  370. package/dist/esm/platform/registry.mjs +300 -0
  371. package/dist/esm/platform/repository.mjs +479 -0
  372. package/dist/esm/platform/workspace.mjs +555 -0
  373. package/dist/esm/qldb/index.mjs +6 -0
  374. package/dist/esm/qldb/qldb.mjs +5 -0
  375. package/dist/esm/rabbitmq/consumer.mjs +31 -0
  376. package/dist/esm/rabbitmq/index.mjs +9 -0
  377. package/dist/esm/rabbitmq/producer.mjs +19 -0
  378. package/dist/esm/redis/client.mjs +171 -0
  379. package/dist/esm/redis/index.mjs +6 -0
  380. package/dist/esm/security/decorators.mjs +29 -0
  381. package/dist/esm/security/index.mjs +10 -0
  382. package/dist/esm/security/oauth.mjs +56 -0
  383. package/dist/esm/security/user.mjs +69 -0
  384. package/dist/esm/template/engines.mjs +120 -0
  385. package/dist/esm/template/index.mjs +6 -0
  386. package/dist/esm/utils/alphanumeric.mjs +88 -0
  387. package/dist/esm/utils/base64.mjs +85 -0
  388. package/dist/esm/utils/converter.mjs +59 -0
  389. package/dist/esm/utils/digest.mjs +148 -0
  390. package/dist/esm/utils/escape.mjs +141 -0
  391. package/dist/esm/utils/hex.mjs +85 -0
  392. package/dist/esm/utils/index.mjs +38 -0
  393. package/dist/esm/utils/jsonpath.mjs +470 -0
  394. package/dist/esm/utils/qrcode.mjs +22 -0
  395. package/dist/esm/utils/url.mjs +63 -0
  396. package/dist/esm/utils/utf8.mjs +42 -0
  397. package/dist/esm/utils/uuid.mjs +29 -0
  398. package/dist/esm/utils/xml.mjs +38 -0
  399. package/package.json +58 -0
@@ -0,0 +1,973 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var tasks_exports = {};
19
+ __export(tasks_exports, {
20
+ DelegationState: () => DelegationState,
21
+ NullHandlingOnOrder: () => NullHandlingOnOrder,
22
+ TaskService: () => TaskService,
23
+ Tasks: () => Tasks
24
+ });
25
+ module.exports = __toCommonJS(tasks_exports);
26
+ var import_io = require("@aerokit/sdk/io");
27
+ var import_values = require("@aerokit/sdk/bpm/values");
28
+ const BpmFacade = Java.type("org.eclipse.dirigible.components.api.bpm.BpmFacade");
29
+ class Tasks {
30
+ static list() {
31
+ const tasks = JSON.parse(BpmFacade.getTasks());
32
+ return tasks.map((e) => new TaskData(e));
33
+ }
34
+ static getVariable(taskId, variableName) {
35
+ return import_values.Values.parseValue(BpmFacade.getTaskVariable(taskId, variableName));
36
+ }
37
+ /**
38
+ * Returns all variables. This will include all variables of parent scopes too.
39
+ */
40
+ static getVariables(taskId) {
41
+ return import_values.Values.parseValuesMap(BpmFacade.getTaskVariables(taskId));
42
+ }
43
+ static setVariable(taskId, variableName, value) {
44
+ BpmFacade.setTaskVariable(taskId, variableName, import_values.Values.stringifyValue(value));
45
+ }
46
+ static setVariables(taskId, variables) {
47
+ BpmFacade.setTaskVariables(taskId, import_values.Values.stringifyValuesMap(variables));
48
+ }
49
+ static complete(taskId, variables = {}) {
50
+ BpmFacade.completeTask(taskId, JSON.stringify(variables));
51
+ }
52
+ static getTaskService() {
53
+ return new TaskService(BpmFacade.getBpmProviderFlowable().getTaskService());
54
+ }
55
+ }
56
+ class TaskService {
57
+ constructor(taskService) {
58
+ this.taskService = taskService;
59
+ }
60
+ /**
61
+ * Creates a new task that is not related to any process instance.
62
+ *
63
+ * The returned task is transient and must be saved with {@link #saveTask(Task)} 'manually'.
64
+ */
65
+ newTask(taskId) {
66
+ if (this.isNotNull(taskId)) {
67
+ return this.taskService.newTask(taskId);
68
+ }
69
+ return this.taskService.newTask();
70
+ }
71
+ /**
72
+ * Create a builder for the task
73
+ *
74
+ * @return task builder
75
+ */
76
+ createTaskBuilder() {
77
+ return this.taskService.createTaskBuilder();
78
+ }
79
+ /**
80
+ * Saves the given task to the persistent data store. If the task is already present in the persistent store, it is updated. After a new task has been saved, the task instance passed into this
81
+ * method is updated with the id of the newly created task.
82
+ *
83
+ * @param task
84
+ * the task, cannot be null.
85
+ */
86
+ saveTask(task) {
87
+ this.taskService.saveTask(task);
88
+ }
89
+ /**
90
+ * Saves the given tasks to the persistent data store. If the tasks are already present in the persistent store, it is updated. After a new task has been saved, the task instance passed into this
91
+ * method is updated with the id of the newly created task.
92
+ *
93
+ * @param taskList the list of task instances, cannot be null.
94
+ */
95
+ bulkSaveTasks(taskList) {
96
+ this.taskService.bulkSaveTasks(taskList);
97
+ }
98
+ /**
99
+ * Deletes the given task, not deleting historic information that is related to this task.
100
+ *
101
+ * @param taskId
102
+ * The id of the task that will be deleted, cannot be null. If no task exists with the given taskId, the operation is ignored.
103
+ * @param cascade
104
+ * If cascade is true, also the historic information related to this task is deleted.
105
+ * @throws FlowableObjectNotFoundException
106
+ * when the task with given id does not exist.
107
+ * @throws FlowableException
108
+ * when an error occurs while deleting the task or in case the task is part of a running process.
109
+ */
110
+ deleteTask(taskId, cascade) {
111
+ if (this.isNotNull(cascade)) {
112
+ this.taskService.deleteTask(taskId, cascade);
113
+ } else {
114
+ this.taskService.deleteTask(taskId);
115
+ }
116
+ }
117
+ /**
118
+ * Deletes all tasks of the given collection, not deleting historic information that is related to these tasks.
119
+ *
120
+ * @param taskIds
121
+ * The id's of the tasks that will be deleted, cannot be null. All id's in the list that don't have an existing task will be ignored.
122
+ * @param cascade
123
+ * If cascade is true, also the historic information related to this task is deleted.
124
+ * @throws FlowableObjectNotFoundException
125
+ * when one of the task does not exist.
126
+ * @throws FlowableException
127
+ * when an error occurs while deleting the tasks or in case one of the tasks is part of a running process.
128
+ */
129
+ deleteTasks(taskIds, cascade) {
130
+ if (this.isNotNull(cascade)) {
131
+ this.taskService.deleteTasks(taskIds, cascade);
132
+ } else {
133
+ this.taskService.deleteTasks(taskIds);
134
+ }
135
+ }
136
+ /**
137
+ * Deletes the given task, not deleting historic information that is related to this task..
138
+ *
139
+ * @param taskId
140
+ * The id of the task that will be deleted, cannot be null. If no task exists with the given taskId, the operation is ignored.
141
+ * @param deleteReason
142
+ * reason the task is deleted. Is recorded in history, if enabled.
143
+ * @throws FlowableObjectNotFoundException
144
+ * when the task with given id does not exist.
145
+ * @throws FlowableException
146
+ * when an error occurs while deleting the task or in case the task is part of a running process
147
+ */
148
+ deleteTaskWithReason(taskId, deleteReason) {
149
+ this.taskService.deleteTask(taskId, deleteReason);
150
+ }
151
+ /**
152
+ * Deletes all tasks of the given collection, not deleting historic information that is related to these tasks.
153
+ *
154
+ * @param taskIds
155
+ * The id's of the tasks that will be deleted, cannot be null. All id's in the list that don't have an existing task will be ignored.
156
+ * @param deleteReason
157
+ * reason the task is deleted. Is recorded in history, if enabled.
158
+ * @throws FlowableObjectNotFoundException
159
+ * when one of the tasks does not exist.
160
+ * @throws FlowableException
161
+ * when an error occurs while deleting the tasks or in case one of the tasks is part of a running process.
162
+ */
163
+ deleteTasksWithReason(taskIds, deleteReason) {
164
+ this.taskService.deleteTasks(taskIds, deleteReason);
165
+ }
166
+ /**
167
+ * Claim responsibility for a task: the given user is made assignee for the task. The difference with {@link #setAssignee(String, String)} is that here a check is done if the task already has a
168
+ * user assigned to it. No check is done whether the user is known by the identity component.
169
+ *
170
+ * @param taskId
171
+ * task to claim, cannot be null.
172
+ * @param userId
173
+ * user that claims the task. When userId is null the task is unclaimed, assigned to no one.
174
+ * @throws FlowableObjectNotFoundException
175
+ * when the task doesn't exist.
176
+ * @throws org.flowable.common.engine.api.FlowableTaskAlreadyClaimedException
177
+ * when the task is already claimed by another user
178
+ */
179
+ claim(taskId, userId) {
180
+ this.taskService.claim(taskId, userId);
181
+ }
182
+ /**
183
+ * A shortcut to {@link #claim} with null user in order to unclaim the task
184
+ *
185
+ * @param taskId
186
+ * task to unclaim, cannot be null.
187
+ * @throws FlowableObjectNotFoundException
188
+ * when the task doesn't exist.
189
+ */
190
+ unclaim(taskId) {
191
+ this.taskService.unclaim(taskId);
192
+ }
193
+ /**
194
+ * Set the task state to in progress. No check is done whether the user is known by the identity component.
195
+ *
196
+ * @param taskId
197
+ * task to change the state, cannot be null.
198
+ * @param userId
199
+ * user that puts the task in progress.
200
+ * @throws FlowableObjectNotFoundException
201
+ * when the task doesn't exist.
202
+ */
203
+ startProgress(taskId, userId) {
204
+ this.taskService.startProgress(taskId, userId);
205
+ }
206
+ /**
207
+ * Suspends the task. No check is done whether the user is known by the identity component.
208
+ *
209
+ * @param taskId
210
+ * task to suspend, cannot be null.
211
+ * @param userId
212
+ * user that suspends the task.
213
+ * @throws FlowableObjectNotFoundException
214
+ * when the task doesn't exist.
215
+ */
216
+ suspendTask(taskId, userId) {
217
+ this.taskService.suspendTask(taskId, userId);
218
+ }
219
+ /**
220
+ * Activates the task. No check is done whether the user is known by the identity component.
221
+ *
222
+ * @param taskId
223
+ * task to activate, cannot be null.
224
+ * @param userId
225
+ * user that activates the task.
226
+ * @throws FlowableObjectNotFoundException
227
+ * when the task doesn't exist.
228
+ */
229
+ activateTask(taskId, userId) {
230
+ this.taskService.activateTask(taskId, userId);
231
+ }
232
+ /**
233
+ * Delegates the task to another user. This means that the assignee is set and the delegation state is set to {@link DelegationState#PENDING}. If no owner is set on the task, the owner is set to
234
+ * the current assignee of the task.
235
+ *
236
+ * @param taskId
237
+ * The id of the task that will be delegated.
238
+ * @param userId
239
+ * The id of the user that will be set as assignee.
240
+ * @throws FlowableObjectNotFoundException
241
+ * when no task exists with the given id.
242
+ */
243
+ delegateTask(taskId, userId) {
244
+ this.taskService.delegateTask(taskId, userId);
245
+ }
246
+ /**
247
+ * Marks that the assignee is done with this task and that it can be send back to the owner. Can only be called when this task is {@link DelegationState#PENDING} delegation. After this method
248
+ * returns, the {@link Task#getDelegationState() delegationState} is set to {@link DelegationState#RESOLVED}.
249
+ *
250
+ * @param taskId
251
+ * the id of the task to resolve, cannot be null.
252
+ * @param variables
253
+ * @param transientVariables
254
+ * @throws FlowableObjectNotFoundException
255
+ * when no task exists with the given id.
256
+ */
257
+ resolveTask(taskId, variables, transientVariables) {
258
+ if (this.isNotNull(variables) && this.isNotNull(transientVariables)) {
259
+ this.taskService.resolveTask(taskId, variables, transientVariables);
260
+ } else if (this.isNotNull(variables)) {
261
+ this.taskService.resolveTask(taskId, variables);
262
+ } else {
263
+ this.taskService.resolveTask(taskId);
264
+ }
265
+ }
266
+ /**
267
+ * Called when the task is successfully executed.
268
+ *
269
+ * @param taskId
270
+ * the id of the task to complete, cannot be null.
271
+ * @param userId
272
+ * user that completes the task.
273
+ * @param variables
274
+ * task parameters. May be null or empty.
275
+ * @param transientVariables
276
+ * task parameters. May be null or empty.
277
+ * @param localScope
278
+ * If true, the provided variables will be stored task-local, instead of process instance wide (which is the default behaviour).
279
+ * @throws FlowableObjectNotFoundException
280
+ * when no task exists with the given id.
281
+ * @throws FlowableException
282
+ * when this task is {@link DelegationState#PENDING} delegation.
283
+ */
284
+ complete(taskId, userId, variables, transientVariables, localScope) {
285
+ if (this.isNotNull(userId) && this.isNotNull(variables) && this.isNotNull(localScope)) {
286
+ this.taskService.complete(taskId, userId, variables, localScope);
287
+ } else if (this.isNotNull(variables) && this.isNotNull(localScope)) {
288
+ this.taskService.complete(taskId, variables, localScope);
289
+ } else if (this.isNotNull(userId) && this.isNotNull(variables) && this.isNotNull(transientVariables)) {
290
+ this.taskService.complete(taskId, userId, variables, transientVariables);
291
+ } else if (this.isNotNull(variables) && this.isNotNull(transientVariables)) {
292
+ this.taskService.complete(taskId, variables, transientVariables);
293
+ } else if (this.isNotNull(userId) && this.isNotNull(variables)) {
294
+ this.taskService.complete(taskId, userId, variables);
295
+ } else if (this.isNotNull(variables)) {
296
+ this.taskService.complete(taskId, variables);
297
+ } else if (this.isNotNull(userId)) {
298
+ this.taskService.complete(taskId, userId);
299
+ } else {
300
+ this.taskService.complete(taskId);
301
+ }
302
+ }
303
+ /**
304
+ * Called when the task is successfully executed, and the task form has been submitted.
305
+ *
306
+ * @param taskId
307
+ * the id of the task to complete, cannot be null.
308
+ * @param formDefinitionId
309
+ * the id of the form definition that is filled-in to complete the task, cannot be null.
310
+ * @param outcome
311
+ * the outcome of the completed form, can be null.
312
+ * @param variables
313
+ * values of the completed form. May be null or empty.
314
+ * @param userId
315
+ * user that completes the task.
316
+ * @param transientVariables
317
+ * additional transient values that need to added to the process instance transient variables. May be null or empty.
318
+ * @param localScope
319
+ * If true, the provided variables will be stored task-local, instead of process instance wide (which is the default for {@link #complete(String, Map)}).
320
+ * @throws FlowableObjectNotFoundException
321
+ * when no task exists with the given id.
322
+ */
323
+ completeTaskWithForm(taskId, formDefinitionId, outcome, variables, userId, transientVariables, localScope) {
324
+ if (this.isNotNull(userId) && this.isNotNull(localScope)) {
325
+ this.taskService.completeTaskWithForm(taskId, formDefinitionId, outcome, userId, variables, localScope);
326
+ } else if (this.isNotNull(localScope)) {
327
+ this.taskService.completeTaskWithForm(taskId, formDefinitionId, outcome, variables, localScope);
328
+ } else if (this.isNotNull(userId) && this.isNotNull(transientVariables)) {
329
+ this.taskService.completeTaskWithForm(taskId, formDefinitionId, outcome, userId, variables, transientVariables);
330
+ } else if (this.isNotNull(transientVariables)) {
331
+ this.taskService.completeTaskWithForm(taskId, formDefinitionId, outcome, variables, transientVariables);
332
+ } else if (this.isNotNull(userId)) {
333
+ this.taskService.completeTaskWithForm(taskId, formDefinitionId, outcome, userId, variables);
334
+ } else {
335
+ this.taskService.completeTaskWithForm(taskId, formDefinitionId, outcome, variables);
336
+ }
337
+ }
338
+ /**
339
+ * Gets a Form model instance of the task form of a specific task
340
+ *
341
+ * @param taskId
342
+ * id of the task, cannot be null.
343
+ * @param ignoreVariables
344
+ * should the variables be ignored when fetching the form model?
345
+ * @throws FlowableObjectNotFoundException
346
+ * when the task or form definition doesn't exist.
347
+ */
348
+ getTaskFormModel(taskId, ignoreVariables) {
349
+ if (this.isNotNull(ignoreVariables)) {
350
+ return this.taskService.getTaskFormModel(taskId, ignoreVariables);
351
+ } else {
352
+ return this.taskService.getTaskFormModel(taskId);
353
+ }
354
+ }
355
+ /**
356
+ * Changes the assignee of the given task to the given userId. No check is done whether the user is known by the identity component.
357
+ *
358
+ * @param taskId
359
+ * id of the task, cannot be null.
360
+ * @param userId
361
+ * id of the user to use as assignee.
362
+ * @throws FlowableObjectNotFoundException
363
+ * when the task or user doesn't exist.
364
+ */
365
+ setAssignee(taskId, userId) {
366
+ this.taskService.setAssignee(taskId, userId);
367
+ }
368
+ /**
369
+ * Transfers ownership of this task to another user. No check is done whether the user is known by the identity component.
370
+ *
371
+ * @param taskId
372
+ * id of the task, cannot be null.
373
+ * @param userId
374
+ * of the person that is receiving ownership.
375
+ * @throws FlowableObjectNotFoundException
376
+ * when the task or user doesn't exist.
377
+ */
378
+ setOwner(taskId, userId) {
379
+ this.taskService.setOwner(taskId, userId);
380
+ }
381
+ /**
382
+ * Retrieves the {@link IdentityLink}s associated with the given task. Such an {@link IdentityLink} informs how a certain identity (eg. group or user) is associated with a certain task (eg. as
383
+ * candidate, assignee, etc.)
384
+ */
385
+ getIdentityLinksForTask(taskId) {
386
+ return this.taskService.getIdentityLinksForTask(taskId);
387
+ }
388
+ /**
389
+ * Convenience shorthand for {@link #addUserIdentityLink(String, String, String)}; with type {@link IdentityLinkType#CANDIDATE}
390
+ *
391
+ * @param taskId
392
+ * id of the task, cannot be null.
393
+ * @param userId
394
+ * id of the user to use as candidate, cannot be null.
395
+ * @throws FlowableObjectNotFoundException
396
+ * when the task or user doesn't exist.
397
+ */
398
+ addCandidateUser(taskId, userId) {
399
+ this.taskService.addCandidateUser(taskId, userId);
400
+ }
401
+ /**
402
+ * Convenience shorthand for {@link #addGroupIdentityLink(String, String, String)}; with type {@link IdentityLinkType#CANDIDATE}
403
+ *
404
+ * @param taskId
405
+ * id of the task, cannot be null.
406
+ * @param groupId
407
+ * id of the group to use as candidate, cannot be null.
408
+ * @throws FlowableObjectNotFoundException
409
+ * when the task or group doesn't exist.
410
+ */
411
+ addCandidateGroup(taskId, groupId) {
412
+ this.taskService.addCandidateGroup(taskId, groupId);
413
+ }
414
+ /**
415
+ * Involves a user with a task. The type of identity link is defined by the given identityLinkType.
416
+ *
417
+ * @param taskId
418
+ * id of the task, cannot be null.
419
+ * @param userId
420
+ * id of the user involve, cannot be null.
421
+ * @param identityLinkType
422
+ * type of identityLink, cannot be null (@see {@link IdentityLinkType}).
423
+ * @throws FlowableObjectNotFoundException
424
+ * when the task or user doesn't exist.
425
+ */
426
+ addUserIdentityLink(taskId, userId, identityLinkType) {
427
+ this.taskService.addUserIdentityLink(taskId, userId, identityLinkType);
428
+ }
429
+ /**
430
+ * Involves a group with a task. The type of identityLink is defined by the given identityLink.
431
+ *
432
+ * @param taskId
433
+ * id of the task, cannot be null.
434
+ * @param groupId
435
+ * id of the group to involve, cannot be null.
436
+ * @param identityLinkType
437
+ * type of identity, cannot be null (@see {@link IdentityLinkType}).
438
+ * @throws FlowableObjectNotFoundException
439
+ * when the task or group doesn't exist.
440
+ */
441
+ addGroupIdentityLink(taskId, groupId, identityLinkType) {
442
+ this.taskService.addGroupIdentityLink(taskId, groupId, identityLinkType);
443
+ }
444
+ /**
445
+ * Convenience shorthand for {@link #deleteUserIdentityLink(String, String, String)}; with type {@link IdentityLinkType#CANDIDATE}
446
+ *
447
+ * @param taskId
448
+ * id of the task, cannot be null.
449
+ * @param userId
450
+ * id of the user to use as candidate, cannot be null.
451
+ * @throws FlowableObjectNotFoundException
452
+ * when the task or user doesn't exist.
453
+ */
454
+ deleteCandidateUser(taskId, userId) {
455
+ this.taskService.deleteCandidateUser(taskId, userId);
456
+ }
457
+ /**
458
+ * Convenience shorthand for {@link #deleteGroupIdentityLink(String, String, String)}; with type {@link IdentityLinkType#CANDIDATE}
459
+ *
460
+ * @param taskId
461
+ * id of the task, cannot be null.
462
+ * @param groupId
463
+ * id of the group to use as candidate, cannot be null.
464
+ * @throws FlowableObjectNotFoundException
465
+ * when the task or group doesn't exist.
466
+ */
467
+ deleteCandidateGroup(taskId, groupId) {
468
+ this.taskService.deleteCandidateGroup(taskId, groupId);
469
+ }
470
+ /**
471
+ * Removes the association between a user and a task for the given identityLinkType.
472
+ *
473
+ * @param taskId
474
+ * id of the task, cannot be null.
475
+ * @param userId
476
+ * id of the user involve, cannot be null.
477
+ * @param identityLinkType
478
+ * type of identityLink, cannot be null (@see {@link IdentityLinkType}).
479
+ * @throws FlowableObjectNotFoundException
480
+ * when the task or user doesn't exist.
481
+ */
482
+ deleteUserIdentityLink(taskId, userId, identityLinkType) {
483
+ this.taskService.deleteUserIdentityLink(taskId, userId, identityLinkType);
484
+ }
485
+ /**
486
+ * Removes the association between a group and a task for the given identityLinkType.
487
+ *
488
+ * @param taskId
489
+ * id of the task, cannot be null.
490
+ * @param groupId
491
+ * id of the group to involve, cannot be null.
492
+ * @param identityLinkType
493
+ * type of identity, cannot be null (@see {@link IdentityLinkType}).
494
+ * @throws FlowableObjectNotFoundException
495
+ * when the task or group doesn't exist.
496
+ */
497
+ deleteGroupIdentityLink(taskId, groupId, identityLinkType) {
498
+ this.taskService.deleteGroupIdentityLink(taskId, groupId, identityLinkType);
499
+ }
500
+ /**
501
+ * Changes the priority of the task.
502
+ *
503
+ * Authorization: actual owner / business admin
504
+ *
505
+ * @param taskId
506
+ * id of the task, cannot be null.
507
+ * @param priority
508
+ * the new priority for the task.
509
+ * @throws FlowableObjectNotFoundException
510
+ * when the task doesn't exist.
511
+ */
512
+ setPriority(taskId, priority) {
513
+ this.taskService.setPriority(taskId, priority);
514
+ }
515
+ /**
516
+ * Changes the due date of the task
517
+ *
518
+ * @param taskId
519
+ * id of the task, cannot be null.
520
+ * @param dueDate
521
+ * the new due date for the task
522
+ * @throws FlowableException
523
+ * when the task doesn't exist.
524
+ */
525
+ setDueDate(taskId, dueDate) {
526
+ this.taskService.setDueDate(taskId, dueDate);
527
+ }
528
+ /**
529
+ * set variable on a task. If the variable is not already existing, it will be created in the most outer scope. This means the process instance in case this task is related to an execution.
530
+ */
531
+ setVariable(taskId, variableName, value) {
532
+ this.taskService.setVariable(taskId, variableName, import_values.Values.stringifyValue(value));
533
+ }
534
+ /**
535
+ * set variables on a task. If the variable is not already existing, it will be created in the most outer scope. This means the process instance in case this task is related to an execution.
536
+ */
537
+ setVariables(taskId, variables) {
538
+ this.taskService.setVariables(taskId, import_values.Values.stringifyValuesMap(variables));
539
+ }
540
+ /**
541
+ * set variable on a task. If the variable is not already existing, it will be created in the task.
542
+ */
543
+ setVariableLocal(taskId, variableName, value) {
544
+ this.taskService.setVariableLocal(taskId, variableName, import_values.Values.stringifyValue(value));
545
+ }
546
+ /**
547
+ * set variables on a task. If the variable is not already existing, it will be created in the task.
548
+ */
549
+ setVariablesLocal(taskId, variables) {
550
+ this.taskService.setVariablesLocal(taskId, import_values.Values.stringifyValuesMap(variables));
551
+ }
552
+ /**
553
+ * get a variables and search in the task scope and if available also the execution scopes.
554
+ */
555
+ getVariable(taskId, variableName) {
556
+ return import_values.Values.parseValue(this.taskService.getVariable(taskId, variableName));
557
+ }
558
+ /**
559
+ * The variable. Searching for the variable is done in all scopes that are visible to the given task (including parent scopes). Returns null when no variable value is found with the given name.
560
+ *
561
+ * @param taskId
562
+ * id of task, cannot be null.
563
+ * @param variableName
564
+ * name of variable, cannot be null.
565
+ * @return the variable or null if the variable is undefined.
566
+ * @throws FlowableObjectNotFoundException
567
+ * when no execution is found for the given taskId.
568
+ */
569
+ getVariableInstance(taskId, variableName) {
570
+ return this.taskService.getVariableInstance(taskId, variableName);
571
+ }
572
+ /**
573
+ * checks whether or not the task has a variable defined with the given name, in the task scope and if available also the execution scopes.
574
+ */
575
+ hasVariable(taskId, variableName) {
576
+ return this.taskService.hasVariable(taskId, variableName);
577
+ }
578
+ /**
579
+ * checks whether or not the task has a variable defined with the given name.
580
+ */
581
+ getVariableLocal(taskId, variableName) {
582
+ return import_values.Values.parseValue(this.taskService.getVariableLocal(taskId, variableName));
583
+ }
584
+ /**
585
+ * The variable for a task. Returns the variable when it is set for the task (and not searching parent scopes). Returns null when no variable is found with the given name.
586
+ *
587
+ * @param taskId
588
+ * id of task, cannot be null.
589
+ * @param variableName
590
+ * name of variable, cannot be null.
591
+ * @return the variable or null if the variable is undefined.
592
+ * @throws FlowableObjectNotFoundException
593
+ * when no task is found for the given taskId.
594
+ */
595
+ getVariableInstanceLocal(taskId, variableName) {
596
+ return this.taskService.getVariableInstanceLocal(taskId, variableName);
597
+ }
598
+ /**
599
+ * checks whether or not the task has a variable defined with the given name, local task scope only.
600
+ */
601
+ hasVariableLocal(taskId, variableName) {
602
+ return this.taskService.hasVariableLocal(taskId, variableName);
603
+ }
604
+ /**
605
+ * get all variables and search in the task scope and if available also the execution scopes. If you have many variables and you only need a few, consider using
606
+ * {@link #getVariables(String, Collection)} for better performance.
607
+ */
608
+ getVariables(taskId, variableNames) {
609
+ if (this.isNotNull(variableNames)) {
610
+ return import_values.Values.parseValuesMap(this.taskService.getVariables(taskId, variableNames));
611
+ } else {
612
+ return import_values.Values.parseValuesMap(this.taskService.getVariables(taskId));
613
+ }
614
+ }
615
+ /**
616
+ * All variables visible from the given task scope (including parent scopes).
617
+ *
618
+ * @param taskId
619
+ * id of task, cannot be null.
620
+ * @param variableNames
621
+ * the collection of variable names that should be retrieved.
622
+ * @return the variable instances or an empty map if no such variables are found.
623
+ * @throws FlowableObjectNotFoundException
624
+ * when no task is found for the given taskId.
625
+ */
626
+ getVariableInstances(taskId, variableNames) {
627
+ if (this.isNotNull(variableNames)) {
628
+ return this.taskService.getVariableInstances(taskId, variableNames);
629
+ } else {
630
+ return this.taskService.getVariableInstances(taskId);
631
+ }
632
+ }
633
+ /**
634
+ * get all variables and search only in the task scope. If you have many task local variables and you only need a few, consider using {@link #getVariablesLocal(String, Collection)} for better
635
+ * performance.
636
+ */
637
+ getVariablesLocal(taskId, variableNames) {
638
+ if (this.isNotNull(variableNames)) {
639
+ return import_values.Values.parseValuesMap(this.taskService.getVariablesLocal(taskId, variableNames));
640
+ } else {
641
+ return import_values.Values.parseValuesMap(this.taskService.getVariablesLocal(taskId));
642
+ }
643
+ }
644
+ /** get all variables and search only in the task scope. */
645
+ getVariableInstancesLocalByTaskIds(taskIds) {
646
+ return this.taskService.getVariableInstancesLocalByTaskIds(taskIds);
647
+ }
648
+ /**
649
+ * All variable values that are defined in the task scope, without taking outer scopes into account. If you have many task local variables and you only need a few, consider using
650
+ * {@link #getVariableInstancesLocal(String, Collection)} for better performance.
651
+ *
652
+ * @param taskId
653
+ * id of task, cannot be null.
654
+ * @return the variables or an empty map if no such variables are found.
655
+ * @throws FlowableObjectNotFoundException
656
+ * when no task is found for the given taskId.
657
+ */
658
+ getVariableInstancesLocal(taskId, variableNames) {
659
+ if (this.isNotNull(variableNames)) {
660
+ return this.taskService.getVariableInstancesLocal(taskId, variableNames);
661
+ } else {
662
+ return this.taskService.getVariableInstancesLocal(taskId);
663
+ }
664
+ }
665
+ /**
666
+ * Removes the variable from the task. When the variable does not exist, nothing happens.
667
+ */
668
+ removeVariable(taskId, variableName) {
669
+ this.taskService.removeVariable(taskId, variableName);
670
+ }
671
+ /**
672
+ * Removes the variable from the task (not considering parent scopes). When the variable does not exist, nothing happens.
673
+ */
674
+ removeVariableLocal(taskId, variableName) {
675
+ this.taskService.removeVariableLocal(taskId, variableName);
676
+ }
677
+ /**
678
+ * Removes all variables in the given collection from the task. Non existing variable names are simply ignored.
679
+ */
680
+ removeVariables(taskId, variableNames) {
681
+ this.taskService.removeVariables(taskId, variableNames);
682
+ }
683
+ /**
684
+ * Removes all variables in the given collection from the task (not considering parent scopes). Non existing variable names are simply ignored.
685
+ */
686
+ removeVariablesLocal(taskId, variableNames) {
687
+ this.taskService.removeVariablesLocal(taskId, variableNames);
688
+ }
689
+ /**
690
+ * All DataObjects visible from the given execution scope (including parent scopes).
691
+ *
692
+ * @param taskId
693
+ * id of task, cannot be null.
694
+ * @param dataObjectNames
695
+ * the collection of DataObject names that should be retrieved.
696
+ * @param locale
697
+ * locale the DataObject name and description should be returned in (if available).
698
+ * @param withLocalizationFallback
699
+ * When true localization will fallback to more general locales if the specified locale is not found.
700
+ * @return the DataObjects or an empty map if no such variables are found.
701
+ * @throws FlowableObjectNotFoundException
702
+ * when no task is found for the given taskId.
703
+ */
704
+ getDataObjects(taskId, dataObjectNames, locale, withLocalizationFallback) {
705
+ if (this.isNotNull(dataObjectNames) && this.isNotNull(locale) && this.isNotNull(withLocalizationFallback)) {
706
+ return this.taskService.getDataObjects(taskId, dataObjectNames, locale, withLocalizationFallback);
707
+ } else if (this.isNotNull(dataObjectNames)) {
708
+ return this.taskService.getDataObjects(taskId, dataObjectNames);
709
+ } else if (this.isNotNull(locale) && this.isNotNull(withLocalizationFallback)) {
710
+ return this.taskService.getDataObjects(taskId, locale, withLocalizationFallback);
711
+ } else {
712
+ return this.taskService.getDataObjects(taskId);
713
+ }
714
+ }
715
+ /**
716
+ * The DataObject. Searching for the DataObject is done in all scopes that are visible to the given task (including parent scopes). Returns null when no DataObject value is found with the given
717
+ * name.
718
+ *
719
+ * @param taskId
720
+ * id of task, cannot be null.
721
+ * @param dataObject
722
+ * name of DataObject, cannot be null.
723
+ * @param locale
724
+ * locale the DataObject name and description should be returned in (if available).
725
+ * @param withLocalizationFallback
726
+ * When true localization will fallback to more general locales including the default locale of the JVM if the specified locale is not found.
727
+ * @return the DataObject or null if the variable is undefined.
728
+ * @throws FlowableObjectNotFoundException
729
+ * when no task is found for the given taskId.
730
+ */
731
+ getDataObject(taskId, dataObject, locale, withLocalizationFallback) {
732
+ if (this.isNotNull(locale) && this.isNotNull(withLocalizationFallback)) {
733
+ return this.taskService.getDataObject(taskId, dataObject, locale, withLocalizationFallback);
734
+ } else {
735
+ return this.taskService.getDataObject(taskId, dataObject);
736
+ }
737
+ }
738
+ /** Add a comment to a task and/or process instance. */
739
+ addComment(taskId, processInstanceId, message, type) {
740
+ if (this.isNotNull(type)) {
741
+ return this.taskService.addComment(taskId, processInstanceId, type, message);
742
+ } else {
743
+ return this.taskService.addComment(taskId, processInstanceId, message);
744
+ }
745
+ }
746
+ /** Update a comment to a task and/or process instance. */
747
+ saveComment(comment) {
748
+ this.taskService.saveComment(comment);
749
+ }
750
+ /**
751
+ * Returns an individual comment with the given id. Returns null if no comment exists with the given id.
752
+ */
753
+ getComment(commentId) {
754
+ return this.taskService.getComment(commentId);
755
+ }
756
+ /** Removes all comments from the provided task and/or process instance */
757
+ deleteComments(taskId, processInstanceId) {
758
+ this.taskService.deleteComments(taskId, processInstanceId);
759
+ }
760
+ /**
761
+ * Removes an individual comment with the given id.
762
+ *
763
+ * @throws FlowableObjectNotFoundException
764
+ * when no comment exists with the given id.
765
+ */
766
+ deleteComment(commentId) {
767
+ this.taskService.deleteComment(commentId);
768
+ }
769
+ /** The comments related to the given task. */
770
+ getTaskComments(taskId, type) {
771
+ if (this.isNotNull(type)) {
772
+ return this.taskService.getTaskComments(taskId, type);
773
+ } else {
774
+ return this.taskService.getTaskComments(taskId);
775
+ }
776
+ }
777
+ /** All comments of a given type. */
778
+ getCommentsByType(type) {
779
+ return this.taskService.getCommentsByType(type);
780
+ }
781
+ /** The all events related to the given task. */
782
+ getTaskEvents(taskId) {
783
+ return this.taskService.getTaskEvents(taskId);
784
+ }
785
+ /**
786
+ * Returns an individual event with the given id. Returns null if no event exists with the given id.
787
+ */
788
+ getEvent(eventId) {
789
+ return this.taskService.getEvent(eventId);
790
+ }
791
+ /** The comments related to the given process instance. */
792
+ getProcessInstanceComments(processInstanceId, type) {
793
+ if (this.isNotNull(type)) {
794
+ return this.taskService.getProcessInstanceComments(processInstanceId, type);
795
+ } else {
796
+ return this.taskService.getProcessInstanceComments(processInstanceId);
797
+ }
798
+ }
799
+ /**
800
+ * Add a new attachment to a task and/or a process instance and use an input stream to provide the content
801
+ */
802
+ createAttachment(attachmentType, taskId, processInstanceId, attachmentName, attachmentDescription, content, url) {
803
+ if (this.isNotNull(url)) {
804
+ return this.taskService.createAttachment(attachmentType, taskId, processInstanceId, attachmentName, attachmentDescription, url);
805
+ } else {
806
+ return this.taskService.createAttachment(attachmentType, taskId, processInstanceId, attachmentName, attachmentDescription, import_io.Streams.createByteArrayInputStream(content));
807
+ }
808
+ }
809
+ /** Update the name and description of an attachment */
810
+ saveAttachment(attachment) {
811
+ this.taskService.saveAttachment(attachment);
812
+ }
813
+ /** Retrieve a particular attachment */
814
+ getAttachment(attachmentId) {
815
+ return this.taskService.getAttachment(attachmentId);
816
+ }
817
+ /** Retrieve stream content of a particular attachment */
818
+ getAttachmentContent(attachmentId) {
819
+ const content = this.taskService.getAttachmentContent(attachmentId);
820
+ const baos = import_io.Streams.createByteArrayOutputStream();
821
+ import_io.Streams.copyLarge(content, baos);
822
+ return baos.getBytes();
823
+ }
824
+ /** The list of attachments associated to a task */
825
+ getTaskAttachments(taskId) {
826
+ return this.taskService.getTaskAttachments(taskId);
827
+ }
828
+ /** The list of attachments associated to a process instance */
829
+ getProcessInstanceAttachments(processInstanceId) {
830
+ return this.taskService.getProcessInstanceAttachments(processInstanceId);
831
+ }
832
+ /** Delete an attachment */
833
+ deleteAttachment(attachmentId) {
834
+ this.taskService.deleteAttachment(attachmentId);
835
+ }
836
+ /** The list of subtasks for this parent task */
837
+ getSubTasks(parentTaskId) {
838
+ return this.taskService.getSubTasks(parentTaskId);
839
+ }
840
+ isNotNull(property) {
841
+ return property !== null && property !== void 0;
842
+ }
843
+ }
844
+ class TaskData {
845
+ constructor(data) {
846
+ this.data = data;
847
+ }
848
+ getId() {
849
+ return this.data.id ?? void 0;
850
+ }
851
+ getRevision() {
852
+ return this.data.revision;
853
+ }
854
+ getOwner() {
855
+ return this.data.owner ?? void 0;
856
+ }
857
+ getAssigneeUpdatedCount() {
858
+ return this.data.assigneeUpdatedCount;
859
+ }
860
+ getOriginalAssignee() {
861
+ return this.data.originalAssignee ?? void 0;
862
+ }
863
+ getAssignee() {
864
+ return this.data.assignee ?? void 0;
865
+ }
866
+ getDelegationState() {
867
+ return this.data.delegationState ?? void 0;
868
+ }
869
+ getParentTaskId() {
870
+ return this.data.parentTaskId ?? void 0;
871
+ }
872
+ getName() {
873
+ return this.data.name ?? void 0;
874
+ }
875
+ getLocalizedName() {
876
+ return this.data.localizedName ?? void 0;
877
+ }
878
+ getDescription() {
879
+ return this.data.description ?? void 0;
880
+ }
881
+ getLocalizedDescription() {
882
+ return this.data.localizedDescription ?? void 0;
883
+ }
884
+ getPriority() {
885
+ return this.data.priority;
886
+ }
887
+ getCreateTime() {
888
+ return this.data.createTime ?? void 0;
889
+ }
890
+ getDueDate() {
891
+ return this.data.dueDate ?? void 0;
892
+ }
893
+ getSuspensionState() {
894
+ return this.data.suspensionState ?? void 0;
895
+ }
896
+ getCategory() {
897
+ return this.data.category ?? void 0;
898
+ }
899
+ isIdentityLinksInitialized() {
900
+ return this.data.isIdentityLinksInitialized;
901
+ }
902
+ getExecutionId() {
903
+ return this.data.executionId ?? void 0;
904
+ }
905
+ getProcessInstanceId() {
906
+ return this.data.processInstanceId ?? void 0;
907
+ }
908
+ getProcessDefinitionId() {
909
+ return this.data.processDefinitionId ?? void 0;
910
+ }
911
+ getScopeId() {
912
+ return this.data.scopeId ?? void 0;
913
+ }
914
+ getSubScopeId() {
915
+ return this.data.subScopeId ?? void 0;
916
+ }
917
+ getScopeType() {
918
+ return this.data.scopeType ?? void 0;
919
+ }
920
+ getScopeDefinitionId() {
921
+ return this.data.scopeDefinitionId ?? void 0;
922
+ }
923
+ getTaskDefinitionKey() {
924
+ return this.data.taskDefinitionKey ?? void 0;
925
+ }
926
+ getFormKey() {
927
+ return this.data.formKey ?? void 0;
928
+ }
929
+ isDeleted() {
930
+ return this.data.isDeleted;
931
+ }
932
+ isCanceled() {
933
+ return this.data.isCanceled;
934
+ }
935
+ isCountEnabled() {
936
+ return this.data.isCountEnabled;
937
+ }
938
+ getVariableCount() {
939
+ return this.data.variableCount;
940
+ }
941
+ getIdentityLinkCount() {
942
+ return this.data.identityLinkCount;
943
+ }
944
+ getClaimTime() {
945
+ return this.data.claimTime ?? void 0;
946
+ }
947
+ getTenantId() {
948
+ return this.data.tenantId;
949
+ }
950
+ getEventName() {
951
+ return this.data.eventName ?? void 0;
952
+ }
953
+ getEventHandlerId() {
954
+ return this.data.eventHandlerId ?? void 0;
955
+ }
956
+ isForcedUpdate() {
957
+ return this.data.forcedUpdate;
958
+ }
959
+ }
960
+ var DelegationState = /* @__PURE__ */ ((DelegationState2) => {
961
+ DelegationState2[DelegationState2["PENDING"] = 0] = "PENDING";
962
+ DelegationState2[DelegationState2["RESOLVED"] = 1] = "RESOLVED";
963
+ return DelegationState2;
964
+ })(DelegationState || {});
965
+ var NullHandlingOnOrder = /* @__PURE__ */ ((NullHandlingOnOrder2) => {
966
+ NullHandlingOnOrder2[NullHandlingOnOrder2["NULLS_FIRST"] = 0] = "NULLS_FIRST";
967
+ NullHandlingOnOrder2[NullHandlingOnOrder2["NULLS_LAST"] = 1] = "NULLS_LAST";
968
+ return NullHandlingOnOrder2;
969
+ })(NullHandlingOnOrder || {});
970
+ if (typeof module !== "undefined") {
971
+ module.exports = Tasks;
972
+ }
973
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS90YXNrcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBBUEkgVGFza3NcbiAqL1xuXG5pbXBvcnQgeyBTdHJlYW1zIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9pb1wiO1xuaW1wb3J0IHsgVmFsdWVzIH0gZnJvbSBcIkBhZXJva2l0L3Nkay9icG0vdmFsdWVzXCI7XG5cbmNvbnN0IEJwbUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5icG0uQnBtRmFjYWRlXCIpO1xuXG5leHBvcnQgY2xhc3MgVGFza3Mge1xuXG5cdHB1YmxpYyBzdGF0aWMgbGlzdCgpOiBUYXNrRGF0YVtdIHtcblx0XHRjb25zdCB0YXNrczogYW55W10gPSBKU09OLnBhcnNlKEJwbUZhY2FkZS5nZXRUYXNrcygpKTtcblx0XHRyZXR1cm4gdGFza3MubWFwKGUgPT4gbmV3IFRhc2tEYXRhKGUpKTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGUodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gVmFsdWVzLnBhcnNlVmFsdWUoQnBtRmFjYWRlLmdldFRhc2tWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHZhcmlhYmxlcy4gVGhpcyB3aWxsIGluY2x1ZGUgYWxsIHZhcmlhYmxlcyBvZiBwYXJlbnQgc2NvcGVzIHRvby5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGVzKHRhc2tJZDogc3RyaW5nKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcChCcG1GYWNhZGUuZ2V0VGFza1ZhcmlhYmxlcyh0YXNrSWQpKTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgc2V0VmFyaWFibGUodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFRhc2tWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIHNldFZhcmlhYmxlcyh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFRhc2tWYXJpYWJsZXModGFza0lkLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWVzTWFwKHZhcmlhYmxlcykpO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBjb21wbGV0ZSh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30pOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUuY29tcGxldGVUYXNrKHRhc2tJZCwgSlNPTi5zdHJpbmdpZnkodmFyaWFibGVzKSk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGdldFRhc2tTZXJ2aWNlKCk6IFRhc2tTZXJ2aWNlIHtcblx0XHRyZXR1cm4gbmV3IFRhc2tTZXJ2aWNlKEJwbUZhY2FkZS5nZXRCcG1Qcm92aWRlckZsb3dhYmxlKCkuZ2V0VGFza1NlcnZpY2UoKSk7XG5cdH1cbn1cblxuLyoqXG4gKiBTZXJ2aWNlIHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0byB7QGxpbmsgVGFza30gYW5kIGZvcm0gcmVsYXRlZCBvcGVyYXRpb25zLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tTZXJ2aWNlIHtcblxuXHRwcml2YXRlIHJlYWRvbmx5IHRhc2tTZXJ2aWNlOiBhbnk7XG5cblx0Y29uc3RydWN0b3IodGFza1NlcnZpY2U6IGFueSkge1xuXHRcdHRoaXMudGFza1NlcnZpY2UgPSB0YXNrU2VydmljZTtcblx0fVxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyB0YXNrIHRoYXQgaXMgbm90IHJlbGF0ZWQgdG8gYW55IHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIFxuXHQgKiBUaGUgcmV0dXJuZWQgdGFzayBpcyB0cmFuc2llbnQgYW5kIG11c3QgYmUgc2F2ZWQgd2l0aCB7QGxpbmsgI3NhdmVUYXNrKFRhc2spfSAnbWFudWFsbHknLlxuXHQgKi9cblx0cHVibGljIG5ld1Rhc2sodGFza0lkPzogc3RyaW5nKTogVGFzayB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHRhc2tJZCkpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLm5ld1Rhc2sodGFza0lkKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UubmV3VGFzaygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIGJ1aWxkZXIgZm9yIHRoZSB0YXNrXG5cdCAqIFxuXHQgKiBAcmV0dXJuIHRhc2sgYnVpbGRlclxuXHQgKi9cblx0cHVibGljIGNyZWF0ZVRhc2tCdWlsZGVyKCk6IFRhc2tCdWlsZGVyIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5jcmVhdGVUYXNrQnVpbGRlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSBnaXZlbiB0YXNrIHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgc3RvcmUuIElmIHRoZSB0YXNrIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcGVyc2lzdGVudCBzdG9yZSwgaXQgaXMgdXBkYXRlZC4gQWZ0ZXIgYSBuZXcgdGFzayBoYXMgYmVlbiBzYXZlZCwgdGhlIHRhc2sgaW5zdGFuY2UgcGFzc2VkIGludG8gdGhpc1xuXHQgKiBtZXRob2QgaXMgdXBkYXRlZCB3aXRoIHRoZSBpZCBvZiB0aGUgbmV3bHkgY3JlYXRlZCB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tcblx0ICogICAgICAgICAgICB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwdWJsaWMgc2F2ZVRhc2sodGFzazogVGFzayk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc2F2ZVRhc2sodGFzayk7XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZXMgdGhlIGdpdmVuIHRhc2tzIHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgc3RvcmUuIElmIHRoZSB0YXNrcyBhcmUgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBwZXJzaXN0ZW50IHN0b3JlLCBpdCBpcyB1cGRhdGVkLiBBZnRlciBhIG5ldyB0YXNrIGhhcyBiZWVuIHNhdmVkLCB0aGUgdGFzayBpbnN0YW5jZSBwYXNzZWQgaW50byB0aGlzXG5cdCAqIG1ldGhvZCBpcyB1cGRhdGVkIHdpdGggdGhlIGlkIG9mIHRoZSBuZXdseSBjcmVhdGVkIHRhc2suXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrTGlzdCB0aGUgbGlzdCBvZiB0YXNrIGluc3RhbmNlcywgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwdWJsaWMgYnVsa1NhdmVUYXNrcyh0YXNrTGlzdDogVGFza1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5idWxrU2F2ZVRhc2tzKHRhc2tMaXN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBnaXZlbiB0YXNrLCBub3QgZGVsZXRpbmcgaGlzdG9yaWMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxhdGVkIHRvIHRoaXMgdGFzay5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHRhc2sgdGhhdCB3aWxsIGJlIGRlbGV0ZWQsIGNhbm5vdCBiZSBudWxsLiBJZiBubyB0YXNrIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiB0YXNrSWQsIHRoZSBvcGVyYXRpb24gaXMgaWdub3JlZC5cblx0ICogQHBhcmFtIGNhc2NhZGVcblx0ICogICAgICAgICAgICBJZiBjYXNjYWRlIGlzIHRydWUsIGFsc28gdGhlIGhpc3RvcmljIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhpcyB0YXNrIGlzIGRlbGV0ZWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIHdpdGggZ2l2ZW4gaWQgZG9lcyBub3QgZXhpc3QuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgdGhlIHRhc2sgb3IgaW4gY2FzZSB0aGUgdGFzayBpcyBwYXJ0IG9mIGEgcnVubmluZyBwcm9jZXNzLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZVRhc2sodGFza0lkOiBzdHJpbmcsIGNhc2NhZGU/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKGNhc2NhZGUpKSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZVRhc2sodGFza0lkLCBjYXNjYWRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgYWxsIHRhc2tzIG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLCBub3QgZGVsZXRpbmcgaGlzdG9yaWMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxhdGVkIHRvIHRoZXNlIHRhc2tzLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZHNcblx0ICogICAgICAgICAgICBUaGUgaWQncyBvZiB0aGUgdGFza3MgdGhhdCB3aWxsIGJlIGRlbGV0ZWQsIGNhbm5vdCBiZSBudWxsLiBBbGwgaWQncyBpbiB0aGUgbGlzdCB0aGF0IGRvbid0IGhhdmUgYW4gZXhpc3RpbmcgdGFzayB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqIEBwYXJhbSBjYXNjYWRlXG5cdCAqICAgICAgICAgICAgSWYgY2FzY2FkZSBpcyB0cnVlLCBhbHNvIHRoZSBoaXN0b3JpYyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoaXMgdGFzayBpcyBkZWxldGVkLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBvbmUgb2YgdGhlIHRhc2sgZG9lcyBub3QgZXhpc3QuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgdGhlIHRhc2tzIG9yIGluIGNhc2Ugb25lIG9mIHRoZSB0YXNrcyBpcyBwYXJ0IG9mIGEgcnVubmluZyBwcm9jZXNzLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZVRhc2tzKHRhc2tJZHM6IHN0cmluZ1tdLCBjYXNjYWRlPzogYm9vbGVhbik6IHZvaWQge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbChjYXNjYWRlKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrcyh0YXNrSWRzLCBjYXNjYWRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrcyh0YXNrSWRzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyB0aGUgZ2l2ZW4gdGFzaywgbm90IGRlbGV0aW5nIGhpc3RvcmljIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVsYXRlZCB0byB0aGlzIHRhc2suLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIFRoZSBpZCBvZiB0aGUgdGFzayB0aGF0IHdpbGwgYmUgZGVsZXRlZCwgY2Fubm90IGJlIG51bGwuIElmIG5vIHRhc2sgZXhpc3RzIHdpdGggdGhlIGdpdmVuIHRhc2tJZCwgdGhlIG9wZXJhdGlvbiBpcyBpZ25vcmVkLlxuXHQgKiBAcGFyYW0gZGVsZXRlUmVhc29uXG5cdCAqICAgICAgICAgICAgcmVhc29uIHRoZSB0YXNrIGlzIGRlbGV0ZWQuIElzIHJlY29yZGVkIGluIGhpc3RvcnksIGlmIGVuYWJsZWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIHdpdGggZ2l2ZW4gaWQgZG9lcyBub3QgZXhpc3QuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZGVsZXRpbmcgdGhlIHRhc2sgb3IgaW4gY2FzZSB0aGUgdGFzayBpcyBwYXJ0IG9mIGEgcnVubmluZyBwcm9jZXNzXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlVGFza1dpdGhSZWFzb24odGFza0lkOiBzdHJpbmcsIGRlbGV0ZVJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVUYXNrKHRhc2tJZCwgZGVsZXRlUmVhc29uKVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgYWxsIHRhc2tzIG9mIHRoZSBnaXZlbiBjb2xsZWN0aW9uLCBub3QgZGVsZXRpbmcgaGlzdG9yaWMgaW5mb3JtYXRpb24gdGhhdCBpcyByZWxhdGVkIHRvIHRoZXNlIHRhc2tzLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZHNcblx0ICogICAgICAgICAgICBUaGUgaWQncyBvZiB0aGUgdGFza3MgdGhhdCB3aWxsIGJlIGRlbGV0ZWQsIGNhbm5vdCBiZSBudWxsLiBBbGwgaWQncyBpbiB0aGUgbGlzdCB0aGF0IGRvbid0IGhhdmUgYW4gZXhpc3RpbmcgdGFzayB3aWxsIGJlIGlnbm9yZWQuXG5cdCAqIEBwYXJhbSBkZWxldGVSZWFzb25cblx0ICogICAgICAgICAgICByZWFzb24gdGhlIHRhc2sgaXMgZGVsZXRlZC4gSXMgcmVjb3JkZWQgaW4gaGlzdG9yeSwgaWYgZW5hYmxlZC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gb25lIG9mIHRoZSB0YXNrcyBkb2VzIG5vdCBleGlzdC5cblx0ICogQHRocm93cyBGbG93YWJsZUV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBkZWxldGluZyB0aGUgdGFza3Mgb3IgaW4gY2FzZSBvbmUgb2YgdGhlIHRhc2tzIGlzIHBhcnQgb2YgYSBydW5uaW5nIHByb2Nlc3MuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlVGFza3NXaXRoUmVhc29uKHRhc2tJZHM6IHN0cmluZ1tdLCBkZWxldGVSZWFzb246IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuZGVsZXRlVGFza3ModGFza0lkcywgZGVsZXRlUmVhc29uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGFpbSByZXNwb25zaWJpbGl0eSBmb3IgYSB0YXNrOiB0aGUgZ2l2ZW4gdXNlciBpcyBtYWRlIGFzc2lnbmVlIGZvciB0aGUgdGFzay4gVGhlIGRpZmZlcmVuY2Ugd2l0aCB7QGxpbmsgI3NldEFzc2lnbmVlKFN0cmluZywgU3RyaW5nKX0gaXMgdGhhdCBoZXJlIGEgY2hlY2sgaXMgZG9uZSBpZiB0aGUgdGFzayBhbHJlYWR5IGhhcyBhXG5cdCAqIHVzZXIgYXNzaWduZWQgdG8gaXQuIE5vIGNoZWNrIGlzIGRvbmUgd2hldGhlciB0aGUgdXNlciBpcyBrbm93biBieSB0aGUgaWRlbnRpdHkgY29tcG9uZW50LlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIHRhc2sgdG8gY2xhaW0sIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IGNsYWltcyB0aGUgdGFzay4gV2hlbiB1c2VySWQgaXMgbnVsbCB0aGUgdGFzayBpcyB1bmNsYWltZWQsIGFzc2lnbmVkIHRvIG5vIG9uZS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgZG9lc24ndCBleGlzdC5cblx0ICogQHRocm93cyBvcmcuZmxvd2FibGUuY29tbW9uLmVuZ2luZS5hcGkuRmxvd2FibGVUYXNrQWxyZWFkeUNsYWltZWRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBpcyBhbHJlYWR5IGNsYWltZWQgYnkgYW5vdGhlciB1c2VyXG5cdCAqL1xuXHRwdWJsaWMgY2xhaW0odGFza0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5jbGFpbSh0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaG9ydGN1dCB0byB7QGxpbmsgI2NsYWltfSB3aXRoIG51bGwgdXNlciBpbiBvcmRlciB0byB1bmNsYWltIHRoZSB0YXNrXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGFzayB0byB1bmNsYWltLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyB1bmNsYWltKHRhc2tJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS51bmNsYWltKHRhc2tJZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0IHRoZSB0YXNrIHN0YXRlIHRvIGluIHByb2dyZXNzLiBObyBjaGVjayBpcyBkb25lIHdoZXRoZXIgdGhlIHVzZXIgaXMga25vd24gYnkgdGhlIGlkZW50aXR5IGNvbXBvbmVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICB0YXNrIHRvIGNoYW5nZSB0aGUgc3RhdGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IHB1dHMgdGhlIHRhc2sgaW4gcHJvZ3Jlc3MuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc3RhcnRQcm9ncmVzcyh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnN0YXJ0UHJvZ3Jlc3ModGFza0lkLCB1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN1c3BlbmRzIHRoZSB0YXNrLiBObyBjaGVjayBpcyBkb25lIHdoZXRoZXIgdGhlIHVzZXIgaXMga25vd24gYnkgdGhlIGlkZW50aXR5IGNvbXBvbmVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICB0YXNrIHRvIHN1c3BlbmQsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IHN1c3BlbmRzIHRoZSB0YXNrLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIHN1c3BlbmRUYXNrKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc3VzcGVuZFRhc2sodGFza0lkLCB1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFjdGl2YXRlcyB0aGUgdGFzay4gTm8gY2hlY2sgaXMgZG9uZSB3aGV0aGVyIHRoZSB1c2VyIGlzIGtub3duIGJ5IHRoZSBpZGVudGl0eSBjb21wb25lbnQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGFzayB0byBhY3RpdmF0ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICB1c2VyIHRoYXQgYWN0aXZhdGVzIHRoZSB0YXNrLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIGFjdGl2YXRlVGFzayh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmFjdGl2YXRlVGFzayh0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogRGVsZWdhdGVzIHRoZSB0YXNrIHRvIGFub3RoZXIgdXNlci4gVGhpcyBtZWFucyB0aGF0IHRoZSBhc3NpZ25lZSBpcyBzZXQgYW5kIHRoZSBkZWxlZ2F0aW9uIHN0YXRlIGlzIHNldCB0byB7QGxpbmsgRGVsZWdhdGlvblN0YXRlI1BFTkRJTkd9LiBJZiBubyBvd25lciBpcyBzZXQgb24gdGhlIHRhc2ssIHRoZSBvd25lciBpcyBzZXQgdG9cblx0ICogdGhlIGN1cnJlbnQgYXNzaWduZWUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgVGhlIGlkIG9mIHRoZSB0YXNrIHRoYXQgd2lsbCBiZSBkZWxlZ2F0ZWQuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICBUaGUgaWQgb2YgdGhlIHVzZXIgdGhhdCB3aWxsIGJlIHNldCBhcyBhc3NpZ25lZS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZWdhdGVUYXNrKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuZGVsZWdhdGVUYXNrKHRhc2tJZCwgdXNlcklkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYXJrcyB0aGF0IHRoZSBhc3NpZ25lZSBpcyBkb25lIHdpdGggdGhpcyB0YXNrIGFuZCB0aGF0IGl0IGNhbiBiZSBzZW5kIGJhY2sgdG8gdGhlIG93bmVyLiBDYW4gb25seSBiZSBjYWxsZWQgd2hlbiB0aGlzIHRhc2sgaXMge0BsaW5rIERlbGVnYXRpb25TdGF0ZSNQRU5ESU5HfSBkZWxlZ2F0aW9uLiBBZnRlciB0aGlzIG1ldGhvZFxuXHQgKiByZXR1cm5zLCB0aGUge0BsaW5rIFRhc2sjZ2V0RGVsZWdhdGlvblN0YXRlKCkgZGVsZWdhdGlvblN0YXRlfSBpcyBzZXQgdG8ge0BsaW5rIERlbGVnYXRpb25TdGF0ZSNSRVNPTFZFRH0uXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSB0YXNrIHRvIHJlc29sdmUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXNcblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqL1xuXHRwdWJsaWMgcmVzb2x2ZVRhc2sodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4sIHRyYW5zaWVudFZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVzKSAmJiB0aGlzLmlzTm90TnVsbCh0cmFuc2llbnRWYXJpYWJsZXMpKSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLnJlc29sdmVUYXNrKHRhc2tJZCwgdmFyaWFibGVzLCB0cmFuc2llbnRWYXJpYWJsZXMpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVzKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5yZXNvbHZlVGFzayh0YXNrSWQsIHZhcmlhYmxlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UucmVzb2x2ZVRhc2sodGFza0lkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIHRhc2sgaXMgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIHRoZSBpZCBvZiB0aGUgdGFzayB0byBjb21wbGV0ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICB1c2VyIHRoYXQgY29tcGxldGVzIHRoZSB0YXNrLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzXG5cdCAqICAgICAgICAgICAgdGFzayBwYXJhbWV0ZXJzLiBNYXkgYmUgbnVsbCBvciBlbXB0eS5cblx0ICogQHBhcmFtIHRyYW5zaWVudFZhcmlhYmxlc1xuXHQgKiAgICAgICAgICAgIHRhc2sgcGFyYW1ldGVycy4gTWF5IGJlIG51bGwgb3IgZW1wdHkuXG5cdCAqIEBwYXJhbSBsb2NhbFNjb3BlXG5cdCAqICAgICAgICAgICAgSWYgdHJ1ZSwgdGhlIHByb3ZpZGVkIHZhcmlhYmxlcyB3aWxsIGJlIHN0b3JlZCB0YXNrLWxvY2FsLCBpbnN0ZWFkIG9mIHByb2Nlc3MgaW5zdGFuY2Ugd2lkZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyKS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGlzIHRhc2sgaXMge0BsaW5rIERlbGVnYXRpb25TdGF0ZSNQRU5ESU5HfSBkZWxlZ2F0aW9uLlxuXHQgKi9cblx0cHVibGljIGNvbXBsZXRlKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ/OiBzdHJpbmcsIHZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4sIHRyYW5zaWVudFZhcmlhYmxlcz86IE1hcDxzdHJpbmcsIGFueT4sIGxvY2FsU2NvcGU/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHVzZXJJZCkgJiYgdGhpcy5pc05vdE51bGwodmFyaWFibGVzKSAmJiB0aGlzLmlzTm90TnVsbChsb2NhbFNjb3BlKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHVzZXJJZCwgdmFyaWFibGVzLCBsb2NhbFNjb3BlKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHZhcmlhYmxlcykgJiYgdGhpcy5pc05vdE51bGwobG9jYWxTY29wZSkpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkLCB2YXJpYWJsZXMsIGxvY2FsU2NvcGUpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05vdE51bGwodXNlcklkKSAmJiB0aGlzLmlzTm90TnVsbCh2YXJpYWJsZXMpICYmIHRoaXMuaXNOb3ROdWxsKHRyYW5zaWVudFZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkLCB1c2VySWQsIHZhcmlhYmxlcywgdHJhbnNpZW50VmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHZhcmlhYmxlcykgJiYgdGhpcy5pc05vdE51bGwodHJhbnNpZW50VmFyaWFibGVzKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHZhcmlhYmxlcywgdHJhbnNpZW50VmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHVzZXJJZCkgJiYgdGhpcy5pc05vdE51bGwodmFyaWFibGVzKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHVzZXJJZCwgdmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkLCB2YXJpYWJsZXMpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy5pc05vdE51bGwodXNlcklkKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZSh0YXNrSWQsIHVzZXJJZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGUodGFza0lkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIHRhc2sgaXMgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLCBhbmQgdGhlIHRhc2sgZm9ybSBoYXMgYmVlbiBzdWJtaXR0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSB0YXNrIHRvIGNvbXBsZXRlLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGZvcm1EZWZpbml0aW9uSWRcblx0ICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGZvcm0gZGVmaW5pdGlvbiB0aGF0IGlzIGZpbGxlZC1pbiB0byBjb21wbGV0ZSB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBvdXRjb21lXG5cdCAqICAgICAgICAgICAgdGhlIG91dGNvbWUgb2YgdGhlIGNvbXBsZXRlZCBmb3JtLCBjYW4gYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhcmlhYmxlc1xuXHQgKiAgICAgICAgICAgIHZhbHVlcyBvZiB0aGUgY29tcGxldGVkIGZvcm0uIE1heSBiZSBudWxsIG9yIGVtcHR5LlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgdXNlciB0aGF0IGNvbXBsZXRlcyB0aGUgdGFzay5cblx0ICogQHBhcmFtIHRyYW5zaWVudFZhcmlhYmxlc1xuXHQgKiAgICAgICAgICAgIGFkZGl0aW9uYWwgdHJhbnNpZW50IHZhbHVlcyB0aGF0IG5lZWQgdG8gYWRkZWQgdG8gdGhlIHByb2Nlc3MgaW5zdGFuY2UgdHJhbnNpZW50IHZhcmlhYmxlcy4gTWF5IGJlIG51bGwgb3IgZW1wdHkuXG5cdCAqIEBwYXJhbSBsb2NhbFNjb3BlXG5cdCAqICAgICAgICAgICAgSWYgdHJ1ZSwgdGhlIHByb3ZpZGVkIHZhcmlhYmxlcyB3aWxsIGJlIHN0b3JlZCB0YXNrLWxvY2FsLCBpbnN0ZWFkIG9mIHByb2Nlc3MgaW5zdGFuY2Ugd2lkZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQgZm9yIHtAbGluayAjY29tcGxldGUoU3RyaW5nLCBNYXApfSkuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIHRhc2sgZXhpc3RzIHdpdGggdGhlIGdpdmVuIGlkLlxuXHQgKi9cblx0cHVibGljIGNvbXBsZXRlVGFza1dpdGhGb3JtKHRhc2tJZDogc3RyaW5nLCBmb3JtRGVmaW5pdGlvbklkOiBzdHJpbmcsIG91dGNvbWU6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8U3RyaW5nLCBhbnk+LCB1c2VySWQ/OiBzdHJpbmcsIHRyYW5zaWVudFZhcmlhYmxlcz86IE1hcDxTdHJpbmcsIGFueT4sIGxvY2FsU2NvcGU/OiBib29sZWFuKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHVzZXJJZCkgJiYgdGhpcy5pc05vdE51bGwobG9jYWxTY29wZSkpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGVUYXNrV2l0aEZvcm0odGFza0lkLCBmb3JtRGVmaW5pdGlvbklkLCBvdXRjb21lLCB1c2VySWQsIHZhcmlhYmxlcywgbG9jYWxTY29wZSk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbChsb2NhbFNjb3BlKSkge1xuXHRcdFx0dGhpcy50YXNrU2VydmljZS5jb21wbGV0ZVRhc2tXaXRoRm9ybSh0YXNrSWQsIGZvcm1EZWZpbml0aW9uSWQsIG91dGNvbWUsIHZhcmlhYmxlcywgbG9jYWxTY29wZSk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbCh1c2VySWQpICYmIHRoaXMuaXNOb3ROdWxsKHRyYW5zaWVudFZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGVUYXNrV2l0aEZvcm0odGFza0lkLCBmb3JtRGVmaW5pdGlvbklkLCBvdXRjb21lLCB1c2VySWQsIHZhcmlhYmxlcywgdHJhbnNpZW50VmFyaWFibGVzKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuaXNOb3ROdWxsKHRyYW5zaWVudFZhcmlhYmxlcykpIHtcblx0XHRcdHRoaXMudGFza1NlcnZpY2UuY29tcGxldGVUYXNrV2l0aEZvcm0odGFza0lkLCBmb3JtRGVmaW5pdGlvbklkLCBvdXRjb21lLCB2YXJpYWJsZXMsIHRyYW5zaWVudFZhcmlhYmxlcyk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbCh1c2VySWQpKSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLmNvbXBsZXRlVGFza1dpdGhGb3JtKHRhc2tJZCwgZm9ybURlZmluaXRpb25JZCwgb3V0Y29tZSwgdXNlcklkLCB2YXJpYWJsZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnRhc2tTZXJ2aWNlLmNvbXBsZXRlVGFza1dpdGhGb3JtKHRhc2tJZCwgZm9ybURlZmluaXRpb25JZCwgb3V0Y29tZSwgdmFyaWFibGVzKTtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIEdldHMgYSBGb3JtIG1vZGVsIGluc3RhbmNlIG9mIHRoZSB0YXNrIGZvcm0gb2YgYSBzcGVjaWZpYyB0YXNrXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gaWdub3JlVmFyaWFibGVzXG5cdCAqICAgICAgICAgICAgc2hvdWxkIHRoZSB2YXJpYWJsZXMgYmUgaWdub3JlZCB3aGVuIGZldGNoaW5nIHRoZSBmb3JtIG1vZGVsP1xuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBmb3JtIGRlZmluaXRpb24gZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBnZXRUYXNrRm9ybU1vZGVsKHRhc2tJZDogc3RyaW5nLCBpZ25vcmVWYXJpYWJsZXM/OiBib29sZWFuKTogRm9ybUluZm8ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbChpZ25vcmVWYXJpYWJsZXMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRUYXNrRm9ybU1vZGVsKHRhc2tJZCwgaWdub3JlVmFyaWFibGVzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0VGFza0Zvcm1Nb2RlbCh0YXNrSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBhc3NpZ25lZSBvZiB0aGUgZ2l2ZW4gdGFzayB0byB0aGUgZ2l2ZW4gdXNlcklkLiBObyBjaGVjayBpcyBkb25lIHdoZXRoZXIgdGhlIHVzZXIgaXMga25vd24gYnkgdGhlIGlkZW50aXR5IGNvbXBvbmVudC5cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB1c2VySWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgdXNlciB0byB1c2UgYXMgYXNzaWduZWUuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBzZXRBc3NpZ25lZSh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldEFzc2lnbmVlKHRhc2tJZCwgdXNlcklkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFuc2ZlcnMgb3duZXJzaGlwIG9mIHRoaXMgdGFzayB0byBhbm90aGVyIHVzZXIuIE5vIGNoZWNrIGlzIGRvbmUgd2hldGhlciB0aGUgdXNlciBpcyBrbm93biBieSB0aGUgaWRlbnRpdHkgY29tcG9uZW50LlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHVzZXJJZFxuXHQgKiAgICAgICAgICAgIG9mIHRoZSBwZXJzb24gdGhhdCBpcyByZWNlaXZpbmcgb3duZXJzaGlwLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc2V0T3duZXIodGFza0lkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5zZXRPd25lcih0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB7QGxpbmsgSWRlbnRpdHlMaW5rfXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0YXNrLiBTdWNoIGFuIHtAbGluayBJZGVudGl0eUxpbmt9IGluZm9ybXMgaG93IGEgY2VydGFpbiBpZGVudGl0eSAoZWcuIGdyb3VwIG9yIHVzZXIpIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNlcnRhaW4gdGFzayAoZWcuIGFzXG5cdCAqIGNhbmRpZGF0ZSwgYXNzaWduZWUsIGV0Yy4pXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SWRlbnRpdHlMaW5rc0ZvclRhc2sodGFza0lkOiBzdHJpbmcpOiBJZGVudGl0eUxpbmtbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0SWRlbnRpdHlMaW5rc0ZvclRhc2sodGFza0lkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgZm9yIHtAbGluayAjYWRkVXNlcklkZW50aXR5TGluayhTdHJpbmcsIFN0cmluZywgU3RyaW5nKX07IHdpdGggdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9XG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBhZGRDYW5kaWRhdGVVc2VyKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuYWRkQ2FuZGlkYXRlVXNlcih0YXNrSWQsIHVzZXJJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB7QGxpbmsgI2FkZEdyb3VwSWRlbnRpdHlMaW5rKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfTsgd2l0aCB0eXBlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlI0NBTkRJREFURX1cblx0ICogXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBncm91cElkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIHVzZSBhcyBjYW5kaWRhdGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBncm91cCBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZUdyb3VwKHRhc2tJZDogc3RyaW5nLCBncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmFkZENhbmRpZGF0ZUdyb3VwKHRhc2tJZCwgZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcblx0ICogSW52b2x2ZXMgYSB1c2VyIHdpdGggYSB0YXNrLiBUaGUgdHlwZSBvZiBpZGVudGl0eSBsaW5rIGlzIGRlZmluZWQgYnkgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdXNlcklkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG5cdCAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eUxpbmssIGNhbm5vdCBiZSBudWxsIChAc2VlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlfSkuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIG9yIHVzZXIgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBhZGRVc2VySWRlbnRpdHlMaW5rKHRhc2tJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgaWRlbnRpdHlMaW5rVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5hZGRVc2VySWRlbnRpdHlMaW5rKHRhc2tJZCwgdXNlcklkLCBpZGVudGl0eUxpbmtUeXBlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnZvbHZlcyBhIGdyb3VwIHdpdGggYSB0YXNrLiBUaGUgdHlwZSBvZiBpZGVudGl0eUxpbmsgaXMgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gaWRlbnRpdHlMaW5rLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG5cdCAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eSwgY2Fubm90IGJlIG51bGwgKEBzZWUge0BsaW5rIElkZW50aXR5TGlua1R5cGV9KS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBhZGRHcm91cElkZW50aXR5TGluayh0YXNrSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmFkZEdyb3VwSWRlbnRpdHlMaW5rKHRhc2tJZCwgZ3JvdXBJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVuaWVuY2Ugc2hvcnRoYW5kIGZvciB7QGxpbmsgI2RlbGV0ZVVzZXJJZGVudGl0eUxpbmsoU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9OyB3aXRoIHR5cGUge0BsaW5rIElkZW50aXR5TGlua1R5cGUjQ0FORElEQVRFfVxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHVzZXJJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB1c2VyIHRvIHVzZSBhcyBjYW5kaWRhdGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlQ2FuZGlkYXRlVXNlcih0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZUNhbmRpZGF0ZVVzZXIodGFza0lkLCB1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlbmllbmNlIHNob3J0aGFuZCBmb3Ige0BsaW5rICNkZWxldGVHcm91cElkZW50aXR5TGluayhTdHJpbmcsIFN0cmluZywgU3RyaW5nKX07IHdpdGggdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9XG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gZ3JvdXBJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSBncm91cCB0byB1c2UgYXMgY2FuZGlkYXRlLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBkZWxldGVDYW5kaWRhdGVHcm91cCh0YXNrSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVDYW5kaWRhdGVHcm91cCh0YXNrSWQsIGdyb3VwSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gYSB1c2VyIGFuZCBhIHRhc2sgZm9yIHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHVzZXJJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB1c2VyIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gaWRlbnRpdHlMaW5rVHlwZVxuXHQgKiAgICAgICAgICAgIHR5cGUgb2YgaWRlbnRpdHlMaW5rLCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgZGVsZXRlVXNlcklkZW50aXR5TGluayh0YXNrSWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIGlkZW50aXR5TGlua1R5cGU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UuZGVsZXRlVXNlcklkZW50aXR5TGluayh0YXNrSWQsIHVzZXJJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhIGdyb3VwIGFuZCBhIHRhc2sgZm9yIHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG5cdCAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eSwgY2Fubm90IGJlIG51bGwgKEBzZWUge0BsaW5rIElkZW50aXR5TGlua1R5cGV9KS5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cblx0ICovXG5cdHB1YmxpYyBkZWxldGVHcm91cElkZW50aXR5TGluayh0YXNrSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZUdyb3VwSWRlbnRpdHlMaW5rKHRhc2tJZCwgZ3JvdXBJZCwgaWRlbnRpdHlMaW5rVHlwZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgcHJpb3JpdHkgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBBdXRob3JpemF0aW9uOiBhY3R1YWwgb3duZXIgLyBidXNpbmVzcyBhZG1pblxuXHQgKiBcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRoZSB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHByaW9yaXR5XG5cdCAqICAgICAgICAgICAgdGhlIG5ldyBwcmlvcml0eSBmb3IgdGhlIHRhc2suXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIHRoZSB0YXNrIGRvZXNuJ3QgZXhpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc2V0UHJpb3JpdHkodGFza0lkOiBzdHJpbmcsIHByaW9yaXR5OiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFByaW9yaXR5KHRhc2tJZCwgcHJpb3JpdHkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrXG5cdCAqIFxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGhlIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gZHVlRGF0ZVxuXHQgKiAgICAgICAgICAgIHRoZSBuZXcgZHVlIGRhdGUgZm9yIHRoZSB0YXNrXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBkb2Vzbid0IGV4aXN0LlxuXHQgKi9cblx0cHVibGljIHNldER1ZURhdGUodGFza0lkOiBzdHJpbmcsIGR1ZURhdGU6IERhdGUpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldER1ZURhdGUodGFza0lkLCBkdWVEYXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBzZXQgdmFyaWFibGUgb24gYSB0YXNrLiBJZiB0aGUgdmFyaWFibGUgaXMgbm90IGFscmVhZHkgZXhpc3RpbmcsIGl0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgbW9zdCBvdXRlciBzY29wZS4gVGhpcyBtZWFucyB0aGUgcHJvY2VzcyBpbnN0YW5jZSBpbiBjYXNlIHRoaXMgdGFzayBpcyByZWxhdGVkIHRvIGFuIGV4ZWN1dGlvbi5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZSh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFZhcmlhYmxlKHRhc2tJZCwgdmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBzZXQgdmFyaWFibGVzIG9uIGEgdGFzay4gSWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBhbHJlYWR5IGV4aXN0aW5nLCBpdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIG1vc3Qgb3V0ZXIgc2NvcGUuIFRoaXMgbWVhbnMgdGhlIHByb2Nlc3MgaW5zdGFuY2UgaW4gY2FzZSB0aGlzIHRhc2sgaXMgcmVsYXRlZCB0byBhbiBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVzKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZXM6IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFZhcmlhYmxlcyh0YXNrSWQsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZXNNYXAodmFyaWFibGVzKSk7XG5cdH1cblxuXHQvKipcblx0ICogc2V0IHZhcmlhYmxlIG9uIGEgdGFzay4gSWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBhbHJlYWR5IGV4aXN0aW5nLCBpdCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLnNldFZhcmlhYmxlTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHNldCB2YXJpYWJsZXMgb24gYSB0YXNrLiBJZiB0aGUgdmFyaWFibGUgaXMgbm90IGFscmVhZHkgZXhpc3RpbmcsIGl0IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZXNMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5zZXRWYXJpYWJsZXNMb2NhbCh0YXNrSWQsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZXNNYXAodmFyaWFibGVzKSk7XG5cdH1cblxuXHQvKipcblx0ICogZ2V0IGEgdmFyaWFibGVzIGFuZCBzZWFyY2ggaW4gdGhlIHRhc2sgc2NvcGUgYW5kIGlmIGF2YWlsYWJsZSBhbHNvIHRoZSBleGVjdXRpb24gc2NvcGVzLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudGFza1NlcnZpY2UuZ2V0VmFyaWFibGUodGFza0lkLCB2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdmFyaWFibGUuIFNlYXJjaGluZyBmb3IgdGhlIHZhcmlhYmxlIGlzIGRvbmUgaW4gYWxsIHNjb3BlcyB0aGF0IGFyZSB2aXNpYmxlIHRvIHRoZSBnaXZlbiB0YXNrIChpbmNsdWRpbmcgcGFyZW50IHNjb3BlcykuIFJldHVybnMgbnVsbCB3aGVuIG5vIHZhcmlhYmxlIHZhbHVlIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZVxuXHQgKiAgICAgICAgICAgIG5hbWUgb2YgdmFyaWFibGUsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcmV0dXJuIHRoZSB2YXJpYWJsZSBvciBudWxsIGlmIHRoZSB2YXJpYWJsZSBpcyB1bmRlZmluZWQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIGV4ZWN1dGlvbiBpcyBmb3VuZCBmb3IgdGhlIGdpdmVuIHRhc2tJZC5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IFZhcmlhYmxlSW5zdGFuY2Uge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlSW5zdGFuY2UodGFza0lkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgdGFzayBoYXMgYSB2YXJpYWJsZSBkZWZpbmVkIHdpdGggdGhlIGdpdmVuIG5hbWUsIGluIHRoZSB0YXNrIHNjb3BlIGFuZCBpZiBhdmFpbGFibGUgYWxzbyB0aGUgZXhlY3V0aW9uIHNjb3Blcy5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZSh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5oYXNWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogY2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSB0YXNrIGhhcyBhIHZhcmlhYmxlIGRlZmluZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUxvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudGFza1NlcnZpY2UuZ2V0VmFyaWFibGVMb2NhbCh0YXNrSWQsIHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB2YXJpYWJsZSBmb3IgYSB0YXNrLiBSZXR1cm5zIHRoZSB2YXJpYWJsZSB3aGVuIGl0IGlzIHNldCBmb3IgdGhlIHRhc2sgKGFuZCBub3Qgc2VhcmNoaW5nIHBhcmVudCBzY29wZXMpLiBSZXR1cm5zIG51bGwgd2hlbiBubyB2YXJpYWJsZSBpcyBmb3VuZCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFza0lkXG5cdCAqICAgICAgICAgICAgaWQgb2YgdGFzaywgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWVcblx0ICogICAgICAgICAgICBuYW1lIG9mIHZhcmlhYmxlLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHJldHVybiB0aGUgdmFyaWFibGUgb3IgbnVsbCBpZiB0aGUgdmFyaWFibGUgaXMgdW5kZWZpbmVkLlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlT2JqZWN0Tm90Rm91bmRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgd2hlbiBubyB0YXNrIGlzIGZvdW5kIGZvciB0aGUgZ2l2ZW4gdGFza0lkLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiBWYXJpYWJsZUluc3RhbmNlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZUluc3RhbmNlTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgdGFzayBoYXMgYSB2YXJpYWJsZSBkZWZpbmVkIHdpdGggdGhlIGdpdmVuIG5hbWUsIGxvY2FsIHRhc2sgc2NvcGUgb25seS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZUxvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmhhc1ZhcmlhYmxlTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBhbGwgdmFyaWFibGVzIGFuZCBzZWFyY2ggaW4gdGhlIHRhc2sgc2NvcGUgYW5kIGlmIGF2YWlsYWJsZSBhbHNvIHRoZSBleGVjdXRpb24gc2NvcGVzLiBJZiB5b3UgaGF2ZSBtYW55IHZhcmlhYmxlcyBhbmQgeW91IG9ubHkgbmVlZCBhIGZldywgY29uc2lkZXIgdXNpbmdcblx0ICoge0BsaW5rICNnZXRWYXJpYWJsZXMoU3RyaW5nLCBDb2xsZWN0aW9uKX0gZm9yIGJldHRlciBwZXJmb3JtYW5jZS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZXModGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZXM/OiBzdHJpbmdbXSk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbCh2YXJpYWJsZU5hbWVzKSkge1xuXHRcdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcCh0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlcyh0YXNrSWQsIHZhcmlhYmxlTmFtZXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcCh0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlcyh0YXNrSWQpKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWxsIHZhcmlhYmxlcyB2aXNpYmxlIGZyb20gdGhlIGdpdmVuIHRhc2sgc2NvcGUgKGluY2x1ZGluZyBwYXJlbnQgc2NvcGVzKS5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lc1xuXHQgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHJldHJpZXZlZC5cblx0ICogQHJldHVybiB0aGUgdmFyaWFibGUgaW5zdGFuY2VzIG9yIGFuIGVtcHR5IG1hcCBpZiBubyBzdWNoIHZhcmlhYmxlcyBhcmUgZm91bmQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIHRhc2sgaXMgZm91bmQgZm9yIHRoZSBnaXZlbiB0YXNrSWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXModGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZXM/OiBzdHJpbmdbXSk6IE1hcDxzdHJpbmcsIFZhcmlhYmxlSW5zdGFuY2U+IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVOYW1lcykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlSW5zdGFuY2VzKHRhc2tJZCwgdmFyaWFibGVOYW1lcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlSW5zdGFuY2VzKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBhbGwgdmFyaWFibGVzIGFuZCBzZWFyY2ggb25seSBpbiB0aGUgdGFzayBzY29wZS4gSWYgeW91IGhhdmUgbWFueSB0YXNrIGxvY2FsIHZhcmlhYmxlcyBhbmQgeW91IG9ubHkgbmVlZCBhIGZldywgY29uc2lkZXIgdXNpbmcge0BsaW5rICNnZXRWYXJpYWJsZXNMb2NhbChTdHJpbmcsIENvbGxlY3Rpb24pfSBmb3IgYmV0dGVyXG5cdCAqIHBlcmZvcm1hbmNlLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlc0xvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWVzPzogc3RyaW5nW10pOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodmFyaWFibGVOYW1lcykpIHtcblx0XHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZXNNYXAodGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZXNMb2NhbCh0YXNrSWQsIHZhcmlhYmxlTmFtZXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlc01hcCh0aGlzLnRhc2tTZXJ2aWNlLmdldFZhcmlhYmxlc0xvY2FsKHRhc2tJZCkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBnZXQgYWxsIHZhcmlhYmxlcyBhbmQgc2VhcmNoIG9ubHkgaW4gdGhlIHRhc2sgc2NvcGUuICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsQnlUYXNrSWRzKHRhc2tJZHM6IFNldDxzdHJpbmc+KTogVmFyaWFibGVJbnN0YW5jZVtdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsQnlUYXNrSWRzKHRhc2tJZHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFsbCB2YXJpYWJsZSB2YWx1ZXMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgdGFzayBzY29wZSwgd2l0aG91dCB0YWtpbmcgb3V0ZXIgc2NvcGVzIGludG8gYWNjb3VudC4gSWYgeW91IGhhdmUgbWFueSB0YXNrIGxvY2FsIHZhcmlhYmxlcyBhbmQgeW91IG9ubHkgbmVlZCBhIGZldywgY29uc2lkZXIgdXNpbmdcblx0ICoge0BsaW5rICNnZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsKFN0cmluZywgQ29sbGVjdGlvbil9IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHJldHVybiB0aGUgdmFyaWFibGVzIG9yIGFuIGVtcHR5IG1hcCBpZiBubyBzdWNoIHZhcmlhYmxlcyBhcmUgZm91bmQuXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIHRhc2sgaXMgZm91bmQgZm9yIHRoZSBnaXZlbiB0YXNrSWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCh0YXNrSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lcz86IHN0cmluZ1tdKTogTWFwPHN0cmluZywgVmFyaWFibGVJbnN0YW5jZT4ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbCh2YXJpYWJsZU5hbWVzKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCh0YXNrSWQsIHZhcmlhYmxlTmFtZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRWYXJpYWJsZUluc3RhbmNlc0xvY2FsKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIHZhcmlhYmxlIGZyb20gdGhlIHRhc2suIFdoZW4gdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LCBub3RoaW5nIGhhcHBlbnMuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVmFyaWFibGUodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5yZW1vdmVWYXJpYWJsZSh0YXNrSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgdmFyaWFibGUgZnJvbSB0aGUgdGFzayAobm90IGNvbnNpZGVyaW5nIHBhcmVudCBzY29wZXMpLiBXaGVuIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgbm90aGluZyBoYXBwZW5zLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlTG9jYWwodGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5yZW1vdmVWYXJpYWJsZUxvY2FsKHRhc2tJZCwgdmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCB2YXJpYWJsZXMgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgdGFzay4gTm9uIGV4aXN0aW5nIHZhcmlhYmxlIG5hbWVzIGFyZSBzaW1wbHkgaWdub3JlZC5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXModGFza0lkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5yZW1vdmVWYXJpYWJsZXModGFza0lkLCB2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCB2YXJpYWJsZXMgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgdGFzayAobm90IGNvbnNpZGVyaW5nIHBhcmVudCBzY29wZXMpLiBOb24gZXhpc3RpbmcgdmFyaWFibGUgbmFtZXMgYXJlIHNpbXBseSBpZ25vcmVkLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlc0xvY2FsKHRhc2tJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2UucmVtb3ZlVmFyaWFibGVzTG9jYWwodGFza0lkLCB2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBbGwgRGF0YU9iamVjdHMgdmlzaWJsZSBmcm9tIHRoZSBnaXZlbiBleGVjdXRpb24gc2NvcGUgKGluY2x1ZGluZyBwYXJlbnQgc2NvcGVzKS5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tJZFxuXHQgKiAgICAgICAgICAgIGlkIG9mIHRhc2ssIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gZGF0YU9iamVjdE5hbWVzXG5cdCAqICAgICAgICAgICAgdGhlIGNvbGxlY3Rpb24gb2YgRGF0YU9iamVjdCBuYW1lcyB0aGF0IHNob3VsZCBiZSByZXRyaWV2ZWQuXG5cdCAqIEBwYXJhbSBsb2NhbGVcblx0ICogICAgICAgICAgICBsb2NhbGUgdGhlIERhdGFPYmplY3QgbmFtZSBhbmQgZGVzY3JpcHRpb24gc2hvdWxkIGJlIHJldHVybmVkIGluIChpZiBhdmFpbGFibGUpLlxuXHQgKiBAcGFyYW0gd2l0aExvY2FsaXphdGlvbkZhbGxiYWNrXG5cdCAqICAgICAgICAgICAgV2hlbiB0cnVlIGxvY2FsaXphdGlvbiB3aWxsIGZhbGxiYWNrIHRvIG1vcmUgZ2VuZXJhbCBsb2NhbGVzIGlmIHRoZSBzcGVjaWZpZWQgbG9jYWxlIGlzIG5vdCBmb3VuZC5cblx0ICogQHJldHVybiB0aGUgRGF0YU9iamVjdHMgb3IgYW4gZW1wdHkgbWFwIGlmIG5vIHN1Y2ggdmFyaWFibGVzIGFyZSBmb3VuZC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBpcyBmb3VuZCBmb3IgdGhlIGdpdmVuIHRhc2tJZC5cblx0ICovXG5cdHB1YmxpYyBnZXREYXRhT2JqZWN0cyh0YXNrSWQ6IHN0cmluZywgZGF0YU9iamVjdE5hbWVzPzogc3RyaW5nW10sIGxvY2FsZT86IHN0cmluZywgd2l0aExvY2FsaXphdGlvbkZhbGxiYWNrPzogYm9vbGVhbik6IE1hcDxzdHJpbmcsIERhdGFPYmplY3Q+IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwoZGF0YU9iamVjdE5hbWVzKSAmJiB0aGlzLmlzTm90TnVsbChsb2NhbGUpICYmIHRoaXMuaXNOb3ROdWxsKHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjaykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3RzKHRhc2tJZCwgZGF0YU9iamVjdE5hbWVzLCBsb2NhbGUsIHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjayk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbChkYXRhT2JqZWN0TmFtZXMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXREYXRhT2JqZWN0cyh0YXNrSWQsIGRhdGFPYmplY3ROYW1lcyk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzTm90TnVsbChsb2NhbGUpICYmIHRoaXMuaXNOb3ROdWxsKHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjaykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3RzKHRhc2tJZCwgbG9jYWxlLCB3aXRoTG9jYWxpemF0aW9uRmFsbGJhY2spO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXREYXRhT2JqZWN0cyh0YXNrSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgRGF0YU9iamVjdC4gU2VhcmNoaW5nIGZvciB0aGUgRGF0YU9iamVjdCBpcyBkb25lIGluIGFsbCBzY29wZXMgdGhhdCBhcmUgdmlzaWJsZSB0byB0aGUgZ2l2ZW4gdGFzayAoaW5jbHVkaW5nIHBhcmVudCBzY29wZXMpLiBSZXR1cm5zIG51bGwgd2hlbiBubyBEYXRhT2JqZWN0IHZhbHVlIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuXG5cdCAqIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB0YXNrSWRcblx0ICogICAgICAgICAgICBpZCBvZiB0YXNrLCBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIGRhdGFPYmplY3Rcblx0ICogICAgICAgICAgICBuYW1lIG9mIERhdGFPYmplY3QsIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gbG9jYWxlXG5cdCAqICAgICAgICAgICAgbG9jYWxlIHRoZSBEYXRhT2JqZWN0IG5hbWUgYW5kIGRlc2NyaXB0aW9uIHNob3VsZCBiZSByZXR1cm5lZCBpbiAoaWYgYXZhaWxhYmxlKS5cblx0ICogQHBhcmFtIHdpdGhMb2NhbGl6YXRpb25GYWxsYmFja1xuXHQgKiAgICAgICAgICAgIFdoZW4gdHJ1ZSBsb2NhbGl6YXRpb24gd2lsbCBmYWxsYmFjayB0byBtb3JlIGdlbmVyYWwgbG9jYWxlcyBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgbG9jYWxlIG9mIHRoZSBKVk0gaWYgdGhlIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLlxuXHQgKiBAcmV0dXJuIHRoZSBEYXRhT2JqZWN0IG9yIG51bGwgaWYgdGhlIHZhcmlhYmxlIGlzIHVuZGVmaW5lZC5cblx0ICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIHdoZW4gbm8gdGFzayBpcyBmb3VuZCBmb3IgdGhlIGdpdmVuIHRhc2tJZC5cblx0ICovXG5cdHB1YmxpYyBnZXREYXRhT2JqZWN0KHRhc2tJZDogc3RyaW5nLCBkYXRhT2JqZWN0OiBzdHJpbmcsIGxvY2FsZT86IHN0cmluZywgd2l0aExvY2FsaXphdGlvbkZhbGxiYWNrPzogYm9vbGVhbik6IERhdGFPYmplY3Qge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbChsb2NhbGUpICYmIHRoaXMuaXNOb3ROdWxsKHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjaykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3QodGFza0lkLCBkYXRhT2JqZWN0LCBsb2NhbGUsIHdpdGhMb2NhbGl6YXRpb25GYWxsYmFjayk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldERhdGFPYmplY3QodGFza0lkLCBkYXRhT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKiogQWRkIGEgY29tbWVudCB0byBhIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UuICovXG5cdHB1YmxpYyBhZGRDb21tZW50KHRhc2tJZDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBDb21tZW50IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodHlwZSkpIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmFkZENvbW1lbnQodGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgdHlwZSwgbWVzc2FnZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmFkZENvbW1lbnQodGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgbWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFVwZGF0ZSBhIGNvbW1lbnQgdG8gYSB0YXNrIGFuZC9vciBwcm9jZXNzIGluc3RhbmNlLiAqL1xuXHRwdWJsaWMgc2F2ZUNvbW1lbnQoY29tbWVudDogQ29tbWVudCk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc2F2ZUNvbW1lbnQoY29tbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBpbmRpdmlkdWFsIGNvbW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQuIFJldHVybnMgbnVsbCBpZiBubyBjb21tZW50IGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBpZC5cblx0ICovXG5cdHB1YmxpYyBnZXRDb21tZW50KGNvbW1lbnRJZDogc3RyaW5nKTogQ29tbWVudCB7XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0Q29tbWVudChjb21tZW50SWQpO1xuXHR9XG5cblx0LyoqIFJlbW92ZXMgYWxsIGNvbW1lbnRzIGZyb20gdGhlIHByb3ZpZGVkIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UgKi9cblx0cHVibGljIGRlbGV0ZUNvbW1lbnRzKHRhc2tJZDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVDb21tZW50cyh0YXNrSWQsIHByb2Nlc3NJbnN0YW5jZUlkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFuIGluZGl2aWR1YWwgY29tbWVudCB3aXRoIHRoZSBnaXZlbiBpZC5cblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICB3aGVuIG5vIGNvbW1lbnQgZXhpc3RzIHdpdGggdGhlIGdpdmVuIGlkLlxuXHQgKi9cblx0cHVibGljIGRlbGV0ZUNvbW1lbnQoY29tbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2tTZXJ2aWNlLmRlbGV0ZUNvbW1lbnQoY29tbWVudElkKTtcblx0fVxuXG5cdC8qKiBUaGUgY29tbWVudHMgcmVsYXRlZCB0byB0aGUgZ2l2ZW4gdGFzay4gKi9cblx0cHVibGljIGdldFRhc2tDb21tZW50cyh0YXNrSWQ6IHN0cmluZywgdHlwZT86IHN0cmluZyk6IENvbW1lbnRbXSB7XG5cdFx0aWYgKHRoaXMuaXNOb3ROdWxsKHR5cGUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRUYXNrQ29tbWVudHModGFza0lkLCB0eXBlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0VGFza0NvbW1lbnRzKHRhc2tJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIEFsbCBjb21tZW50cyBvZiBhIGdpdmVuIHR5cGUuICovXG5cdHB1YmxpYyBnZXRDb21tZW50c0J5VHlwZSh0eXBlOiBzdHJpbmcpOiBDb21tZW50W10ge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldENvbW1lbnRzQnlUeXBlKHR5cGUpO1xuXHR9XG5cblx0LyoqIFRoZSBhbGwgZXZlbnRzIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIHRhc2suICovXG5cdHB1YmxpYyBnZXRUYXNrRXZlbnRzKHRhc2tJZDogc3RyaW5nKTogVGFza0V2ZW50W10ge1xuXHRcdHJldHVybiB0aGlzLnRhc2tTZXJ2aWNlLmdldFRhc2tFdmVudHModGFza0lkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFuIGluZGl2aWR1YWwgZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gaWQuIFJldHVybnMgbnVsbCBpZiBubyBldmVudCBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gaWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnQoZXZlbnRJZDogc3RyaW5nKTogVGFza0V2ZW50IHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRFdmVudChldmVudElkKTtcblx0fVxuXG5cdC8qKiBUaGUgY29tbWVudHMgcmVsYXRlZCB0byB0aGUgZ2l2ZW4gcHJvY2VzcyBpbnN0YW5jZS4gKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUNvbW1lbnRzKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBDb21tZW50W10ge1xuXHRcdGlmICh0aGlzLmlzTm90TnVsbCh0eXBlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0UHJvY2Vzc0luc3RhbmNlQ29tbWVudHMocHJvY2Vzc0luc3RhbmNlSWQsIHR5cGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRQcm9jZXNzSW5zdGFuY2VDb21tZW50cyhwcm9jZXNzSW5zdGFuY2VJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIG5ldyBhdHRhY2htZW50IHRvIGEgdGFzayBhbmQvb3IgYSBwcm9jZXNzIGluc3RhbmNlIGFuZCB1c2UgYW4gaW5wdXQgc3RyZWFtIHRvIHByb3ZpZGUgdGhlIGNvbnRlbnRcblx0ICovXG5cdHB1YmxpYyBjcmVhdGVBdHRhY2htZW50KGF0dGFjaG1lbnRUeXBlOiBzdHJpbmcsIHRhc2tJZDogc3RyaW5nLCBwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBhdHRhY2htZW50TmFtZTogc3RyaW5nLCBhdHRhY2htZW50RGVzY3JpcHRpb246IHN0cmluZywgY29udGVudD86IGFueVtdLCB1cmw/OiBzdHJpbmcpOiBBdHRhY2htZW50IHtcblx0XHRpZiAodGhpcy5pc05vdE51bGwodXJsKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50VHlwZSwgdGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgYXR0YWNobWVudE5hbWUsIGF0dGFjaG1lbnREZXNjcmlwdGlvbiwgdXJsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50VHlwZSwgdGFza0lkLCBwcm9jZXNzSW5zdGFuY2VJZCwgYXR0YWNobWVudE5hbWUsIGF0dGFjaG1lbnREZXNjcmlwdGlvbiwgU3RyZWFtcy5jcmVhdGVCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50KSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFVwZGF0ZSB0aGUgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgYW4gYXR0YWNobWVudCAqL1xuXHRwdWJsaWMgc2F2ZUF0dGFjaG1lbnQoYXR0YWNobWVudDogQXR0YWNobWVudCk6IHZvaWQge1xuXHRcdHRoaXMudGFza1NlcnZpY2Uuc2F2ZUF0dGFjaG1lbnQoYXR0YWNobWVudCk7XG5cdH1cblxuXHQvKiogUmV0cmlldmUgYSBwYXJ0aWN1bGFyIGF0dGFjaG1lbnQgKi9cblx0cHVibGljIGdldEF0dGFjaG1lbnQoYXR0YWNobWVudElkOiBzdHJpbmcpOiBBdHRhY2htZW50IHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRBdHRhY2htZW50KGF0dGFjaG1lbnRJZCk7XG5cdH1cblxuXHQvKiogUmV0cmlldmUgc3RyZWFtIGNvbnRlbnQgb2YgYSBwYXJ0aWN1bGFyIGF0dGFjaG1lbnQgKi9cblx0cHVibGljIGdldEF0dGFjaG1lbnRDb250ZW50KGF0dGFjaG1lbnRJZDogc3RyaW5nKTogYW55W10ge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSB0aGlzLnRhc2tTZXJ2aWNlLmdldEF0dGFjaG1lbnRDb250ZW50KGF0dGFjaG1lbnRJZCk7XG5cdFx0Y29uc3QgYmFvcyA9IFN0cmVhbXMuY3JlYXRlQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7XG5cdFx0U3RyZWFtcy5jb3B5TGFyZ2UoY29udGVudCwgYmFvcyk7XG5cdFx0cmV0dXJuIGJhb3MuZ2V0Qnl0ZXMoKVxuXHR9O1xuXG5cdC8qKiBUaGUgbGlzdCBvZiBhdHRhY2htZW50cyBhc3NvY2lhdGVkIHRvIGEgdGFzayAqL1xuXHRwdWJsaWMgZ2V0VGFza0F0dGFjaG1lbnRzKHRhc2tJZDogc3RyaW5nKTogQXR0YWNobWVudFtdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRUYXNrQXR0YWNobWVudHModGFza0lkKTtcblx0fVxuXG5cdC8qKiBUaGUgbGlzdCBvZiBhdHRhY2htZW50cyBhc3NvY2lhdGVkIHRvIGEgcHJvY2VzcyBpbnN0YW5jZSAqL1xuXHRwdWJsaWMgZ2V0UHJvY2Vzc0luc3RhbmNlQXR0YWNobWVudHMocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IEF0dGFjaG1lbnRbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFza1NlcnZpY2UuZ2V0UHJvY2Vzc0luc3RhbmNlQXR0YWNobWVudHMocHJvY2Vzc0luc3RhbmNlSWQpO1xuXHR9XG5cblx0LyoqIERlbGV0ZSBhbiBhdHRhY2htZW50ICovXG5cdHB1YmxpYyBkZWxldGVBdHRhY2htZW50KGF0dGFjaG1lbnRJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrU2VydmljZS5kZWxldGVBdHRhY2htZW50KGF0dGFjaG1lbnRJZCk7XG5cdH1cblxuXHQvKiogVGhlIGxpc3Qgb2Ygc3VidGFza3MgZm9yIHRoaXMgcGFyZW50IHRhc2sgKi9cblx0cHVibGljIGdldFN1YlRhc2tzKHBhcmVudFRhc2tJZDogc3RyaW5nKTogVGFza1tdIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrU2VydmljZS5nZXRTdWJUYXNrcyhwYXJlbnRUYXNrSWQpO1xuXHR9XG5cblx0cHJpdmF0ZSBpc05vdE51bGwocHJvcGVydHk6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBwcm9wZXJ0eSAhPT0gbnVsbCAmJiBwcm9wZXJ0eSAhPT0gdW5kZWZpbmVkO1xuXHR9XG59XG5cbmNsYXNzIFRhc2tEYXRhIHtcblxuXHRwcml2YXRlIGRhdGE6IGFueTtcblxuXHRjb25zdHJ1Y3RvcihkYXRhOiBhbnkpIHtcblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXHR9XG5cblx0cHVibGljIGdldElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmV2aXNpb24oKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnJldmlzaW9uO1xuXHR9XG5cblx0cHVibGljIGdldE93bmVyKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5vd25lciA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QXNzaWduZWVVcGRhdGVkQ291bnQoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFzc2lnbmVlVXBkYXRlZENvdW50O1xuXHR9XG5cblx0cHVibGljIGdldE9yaWdpbmFsQXNzaWduZWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLm9yaWdpbmFsQXNzaWduZWUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldEFzc2lnbmVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hc3NpZ25lZSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RGVsZWdhdGlvblN0YXRlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5kZWxlZ2F0aW9uU3RhdGUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFBhcmVudFRhc2tJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEucGFyZW50VGFza0lkID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5uYW1lID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRMb2NhbGl6ZWROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5sb2NhbGl6ZWROYW1lID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuZGVzY3JpcHRpb24gPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsaXplZERlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5sb2NhbGl6ZWREZXNjcmlwdGlvbiA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJpb3JpdHkoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnByaW9yaXR5O1xuXHR9XG5cblx0cHVibGljIGdldENyZWF0ZVRpbWUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jcmVhdGVUaW1lID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXREdWVEYXRlKCk6IERhdGUgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuZHVlRGF0ZSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U3VzcGVuc2lvblN0YXRlKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zdXNwZW5zaW9uU3RhdGUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldENhdGVnb3J5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jYXRlZ29yeSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgaXNJZGVudGl0eUxpbmtzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pc0lkZW50aXR5TGlua3NJbml0aWFsaXplZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRFeGVjdXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuZXhlY3V0aW9uSWQgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5wcm9jZXNzSW5zdGFuY2VJZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvY2Vzc0RlZmluaXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEucHJvY2Vzc0RlZmluaXRpb25JZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2NvcGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuc2NvcGVJZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U3ViU2NvcGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmRhdGEuc3ViU2NvcGVJZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2NvcGVUeXBlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zY29wZVR5cGUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFNjb3BlRGVmaW5pdGlvbklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5zY29wZURlZmluaXRpb25JZCA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VGFza0RlZmluaXRpb25LZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnRhc2tEZWZpbml0aW9uS2V5ID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRGb3JtS2V5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5mb3JtS2V5ID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBpc0RlbGV0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pc0RlbGV0ZWQ7XG5cdH1cblxuXHRwdWJsaWMgaXNDYW5jZWxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmlzQ2FuY2VsZWQ7XG5cdH1cblxuXHRwdWJsaWMgaXNDb3VudEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pc0NvdW50RW5hYmxlZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUNvdW50KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS52YXJpYWJsZUNvdW50O1xuXHR9XG5cblx0cHVibGljIGdldElkZW50aXR5TGlua0NvdW50KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5pZGVudGl0eUxpbmtDb3VudDtcblx0fVxuXG5cdHB1YmxpYyBnZXRDbGFpbVRpbWUoKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5jbGFpbVRpbWUgPz8gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldFRlbmFudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS50ZW5hbnRJZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRFdmVudE5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmV2ZW50TmFtZSA/PyB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RXZlbnRIYW5kbGVySWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmV2ZW50SGFuZGxlcklkID8/IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBpc0ZvcmNlZFVwZGF0ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5kYXRhLmZvcmNlZFVwZGF0ZTtcblx0fVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgb25lIHRhc2sgZm9yIGEgaHVtYW4gdXNlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrIGV4dGVuZHMgVGFza0luZm8ge1xuXG5cdC8qKiBOYW1lIG9yIHRpdGxlIG9mIHRoZSB0YXNrLiAqL1xuXHRzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgYW4gb3B0aW9uYWwgbG9jYWxpemVkIG5hbWUgZm9yIHRoZSB0YXNrLiAqL1xuXHRzZXRMb2NhbGl6ZWROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIENoYW5nZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2sgKi9cblx0c2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgYW4gb3B0aW9uYWwgbG9jYWxpemVkIGRlc2NyaXB0aW9uIGZvciB0aGUgdGFzay4gKi9cblx0c2V0TG9jYWxpemVkRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIFNldHMgdGhlIGluZGljYXRpb24gb2YgaG93IGltcG9ydGFudC91cmdlbnQgdGhpcyB0YXNrIGlzICovXG5cdHNldFByaW9yaXR5KHByaW9yaXR5OiBudW1iZXIpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciBpZCBvZiB0aGUgcGVyc29uIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgdGFzay5cblx0ICovXG5cdHNldE93bmVyKG93bmVyOiBzdHJpbmcpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciBpZCBvZiB0aGUgcGVyc29uIHRvIHdoaWNoIHRoaXMgdGFzayBpcyBkZWxlZ2F0ZWQuXG5cdCAqL1xuXHRzZXRBc3NpZ25lZShhc3NpZ25lZTogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogVGhlIGN1cnJlbnQge0BsaW5rIERlbGVnYXRpb25TdGF0ZX0gZm9yIHRoaXMgdGFzay4gKi9cblx0Z2V0RGVsZWdhdGlvblN0YXRlKCk6IERlbGVnYXRpb25TdGF0ZTtcblxuXHQvKiogVGhlIGN1cnJlbnQge0BsaW5rIERlbGVnYXRpb25TdGF0ZX0gZm9yIHRoaXMgdGFzay4gKi9cblx0c2V0RGVsZWdhdGlvblN0YXRlKGRlbGVnYXRpb25TdGF0ZTogRGVsZWdhdGlvblN0YXRlKTogdm9pZDtcblxuXHQvKiogQ2hhbmdlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrLiAqL1xuXHRzZXREdWVEYXRlKGR1ZURhdGU6IERhdGUpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGNhdGVnb3J5IG9mIHRoZSB0YXNrLiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZpZWxkIGFuZCBhbGxvd3MgdG8gJ3RhZycgdGFza3MgYXMgYmVsb25naW5nIHRvIGEgY2VydGFpbiBjYXRlZ29yeS5cblx0ICovXG5cdHNldENhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiB2b2lkO1xuXG5cdC8qKiB0aGUgcGFyZW50IHRhc2sgZm9yIHdoaWNoIHRoaXMgdGFzayBpcyBhIHN1YnRhc2sgKi9cblx0c2V0UGFyZW50VGFza0lkKHBhcmVudFRhc2tJZDogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogQ2hhbmdlIHRoZSB0ZW5hbnRJZCBvZiB0aGUgdGFzayAqL1xuXHRzZXRUZW5hbnRJZCh0ZW5hbnRJZDogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogQ2hhbmdlIHRoZSBmb3JtIGtleSBvZiB0aGUgdGFzayAqL1xuXHRzZXRGb3JtS2V5KGZvcm1LZXk6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdGFzayBpcyBzdXNwZW5kZWQgb3Igbm90LiAqL1xuXHRpc1N1c3BlbmRlZCgpOiBib29sZWFuO1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0luZm8ge1xuXG5cdC8qKiBEQiBpZCBvZiB0aGUgdGFzay4gKi9cblx0Z2V0SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBOYW1lIG9yIHRpdGxlIG9mIHRoZSB0YXNrLlxuXHQgKi9cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEZyZWUgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgdGFzay5cblx0ICovXG5cdGdldERlc2NyaXB0aW9uKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXNcblx0ICovXG5cdGdldFByaW9yaXR5KCk6IG51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIHRhc2suXG5cdCAqL1xuXHRnZXRPd25lcigpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gdG8gd2hpY2ggdGhpcyB0YXNrIGlzIGRlbGVnYXRlZC5cblx0ICovXG5cdGdldEFzc2lnbmVlKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGluc3RhbmNlIG9yIG51bGwgaWYgaXQgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHBhdGggb2YgZXhlY3V0aW9uIG9yIG51bGwgaWYgaXQgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0Z2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHRhc2sgZGVmaW5pdGlvbiBvciBudWxsIGlmIGl0IGlzIG5vdCByZWxhdGVkIHRvIGFueSB0YXNrIGRlZmluaXRpb24uXG5cdCAqL1xuXHRnZXRUYXNrRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGRlZmluaXRpb24gb3IgbnVsbCBpZiBpdCBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3MuXG5cdCAqL1xuXHRnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIGEgc2NvcGUgaWRlbnRpZmllciBvciBudWxsIGlmIG5vbmUgaXMgc2V0IChlLmcuIGZvciBicG1uIHByb2Nlc3MgdGFzayBpdCBpcyBudWxsKVxuXHQgKi9cblx0Z2V0U2NvcGVJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFJlZmVyZW5jZSB0byBhIHN1YiBzY29wZSBpZGVudGlmaWVyIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQgKGUuZy4gZm9yIGJwbW4gcHJvY2VzcyB0YXNrIGl0IGlzIG51bGwpXG5cdCAqL1xuXHRnZXRTdWJTY29wZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIGEgc2NvcGUgdHlwZSBvciBudWxsIGlmIG5vbmUgaXMgc2V0IChlLmcuIGZvciBicG1uIHByb2Nlc3MgdGFzayBpdCBpcyBudWxsKVxuXHQgKi9cblx0Z2V0U2NvcGVUeXBlKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIGEgc2NvcGUgZGVmaW5pdGlvbiBpZGVudGlmaWVyIG9yIG51bGwgaWYgbm9uZSBpcyBzZXQgKGUuZy4gZm9yIGJwbW4gcHJvY2VzcyB0YXNrIGl0IGlzIG51bGwpXG5cdCAqL1xuXHRnZXRTY29wZURlZmluaXRpb25JZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIElmIHRoaXMgdGFzayBydW5zIGluIHRoZSBjb250ZXh0IG9mIGEgY2FzZSBhbmQgc3RhZ2UsIHRoaXMgbWV0aG9kIHJldHVybnMgaXQncyBjbG9zZXN0IHBhcmVudCBzdGFnZSBpbnN0YW5jZSBpZCAodGhlIHN0YWdlIHBsYW4gaXRlbSBpbnN0YW5jZSBpZCB0byBiZVxuXHQgKiBwcmVjaXNlKS4gRXZlbiBpZiB0aGUgZGlyZWN0IHBhcmVudCBvZiB0aGUgdGFzayBpcyBhIHByb2Nlc3Mgd2hpY2ggaXRzZWxmIG1pZ2h0IGhhdmUgYmVlbiBjcmVhdGVkIG91dCBvZiBhIHByb2Nlc3MgdGFzayBvZiBhIGNhc2UsIGl0cyBzdGFnZSBpbnN0YW5jZVxuXHQgKiBpcyByZWZsZWN0ZWQgaW4gdGhlIHRhc2suXG5cdCAqXG5cdCAqIEByZXR1cm4gdGhlIHN0YWdlIGluc3RhbmNlIGlkIHRoaXMgdGFzayBiZWxvbmdzIHRvIG9yIG51bGwsIGlmIHRoaXMgdGFzayBpcyBub3QgcGFydCBvZiBhIGNhc2UgYXQgYWxsIG9yIGlzIG5vdCBhIGNoaWxkIGVsZW1lbnQgb2YgYSBzdGFnZVxuXHQgKi9cblx0Z2V0UHJvcGFnYXRlZFN0YWdlSW5zdGFuY2VJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSBzdGF0ZSBvZiB0aGlzIHRhc2tcblx0ICovXG5cdGdldFN0YXRlKCk6IHN0cmluZztcblxuXHQvKiogVGhlIGRhdGUvdGltZSB3aGVuIHRoaXMgdGFzayB3YXMgY3JlYXRlZCAqL1xuXHRnZXRDcmVhdGVUaW1lKCk6IERhdGU7XG5cblx0LyoqIFRoZSBkYXRlL3RpbWUgd2hlbiB0aGlzIHRhc2sgd2FzIHB1dCBpbiBwcm9ncmVzcyAqL1xuXHRnZXRJblByb2dyZXNzU3RhcnRUaW1lKCk6IERhdGU7XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIHJlZmVyZW5jZSB0aGF0IHB1dCB0aGlzIHRhc2sgaW4gcHJvZ3Jlc3Ncblx0ICovXG5cdGdldEluUHJvZ3Jlc3NTdGFydGVkQnkoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgY2xhaW0gdGltZSBvZiB0aGlzIHRhc2tcblx0ICovXG5cdGdldENsYWltVGltZSgpOiBEYXRlO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBjbGFpbWVkIHRoaXMgdGFza1xuXHQgKi9cblx0Z2V0Q2xhaW1lZEJ5KCk6IFN0cmluZztcblxuXHQvKipcblx0ICogVGhlIHN1c3BlbmRlZCB0aW1lIG9mIHRoaXMgdGFza1xuXHQgKi9cblx0Z2V0U3VzcGVuZGVkVGltZSgpOiBEYXRlO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhpcyB0YXNrXG5cdCAqL1xuXHRnZXRTdXNwZW5kZWRCeSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSBpZCBvZiB0aGUgYWN0aXZpdHkgaW4gdGhlIHByb2Nlc3MgZGVmaW5pbmcgdGhpcyB0YXNrIG9yIG51bGwgaWYgdGhpcyBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3Ncblx0ICovXG5cdGdldFRhc2tEZWZpbml0aW9uS2V5KCk6IHN0cmluZztcblxuXHQvKipcblx0ICogSW4gcHJvZ3Jlc3Mgc3RhcnQgZHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRnZXRJblByb2dyZXNzU3RhcnREdWVEYXRlKCk6IERhdGU7XG5cblx0LyoqXG5cdCAqIER1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKi9cblx0Z2V0RHVlRGF0ZSgpOiBEYXRlO1xuXG5cdC8qKlxuXHQgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKi9cblx0Z2V0Q2F0ZWdvcnkoKTsgc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgcGFyZW50IHRhc2sgZm9yIHdoaWNoIHRoaXMgdGFzayBpcyBhIHN1YnRhc2tcblx0ICovXG5cdGdldFBhcmVudFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGlzIHRhc2tcblx0ICovXG5cdGdldFRlbmFudElkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIGZvcm0ga2V5IGZvciB0aGUgdXNlciB0YXNrXG5cdCAqL1xuXHRnZXRGb3JtS2V5KCk6IHN0cmluZztcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbG9jYWwgdGFzayB2YXJpYWJsZXMgaWYgcmVxdWVzdGVkIGluIHRoZSB0YXNrIHF1ZXJ5XG5cdCAqL1xuXHRnZXRUYXNrTG9jYWxWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgT2JqZWN0PjtcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcHJvY2VzcyB2YXJpYWJsZXMgaWYgcmVxdWVzdGVkIGluIHRoZSB0YXNrIHF1ZXJ5XG5cdCAqL1xuXHRnZXRQcm9jZXNzVmFyaWFibGVzKCk6IE1hcDxzdHJpbmcsIE9iamVjdD47XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGNhc2UgdmFyaWFibGVzIGlmIHJlcXVlc3RlZCBpbiB0aGUgdGFzayBxdWVyeVxuXHQgKi9cblx0Z2V0Q2FzZVZhcmlhYmxlcygpOiBNYXA8c3RyaW5nLCBPYmplY3Q+O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBpZGVudGl0eSBsaW5rcy5cblx0ICovXG5cdGdldElkZW50aXR5TGlua3MoKTogSWRlbnRpdHlMaW5rSW5mb1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TGlua0luZm8ge1xuXHRnZXRUeXBlKCk6IHN0cmluZztcblxuXHRnZXRVc2VySWQoKTogc3RyaW5nO1xuXG5cdGdldEdyb3VwSWQoKTogc3RyaW5nO1xuXG5cdGdldFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG5cdGdldFNjb3BlSWQoKTogc3RyaW5nO1xuXG5cdGdldFN1YlNjb3BlSWQoKTogc3RyaW5nO1xuXG5cdGdldFNjb3BlVHlwZSgpOiBzdHJpbmc7XG5cblx0Z2V0U2NvcGVEZWZpbml0aW9uSWQoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5TGluayBleHRlbmRzIElkZW50aXR5TGlua0luZm8ge1xuXG5cdC8qKlxuXHQgKiBUaGUgcHJvY2VzcyBkZWZpbml0aW9uIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlkZW50aXR5IGxpbmsuXG5cdCAqL1xuXHRnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxufVxuXG5leHBvcnQgZW51bSBEZWxlZ2F0aW9uU3RhdGUge1xuXG5cdC8qKlxuXHQgKiBUaGUgb3duZXIgZGVsZWdhdGVkIHRoZSB0YXNrIGFuZCB3YW50cyB0byByZXZpZXcgdGhlIHJlc3VsdCBhZnRlciB0aGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLiBXaGVuIHRoZSBhc3NpZ25lZSBjb21wbGV0ZXMgdGhlIHRhc2ssIHRoZSB0YXNrIGlzIG1hcmtlZCBhcyB7QGxpbmsgI1JFU09MVkVEfSBhbmQgc2VudCBiYWNrXG5cdCAqIHRvIHRoZSBvd25lci4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoZSBvd25lciBpcyBzZXQgYXMgdGhlIGFzc2lnbmVlIHNvIHRoYXQgdGhlIG93bmVyIGdldHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8uXG5cdCAqL1xuXHRQRU5ESU5HLFxuXG5cdC8qKlxuXHQgKiBUaGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLCB0aGUgYXNzaWduZWUgd2FzIHNldCB0byB0aGUgb3duZXIgYWdhaW4gYW5kIHRoZSBvd25lciBub3cgZmluZHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8gbGlzdCBmb3IgcmV2aWV3LiBUaGUgb3duZXIgbm93IGlzIGFibGUgdG8gY29tcGxldGUgdGhlIHRhc2suXG5cdCAqL1xuXHRSRVNPTFZFRFxufVxuXG4vKipcbiAqIFdyYXBzIHtAbGluayBUYXNrSW5mb30gdG8gdGhlIGJ1aWxkZXIuXG4gKiBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNrQnVpbGRlciB7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGFzayBpbnN0YW5jZSBhY2NvcmRpbmcgdmFsdWVzIHNldCBpbiB0aGUgYnVpbGRlclxuXHQgKiBcblx0ICogQHJldHVybiB0YXNrIGluc3RhbmNlXG5cdCAqL1xuXHRjcmVhdGUoKTogVGFzaztcblxuXHQvKipcblx0ICogREIgaWQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRpZChpZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldElkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogTmFtZSBvciB0aXRsZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdG5hbWUobmFtZTogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldE5hbWUoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBGcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRkZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldERlc2NyaXB0aW9uKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXNcblx0ICovXG5cdHByaW9yaXR5KHByaW9yaXR5OiBudW1iZXIpOiBUYXNrQnVpbGRlcjtcblx0Z2V0UHJpb3JpdHkoKTogbnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgdXNlcklkIG9mIHRoZSBwZXJzb24gdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhpcyB0YXNrLlxuXHQgKi9cblx0b3duZXIob3duZXJJZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldE93bmVyKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIHVzZXJJZCBvZiB0aGUgcGVyc29uIHRvIHdoaWNoIHRoaXMgdGFzayBpcyBkZWxlZ2F0ZWQuXG5cdCAqL1xuXHRhc3NpZ25lZShhc3NpZ25lSWQ6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRBc3NpZ25lZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIENoYW5nZSBkdWUgZGF0ZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdGR1ZURhdGUoZHVlRGF0ZTogRGF0ZSk6IFRhc2tCdWlsZGVyO1xuXHRnZXREdWVEYXRlKCk6IERhdGU7XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKi9cblx0Y2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRDYXRlZ29yeSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIHRoZSBwYXJlbnQgdGFzayBmb3Igd2hpY2ggdGhpcyB0YXNrIGlzIGEgc3VidGFza1xuXHQgKi9cblx0cGFyZW50VGFza0lkKHBhcmVudFRhc2tJZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldFBhcmVudFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgdGVuYW50SWQgb2YgdGhlIHRhc2tcblx0ICovXG5cdHRlbmFudElkKHRlbmFudElkOiBzdHJpbmcpOiBUYXNrQnVpbGRlcjtcblx0Z2V0VGVuYW50SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGZvcm0ga2V5IG9mIHRoZSB0YXNrXG5cdCAqL1xuXHRmb3JtS2V5KGZvcm1LZXk6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRGb3JtS2V5KCk6IHN0cmluZztcblxuXHQvKipcblx0ICogdGFzayBkZWZpbml0aW9uIGlkIHRvIGNyZWF0ZSB0YXNrIGZyb21cblx0ICovXG5cdHRhc2tEZWZpbml0aW9uSWQodGFza0RlZmluaXRpb25JZDogc3RyaW5nKTogVGFza0J1aWxkZXI7XG5cdGdldFRhc2tEZWZpbml0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiB0YXNrIGRlZmluaXRpb24ga2V5IHRvIGNyZWF0ZSB0YXNrIGZyb21cblx0ICovXG5cdHRhc2tEZWZpbml0aW9uS2V5KHRhc2tEZWZpbml0aW9uS2V5OiBzdHJpbmcpOiBUYXNrQnVpbGRlcjtcblx0Z2V0VGFza0RlZmluaXRpb25LZXkoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBhZGQgaWRlbnRpdHkgbGlua3MgdG8gdGhlIHRhc2tcblx0ICovXG5cdGlkZW50aXR5TGlua3MoaWRlbnRpdHlMaW5rczogU2V0PElkZW50aXR5TGlua0luZm8+KTogVGFza0J1aWxkZXI7XG5cdGdldElkZW50aXR5TGlua3MoKTogU2V0PElkZW50aXR5TGlua0luZm8+O1xuXG5cdC8qKlxuXHQgKiBhZGQgdGFzayBzY29wZUlkXG5cdCAqL1xuXHRzY29wZUlkKHNjb3BlSWQ6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRTY29wZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQWRkIHNjb3BlIHR5cGVcblx0ICovXG5cdHNjb3BlVHlwZShzY29wZVR5cGU6IHN0cmluZyk6IFRhc2tCdWlsZGVyO1xuXHRnZXRTY29wZVR5cGUoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1JbmZvIHtcblxuXHRnZXRJZCgpOiBzdHJpbmc7XG5cblx0c2V0SWQoaWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG5cblx0c2V0TmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldERlc2NyaXB0aW9uKCk6IHN0cmluZztcblxuXHRzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZDtcblxuXHRnZXRLZXkoKTogc3RyaW5nO1xuXG5cdHNldEtleShrZXk6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0VmVyc2lvbigpOiBudW1iZXI7XG5cblx0c2V0VmVyc2lvbih2ZXJzaW9uOiBudW1iZXIpOiB2b2lkO1xuXG5cdGdldEZvcm1Nb2RlbCgpOiBhbnk7XG5cblx0c2V0Rm9ybU1vZGVsKGZvcm1Nb2RlbDogYW55KTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWx1ZUZpZWxkcyB7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlXG5cdCAqL1xuXHRnZXROYW1lKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgcHJvY2VzcyBpbnN0YW5jZSBpZCBvZiB0aGUgdmFyaWFibGVcblx0ICovXG5cdGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgZXhlY3V0aW9uIGlkIG9mIHRoZSB2YXJpYWJsZVxuXHQgKi9cblx0Z2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHRoZSBzY29wZSBpZCBvZiB0aGUgdmFyaWFibGVcblx0ICovXG5cdGdldFNjb3BlSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHRoZSBzdWIgc2NvcGUgaWQgb2YgdGhlIHZhcmlhYmxlXG5cdCAqL1xuXHRnZXRTdWJTY29wZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgc2NvcGUgdHlwZSBvZiB0aGUgdmFyaWFibGVcblx0ICovXG5cdGdldFNjb3BlVHlwZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIHRhc2sgaWQgb2YgdGhlIHZhcmlhYmxlXG5cdCAqL1xuXHRnZXRUYXNrSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBAcmV0dXJuIHRoZSBmaXJzdCB0ZXh0IHZhbHVlLCBpZiBhbnksIG9yIG51bGwuXG5cdCAqL1xuXHRnZXRUZXh0VmFsdWUoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBmaXJzdCB0ZXh0IHZhbHVlLiBBIHZhbHVlIG9mIG51bGwgaXMgYWxsb3dlZC5cblx0ICovXG5cdHNldFRleHRWYWx1ZSh0ZXh0VmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIHNlY29uZCB0ZXh0IHZhbHVlLCBpZiBhbnksIG9yIG51bGwuXG5cdCAqL1xuXHRnZXRUZXh0VmFsdWUyKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogU2V0cyBzZWNvbmQgdGV4dCB2YWx1ZS4gQSB2YWx1ZSBvZiBudWxsIGlzIGFsbG93ZWQuXG5cdCAqL1xuXHRzZXRUZXh0VmFsdWUyKHRleHRWYWx1ZTI6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEByZXR1cm4gdGhlIGxvbmcgdmFsdWUsIGlmIGFueSwgb3IgbnVsbC5cblx0ICovXG5cdGdldExvbmdWYWx1ZSgpOiBudW1iZXI7XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGxvbmcgdmFsdWUuIEEgdmFsdWUgb2YgbnVsbCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0c2V0TG9uZ1ZhbHVlKGxvbmdWYWx1ZTogbnVtYmVyKTogdm9pZDtcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgZG91YmxlIHZhbHVlLCBpZiBhbnksIG9yIG51bGwuXG5cdCAqL1xuXHRnZXREb3VibGVWYWx1ZSgpOiBudW1iZXI7XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGRvdWJsZSB2YWx1ZS4gQSB2YWx1ZSBvZiBudWxsIGlzIGFsbG93ZWQuXG5cdCAqL1xuXHRzZXREb3VibGVWYWx1ZShkb3VibGVWYWx1ZTogbnVtYmVyKTogdm9pZDtcblxuXHQvKipcblx0ICogQHJldHVybiB0aGUgYnl0ZSBhcnJheSB2YWx1ZSwgaWYgYW55LCBvciBudWxsLlxuXHQgKi9cblx0Z2V0Qnl0ZXMoKTogYW55W107XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGJ5dGUgYXJyYXkgdmFsdWUuIEEgdmFsdWUgb2YgbnVsbCBpcyBhbGxvd2VkLlxuXHQgKi9cblx0c2V0Qnl0ZXMoYnl0ZXM6IGFueVtdKTogdm9pZDtcblxuXHRnZXRDYWNoZWRWYWx1ZSgpOiBhbnk7XG5cblx0c2V0Q2FjaGVkVmFsdWUoY2FjaGVkVmFsdWU6IGFueSk6IHZvaWQ7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZUluc3RhbmNlIGV4dGVuZHMgVmFsdWVGaWVsZHMge1xuXG5cdGdldElkKCk6IHN0cmluZztcblxuXHRzZXRJZChpZDogc3RyaW5nKTogdm9pZDtcblxuXHRzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0RXhlY3V0aW9uSWQoZXhlY3V0aW9uSWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0UHJvY2Vzc0luc3RhbmNlSWQocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0UHJvY2Vzc0RlZmluaXRpb25JZChwcm9jZXNzRGVmaW5pdGlvbklkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTogc3RyaW5nO1xuXG5cdGdldFZhbHVlKCk6IGFueTtcblxuXHRzZXRWYWx1ZSh2YWx1ZTogYW55KTogdm9pZDtcblxuXHRnZXRUeXBlTmFtZSgpOiBzdHJpbmc7XG5cblx0c2V0VHlwZU5hbWUodHlwZU5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0aXNSZWFkT25seSgpOiBib29sZWFuO1xuXG5cdHNldFRhc2tJZCh0YXNrSWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0c2V0U2NvcGVJZChzY29wZUlkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdHNldFN1YlNjb3BlSWQoc3ViU2NvcGVJZDogc3RyaW5nKTogdm9pZDtcblxuXHRzZXRTY29wZVR5cGUoc2NvcGVUeXBlOiBzdHJpbmcpOiB2b2lkO1xuXG5cdHNldFNjb3BlRGVmaW5pdGlvbklkKHNjb3BlRGVmaW5pdGlvbklkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdGdldFNjb3BlRGVmaW5pdGlvbklkKCk6IHN0cmluZztcblxuXHRnZXRNZXRhSW5mbygpOiBzdHJpbmc7XG5cblx0c2V0TWV0YUluZm8obWV0YUluZm86IHN0cmluZyk6IHZvaWQ7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhT2JqZWN0IHtcblxuXHQvKipcblx0ICogVGhlIHVuaXF1ZSBpZCBvZiB0aGlzIERhdGEgT2JqZWN0LlxuXHQgKi9cblx0Z2V0SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgLyoqXG5cdCAqIFRoZSBpZCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0aGF0IHRoaXMgRGF0YSBPYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKi9cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgaWQgb2YgdGhlIGV4ZWN1dGlvbiBpbiB3aGljaCB0aGlzIERhdGEgT2JqZWN0IHJlc2lkZXMuIEEgRGF0YU9iamVjdCBvbmx5IHJlc2lkZXMgb24gYSBwcm9jZXNzIGluc3RhbmNlXG5cdCAqIGV4ZWN1dGlvbiBvciBhIHN1YnByb2Nlc3MgZXhlY3V0aW9uLlxuXHQgKi9cblx0Z2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBOYW1lIG9mIHRoZSBEYXRhT2JqZWN0LlxuXHQgKi9cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIExvY2FsaXplZCBOYW1lIG9mIHRoZSBEYXRhT2JqZWN0LlxuXHQgKi9cblx0Z2V0TG9jYWxpemVkTmFtZSgpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIERlc2NyaXB0aW9uIG9mIHRoZSBEYXRhT2JqZWN0LlxuXHQgKi9cblx0Z2V0RGVzY3JpcHRpb24oKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBWYWx1ZSBvZiB0aGUgRGF0YU9iamVjdC5cblx0ICovXG5cdGdldFZhbHVlKCk6IGFueTtcblxuXHQvKipcblx0ICogVHlwZSBvZiB0aGUgRGF0YU9iamVjdC5cblx0ICovXG5cdGdldFR5cGUoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBUaGUgaWQgb2YgdGhlIGZsb3cgZWxlbWVudCBpbiB0aGUgcHJvY2VzcyBkZWZpbmluZyB0aGlzIGRhdGEgb2JqZWN0LlxuXHQgKi9cblx0Z2V0RGF0YU9iamVjdERlZmluaXRpb25LZXkoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1lbnQge1xuXG5cdC8qKiB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjb21tZW50ICovXG5cdGdldElkKCk6IHN0cmluZztcblxuXHQvKiogcmVmZXJlbmNlIHRvIHRoZSB1c2VyIHRoYXQgbWFkZSB0aGUgY29tbWVudCAqL1xuXHRnZXRVc2VySWQoKTogc3RyaW5nO1xuXG5cdHNldFVzZXJJZCh1c2VySWQ6IHN0cmluZyk6IHZvaWQ7XG5cblx0Z2V0VGltZSgpOiBEYXRlO1xuXG5cdHNldFRpbWUodGltZTogRGF0ZSk7XG5cblx0LyoqIHJlZmVyZW5jZSB0byB0aGUgdGFzayBvbiB3aGljaCB0aGlzIGNvbW1lbnQgd2FzIG1hZGUgKi9cblx0Z2V0VGFza0lkKCk6IHN0cmluZztcblxuXHRzZXRUYXNrSWQodGFza0lkOiBzdHJpbmcpOiB2b2lkO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHByb2Nlc3MgaW5zdGFuY2Ugb24gd2hpY2ggdGhpcyBjb21tZW50IHdhcyBtYWRlICovXG5cdGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZztcblxuXHRzZXRQcm9jZXNzSW5zdGFuY2VJZChwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogdm9pZDtcblxuXHQvKiogcmVmZXJlbmNlIHRvIHRoZSB0eXBlIGdpdmVuIHRvIHRoZSBjb21tZW50ICovXG5cdGdldFR5cGUoKTogc3RyaW5nO1xuXG5cdHNldFR5cGUodHlwZTogc3RyaW5nKTogdm9pZDtcblxuXHQvKipcblx0ICogdGhlIGZ1bGwgY29tbWVudCBtZXNzYWdlIHRoZSB1c2VyIGhhZCByZWxhdGVkIHRvIHRoZSB0YXNrIGFuZC9vciBwcm9jZXNzIGluc3RhbmNlXG5cdCAqIFxuXHQgKiBAc2VlIFRhc2tTZXJ2aWNlI2dldFRhc2tDb21tZW50cyhTdHJpbmcpXG5cdCAqL1xuXHRnZXRGdWxsTWVzc2FnZSgpOiBzdHJpbmc7XG5cblx0c2V0RnVsbE1lc3NhZ2UoZnVsbE1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza0V2ZW50IHtcblxuXHQvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQgKi9cblx0Z2V0SWQoKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIHR5cGUgb2Ygb2YgYWN0aW9uIGFuZCBhbHNvIGluZGljYXRlcyB0aGUgbWVhbmluZyBvZiB0aGUgcGFydHMgYXMgZXhwb3NlZCBpbiB7QGxpbmsgI2dldE1lc3NhZ2VQYXJ0cygpfVxuXHQgKi9cblx0Z2V0QWN0aW9uKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGhlIG1lYW5pbmcgb2YgdGhlIG1lc3NhZ2UgcGFydHMgaXMgZGVmaW5lZCBieSB0aGUgYWN0aW9uIGFzIHlvdSBjYW4gZmluZCBpbiB7QGxpbmsgI2dldEFjdGlvbigpfVxuXHQgKi9cblx0Z2V0TWVzc2FnZVBhcnRzKCk6IHN0cmluZ1tdO1xuXG5cdC8qKlxuXHQgKiBUaGUgbWVzc2FnZSB0aGF0IGNhbiBiZSB1c2VkIGluIGNhc2UgdGhpcyBhY3Rpb24gb25seSBoYXMgYSBzaW5nbGUgbWVzc2FnZSBwYXJ0LlxuXHQgKi9cblx0Z2V0TWVzc2FnZSgpOiBzdHJpbmc7XG5cblx0LyoqIHJlZmVyZW5jZSB0byB0aGUgdXNlciB0aGF0IG1hZGUgdGhlIGNvbW1lbnQgKi9cblx0Z2V0VXNlcklkKCk6IHN0cmluZztcblxuXHQvKiogdGltZSBhbmQgZGF0ZSB3aGVuIHRoZSB1c2VyIG1hZGUgdGhlIGNvbW1lbnQgKi9cblx0Z2V0VGltZSgpOiBEYXRlO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHRhc2sgb24gd2hpY2ggdGhpcyBjb21tZW50IHdhcyBtYWRlICovXG5cdGdldFRhc2tJZCgpOiBzdHJpbmc7XG5cblx0LyoqIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSBvbiB3aGljaCB0aGlzIGNvbW1lbnQgd2FzIG1hZGUgKi9cblx0Z2V0UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nO1xuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXR0YWNobWVudCB7XG5cblx0LyoqIHVuaXF1ZSBpZCBmb3IgdGhpcyBhdHRhY2htZW50ICovXG5cdGdldElkKCk6IHN0cmluZztcblxuXHQvKiogZnJlZSB1c2VyIGRlZmluZWQgc2hvcnQgKG1heCAyNTUgY2hhcnMpIG5hbWUgZm9yIHRoaXMgYXR0YWNobWVudCAqL1xuXHRnZXROYW1lKCk6IHN0cmluZztcblxuXHQvKiogZnJlZSB1c2VyIGRlZmluZWQgc2hvcnQgKG1heCAyNTUgY2hhcnMpIG5hbWUgZm9yIHRoaXMgYXR0YWNobWVudCAqL1xuXHRzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIGxvbmcgKG1heCAyNTUgY2hhcnMpIGV4cGxhbmF0aW9uIHdoYXQgdGhpcyBhdHRhY2htZW50IGlzIGFib3V0IGluIGNvbnRleHQgb2YgdGhlIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UgaXQncyBsaW5rZWQgdG8uXG5cdCAqL1xuXHRnZXREZXNjcmlwdGlvbigpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIGxvbmcgKG1heCAyNTUgY2hhcnMpIGV4cGxhbmF0aW9uIHdoYXQgdGhpcyBhdHRhY2htZW50IGlzIGFib3V0IGluIGNvbnRleHQgb2YgdGhlIHRhc2sgYW5kL29yIHByb2Nlc3MgaW5zdGFuY2UgaXQncyBsaW5rZWQgdG8uXG5cdCAqL1xuXHRzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZDtcblxuXHQvKipcblx0ICogaW5kaWNhdGlvbiBvZiB0aGUgdHlwZSBvZiBjb250ZW50IHRoYXQgdGhpcyBhdHRhY2htZW50IHJlZmVycyB0by4gQ2FuIGJlIG1pbWUgdHlwZSBvciBhbnkgb3RoZXIgaW5kaWNhdGlvbi5cblx0ICovXG5cdGdldFR5cGUoKTogc3RyaW5nO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHRhc2sgdG8gd2hpY2ggdGhpcyBhdHRhY2htZW50IGlzIGFzc29jaWF0ZWQuICovXG5cblx0Z2V0VGFza0lkKCk6IHN0cmluZztcblx0LyoqXG5cdCAqIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byB3aGljaCB0aGlzIGF0dGFjaG1lbnQgaXMgYXNzb2NpYXRlZC5cblx0ICovXG5cdGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZztcblxuXHQvKipcblx0ICogdGhlIHJlbW90ZSBVUkwgaW4gY2FzZSB0aGlzIGlzIHJlbW90ZSBjb250ZW50LiBJZiB0aGUgYXR0YWNobWVudCBjb250ZW50IHdhcyB7QGxpbmsgVGFza1NlcnZpY2UjY3JlYXRlQXR0YWNobWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgamF2YS5pby5JbnB1dFN0cmVhbSkgdXBsb2FkZWQgd2l0aCBhblxuXHQgKiBpbnB1dCBzdHJlYW19LCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBhbmQgdGhlIGNvbnRlbnQgY2FuIGJlIGZldGNoZWQgd2l0aCB7QGxpbmsgVGFza1NlcnZpY2UjZ2V0QXR0YWNobWVudENvbnRlbnQoU3RyaW5nKX0uXG5cdCAqL1xuXHRnZXRVcmwoKTogc3RyaW5nO1xuXG5cdC8qKiByZWZlcmVuY2UgdG8gdGhlIHVzZXIgd2hvIGNyZWF0ZWQgdGhpcyBhdHRhY2htZW50LiAqL1xuXHRnZXRVc2VySWQoKTogc3RyaW5nO1xuXG5cdC8qKiB0aW1lc3RhbXAgd2hlbiB0aGlzIGF0dGFjaG1lbnQgd2FzIGNyZWF0ZWQgKi9cblx0Z2V0VGltZSgpOiBEYXRlO1xuXG5cdC8qKiB0aW1lc3RhbXAgd2hlbiB0aGlzIGF0dGFjaG1lbnQgd2FzIGNyZWF0ZWQgKi9cblx0c2V0VGltZSh0aW1lOiBEYXRlKTogdm9pZDtcblxuXHQvKiogdGhlIGlkIG9mIHRoZSBieXRlIGFycmF5IGVudGl0eSBzdG9yaW5nIHRoZSBjb250ZW50ICovXG5cdGdldENvbnRlbnRJZCgpOiBzdHJpbmc7XG5cbn1cblxuZXhwb3J0IGVudW0gTnVsbEhhbmRsaW5nT25PcmRlciB7XG5cdE5VTExTX0ZJUlNULCBOVUxMU19MQVNUXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlQcm9wZXJ0eSB7XG5cblx0Z2V0TmFtZSgpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnk8VCwgVT4ge1xuXG5cdC8qKlxuXHQgKiBPcmRlciB0aGUgcmVzdWx0cyBhc2NlbmRpbmcgb24gdGhlIGdpdmVuIHByb3BlcnR5IGFzIGRlZmluZWQgaW4gdGhpcyBjbGFzcyAobmVlZHMgdG8gY29tZSBhZnRlciBhIGNhbGwgdG8gb25lIG9mIHRoZSBvcmRlckJ5WHh4eCBtZXRob2RzKS5cblx0ICovXG5cdGFzYygpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciB0aGUgcmVzdWx0cyBkZXNjZW5kaW5nIG9uIHRoZSBnaXZlbiBwcm9wZXJ0eSBhcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MgKG5lZWRzIHRvIGNvbWUgYWZ0ZXIgYSBjYWxsIHRvIG9uZSBvZiB0aGUgb3JkZXJCeVh4eHggbWV0aG9kcykuXG5cdCAqL1xuXHRkZXNjKCk6IFQ7XG5cblx0b3JkZXJCeShwcm9wZXJ0eTogUXVlcnlQcm9wZXJ0eSk6IFQ7XG5cblx0b3JkZXJCeShwcm9wZXJ0eTogUXVlcnlQcm9wZXJ0eSwgbnVsbEhhbmRsaW5nT25PcmRlcjogTnVsbEhhbmRsaW5nT25PcmRlcik6IFQ7XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlc3VsdHNcblx0ICovXG5cdGNvdW50KCk6IG51bWJlcjtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgZW50aXR5IG9yIG51bGwgaWYgbm8gZW50aXR5IG1hdGNoZXMgdGhlIHF1ZXJ5IGNyaXRlcmlhLlxuXHQgKlxuXHQgKiBAdGhyb3dzIG9yZy5mbG93YWJsZS5jb21tb24uZW5naW5lLmFwaS5GbG93YWJsZUV4Y2VwdGlvbiB3aGVuIHRoZSBxdWVyeSByZXN1bHRzIGluIG1vcmUgdGhhbiBvbmUgZW50aXRpZXMuXG5cdCAqL1xuXHRzaW5nbGVSZXN1bHQoKTogVTtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCBnZXQgYSBsaXN0IG9mIGVudGl0aWVzIGFzIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRsaXN0KCk6IFVbXTtcblxuXHQvKipcblx0ICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCBnZXQgYSBsaXN0IG9mIGVudGl0aWVzIGFzIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRsaXN0UGFnZShmaXJzdFJlc3VsdDogbnVtYmVyLCBtYXhSZXN1bHRzOiBudW1iZXIpOiBVW107XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBUYXNrSW5mb1F1ZXJ5PFQsIFYgZXh0ZW5kcyBUYXNrSW5mbz4gZXh0ZW5kcyBRdWVyeTxULCBWPiB7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIHRhc2sgaWQgKGluIHByYWN0aWNlLCB0aGVyZSB3aWxsIGJlIG1heGltdW0gb25lIG9mIHRoaXMga2luZClcblx0ICovXG5cdHRhc2tJZCh0YXNrSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYW4gaWQgdGhhdCBpcyBpbiB0aGUgZ2l2ZW4gbGlzdFxuXHQgKlxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIFdoZW4gcGFzc2VkIGlkIGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKi9cblx0dGFza0lkcyh0YXNrSWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIG5hbWUgKi9cblx0dGFza05hbWUobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIG5hbWUgdGhhdCBpcyBpbiB0aGUgZ2l2ZW4gbGlzdFxuXHQgKiBcblx0ICogQHRocm93cyBGbG93YWJsZUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICBXaGVuIHBhc3NlZCBuYW1lIGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKi9cblx0dGFza05hbWVJbihuYW1lTGlzdDogc3RyaW5nW10pOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGEgbmFtZSB0aGF0IGlzIGluIHRoZSBnaXZlbiBsaXN0XG5cdCAqIFxuXHQgKiBUaGlzIG1ldGhvZCwgdW5saWtlIHRoZSB7QGxpbmsgI3Rhc2tOYW1lSW4oQ29sbGVjdGlvbil9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlcnMgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZSBxdWVyeSBpcyBleGVjdXRlZC5cblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgV2hlbiBwYXNzZWQgbmFtZSBsaXN0IGlzIGVtcHR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW5zIDxjb2RlPm51bGwgU3RyaW5nPC9jb2RlPi5cblx0ICovXG5cdHRhc2tOYW1lSW5JZ25vcmVDYXNlKG5hbWVMaXN0OiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBuYW1lIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXIuIFRoZSBzeW50YXggaXMgdGhhdCBvZiBTUUw6IGZvciBleGFtcGxlIHVzYWdlOiBuYW1lTGlrZSgldGVzdCUpXG5cdCAqL1xuXHR0YXNrTmFtZUxpa2UobmFtZUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBuYW1lIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXIuIFRoZSBzeW50YXggaXMgdGhhdCBvZiBTUUw6IGZvciBleGFtcGxlIHVzYWdlOiBuYW1lTGlrZSgldGVzdCUpXG5cdCAqIFxuXHQgKiBUaGlzIG1ldGhvZCwgdW5saWtlIHRoZSB7QGxpbmsgI3Rhc2tOYW1lTGlrZShTdHJpbmcpfSBtZXRob2Qgd2lsbCBub3QgdGFrZSBpbiBhY2NvdW50IHRoZSB1cHBlci9sb3dlciBjYXNlOiBib3RoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZSBxdWVyeSBpc1xuXHQgKiBleGVjdXRlZC5cblx0ICovXG5cdHRhc2tOYW1lTGlrZUlnbm9yZUNhc2UobmFtZUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0aW9uLiAqL1xuXHR0YXNrRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBkZXNjcmlwdGlvbiBtYXRjaGluZyB0aGUgcGFyYW1ldGVyIC4gVGhlIHN5bnRheCBpcyB0aGF0IG9mIFNRTDogZm9yIGV4YW1wbGUgdXNhZ2U6IGRlc2NyaXB0aW9uTGlrZSgldGVzdCUpXG5cdCAqL1xuXHR0YXNrRGVzY3JpcHRpb25MaWtlKGRlc2NyaXB0aW9uTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIGRlc2NyaXB0aW9uIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXIgLiBUaGUgc3ludGF4IGlzIHRoYXQgb2YgU1FMOiBmb3IgZXhhbXBsZSB1c2FnZTogZGVzY3JpcHRpb25MaWtlKCV0ZXN0JSlcblx0ICogXG5cdCAqIFRoaXMgbWV0aG9kLCB1bmxpa2UgdGhlIHtAbGluayAjdGFza0Rlc2NyaXB0aW9uTGlrZShTdHJpbmcpfSBtZXRob2Qgd2lsbCBub3QgdGFrZSBpbiBhY2NvdW50IHRoZSB1cHBlci9sb3dlciBjYXNlOiBib3RoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZSBxdWVyeSBpc1xuXHQgKiBleGVjdXRlZC5cblx0ICovXG5cdHRhc2tEZXNjcmlwdGlvbkxpa2VJZ25vcmVDYXNlKGRlc2NyaXB0aW9uTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2l0aCB0aGUgZ2l2ZW4gcHJpb3JpdHkuICovXG5cdHRhc2tQcmlvcml0eShwcmlvcml0eTogbnVtYmVyKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2l0aCB0aGUgZ2l2ZW4gcHJpb3JpdHkgb3IgaGlnaGVyLiAqL1xuXHR0YXNrTWluUHJpb3JpdHkobWluUHJpb3JpdHk6IG51bWJlcik6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIHByaW9yaXR5IG9yIGxvd2VyLiAqL1xuXHR0YXNrTWF4UHJpb3JpdHkobWF4UHJpb3JpdHk6IG51bWJlcik6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4gdXNlci4gKi9cblx0dGFza0Fzc2lnbmVlKGFzc2lnbmVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCB3ZXJlIGxhc3QgYXNzaWduZWQgdG8gYW4gYXNzaWduZWUgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW50YXggdGhhdCBzaG91bGQgYmUgdXNlZCBpcyB0aGUgc2FtZSBhcyBpbiBTUUwsIGVnLiAldGVzdCUuXG5cdCAqL1xuXHR0YXNrQXNzaWduZWVMaWtlKGFzc2lnbmVlTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggd2VyZSBsYXN0IGFzc2lnbmVkIHRvIGFuIGFzc2lnbmVlIGxpa2UgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ludGF4IHRoYXQgc2hvdWxkIGJlIHVzZWQgaXMgdGhlIHNhbWUgYXMgaW4gU1FMLCBlZy4gJXRlc3QlLlxuXHQgKiBcblx0ICogVGhpcyBtZXRob2QsIHVubGlrZSB0aGUge0BsaW5rICN0YXNrQXNzaWduZWVMaWtlKFN0cmluZyl9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgY29sdW1uIHZhbHVlIGFyZSBsb3dlcmNhc2VkIHdoZW4gdGhlIHF1ZXJ5IGlzXG5cdCAqIGV4ZWN1dGVkLlxuXHQgKi9cblx0dGFza0Fzc2lnbmVlTGlrZUlnbm9yZUNhc2UoYXNzaWduZWVMaWtlSWdub3JlQ2FzZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggZG9uJ3QgaGF2ZSBhbiBhc3NpZ25lZS4gKi9cblx0dGFza1VuYXNzaWduZWQoKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGFueSB1c2VyICovXG5cdHRhc2tBc3NpZ25lZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGFuIGFzc2lnbmVlIHRoYXQgaXMgaW4gdGhlIGdpdmVuIGxpc3Rcblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgV2hlbiBwYXNzZWQgbmFtZSBsaXN0IGlzIGVtcHR5IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIGNvbnRhaW5zIDxjb2RlPm51bGwgU3RyaW5nPC9jb2RlPi5cblx0ICovXG5cdHRhc2tBc3NpZ25lZUlkcyhhc3NpZ25lZUxpc3RJZHM6IHN0cmluZ1tdKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZSBnaXZlbiB1c2VyIGlzIHRoZSBvd25lci4gKi9cblx0dGFza093bmVyKG93bmVyOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCB3ZXJlIGxhc3QgYXNzaWduZWQgdG8gYW4gb3duZXIgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW50YXggdGhhdCBzaG91bGQgYmUgdXNlZCBpcyB0aGUgc2FtZSBhcyBpbiBTUUwsIGVnLiAldGVzdCUuXG5cdCAqL1xuXHR0YXNrT3duZXJMaWtlKG93bmVyTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggd2VyZSBsYXN0IGFzc2lnbmVkIHRvIGFuIG93bmVyIGxpa2UgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ludGF4IHRoYXQgc2hvdWxkIGJlIHVzZWQgaXMgdGhlIHNhbWUgYXMgaW4gU1FMLCBlZy4gJXRlc3QlLlxuXHQgKiBcblx0ICogVGhpcyBtZXRob2QsIHVubGlrZSB0aGUge0BsaW5rICN0YXNrT3duZXJMaWtlKFN0cmluZyl9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgY29sdW1uIHZhbHVlIGFyZSBsb3dlcmNhc2VkIHdoZW4gdGhlIHF1ZXJ5IGlzXG5cdCAqIGV4ZWN1dGVkLlxuXHQgKi9cblx0dGFza093bmVyTGlrZUlnbm9yZUNhc2Uob3duZXJMaWtlSWdub3JlQ2FzZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZSBnaXZlbiB1c2VyIGlzIGEgY2FuZGlkYXRlLiAqL1xuXHR0YXNrQ2FuZGlkYXRlVXNlcihjYW5kaWRhdGVVc2VyOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3Igd2hpY2ggdGhlcmUgZXhpc3QgYW4ge0BsaW5rIElkZW50aXR5TGlua30gd2l0aCB0aGUgZ2l2ZW4gdXNlciwgaW5jbHVkaW5nIHRhc2tzIHdoaWNoIGhhdmUgYmVlbiBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4gdXNlciAoYXNzaWduZWUpIG9yIG93bmVkIGJ5IHRoZSBnaXZlbiB1c2VyIChvd25lcikuXG5cdCAqL1xuXHR0YXNrSW52b2x2ZWRVc2VyKGludm9sdmVkVXNlcjogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZXJlIGV4aXN0IGFuIHtAbGluayBJZGVudGl0eUxpbmt9IHdpdGggdGhlIGdpdmVuIEdyb3Vwcy5cblx0ICovXG5cdHRhc2tJbnZvbHZlZEdyb3VwcyhpbnZvbHZlZEdyb3VwOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIEFsbG93cyB0byBzZWxlY3QgYSB0YXNrIHVzaW5nIHtAbGluayAjdGFza0NhbmRpZGF0ZUdyb3VwKFN0cmluZyl9IHtAbGluayAjdGFza0NhbmRpZGF0ZUdyb3VwSW4oQ29sbGVjdGlvbil9IG9yIHtAbGluayAjdGFza0NhbmRpZGF0ZVVzZXIoU3RyaW5nKX0gYnV0IGlnbm9yZSB0aGUgYXNzaWduZWUgdmFsdWUgaW5zdGVhZCBvZiBxdWVyeWluZyBmb3IgYW4gZW1wdHkgYXNzaWduZWUuXG5cdCAqL1xuXHRpZ25vcmVBc3NpZ25lZVZhbHVlKCk6IFQ7XG5cblx0LyoqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB3aGljaCB1c2VycyBpbiB0aGUgZ2l2ZW4gZ3JvdXAgYXJlIGNhbmRpZGF0ZXMuICovXG5cdHRhc2tDYW5kaWRhdGVHcm91cChjYW5kaWRhdGVHcm91cDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHdoaWNoIHRoZSAnY2FuZGlkYXRlR3JvdXAnIGlzIG9uZSBvZiB0aGUgZ2l2ZW4gZ3JvdXBzLlxuXHQgKiBcblx0ICogQHRocm93cyBGbG93YWJsZUlsbGVnYWxBcmd1bWVudEV4Y2VwdGlvblxuXHQgKiAgICAgICAgICAgICBXaGVuIHF1ZXJ5IGlzIGV4ZWN1dGVkIGFuZCB7QGxpbmsgI3Rhc2tDYW5kaWRhdGVHcm91cChTdHJpbmcpfSBvciB7QGxpbmsgI3Rhc2tDYW5kaWRhdGVVc2VyKFN0cmluZyl9IGhhcyBiZWVuIGV4ZWN1dGVkIG9uIHRoZSBxdWVyeSBpbnN0YW5jZS4gV2hlbiBwYXNzZWQgZ3JvdXAgbGlzdCBpcyBlbXB0eSBvclxuXHQgKiAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi5cblx0ICovXG5cdHRhc2tDYW5kaWRhdGVHcm91cEluKGNhbmRpZGF0ZUdyb3Vwczogc3RyaW5nW10pOiBUXG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gdGVuYW50IGlkLlxuXHQgKi9cblx0dGFza1RlbmFudElkKHRlbmFudElkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGEgdGVuYW50IGlkIGxpa2UgdGhlIGdpdmVuIG9uZS5cblx0ICovXG5cdHRhc2tUZW5hbnRJZExpa2UodGVuYW50SWRMaWtlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGRvIG5vdCBoYXZlIGEgdGVuYW50IGlkLlxuXHQgKi9cblx0dGFza1dpdGhvdXRUZW5hbnRJZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgaW5zdGFuY2UgaWQuXG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VJZChwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGlkcy5cblx0ICovXG5cdHByb2Nlc3NJbnN0YW5jZUlkSW4ocHJvY2Vzc0luc3RhbmNlSWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGhvdXQgYSBwcm9jZXNzIGluc3RhbmNlIGlkLlxuXHQgKi9cblx0d2l0aG91dFByb2Nlc3NJbnN0YW5jZUlkKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gYnVzaW5lc3Mga2V5XG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleShwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIGJ1c2luZXNzIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSBUaGUgc3ludGF4IGlzIHRoYXQgb2YgU1FMOiBmb3IgZXhhbXBsZSB1c2FnZTogcHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXlMaWtlKFwiJXRlc3QlXCIpLlxuXHQgKi9cblx0cHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXlMaWtlKHByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5TGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBhIGJ1c2luZXNzIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSBUaGUgc3ludGF4IGlzIHRoYXQgb2YgU1FMOiBmb3IgZXhhbXBsZSB1c2FnZTogcHJvY2Vzc0luc3RhbmNlQnVzaW5lc3NLZXlMaWtlKFwiJXRlc3QlXCIpLlxuXHQgKiBcblx0ICogVGhpcyBtZXRob2QsIHVubGlrZSB0aGUge0BsaW5rICNwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleUxpa2UoU3RyaW5nKX0gbWV0aG9kIHdpbGwgbm90IHRha2UgaW4gYWNjb3VudCB0aGUgdXBwZXIvbG93ZXIgY2FzZTogYm90aCB0aGUgaW5wdXQgcGFyYW1ldGVyIGFzIHRoZSBjb2x1bW4gdmFsdWUgYXJlIGxvd2VyY2FzZWQgd2hlblxuXHQgKiB0aGUgcXVlcnkgaXMgZXhlY3V0ZWQuXG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VCdXNpbmVzc0tleUxpa2VJZ25vcmVDYXNlKHByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5TGlrZUlnbm9yZUNhc2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gZXhlY3V0aW9uLlxuXHQgKi9cblx0ZXhlY3V0aW9uSWQoZXhlY3V0aW9uSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gY2FzZSBpbnN0YW5jZS5cblx0ICovXG5cdGNhc2VJbnN0YW5jZUlkKGNhc2VJbnN0YW5jZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3IgdGhlIGdpdmVuIGNhc2UgZGVmaW5pdGlvbi5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uSWQoY2FzZURlZmluaXRpb25JZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBjYXNlIGluc3RhbmNlIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gY2FzZSBkZWZpbml0aW9uIGtleS5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uS2V5KGNhc2VEZWZpbml0aW9uS2V5OiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIGNhc2UgaW5zdGFuY2Ugd2hpY2ggaGFzIGEgY2FzZSBkZWZpbml0aW9uIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHN5bnRheCB0aGF0IHNob3VsZCBiZSB1c2VkIGlzIHRoZSBzYW1lIGFzIGluIFNRTCwgZWcuICV0ZXN0JS5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uS2V5TGlrZShjYXNlRGVmaW5pdGlvbktleUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgY2FzZSBpbnN0YW5jZSB3aGljaCBoYXMgYSBjYXNlIGRlZmluaXRpb24ga2V5IGxpa2UgdGhlIGdpdmVuIHZhbHVlLiBUaGUgc3ludGF4IHRoYXQgc2hvdWxkIGJlIHVzZWQgaXMgdGhlIHNhbWUgYXMgaW4gU1FMLCBlZy4gJXRlc3QlLlxuXHQgKlxuXHQgKiBUaGlzIG1ldGhvZCwgdW5saWtlIHRoZSB7QGxpbmsgI2Nhc2VEZWZpbml0aW9uS2V5TGlrZShTdHJpbmcpfSBtZXRob2Qgd2lsbCBub3QgdGFrZSBpbiBhY2NvdW50IHRoZSB1cHBlci9sb3dlciBjYXNlOiBib3RoIHRoZSBpbnB1dCBwYXJhbWV0ZXIgYXMgdGhlIGNvbHVtbiB2YWx1ZSBhcmUgbG93ZXJjYXNlZCB3aGVuIHRoZVxuXHQgKiBxdWVyeSBpcyBleGVjdXRlZC5cblx0ICovXG5cdGNhc2VEZWZpbml0aW9uS2V5TGlrZUlnbm9yZUNhc2UoY2FzZURlZmluaXRpb25LZXlMaWtlSWdub3JlQ2FzZTogc3RyaW5nKTogVDtcblxuXHQvKiogT25seSBzZWxlY3QgdGFza3MgdGhhdCBoYXZlIGEgY2FzZSBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUga2V5IGlzIHByZXNlbnQgaW4gdGhlIGdpdmVuIGxpc3QgKiovXG5cdGNhc2VEZWZpbml0aW9uS2V5SW4oY2FzZURlZmluaXRpb25LZXlzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gcGxhbiBpdGVtIGluc3RhbmNlLiBcblx0ICovXG5cdHBsYW5JdGVtSW5zdGFuY2VJZChwbGFuSXRlbUluc3RhbmNlSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gc2NvcGUgaWRlbnRpZmllci4gXG5cdCAqL1xuXHRzY29wZUlkKHNjb3BlSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gc3ViIHNjb3BlIGlkZW50aWZpZXIuIFxuXHQgKi9cblx0c3ViU2NvcGVJZChzdWJTY29wZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyBmb3IgdGhlIGdpdmVuIHNjb3BlIHR5cGUuIFxuXHQgKi9cblx0c2NvcGVUeXBlKHNjb3BlVHlwZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgZm9yIHRoZSBnaXZlbiBzY29wZSBkZWZpbml0aW9uIGlkZW50aWZpZXIuIFxuXHQgKi9cblx0c2NvcGVEZWZpbml0aW9uSWQoc2NvcGVEZWZpbml0aW9uSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIGZvciB0aGUgZ2l2ZW4gc3RhZ2UsIGRlZmluZWQgdGhyb3VnaCBpdHMgc3RhZ2UgaW5zdGFuY2UgaWQuXG5cdCAqL1xuXHRwcm9wYWdhdGVkU3RhZ2VJbnN0YW5jZUlkKHByb3BhZ2F0ZWRTdGFnZUluc3RhbmNlSWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIFNlbGVjdCBhbGwgdGFza3MgZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGluc3RhbmNlIGlkIGFuZCBpdHMgY2hpbGRyZW4uXG5cdCAqL1xuXHRwcm9jZXNzSW5zdGFuY2VJZFdpdGhDaGlsZHJlbihwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogU2VsZWN0IGFsbCB0YXNrcyBmb3IgdGhlIGdpdmVuIGNhc2UgaW5zdGFuY2UgaWQgYW5kIGl0cyBjaGlsZHJlbi5cblx0ICovXG5cdGNhc2VJbnN0YW5jZUlkV2l0aENoaWxkcmVuKGNhc2VJbnN0YW5jZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBjcmVhdGVkIG9uIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0NyZWF0ZWRPbihjcmVhdGVUaW1lOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrQ3JlYXRlZEJlZm9yZShiZWZvcmU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBjcmVhdGVkIGFmdGVyIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0NyZWF0ZWRBZnRlcihhZnRlcjogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHRoYXQgYXJlIHN0YXJ0ZWQgaW4gcHJvZ3Jlc3Mgb24gdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrSW5Qcm9ncmVzc1N0YXJ0VGltZU9uKGNsYWltZWRUaW1lOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgc3RhcnRlZCBpbiBwcm9ncmVzcyBiZWZvcmUgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrSW5Qcm9ncmVzc1N0YXJ0VGltZUJlZm9yZShiZWZvcmU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBzdGFydGVkIGluIHByb2dyZXNzIGFmdGVyIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0luUHJvZ3Jlc3NTdGFydFRpbWVBZnRlcihhZnRlcjogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIFNlbGVjdCBhbGwgdGFza3MgdGhhdCBoYXZlIGFuIGluIHByb2dyZXNzIHN0YXJ0ZWQgdXNlciByZWZlcmVuY2UgZm9yIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdHRhc2tJblByb2dyZXNzU3RhcnRlZEJ5KHN0YXJ0ZWRCeTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgY2xhaW1lZCBvbiB0aGUgZ2l2ZW4gZGF0ZS5cblx0ICovXG5cdHRhc2tDbGFpbWVkT24oY2xhaW1lZFRpbWU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBjbGFpbWVkIGJlZm9yZSB0aGUgZ2l2ZW4gZGF0ZS5cblx0ICovXG5cdHRhc2tDbGFpbWVkQmVmb3JlKGJlZm9yZTogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHRoYXQgYXJlIGNsYWltZWQgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrQ2xhaW1lZEFmdGVyKGFmdGVyOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogU2VsZWN0IGFsbCB0YXNrcyB0aGF0IGhhdmUgYSBjbGFpbWVkIGJ5IHVzZXIgcmVmZXJlbmNlIGZvciB0aGUgZ2l2ZW4gdmFsdWUuXG5cdCAqL1xuXHR0YXNrQ2xhaW1lZEJ5KGNsYWltZWRCeTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgdGhhdCBhcmUgc3VzcGVuZGVkIG9uIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza1N1c3BlbmRlZE9uKHN1c3BlbmRlZFRpbWU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBzdXNwZW5kZWQgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza1N1c3BlbmRlZEJlZm9yZShiZWZvcmU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGFyZSBzdXNwZW5kZWQgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUuXG5cdCAqL1xuXHR0YXNrU3VzcGVuZGVkQWZ0ZXIoYWZ0ZXI6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBTZWxlY3QgYWxsIHRhc2tzIHRoYXQgaGF2ZSBhIHN1c3BlbmRlZCBieSB1c2VyIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIHZhbHVlLlxuXHQgKi9cblx0dGFza1N1c3BlbmRlZEJ5KHN1c3BlbmRlZEJ5OiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiBjYXRlZ29yeS5cblx0ICovXG5cdHRhc2tDYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3MgYmVsb25naW5nIHRvIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBpbiB0aGUgZ2l2ZW4gbGlzdC5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tDYXRlZ29yeUluTGlzdFxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFdoZW4gcGFzc2VkIGNhdGVnb3J5IGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbDwvY29kZT4gU3RyaW5nLlxuXHQgKi9cblx0dGFza0NhdGVnb3J5SW4odGFza0NhdGVnb3J5SW5MaXN0OiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSBkZWZpbmVkIGNhdGVnb3J5IHdoaWNoIGRvIG5vdCBiZWxvbmcgdG8gYSBjYXRlZ29yeSBwcmVzZW50IGluIHRoZSBnaXZlbiBsaXN0LlxuXHQgKiA8cD5cblx0ICogTk9URTogVGhpcyBtZXRob2QgZG9lcyA8Yj5ub3Q8L2I+IHJldHVybiB0YXNrcyA8Yj53aXRob3V0PC9iPiBjYXRlZ29yeSBlLmcuIHRhc2tzIGhhdmluZyBhIDxjb2RlPm51bGw8L2NvZGU+IGNhdGVnb3J5LlxuXHQgKiBUbyBpbmNsdWRlIDxjb2RlPm51bGw8L2NvZGU+IGNhdGVnb3JpZXMsIHVzZSA8Y29kZT5xdWVyeS5vcigpLnRhc2tDYXRlZ29yeU5vdEluKC4uLikudGFza1dpdGhvdXRDYXRlZ29yeSgpLmVuZE9yKCk8L2NvZGU+XG5cdCAqIDwvcD5cblx0ICpcblx0ICogQHBhcmFtIHRhc2tDYXRlZ29yeU5vdEluTGlzdFxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFdoZW4gcGFzc2VkIGNhdGVnb3J5IGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKiBAc2VlICN0YXNrV2l0aG91dENhdGVnb3J5XG5cdCAqL1xuXHR0YXNrQ2F0ZWdvcnlOb3RJbih0YXNrQ2F0ZWdvcnlOb3RJbkxpc3Q6IHN0cmluZ1tdKTogVDtcblxuXHQvKipcblx0ICogU2VsZWN0cyB0YXNrcyB3aXRob3V0IGNhdGVnb3J5LlxuXHQgKiA8cD5cblx0ICogQ2FuIGFsc28gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIGZpbHRlciBjcml0ZXJpYSB0byBpbmNsdWRlIHRhc2tzIHdpdGhvdXQgY2F0ZWdvcnkgZS5nLiBpbiA8Y29kZT5vcjwvY29kZT4gcXVlcmllcy5cblx0ICogPC9wPlxuXHQgKiBAc2VlICN0YXNrQ2F0ZWdvcnlOb3RJbihDb2xsZWN0aW9uKVxuXHQgKi9cblx0dGFza1dpdGhvdXRDYXRlZ29yeSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIGZvcm0ga2V5LlxuXHQgKi9cblx0dGFza1dpdGhGb3JtS2V5KCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIGZvcm1LZXkuXG5cdCAqL1xuXHR0YXNrRm9ybUtleShmb3JtS2V5OiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiB0YXNrRGVmaW5pdGlvbktleS4gVGhlIHRhc2sgZGVmaW5pdGlvbiBrZXkgaXMgdGhlIGlkIG9mIHRoZSB1c2VyVGFzazogJmx0O3VzZXJUYXNrIGlkPVwieHh4XCIgLi4uLyZndDtcblx0ICoqL1xuXHR0YXNrRGVmaW5pdGlvbktleShrZXk6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggYSB0YXNrRGVmaW5pdGlvbktleSB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXJhbWV0ZXIuIFRoZSBzeW50YXggaXMgdGhhdCBvZiBTUUw6IGZvciBleGFtcGxlIHVzYWdlOiB0YXNrRGVmaW5pdGlvbktleUxpa2UoXCIldGVzdCVcIikuIFRoZSB0YXNrIGRlZmluaXRpb24ga2V5IGlzIHRoZSBpZCBvZlxuXHQgKiB0aGUgdXNlclRhc2s6ICZsdDt1c2VyVGFzayBpZD1cInh4eFwiIC4uLi8mZ3Q7XG5cdCAqKi9cblx0dGFza0RlZmluaXRpb25LZXlMaWtlKGtleUxpa2U6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIHRhc2tEZWZpbml0aW9uS2V5cy4gVGhlIHRhc2sgZGVmaW5pdGlvbiBrZXkgaXMgdGhlIGlkIG9mIHRoZSB1c2VyVGFzazogJmx0O3VzZXJUYXNrIGlkPVwieHh4XCIgLi4uLyZndDtcblx0ICoqL1xuXHR0YXNrRGVmaW5pdGlvbktleXMoa2V5czogc3RyaW5nW10pOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiBzdGF0ZS5cblx0ICoqL1xuXHR0YXNrU3RhdGUoc3RhdGU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdpdGggdGhlIGdpdmVuIGluIHByb2dyZXNzIHN0YXJ0IGR1ZSBkYXRlLlxuXHQgKi9cblx0dGFza0luUHJvZ3Jlc3NTdGFydER1ZURhdGUoZHVlRGF0ZTogRGF0ZSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYW4gaW4gcHJvZ3Jlc3Mgc3RhcnQgZHVlIGRhdGUgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0luUHJvZ3Jlc3NTdGFydER1ZUJlZm9yZShkdWVEYXRlOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhbiBpbiBwcm9ncmVzcyBzdGFydCBkdWUgZGF0ZSBhZnRlciB0aGUgZ2l2ZW4gZGF0ZS5cblx0ICovXG5cdHRhc2tJblByb2dyZXNzU3RhcnREdWVBZnRlcihkdWVEYXRlOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2l0aCBubyBpbiBwcm9ncmVzcyBzdGFydCBkdWUgZGF0ZS5cblx0ICovXG5cdHdpdGhvdXRUYXNrSW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIHRoZSBnaXZlbiBkdWUgZGF0ZS5cblx0ICovXG5cdHRhc2tEdWVEYXRlKGR1ZURhdGU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZHVlIGRhdGUgYmVmb3JlIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0R1ZUJlZm9yZShkdWVEYXRlOiBEYXRlKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGR1ZSBkYXRlIGFmdGVyIHRoZSBnaXZlbiBkYXRlLlxuXHQgKi9cblx0dGFza0R1ZUFmdGVyKGR1ZURhdGU6IERhdGUpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aXRoIG5vIGR1ZSBkYXRlLlxuXHQgKi9cblx0d2l0aG91dFRhc2tEdWVEYXRlKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyBpbnN0YW5jZSB3aGljaCBoYXMgdGhlIGdpdmVuIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkuXG5cdCAqL1xuXHRwcm9jZXNzRGVmaW5pdGlvbktleShwcm9jZXNzRGVmaW5pdGlvbktleTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdoaWNoIGhhcyBhIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBzeW50YXggdGhhdCBzaG91bGQgYmUgdXNlZCBpcyB0aGUgc2FtZSBhcyBpbiBTUUwsIGVnLiAldGVzdCUuXG5cdCAqL1xuXHRwcm9jZXNzRGVmaW5pdGlvbktleUxpa2UocHJvY2Vzc0RlZmluaXRpb25LZXlMaWtlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgaW5zdGFuY2Ugd2hpY2ggaGFzIGEgcHJvY2VzcyBkZWZpbml0aW9uIGtleSBsaWtlIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHN5bnRheCB0aGF0IHNob3VsZCBiZSB1c2VkIGlzIHRoZSBzYW1lIGFzIGluIFNRTCwgZWcuICV0ZXN0JS5cblx0ICogXG5cdCAqIFRoaXMgbWV0aG9kLCB1bmxpa2UgdGhlIHtAbGluayAjcHJvY2Vzc0RlZmluaXRpb25LZXlMaWtlKFN0cmluZyl9IG1ldGhvZCB3aWxsIG5vdCB0YWtlIGluIGFjY291bnQgdGhlIHVwcGVyL2xvd2VyIGNhc2U6IGJvdGggdGhlIGlucHV0IHBhcmFtZXRlciBhcyB0aGUgY29sdW1uIHZhbHVlIGFyZSBsb3dlcmNhc2VkIHdoZW4gdGhlXG5cdCAqIHF1ZXJ5IGlzIGV4ZWN1dGVkLlxuXHQgKi9cblx0cHJvY2Vzc0RlZmluaXRpb25LZXlMaWtlSWdub3JlQ2FzZShwcm9jZXNzRGVmaW5pdGlvbktleUxpa2VJZ25vcmVDYXNlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKiBPbmx5IHNlbGVjdCB0YXNrcyB0aGF0IGhhdmUgYSBwcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBrZXkgaXMgcHJlc2VudCBpbiB0aGUgZ2l2ZW4gbGlzdCAqKi9cblx0cHJvY2Vzc0RlZmluaXRpb25LZXlJbihwcm9jZXNzRGVmaW5pdGlvbktleXM6IHN0cmluZ1tdKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiB0YXNrIGRlZmluaXRpb24gcmVmZXJlbmNlZCBieSBpZC5cblx0ICovXG5cdHRhc2tEZWZpbml0aW9uSWQodGFza0RlZmluaXRpb25JZDogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gcHJvY2VzcyBkZWZpbml0aW9uIGlkLlxuXHQgKi9cblx0cHJvY2Vzc0RlZmluaXRpb25JZChwcm9jZXNzRGVmaW5pdGlvbklkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgaW5zdGFuY2Ugd2hpY2ggaGFzIHRoZSBnaXZlbiBwcm9jZXNzIGRlZmluaXRpb24gbmFtZS5cblx0ICovXG5cdHByb2Nlc3NEZWZpbml0aW9uTmFtZShwcm9jZXNzRGVmaW5pdGlvbk5hbWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyBpbnN0YW5jZSB3aGljaCBoYXMgYSBwcm9jZXNzIGRlZmluaXRpb24gbmFtZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZS4gVGhlIHN5bnRheCB0aGF0IHNob3VsZCBiZSB1c2VkIGlzIHRoZSBzYW1lIGFzIGluIFNRTCwgZWcuICV0ZXN0JS5cblx0ICovXG5cdHByb2Nlc3NEZWZpbml0aW9uTmFtZUxpa2UocHJvY2Vzc0RlZmluaXRpb25OYW1lTGlrZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdob3NlIGRlZmluaXRpb24gYmVsb25ncyB0byB0aGUgY2F0ZWdvcnkgd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgZ2l2ZW4gbGlzdC5cblx0ICogXG5cdCAqIEB0aHJvd3MgRmxvd2FibGVJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cblx0ICogICAgICAgICAgICAgV2hlbiBwYXNzZWQgY2F0ZWdvcnkgbGlzdCBpcyBlbXB0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBvciBjb250YWlucyA8Y29kZT5udWxsIFN0cmluZzwvY29kZT4uXG5cdCAqIEBwYXJhbSBwcm9jZXNzQ2F0ZWdvcnlJbkxpc3Rcblx0ICovXG5cdHByb2Nlc3NDYXRlZ29yeUluKHByb2Nlc3NDYXRlZ29yeUluTGlzdDogc3RyaW5nW10pOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgaW5zdGFuY2Ugd2hvc2UgZGVmaW5pdGlvbiBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIGNhdGVnb3J5IHdoaWNoIGlzIHByZXNlbnQgaW4gdGhlIGdpdmVuIGxpc3QuXG5cdCAqIFxuXHQgKiBAdGhyb3dzIEZsb3dhYmxlSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXG5cdCAqICAgICAgICAgICAgIFdoZW4gcGFzc2VkIGNhdGVnb3J5IGxpc3QgaXMgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3IgY29udGFpbnMgPGNvZGU+bnVsbCBTdHJpbmc8L2NvZGU+LlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0NhdGVnb3J5Tm90SW5MaXN0XG5cdCAqL1xuXHRwcm9jZXNzQ2F0ZWdvcnlOb3RJbihwcm9jZXNzQ2F0ZWdvcnlOb3RJbkxpc3Q6IHN0cmluZ1tdKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIGluc3RhbmNlIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gZGVwbG95bWVudCBpZC5cblx0ICovXG5cdGRlcGxveW1lbnRJZChkZXBsb3ltZW50SWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyBpbnN0YW5jZSB3aGljaCBoYXMgdGhlIGdpdmVuIGRlcGxveW1lbnQgaWQuXG5cdCAqL1xuXHRkZXBsb3ltZW50SWRJbihkZXBsb3ltZW50SWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSByZWxhdGVkIHRvIGEgY2FzZSBpbnN0YW5jZSBmb3IgdG8gdGhlIGdpdmVuIGRlcGxveW1lbnQgaWQuXG5cdCAqL1xuXHRjbW1uRGVwbG95bWVudElkKGNtbW5EZXBsb3ltZW50SWQ6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSByZWxhdGVkIHRvIGEgY2FzZSBpbnN0YW5jZXMgZm9yIHRoZSBnaXZlbiBkZXBsb3ltZW50IGlkLlxuXHQgKi9cblx0Y21tbkRlcGxveW1lbnRJZEluKGNtbW5EZXBsb3ltZW50SWRzOiBzdHJpbmdbXSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGRvbid0IGhhdmUgYSBzY29wZSBpZCBzZXQuXG5cdCAqL1xuXHR3aXRob3V0U2NvcGVJZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdGFzayB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVWYWx1ZUVxdWFscyh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhdCBsZWFzdCBvbmUgbG9jYWwgdGFzayB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlRXF1YWxzKHZhcmlhYmxlVmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCBzdHJpbmcgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIDxwPlxuXHQgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHlvdXIgZGF0YWJhc2UgaGFzIGVuY29kaW5nL2NvbGxhdGlvbiB0aGF0IHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlIHF1ZXJpZXMuIEZvciBleGFtcGxlLCB1c2UgXCJjb2xsYXRlIFVURi04XCIgb24gTXlTUUwgYW5kIGZvciBNU1NRTCwgc2VsZWN0IG9uZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmVcblx0ICogQ29sbGF0aW9ucyBhdmFpbGFibGUgKDxhIGhyZWY9XCJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTAodj1zcWwuMTA1KS5hc3B4XCIgPk1TRE4gU2VydmVyIENvbGxhdGlvbiBSZWZlcmVuY2U8L2E+KS5cblx0ICogPC9wPlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlVmFsdWVFcXVhbHNJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB0YXNrIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIHRoYW4gdGhlIHBhc3NlZCB2YWx1ZS4gQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlXG5cdCAqIHR5cGUgd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlVmFsdWVOb3RFcXVhbHModmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCBzdHJpbmcgdmFyaWFibGUgd2l0aCBpcyBub3QgdGhlIGdpdmVuIHZhbHVlLCBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiA8cD5cblx0ICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB5b3VyIGRhdGFiYXNlIGhhcyBlbmNvZGluZy9jb2xsYXRpb24gdGhhdCBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZSBxdWVyaWVzLiBGb3IgZXhhbXBsZSwgdXNlIFwiY29sbGF0ZSBVVEYtOFwiIG9uIE15U1FMIGFuZCBmb3IgTVNTUUwsIHNlbGVjdCBvbmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlXG5cdCAqIENvbGxhdGlvbnMgYXZhaWxhYmxlICg8YSBocmVmPVwiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjUwKHY9c3FsLjEwNSkuYXNweFwiID5NU0ROIFNlcnZlciBDb2xsYXRpb24gUmVmZXJlbmNlPC9hPikuXG5cdCAqIDwvcD5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlTm90RXF1YWxzSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdmFyaWFibGUgdmFsdWUgZ3JlYXRlciB0aGFuIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGUgd3JhcHBlcnMpXG5cdCAqIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmVcblx0ICogdHlwZSB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlR3JlYXRlclRoYW5PckVxdWFsKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBsZXNzIHRoYW4gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZSBlbmRlZC5Cb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGUgd3JhcHBlcnMpIGFyZVxuXHQgKiBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVWYWx1ZUxlc3NUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZVxuXHQgKiB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlTGVzc1RoYW5PckVxdWFsKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBsb2NhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIFRoaXMgY2FuIGJlIHVzZWQgb24gc3RyaW5nIHZhcmlhYmxlcyBvbmx5LlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuIFRoZSBzdHJpbmcgY2FuIGluY2x1ZGUgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciAnJScgdG8gZXhwcmVzcyBsaWtlLXN0cmF0ZWd5OiBzdGFydHMgd2l0aCAoc3RyaW5nJSksIGVuZHMgd2l0aCAoJXN0cmluZykgb3IgY29udGFpbnMgKCVzdHJpbmclKS5cblx0ICovXG5cdHRhc2tWYXJpYWJsZVZhbHVlTGlrZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdmFyaWFibGUgdmFsdWUgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUgKGNhc2UgaW5zZW5zaXRpdmUpIHdoZW4gdGhleSBlbmRlZC4gVGhpcyBjYW4gYmUgdXNlZCBvbiBzdHJpbmcgdmFyaWFibGVzIG9ubHkuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC4gVGhlIHN0cmluZyBjYW4gaW5jbHVkZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyICclJyB0byBleHByZXNzIGxpa2Utc3RyYXRlZ3k6IHN0YXJ0cyB3aXRoIChzdHJpbmclKSwgZW5kcyB3aXRoICglc3RyaW5nKSBvciBjb250YWlucyAoJXN0cmluZyUpLlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlVmFsdWVMaWtlSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgbG9jYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHR0YXNrVmFyaWFibGVFeGlzdHMobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIGxvY2FsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKi9cblx0dGFza1ZhcmlhYmxlTm90RXhpc3RzKG5hbWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgcHJvY2VzcyB0aGF0IGhhcyBhIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUgc2V0IHRvIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlRXF1YWxzKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YXJpYWJsZVZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgdGhhdCBoYXMgYXQgbGVhc3Qgb25lIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIHZhbHVlLlxuXHQgKi9cblx0cHJvY2Vzc1ZhcmlhYmxlVmFsdWVFcXVhbHModmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBwcm9jZXNzIHRoYXQgaGFzIGEgbG9jYWwgc3RyaW5nIHZhcmlhYmxlIHdoaWNoIGlzIG5vdCB0aGUgZ2l2ZW4gdmFsdWUsIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIDxwPlxuXHQgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHlvdXIgZGF0YWJhc2UgaGFzIGVuY29kaW5nL2NvbGxhdGlvbiB0aGF0IHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlIHF1ZXJpZXMuIEZvciBleGFtcGxlLCB1c2UgXCJjb2xsYXRlIFVURi04XCIgb24gTXlTUUwgYW5kIGZvciBNU1NRTCwgc2VsZWN0IG9uZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmVcblx0ICogQ29sbGF0aW9ucyBhdmFpbGFibGUgKDxhIGhyZWY9XCJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTAodj1zcWwuMTA1KS5hc3B4XCIgPk1TRE4gU2VydmVyIENvbGxhdGlvbiBSZWZlcmVuY2U8L2E+KS5cblx0ICogPC9wPlxuXHQgKi9cblx0cHJvY2Vzc1ZhcmlhYmxlVmFsdWVFcXVhbHNJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBidXQgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSB0aGFuIHRoZSBwYXNzZWQgdmFsdWUuIEJ5dGUtYXJyYXlzIGFuZCB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3RzICh3aGljaCBhcmUgbm90IHByaW1pdGl2ZSB0eXBlXG5cdCAqIHdyYXBwZXJzKSBhcmUgbm90IHN1cHBvcnRlZC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlTm90RXF1YWxzKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YXJpYWJsZVZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIHByb2Nlc3MgdGhhdCBoYXMgYSBzdHJpbmcgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGNhc2UgaW5zZW5zaXRpdmUuXG5cdCAqIDxwPlxuXHQgKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHlvdXIgZGF0YWJhc2UgaGFzIGVuY29kaW5nL2NvbGxhdGlvbiB0aGF0IHN1cHBvcnRzIGNhc2Utc2Vuc2l0aXZlIHF1ZXJpZXMuIEZvciBleGFtcGxlLCB1c2UgXCJjb2xsYXRlIFVURi04XCIgb24gTXlTUUwgYW5kIGZvciBNU1NRTCwgc2VsZWN0IG9uZSBvZiB0aGUgY2FzZS1zZW5zaXRpdmVcblx0ICogQ29sbGF0aW9ucyBhdmFpbGFibGUgKDxhIGhyZWY9XCJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTAodj1zcWwuMTA1KS5hc3B4XCIgPk1TRE4gU2VydmVyIENvbGxhdGlvbiBSZWZlcmVuY2U8L2E+KS5cblx0ICogPC9wPlxuXHQgKi9cblx0cHJvY2Vzc1ZhcmlhYmxlVmFsdWVOb3RFcXVhbHNJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgZ3JlYXRlciB0aGFuIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGVcblx0ICogd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlXG5cdCAqIHR5cGUgd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuT3JFcXVhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHZhbHVlIGxlc3MgdGhhbiB0aGUgcGFzc2VkIHZhbHVlIHdoZW4gdGhlIGVuZGVkLkJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZSB3cmFwcGVycykgYXJlXG5cdCAqIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlTGVzc1RoYW4obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZVxuXHQgKiB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZVZhbHVlTGVzc1RoYW5PckVxdWFsKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgbGlrZSB0aGUgZ2l2ZW4gdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBUaGlzIGNhbiBiZSB1c2VkIG9uIHN0cmluZyB2YXJpYWJsZXMgb25seS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLiBUaGUgc3RyaW5nIGNhbiBpbmNsdWRlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgJyUnIHRvIGV4cHJlc3MgbGlrZS1zdHJhdGVneTogc3RhcnRzIHdpdGggKHN0cmluZyUpLCBlbmRzIHdpdGggKCVzdHJpbmcpIG9yIGNvbnRhaW5zICglc3RyaW5nJSkuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUxpa2UobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSAoY2FzZSBpbnNlbnNpdGl2ZSkgd2hlbiB0aGV5IGVuZGVkLiBUaGlzIGNhbiBiZSB1c2VkIG9uIHN0cmluZyB2YXJpYWJsZXMgb25seS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLiBUaGUgc3RyaW5nIGNhbiBpbmNsdWRlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgJyUnIHRvIGV4cHJlc3MgbGlrZS1zdHJhdGVneTogc3RhcnRzIHdpdGggKHN0cmluZyUpLCBlbmRzIHdpdGggKCVzdHJpbmcpIG9yIGNvbnRhaW5zICglc3RyaW5nJSkuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVWYWx1ZUxpa2VJZ25vcmVDYXNlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICogXG5cdCAqIEBwYXJhbSBuYW1lXG5cdCAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRwcm9jZXNzVmFyaWFibGVFeGlzdHMobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuXHQgKiBcblx0ICogQHBhcmFtIG5hbWVcblx0ICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdHByb2Nlc3NWYXJpYWJsZU5vdEV4aXN0cyhuYW1lOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBhcmUgcGFydCBvZiBhIGNhc2UgdGhhdCBoYXMgYSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUVxdWFscyh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBjYXNlIHRoYXQgaGFzIGF0IGxlYXN0IG9uZSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlRXF1YWxzKHZhcmlhYmxlVmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGFyZSBwYXJ0IG9mIGEgY2FzZSB0aGF0IGhhcyBhIGxvY2FsIHN0cmluZyB2YXJpYWJsZSB3aGljaCBpcyBub3QgdGhlIGdpdmVuIHZhbHVlLCBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiA8cD5cblx0ICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB5b3VyIGRhdGFiYXNlIGhhcyBlbmNvZGluZy9jb2xsYXRpb24gdGhhdCBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZSBxdWVyaWVzLiBGb3IgZXhhbXBsZSwgdXNlIFwiY29sbGF0ZSBVVEYtOFwiIG9uIE15U1FMIGFuZCBmb3IgTVNTUUwsIHNlbGVjdCBvbmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlXG5cdCAqIENvbGxhdGlvbnMgYXZhaWxhYmxlICg8YSBocmVmPVwiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjUwKHY9c3FsLjEwNSkuYXNweFwiID5NU0ROIFNlcnZlciBDb2xsYXRpb24gUmVmZXJlbmNlPC9hPikuXG5cdCAqIDwvcD5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlRXF1YWxzSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgYnV0IHdpdGggYSBkaWZmZXJlbnQgdmFsdWUgdGhhbiB0aGUgcGFzc2VkIHZhbHVlLiBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZVxuXHQgKiB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZU5vdEVxdWFscyh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggYXJlIHBhcnQgb2YgYSBjYXNlIHRoYXQgaGFzIGEgc3RyaW5nIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIHZhbHVlLCBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKiA8cD5cblx0ICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB5b3VyIGRhdGFiYXNlIGhhcyBlbmNvZGluZy9jb2xsYXRpb24gdGhhdCBzdXBwb3J0cyBjYXNlLXNlbnNpdGl2ZSBxdWVyaWVzLiBGb3IgZXhhbXBsZSwgdXNlIFwiY29sbGF0ZSBVVEYtOFwiIG9uIE15U1FMIGFuZCBmb3IgTVNTUUwsIHNlbGVjdCBvbmUgb2YgdGhlIGNhc2Utc2Vuc2l0aXZlXG5cdCAqIENvbGxhdGlvbnMgYXZhaWxhYmxlICg8YSBocmVmPVwiaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjUwKHY9c3FsLjEwNSkuYXNweFwiID5NU0ROIFNlcnZlciBDb2xsYXRpb24gUmVmZXJlbmNlPC9hPikuXG5cdCAqIDwvcD5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlTm90RXF1YWxzSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgcGFzc2VkIHZhbHVlIHdoZW4gdGhleSBlbmRlZC4gQm9vbGVhbnMsIEJ5dGUtYXJyYXlzIGFuZCB7QGxpbmsgU2VyaWFsaXphYmxlfSBvYmplY3RzICh3aGljaCBhcmUgbm90IHByaW1pdGl2ZSB0eXBlXG5cdCAqIHdyYXBwZXJzKSBhcmUgbm90IHN1cHBvcnRlZC5cblx0ICpcblx0ICogQHBhcmFtIG5hbWUgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZSBjYW5ub3QgYmUgbnVsbC5cblx0ICovXG5cdGNhc2VWYXJpYWJsZVZhbHVlR3JlYXRlclRoYW4obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBhc3NlZCB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIEJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmVcblx0ICogdHlwZSB3cmFwcGVycykgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWUgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUdyZWF0ZXJUaGFuT3JFcXVhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHZhbHVlIGxlc3MgdGhhbiB0aGUgcGFzc2VkIHZhbHVlIHdoZW4gdGhlIGVuZGVkLkJvb2xlYW5zLCBCeXRlLWFycmF5cyBhbmQge0BsaW5rIFNlcmlhbGl6YWJsZX0gb2JqZWN0cyAod2hpY2ggYXJlIG5vdCBwcmltaXRpdmUgdHlwZSB3cmFwcGVycykgYXJlXG5cdCAqIG5vdCBzdXBwb3J0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIGNhbm5vdCBiZSBudWxsLlxuXHQgKiBAcGFyYW0gdmFsdWUgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUxlc3NUaGFuKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwYXNzZWQgdmFsdWUgd2hlbiB0aGV5IGVuZGVkLiBCb29sZWFucywgQnl0ZS1hcnJheXMgYW5kIHtAbGluayBTZXJpYWxpemFibGV9IG9iamVjdHMgKHdoaWNoIGFyZSBub3QgcHJpbWl0aXZlIHR5cGVcblx0ICogd3JhcHBlcnMpIGFyZSBub3Qgc3VwcG9ydGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gbmFtZSBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlIGNhbm5vdCBiZSBudWxsLlxuXHQgKi9cblx0Y2FzZVZhcmlhYmxlVmFsdWVMZXNzVGhhbk9yRXF1YWwobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSB3aGVuIHRoZXkgZW5kZWQuIFRoaXMgY2FuIGJlIHVzZWQgb24gc3RyaW5nIHZhcmlhYmxlcyBvbmx5LlxuXHQgKlxuXHQgKiBAcGFyYW0gbmFtZSBjYW5ub3QgYmUgbnVsbC5cblx0ICogQHBhcmFtIHZhbHVlIGNhbm5vdCBiZSBudWxsLiBUaGUgc3RyaW5nIGNhbiBpbmNsdWRlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgJyUnIHRvIGV4cHJlc3MgbGlrZS1zdHJhdGVneTogc3RhcnRzIHdpdGggKHN0cmluZyUpLCBlbmRzIHdpdGggKCVzdHJpbmcpIG9yIGNvbnRhaW5zICglc3RyaW5nJSkuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVWYWx1ZUxpa2UobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3QgdGFza3Mgd2hpY2ggaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSB2YWx1ZSBsaWtlIHRoZSBnaXZlbiB2YWx1ZSAoY2FzZSBpbnNlbnNpdGl2ZSkgd2hlbiB0aGV5IGVuZGVkLiBUaGlzIGNhbiBiZSB1c2VkIG9uIHN0cmluZyB2YXJpYWJsZXMgb25seS5cblx0ICpcblx0ICogQHBhcmFtIG5hbWUgY2Fubm90IGJlIG51bGwuXG5cdCAqIEBwYXJhbSB2YWx1ZSBjYW5ub3QgYmUgbnVsbC4gVGhlIHN0cmluZyBjYW4gaW5jbHVkZSB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyICclJyB0byBleHByZXNzIGxpa2Utc3RyYXRlZ3k6IHN0YXJ0cyB3aXRoIChzdHJpbmclKSwgZW5kcyB3aXRoICglc3RyaW5nKSBvciBjb250YWlucyAoJXN0cmluZyUpLlxuXHQgKi9cblx0Y2FzZVZhcmlhYmxlVmFsdWVMaWtlSWdub3JlQ2FzZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdCB0YXNrcyB3aGljaCBoYXZlIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIGNhbm5vdCBiZSBudWxsLlxuXHQgKi9cblx0Y2FzZVZhcmlhYmxlRXhpc3RzKG5hbWU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIE9ubHkgc2VsZWN0IHRhc2tzIHdoaWNoIGRvZXMgbm90IGhhdmUgYSBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIG5hbWUgY2Fubm90IGJlIG51bGwuXG5cdCAqL1xuXHRjYXNlVmFyaWFibGVOb3RFeGlzdHMobmFtZTogc3RyaW5nKTogVDtcblxuXHQvKipcblx0ICogT25seSBzZWxlY3RzIHRhc2tzIHdoaWNoIHdpdGggdGhlIGdpdmVuIHJvb3Qgc2NvcGUgaWRcblx0ICovXG5cdHRhc2tSb290U2NvcGVJZChwYXJlbnRTY29wZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBPbmx5IHNlbGVjdHMgdGFza3Mgd2hpY2ggd2l0aCB0aGUgZ2l2ZW4gcGFyZW50IHNjb3BlIGlkXG5cdCAqL1xuXHR0YXNrUGFyZW50U2NvcGVJZChwYXJlbnRTY29wZUlkOiBzdHJpbmcpOiBUO1xuXG5cdC8qKlxuXHQgKiBJbmNsdWRlIGxvY2FsIHRhc2sgdmFyaWFibGVzIGluIHRoZSB0YXNrIHF1ZXJ5IHJlc3VsdFxuXHQgKi9cblx0aW5jbHVkZVRhc2tMb2NhbFZhcmlhYmxlcygpOiBUO1xuXG5cdC8qKlxuXHQgKiBJbmNsdWRlIGdsb2JhbCBwcm9jZXNzIHZhcmlhYmxlcyBpbiB0aGUgdGFzayBxdWVyeSByZXN1bHRcblx0ICovXG5cdGluY2x1ZGVQcm9jZXNzVmFyaWFibGVzKCk6IFQ7XG5cblx0LyoqXG5cdCAqIEluY2x1ZGUgZ2xvYmFsIGNhc2UgdmFyaWFibGVzIGluIHRoZSB0YXNrIHF1ZXJ5IHJlc3VsdFxuXHQgKi9cblx0aW5jbHVkZUNhc2VWYXJpYWJsZXMoKTogVDtcblxuXHQvKipcblx0ICogSW5jbHVkZSBpZGVudGl0eSBsaW5rcyBpbiB0aGUgdGFzayBxdWVyeSByZXN1bHRcblx0ICovXG5cdGluY2x1ZGVJZGVudGl0eUxpbmtzKCk6IFQ7XG5cblx0LyoqXG5cdCAqIExvY2FsaXplIHRhc2sgbmFtZSBhbmQgZGVzY3JpcHRpb24gdG8gc3BlY2lmaWVkIGxvY2FsZS5cblx0ICovXG5cdGxvY2FsZShsb2NhbGU6IHN0cmluZyk6IFQ7XG5cblx0LyoqXG5cdCAqIEluc3RydWN0IGxvY2FsaXphdGlvbiB0byBmYWxsYmFjayB0byBtb3JlIGdlbmVyYWwgbG9jYWxlcyBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgbG9jYWxlIG9mIHRoZSBKVk0gaWYgdGhlIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLlxuXHQgKi9cblx0d2l0aExvY2FsaXphdGlvbkZhbGxiYWNrKCk6IFQ7XG5cblx0LyoqXG5cdCAqIEFsbCBxdWVyeSBjbGF1c2VzIGNhbGxlZCB3aWxsIGJlIGFkZGVkIHRvIGEgc2luZ2xlIG9yLXN0YXRlbWVudC4gVGhpcyBvci1zdGF0ZW1lbnQgd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBvdGhlciBhbHJlYWR5IGV4aXN0aW5nIGNsYXVzZXMgaW4gdGhlIHF1ZXJ5LCBqb2luZWQgYnkgYW4gJ2FuZCcuXG5cdCAqIDxwPlxuXHQgKiBDYWxsaW5nIGVuZE9yKCkgd2lsbCBhZGQgYWxsIGNsYXVzZXMgdG8gdGhlIHJlZ3VsYXIgcXVlcnkgYWdhaW4uIENhbGxpbmcgb3IoKSBhZnRlciBvcigpIGhhcyBiZWVuIGNhbGxlZCBvciBjYWxsaW5nIGVuZE9yKCkgYWZ0ZXIgZW5kT3IoKSBoYXMgYmVlbiBjYWxsZWQgd2lsbCByZXN1bHQgaW4gYW4gZXhjZXB0aW9uLlxuXHQgKiBJdCBpcyBwb3NzaWJsZSB0byBjYWxsIG9yKCkgZW5kT3IoKSBzZXZlcmFsIHRpbWVzIGlmIGVhY2ggb3IoKSBoYXMgYSBtYXRjaGluZyBlbmRPcigpLCBlLmcuOlxuXHQgKiA8L3A+XG5cdCAqIHtAY29kZSBxdWVyeS48Q29uZGl0aW9uQT59XG5cdCAqIHtAY29kZSAgLm9yKCkuPGNvbmRpdGlvbkI+Ljxjb25kaXRpb25DPi5lbmRPcigpfVxuXHQgKiB7QGNvZGUgIC48Y29uZGl0aW9uRD4uPGNvbmRpdGlvbkU+fVxuXHQgKiB7QGNvZGUgIC5vcigpLjxjb25kaXRpb25GPi48Y29uZGl0aW9uRz4uZW5kT3IoKX1cblx0ICogPHA+XG5cdCAqIHdpbGwgcmVzdWx0IGluOiBjb25kaXRpb25BICZhbXA7IChjb25kaXRpb25CIHwgY29uZGl0aW9uQykgJmFtcDsgY29uZGl0aW9uRCAmYW1wOyBjb25kaXRpb25FICZhbXA7IChjb25kaXRpb25GIHwgY29uZGl0aW9uRylcblx0ICovXG5cdG9yKCk6IFQ7XG5cblx0ZW5kT3IoKTogVDtcblxuXHQvLyBPUkRFUklOR1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSB0YXNrIGlkIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRhc2tJZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSB0YXNrIG5hbWUgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza05hbWUoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgZGVzY3JpcHRpb24gKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza0Rlc2NyaXB0aW9uKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IHByaW9yaXR5IChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRhc2tQcmlvcml0eSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSBhc3NpZ25lZSAobmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkge0BsaW5rICNhc2MoKX0gb3Ige0BsaW5rICNkZXNjKCl9KS5cblx0ICovXG5cdG9yZGVyQnlUYXNrQXNzaWduZWUoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgdGhlIHRpbWUgb24gd2hpY2ggdGhlIHRhc2tzIHdlcmUgY3JlYXRlZCAobmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkge0BsaW5rICNhc2MoKX0gb3Ige0BsaW5rICNkZXNjKCl9KS5cblx0ICovXG5cdG9yZGVyQnlUYXNrQ3JlYXRlVGltZSgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSBwcm9jZXNzIGluc3RhbmNlIGlkIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVByb2Nlc3NJbnN0YW5jZUlkKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IGV4ZWN1dGlvbiBpZCAobmVlZHMgdG8gYmUgZm9sbG93ZWQgYnkge0BsaW5rICNhc2MoKX0gb3Ige0BsaW5rICNkZXNjKCl9KS5cblx0ICovXG5cdG9yZGVyQnlFeGVjdXRpb25JZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSBwcm9jZXNzIGRlZmluaXRpb24gaWQgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5UHJvY2Vzc0RlZmluaXRpb25JZCgpOiBUO1xuXG5cdC8qKlxuXHQgKiBPcmRlciBieSB0YXNrIGR1ZSBkYXRlIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRhc2tEdWVEYXRlKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IHRhc2sgb3duZXIgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza093bmVyKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IHRhc2sgZGVmaW5pdGlvbiBrZXkgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5VGFza0RlZmluaXRpb25LZXkoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgdGVuYW50IGlkIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLlxuXHQgKi9cblx0b3JkZXJCeVRlbmFudElkKCk6IFQ7XG5cblx0LyoqXG5cdCAqIE9yZGVyIGJ5IGR1ZSBkYXRlIChuZWVkcyB0byBiZSBmb2xsb3dlZCBieSB7QGxpbmsgI2FzYygpfSBvciB7QGxpbmsgI2Rlc2MoKX0pLiBJZiBhbnkgb2YgdGhlIHRhc2tzIGhhdmUgbnVsbCBmb3IgdGhlIGR1ZSBkYXRlLCB0aGVzZSB3aWxsIGJlIGZpcnN0IGluIHRoZSByZXN1bHQuXG5cdCAqL1xuXHRvcmRlckJ5RHVlRGF0ZU51bGxzRmlyc3QoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgZHVlIGRhdGUgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuIElmIGFueSBvZiB0aGUgdGFza3MgaGF2ZSBudWxsIGZvciB0aGUgZHVlIGRhdGUsIHRoZXNlIHdpbGwgYmUgbGFzdCBpbiB0aGUgcmVzdWx0LlxuXHQgKi9cblx0b3JkZXJCeUR1ZURhdGVOdWxsc0xhc3QoKTogVDtcblxuXHQvKipcblx0ICogT3JkZXIgYnkgY2F0ZWdvcnkgKG5lZWRzIHRvIGJlIGZvbGxvd2VkIGJ5IHtAbGluayAjYXNjKCl9IG9yIHtAbGluayAjZGVzYygpfSkuXG5cdCAqL1xuXHRvcmRlckJ5Q2F0ZWdvcnkoKTogVDtcblxufVxuXG4vLyBAdHMtaWdub3JlXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0Ly8gQHRzLWlnbm9yZVxuXHRtb2R1bGUuZXhwb3J0cyA9IFRhc2tzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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ZUFBZTtBQUFBLEVBQ2pDO0FBQUEsRUFFTyx1QkFBMkM7QUFDakQsV0FBTyxLQUFLLEtBQUsscUJBQXFCO0FBQUEsRUFDdkM7QUFBQSxFQUVPLHlCQUE2QztBQUNuRCxXQUFPLEtBQUssS0FBSyx1QkFBdUI7QUFBQSxFQUN6QztBQUFBLEVBRU8sYUFBaUM7QUFDdkMsV0FBTyxLQUFLLEtBQUssV0FBVztBQUFBLEVBQzdCO0FBQUEsRUFFTyxnQkFBb0M7QUFDMUMsV0FBTyxLQUFLLEtBQUssY0FBYztBQUFBLEVBQ2hDO0FBQUEsRUFFTyxlQUFtQztBQUN6QyxXQUFPLEtBQUssS0FBSyxhQUFhO0FBQUEsRUFDL0I7QUFBQSxFQUVPLHVCQUEyQztBQUNqRCxXQUFPLEtBQUssS0FBSyxxQkFBcUI7QUFBQSxFQUN2QztBQUFBLEVBRU8sdUJBQTJDO0FBQ2pELFdBQU8sS0FBSyxLQUFLLHFCQUFxQjtBQUFBLEVBQ3ZDO0FBQUEsRUFFTyxhQUFpQztBQUN2QyxXQUFPLEtBQUssS0FBSyxXQUFXO0FBQUEsRUFDN0I7QUFBQSxFQUVPLFlBQXFCO0FBQzNCLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFDbEI7QUFBQSxFQUVPLGFBQXNCO0FBQzVCLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFDbEI7QUFBQSxFQUVPLGlCQUEwQjtBQUNoQyxXQUFPLEtBQUssS0FBSztBQUFBLEVBQ2xCO0FBQUEsRUFFTyxtQkFBMkI7QUFDakMsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUNsQjtBQUFBLEVBRU8sdUJBQStCO0FBQ3JDLFdBQU8sS0FBSyxLQUFLO0FBQUEsRUFDbEI7QUFBQSxFQUVPLGVBQWlDO0FBQ3ZDLFdBQU8sS0FBSyxLQUFLLGFBQWE7QUFBQSxFQUMvQjtBQUFBLEVBRU8sY0FBc0I7QUFDNUIsV0FBTyxLQUFLLEtBQUs7QUFBQSxFQUNsQjtBQUFBLEVBRU8sZUFBbUM7QUFDekMsV0FBTyxLQUFLLEtBQUssYUFBYTtBQUFBLEVBQy9CO0FBQUEsRUFFTyxvQkFBd0M7QUFDOUMsV0FBTyxLQUFLLEtBQUssa0JBQWtCO0FBQUEsRUFDcEM7QUFBQSxFQUVPLGlCQUEwQjtBQUNoQyxXQUFPLEtBQUssS0FBSztBQUFBLEVBQ2xCO0FBQ0Q7QUFvUU8sSUFBSyxrQkFBTCxrQkFBS0EscUJBQUw7QUFNTixFQUFBQSxrQ0FBQTtBQUtBLEVBQUFBLGtDQUFBO0FBWFcsU0FBQUE7QUFBQSxHQUFBO0FBaWRMLElBQUssc0JBQUwsa0JBQUtDLHlCQUFMO0FBQ04sRUFBQUEsMENBQUE7QUFBYSxFQUFBQSwwQ0FBQTtBQURGLFNBQUFBO0FBQUEsR0FBQTtBQWtpQ1osSUFBSSxPQUFPLFdBQVcsYUFBYTtBQUVsQyxTQUFPLFVBQVU7QUFDbEI7IiwKICAibmFtZXMiOiBbIkRlbGVnYXRpb25TdGF0ZSIsICJOdWxsSGFuZGxpbmdPbk9yZGVyIl0KfQo=