@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,885 @@
1
+ import { Bytes } from "@aerokit/sdk/io/bytes";
2
+ const DatabaseFacade = Java.type("org.eclipse.dirigible.components.api.db.DatabaseFacade");
3
+ const DatabaseResultSetHelper = Java.type("org.eclipse.dirigible.components.data.management.helpers.DatabaseResultSetHelper");
4
+ const JSqlDate = Java.type("java.sql.Date");
5
+ const JSqlTimestamp = Java.type("java.sql.Timestamp");
6
+ const JSqlTime = Java.type("java.sql.Time");
7
+ const StringWriter = Java.type("java.io.StringWriter");
8
+ const WriterOutputStream = Java.type("org.apache.commons.io.output.WriterOutputStream");
9
+ const StandardCharsets = Java.type("java.nio.charset.StandardCharsets");
10
+ const SQLTypes = Object.freeze({
11
+ "BOOLEAN": 16,
12
+ "DATE": 91,
13
+ "TIME": 92,
14
+ "TIMESTAMP": 93,
15
+ "DOUBLE": 8,
16
+ "FLOAT": 6,
17
+ "REAL": 7,
18
+ "TINYINT": -6,
19
+ "SMALLINT": 5,
20
+ "INTEGER": 4,
21
+ "BIGINT": -5,
22
+ "VARCHAR": 12,
23
+ "CHAR": 1,
24
+ "CLOB": 2005,
25
+ "BLOB": 2004,
26
+ "VARBINARY": -3,
27
+ "DECIMAL": 3,
28
+ "ARRAY": 2003,
29
+ "NVARCHAR": -9,
30
+ "NCLOB": 2011,
31
+ "BIT": -7
32
+ });
33
+ var DatabaseSystem = /* @__PURE__ */ ((DatabaseSystem2) => {
34
+ DatabaseSystem2[DatabaseSystem2["UNKNOWN"] = 0] = "UNKNOWN";
35
+ DatabaseSystem2[DatabaseSystem2["DERBY"] = 1] = "DERBY";
36
+ DatabaseSystem2[DatabaseSystem2["POSTGRESQL"] = 2] = "POSTGRESQL";
37
+ DatabaseSystem2[DatabaseSystem2["H2"] = 3] = "H2";
38
+ DatabaseSystem2[DatabaseSystem2["MARIADB"] = 4] = "MARIADB";
39
+ DatabaseSystem2[DatabaseSystem2["HANA"] = 5] = "HANA";
40
+ DatabaseSystem2[DatabaseSystem2["SNOWFLAKE"] = 6] = "SNOWFLAKE";
41
+ DatabaseSystem2[DatabaseSystem2["MYSQL"] = 7] = "MYSQL";
42
+ DatabaseSystem2[DatabaseSystem2["MONGODB"] = 8] = "MONGODB";
43
+ DatabaseSystem2[DatabaseSystem2["SYBASE"] = 9] = "SYBASE";
44
+ return DatabaseSystem2;
45
+ })(DatabaseSystem || {});
46
+ function isHanaDatabase(connection) {
47
+ let isHanaDatabase2 = false;
48
+ let metadata = connection.getMetaData();
49
+ if (metadata !== null && metadata !== void 0) {
50
+ isHanaDatabase2 = metadata.getDatabaseProductName() === "HDB";
51
+ }
52
+ return isHanaDatabase2;
53
+ }
54
+ function readClobValue(value) {
55
+ return value ? value.getSubString(1, value.length()) : value;
56
+ }
57
+ function createClobValue(native, value) {
58
+ try {
59
+ let connection = native.getConnection();
60
+ if (connection === null || connection === void 0) {
61
+ throw new Error("Can't create new 'Clob' value as the connection is null");
62
+ }
63
+ let clob = null;
64
+ if (isHanaDatabase(connection)) {
65
+ let ps = null;
66
+ try {
67
+ ps = connection.prepareStatement("SELECT TO_CLOB (?) FROM DUMMY;");
68
+ ps.setString(1, value);
69
+ let rs = ps.executeQuery();
70
+ if (rs.next()) {
71
+ clob = rs.getClob(1);
72
+ }
73
+ } finally {
74
+ if (ps !== null && ps !== void 0) {
75
+ ps.close();
76
+ }
77
+ }
78
+ } else {
79
+ clob = connection.createClob();
80
+ clob.setString(1, value);
81
+ }
82
+ return clob;
83
+ } catch (e) {
84
+ throw new Error(`Error occured during creation of 'Clob' value: ${e.message}`);
85
+ }
86
+ }
87
+ function readNClobValue(value) {
88
+ return value ? value.getSubString(1, value.length()) : value;
89
+ }
90
+ function createNClobValue(native, value) {
91
+ try {
92
+ let connection = native.getConnection();
93
+ if (connection === null || connection === void 0) {
94
+ throw new Error("Can't create new 'NClob' value as the connection is null");
95
+ }
96
+ let nclob = null;
97
+ if (isHanaDatabase(connection)) {
98
+ let ps = null;
99
+ try {
100
+ ps = connection.prepareStatement("SELECT TO_NCLOB (?) FROM DUMMY;");
101
+ ps.setString(1, value);
102
+ let rs = ps.executeQuery();
103
+ if (rs.next()) {
104
+ nclob = rs.getNClob(1);
105
+ }
106
+ } finally {
107
+ if (ps !== null && ps !== void 0) {
108
+ ps.close();
109
+ }
110
+ }
111
+ } else {
112
+ nclob = connection.createNClob();
113
+ nclob.setString(1, value);
114
+ }
115
+ return nclob;
116
+ } catch (e) {
117
+ throw new Error(`Error occured during creation of 'NClob' value: ${e.message}`);
118
+ }
119
+ }
120
+ function createBlobValue(native, value) {
121
+ try {
122
+ let connection = native.getConnection();
123
+ if (connection === null || connection === void 0) {
124
+ throw new Error("Can't create new 'Blob' value as the connection is null");
125
+ }
126
+ let blob = null;
127
+ if (isHanaDatabase(connection)) {
128
+ let ps = null;
129
+ try {
130
+ ps = connection.prepareStatement("SELECT TO_BLOB (?) FROM DUMMY;");
131
+ ps.setBytes(1, value);
132
+ let rs = ps.executeQuery();
133
+ if (rs.next()) {
134
+ blob = rs.getBlob(1);
135
+ }
136
+ } finally {
137
+ if (ps !== null && ps !== void 0) {
138
+ ps.close();
139
+ }
140
+ }
141
+ } else {
142
+ blob = connection.createBlob();
143
+ blob.setBytes(1, value);
144
+ }
145
+ return blob;
146
+ } catch (e) {
147
+ throw new Error(`Error occured during creation of 'Clob' value: ${e.message}`);
148
+ }
149
+ }
150
+ function getDateValue(value) {
151
+ if (typeof value === "string") {
152
+ return new Date(value);
153
+ }
154
+ return value;
155
+ }
156
+ class PreparedStatement {
157
+ constructor(native) {
158
+ this.native = native;
159
+ }
160
+ close() {
161
+ this.native.close();
162
+ }
163
+ getResultSet() {
164
+ return new ResultSet(this.native.getResultSet());
165
+ }
166
+ execute() {
167
+ return this.native.execute();
168
+ }
169
+ executeQuery() {
170
+ return new ResultSet(this.native.executeQuery());
171
+ }
172
+ executeUpdate() {
173
+ return this.native.executeUpdate();
174
+ }
175
+ setNull(index, sqlType) {
176
+ this.native.setNull(index, sqlType);
177
+ }
178
+ setBinaryStream(parameterIndex, inputStream, length) {
179
+ if (length) {
180
+ this.native.setBinaryStream(parameterIndex, inputStream, length);
181
+ } else {
182
+ this.native.setBinaryStream(parameterIndex, inputStream);
183
+ }
184
+ }
185
+ setBoolean(index, value) {
186
+ if (value !== null && value !== void 0) {
187
+ this.native.setBoolean(index, value);
188
+ } else {
189
+ this.setNull(index, SQLTypes.BOOLEAN);
190
+ }
191
+ }
192
+ setByte(index, value) {
193
+ if (value !== null && value !== void 0) {
194
+ this.native.setByte(index, value);
195
+ } else {
196
+ this.setNull(index, SQLTypes.TINYINT);
197
+ }
198
+ }
199
+ setBlob(index, value) {
200
+ if (value !== null && value !== void 0) {
201
+ let blob = createBlobValue(this.native, value);
202
+ this.native.setBlob(index, blob);
203
+ } else {
204
+ this.setNull(index, SQLTypes.BLOB);
205
+ }
206
+ }
207
+ setClob(index, value) {
208
+ if (value !== null && value !== void 0) {
209
+ let clob = createClobValue(this.native, value);
210
+ this.native.setClob(index, clob);
211
+ } else {
212
+ this.setNull(index, SQLTypes.CLOB);
213
+ }
214
+ }
215
+ setNClob(index, value) {
216
+ if (value !== null && value !== void 0) {
217
+ let nclob = createNClobValue(this.native, value);
218
+ this.native.setNClob(index, nclob);
219
+ } else {
220
+ this.setNull(index, SQLTypes.NCLOB);
221
+ }
222
+ }
223
+ setBytesNative(index, value) {
224
+ if (value !== null && value !== void 0) {
225
+ this.native.setBytes(index, value);
226
+ } else {
227
+ this.setNull(index, SQLTypes.VARBINARY);
228
+ }
229
+ }
230
+ setBytes(index, value) {
231
+ if (value !== null && value !== void 0) {
232
+ var data = Bytes.toJavaBytes(value);
233
+ this.native.setBytes(index, data);
234
+ } else {
235
+ this.setNull(index, SQLTypes.VARBINARY);
236
+ }
237
+ }
238
+ setDate(index, value) {
239
+ if (value !== null && value !== void 0) {
240
+ const date = getDateValue(value);
241
+ this.native.setDate(index, new JSqlDate(date.getTime()));
242
+ } else {
243
+ this.setNull(index, SQLTypes.DATE);
244
+ }
245
+ }
246
+ setDouble(index, value) {
247
+ if (value !== null && value !== void 0) {
248
+ this.native.setDouble(index, value);
249
+ } else {
250
+ this.setNull(index, SQLTypes.DOUBLE);
251
+ }
252
+ }
253
+ setFloat(index, value) {
254
+ if (value !== null && value !== void 0) {
255
+ this.native.setFloat(index, value);
256
+ } else {
257
+ this.setNull(index, SQLTypes.FLOAT);
258
+ }
259
+ }
260
+ setInt(index, value) {
261
+ if (value !== null && value !== void 0) {
262
+ this.native.setInt(index, value);
263
+ } else {
264
+ this.setNull(index, SQLTypes.INTEGER);
265
+ }
266
+ }
267
+ setLong(index, value) {
268
+ if (value !== null && value !== void 0) {
269
+ this.native.setLong(index, value);
270
+ } else {
271
+ this.setNull(index, SQLTypes.BIGINT);
272
+ }
273
+ }
274
+ setShort(index, value) {
275
+ if (value !== null && value !== void 0) {
276
+ this.native.setShort(index, value);
277
+ } else {
278
+ this.setNull(index, SQLTypes.SMALLINT);
279
+ }
280
+ }
281
+ setString(index, value) {
282
+ if (value !== null && value !== void 0) {
283
+ this.native.setString(index, value);
284
+ } else {
285
+ this.setNull(index, SQLTypes.VARCHAR);
286
+ }
287
+ }
288
+ setTime(index, value) {
289
+ if (value !== null && value !== void 0) {
290
+ const date = getDateValue(value);
291
+ this.native.setTime(index, new JSqlTime(date.getTime()));
292
+ } else {
293
+ this.setNull(index, SQLTypes.TIME);
294
+ }
295
+ }
296
+ setTimestamp(index, value) {
297
+ if (value !== null && value !== void 0) {
298
+ const date = getDateValue(value);
299
+ this.native.setTimestamp(index, new JSqlTimestamp(date.getTime()));
300
+ } else {
301
+ this.setNull(index, SQLTypes.TIMESTAMP);
302
+ }
303
+ }
304
+ setBigDecimal(index, value) {
305
+ if (value !== null && value !== void 0) {
306
+ this.native.setBigDecimal(index, value);
307
+ } else {
308
+ this.setNull(index, SQLTypes.DECIMAL);
309
+ }
310
+ }
311
+ setNString(index, value) {
312
+ if (value !== null && value !== void 0) {
313
+ this.native.setNString(index, value);
314
+ } else {
315
+ this.setNull(index, SQLTypes.NVARCHAR);
316
+ }
317
+ }
318
+ addBatch() {
319
+ this.native.addBatch();
320
+ }
321
+ executeBatch() {
322
+ return this.native.executeBatch();
323
+ }
324
+ getMetaData() {
325
+ return this.native.getMetaData();
326
+ }
327
+ getMoreResults() {
328
+ return this.native.getMoreResults();
329
+ }
330
+ getParameterMetaData() {
331
+ return this.native.getParameterMetaData();
332
+ }
333
+ getSQLWarning() {
334
+ return this.native.getWarnings();
335
+ }
336
+ isClosed() {
337
+ return this.native.isClosed();
338
+ }
339
+ }
340
+ class CallableStatement {
341
+ constructor(native) {
342
+ this.native = native;
343
+ }
344
+ getResultSet() {
345
+ return new ResultSet(this.native.getResultSet());
346
+ }
347
+ executeQuery() {
348
+ return new ResultSet(this.native.executeQuery());
349
+ }
350
+ executeUpdate() {
351
+ return this.native.executeUpdate();
352
+ }
353
+ registerOutParameter(parameterIndex, sqlType) {
354
+ this.native.registerOutParameter(parameterIndex, sqlType);
355
+ }
356
+ registerOutParameterByScale(parameterIndex, sqlType, scale) {
357
+ this.native.registerOutParameter(parameterIndex, sqlType, scale);
358
+ }
359
+ registerOutParameterByTypeName(parameterIndex, sqlType, typeName) {
360
+ this.native.registerOutParameter(parameterIndex, sqlType, typeName);
361
+ }
362
+ wasNull() {
363
+ return this.native.wasNull();
364
+ }
365
+ getString(parameterIndex) {
366
+ return this.native.getString(parameterIndex);
367
+ }
368
+ getBoolean(parameterIndex) {
369
+ return this.native.getBoolean(parameterIndex);
370
+ }
371
+ getByte(parameterIndex) {
372
+ return this.native.getByte(parameterIndex);
373
+ }
374
+ getShort(parameterIndex) {
375
+ return this.native.getShort(parameterIndex);
376
+ }
377
+ getInt(parameterIndex) {
378
+ return this.native.getInt(parameterIndex);
379
+ }
380
+ getLong(parameterIndex) {
381
+ return this.native.getLong(parameterIndex);
382
+ }
383
+ getFloat(parameterIndex) {
384
+ return this.native.getFloat(parameterIndex);
385
+ }
386
+ getDouble(parameterIndex) {
387
+ return this.native.getDouble(parameterIndex);
388
+ }
389
+ getDate(parameterIndex) {
390
+ const dateInstance = this.native.getDate(parameterIndex);
391
+ return dateInstance !== null && dateInstance !== void 0 ? new Date(dateInstance.getTime()) : dateInstance;
392
+ }
393
+ getTime(parameterIndex) {
394
+ const dateInstance = this.native.getTime(parameterIndex);
395
+ return dateInstance !== null && dateInstance !== void 0 ? new Date(dateInstance.getTime()) : dateInstance;
396
+ }
397
+ getTimestamp(parameterIndex) {
398
+ const dateInstance = this.native.getTimestamp(parameterIndex);
399
+ return dateInstance !== null && dateInstance !== void 0 ? new Date(dateInstance.getTime()) : dateInstance;
400
+ }
401
+ getObject(parameterIndex) {
402
+ return this.native.getObject(parameterIndex);
403
+ }
404
+ getBigDecimal(parameterIndex) {
405
+ return this.native.getBigDecimal(parameterIndex);
406
+ }
407
+ getRef(parameterIndex) {
408
+ return this.native.getRef(parameterIndex);
409
+ }
410
+ getBytes(parameterIndex) {
411
+ const data = this.native.getBytes(parameterIndex);
412
+ return Bytes.toJavaScriptBytes(data);
413
+ }
414
+ getBytesNative(parameterIndex) {
415
+ return this.native.getBytes(parameterIndex);
416
+ }
417
+ getBlob(parameterIndex) {
418
+ const data = DatabaseFacade.readBlobValue(this.native, parameterIndex);
419
+ return Bytes.toJavaScriptBytes(data);
420
+ }
421
+ getBlobNative(parameterIndex) {
422
+ return DatabaseFacade.readBlobValue(this.native, parameterIndex);
423
+ }
424
+ getClob(parameterIndex) {
425
+ return readClobValue(this.native.getClob(parameterIndex));
426
+ }
427
+ getNClob(parameterIndex) {
428
+ return readNClobValue(this.native.getNClob(parameterIndex));
429
+ }
430
+ getNString(parameterIndex) {
431
+ return this.native.getNString(parameterIndex);
432
+ }
433
+ getArray(parameterIndex) {
434
+ return this.native.getArray(parameterIndex);
435
+ }
436
+ getURL(parameterIndex) {
437
+ return this.native.getURL(parameterIndex);
438
+ }
439
+ getRowId(parameterIndex) {
440
+ return this.native.getRowId(parameterIndex);
441
+ }
442
+ getSQLXML(parameterIndex) {
443
+ return this.native.getSQLXML(parameterIndex);
444
+ }
445
+ setURL(parameterIndex, value) {
446
+ this.native.setURL(parameterIndex, value);
447
+ }
448
+ setNull(parameterIndex, sqlTypeStr, typeName) {
449
+ const sqlType = Number.isInteger(sqlTypeStr) ? sqlTypeStr : SQLTypes[sqlTypeStr];
450
+ if (typeName !== void 0 && typeName !== null) {
451
+ this.native.setNull(parameterIndex, sqlType, typeName);
452
+ } else {
453
+ this.native.setNull(parameterIndex, sqlType);
454
+ }
455
+ }
456
+ setBoolean(parameterIndex, value) {
457
+ if (value !== null && value !== void 0) {
458
+ this.native.setBoolean(parameterIndex, value);
459
+ } else {
460
+ this.setNull(parameterIndex, SQLTypes.BOOLEAN);
461
+ }
462
+ }
463
+ setByte(parameterIndex, value) {
464
+ if (value !== null && value !== void 0) {
465
+ this.native.setByte(parameterIndex, value);
466
+ } else {
467
+ this.setNull(parameterIndex, SQLTypes.BIT);
468
+ }
469
+ }
470
+ setShort(parameterIndex, value) {
471
+ if (value !== null && value !== void 0) {
472
+ this.native.setShort(parameterIndex, value);
473
+ } else {
474
+ this.setNull(parameterIndex, SQLTypes.SMALLINT);
475
+ }
476
+ }
477
+ setInt(parameterIndex, value) {
478
+ if (value !== null && value !== void 0) {
479
+ this.native.setInt(parameterIndex, value);
480
+ } else {
481
+ this.setNull(parameterIndex, SQLTypes.INTEGER);
482
+ }
483
+ }
484
+ setLong(parameterIndex, value) {
485
+ if (value !== null && value !== void 0) {
486
+ this.native.setLong(parameterIndex, value);
487
+ } else {
488
+ this.setNull(parameterIndex, SQLTypes.BIGINT);
489
+ }
490
+ }
491
+ setFloat(parameterIndex, value) {
492
+ if (value !== null && value !== void 0) {
493
+ this.native.setFloat(parameterIndex, value);
494
+ } else {
495
+ this.setNull(parameterIndex, SQLTypes.FLOAT);
496
+ }
497
+ }
498
+ setDouble(parameterIndex, value) {
499
+ if (value !== null && value !== void 0) {
500
+ this.native.setDouble(parameterIndex, value);
501
+ } else {
502
+ this.setNull(parameterIndex, SQLTypes.DOUBLE);
503
+ }
504
+ }
505
+ setBigDecimal(parameterIndex, value) {
506
+ if (value !== null && value !== void 0) {
507
+ this.native.setBigDecimal(parameterIndex, value);
508
+ } else {
509
+ this.setNull(parameterIndex, SQLTypes.DECIMAL);
510
+ }
511
+ }
512
+ setString(parameterIndex, value) {
513
+ if (value !== null && value !== void 0) {
514
+ this.native.setString(parameterIndex, value);
515
+ } else {
516
+ this.setNull(parameterIndex, SQLTypes.VARCHAR);
517
+ }
518
+ }
519
+ setBytes(parameterIndex, value) {
520
+ if (value !== null && value !== void 0) {
521
+ this.native.setBytes(parameterIndex, value);
522
+ } else {
523
+ this.setNull(parameterIndex, SQLTypes.ARRAY);
524
+ }
525
+ }
526
+ setDate(parameterIndex, value) {
527
+ if (value !== null && value !== void 0) {
528
+ const date = getDateValue(value);
529
+ this.native.setDate(parameterIndex, new JSqlDate(date.getTime()));
530
+ } else {
531
+ this.setNull(parameterIndex, SQLTypes.DATE);
532
+ }
533
+ }
534
+ setTime(parameterIndex, value) {
535
+ if (value !== null && value !== void 0) {
536
+ const date = getDateValue(value);
537
+ this.native.setTime(parameterIndex, new JSqlTime(date.getTime()));
538
+ } else {
539
+ this.setNull(parameterIndex, SQLTypes.TIME);
540
+ }
541
+ }
542
+ setTimestamp(parameterIndex, value) {
543
+ if (value !== null && value !== void 0) {
544
+ let date = getDateValue(value);
545
+ this.native.setTimestamp(parameterIndex, new JSqlTimestamp(date.getTime()));
546
+ } else {
547
+ this.setNull(parameterIndex, SQLTypes.TIMESTAMP);
548
+ }
549
+ }
550
+ setAsciiStream(parameterIndex, inputStream, length) {
551
+ if (length) {
552
+ this.native.setAsciiStream(parameterIndex, inputStream, length);
553
+ } else {
554
+ this.native.setAsciiStream(parameterIndex, inputStream);
555
+ }
556
+ }
557
+ setBinaryStream(parameterIndex, inputStream, length) {
558
+ if (length) {
559
+ this.native.setBinaryStream(parameterIndex, inputStream, length);
560
+ } else {
561
+ this.native.setBinaryStream(parameterIndex, inputStream);
562
+ }
563
+ }
564
+ setObject(parameterIndex, value, targetSqlType, scale) {
565
+ if (scale !== void 0 && scale !== null && targetSqlType !== void 0 && targetSqlType !== null) {
566
+ this.native.setObject(parameterIndex, value, targetSqlType, scale);
567
+ } else if (targetSqlType !== void 0 && targetSqlType !== null) {
568
+ this.native.setObject(parameterIndex, value, targetSqlType);
569
+ } else {
570
+ this.native.setObject(parameterIndex, value);
571
+ }
572
+ }
573
+ setRowId(parameterIndex, value) {
574
+ this.native.setRowId(parameterIndex, value);
575
+ }
576
+ setNString(parameterIndex, value) {
577
+ if (value !== null && value !== void 0) {
578
+ this.native.setNString(parameterIndex, value);
579
+ } else {
580
+ this.setNull(parameterIndex, SQLTypes.NVARCHAR);
581
+ }
582
+ }
583
+ setSQLXML(parameterIndex, value) {
584
+ if (value !== null && value !== void 0) {
585
+ this.native.setSQLXML(parameterIndex, value);
586
+ } else {
587
+ throw new Error("Nullable SQLXML type not supported.");
588
+ }
589
+ }
590
+ setBlob(parameterIndex, value) {
591
+ if (value !== null && value !== void 0) {
592
+ const blob = createBlobValue(this.native, value);
593
+ this.native.setBlob(parameterIndex, blob);
594
+ } else {
595
+ this.setNull(parameterIndex, SQLTypes.BLOB);
596
+ }
597
+ }
598
+ setClob(parameterIndex, value) {
599
+ if (value !== null && value !== void 0) {
600
+ const clob = createClobValue(this.native, value);
601
+ this.native.setClob(parameterIndex, clob);
602
+ } else {
603
+ this.setNull(parameterIndex, SQLTypes.CLOB);
604
+ }
605
+ }
606
+ setNClob(parameterIndex, value) {
607
+ if (value !== null && value !== void 0) {
608
+ const nclob = createNClobValue(this.native, value);
609
+ this.native.setNClob(parameterIndex, nclob);
610
+ } else {
611
+ this.setNull(parameterIndex, SQLTypes.NCLOB);
612
+ }
613
+ }
614
+ execute() {
615
+ return this.native.execute();
616
+ }
617
+ getMoreResults() {
618
+ return this.native.getMoreResults();
619
+ }
620
+ getParameterMetaData() {
621
+ return this.native.getParameterMetaData();
622
+ }
623
+ isClosed() {
624
+ return this.native.isClosed();
625
+ }
626
+ close() {
627
+ this.native.close();
628
+ }
629
+ }
630
+ class ResultSet {
631
+ constructor(native) {
632
+ this.native = native;
633
+ }
634
+ /**
635
+ * Converts the ResultSet into a JSON array of objects.
636
+ * @param limited Whether to use limited JSON conversion (optimized).
637
+ * @param stringify Whether to return the JSON as a string or a parsed array.
638
+ * @returns A JavaScript array of objects representing the result set, or a string if stringify is true.
639
+ */
640
+ toJson(limited = false, stringify = false) {
641
+ const sw = new StringWriter();
642
+ const output = WriterOutputStream.builder().setWriter(sw).setCharset(StandardCharsets.UTF_8).get();
643
+ DatabaseResultSetHelper.toJson(this.native, limited, stringify, output);
644
+ const jsonString = sw.toString();
645
+ return stringify ? jsonString : JSON.parse(jsonString);
646
+ }
647
+ close() {
648
+ this.native.close();
649
+ }
650
+ getBigDecimal(identifier) {
651
+ return this.native.getBigDecimal(identifier);
652
+ }
653
+ getBoolean(identifier) {
654
+ return this.native.getBoolean(identifier);
655
+ }
656
+ getByte(identifier) {
657
+ return this.native.getByte(identifier);
658
+ }
659
+ getBytes(identifier) {
660
+ const data = this.native.getBytes(identifier);
661
+ return Bytes.toJavaScriptBytes(data);
662
+ }
663
+ getBytesNative(identifier) {
664
+ return this.native.getBytes(identifier);
665
+ }
666
+ getBlob(identifier) {
667
+ const data = DatabaseFacade.readBlobValue(this.native, identifier);
668
+ return Bytes.toJavaScriptBytes(data);
669
+ }
670
+ getBlobNative(identifier) {
671
+ return DatabaseFacade.readBlobValue(this.native, identifier);
672
+ }
673
+ getClob(identifier) {
674
+ return readClobValue(this.native.getClob(identifier));
675
+ }
676
+ getNClob(identifier) {
677
+ return readNClobValue(this.native.getNClob(identifier));
678
+ }
679
+ getDate(identifier) {
680
+ const dateInstance = this.native.getDate(identifier);
681
+ return dateInstance !== null && dateInstance !== void 0 ? new Date(dateInstance.getTime()) : void 0;
682
+ }
683
+ getDouble(identifier) {
684
+ return this.native.getDouble(identifier);
685
+ }
686
+ getFloat(identifier) {
687
+ return this.native.getFloat(identifier);
688
+ }
689
+ getInt(identifier) {
690
+ return this.native.getInt(identifier);
691
+ }
692
+ getLong(identifier) {
693
+ return this.native.getLong(identifier);
694
+ }
695
+ getShort(identifier) {
696
+ return this.native.getShort(identifier);
697
+ }
698
+ getString(identifier) {
699
+ return this.native.getString(identifier);
700
+ }
701
+ getTime(identifier) {
702
+ const dateInstance = this.native.getTime(identifier);
703
+ return dateInstance !== null && dateInstance !== void 0 ? new Date(dateInstance.getTime()) : void 0;
704
+ }
705
+ getTimestamp(identifier) {
706
+ const dateInstance = this.native.getTimestamp(identifier);
707
+ return dateInstance !== null && dateInstance !== void 0 ? new Date(dateInstance.getTime()) : void 0;
708
+ }
709
+ isAfterLast() {
710
+ return this.native.isAfterLast();
711
+ }
712
+ isBeforeFirst() {
713
+ return this.native.isBeforeFirst();
714
+ }
715
+ isClosed() {
716
+ return this.native.isClosed();
717
+ }
718
+ isFirst() {
719
+ return this.native.isFirst();
720
+ }
721
+ isLast() {
722
+ return this.native.isLast();
723
+ }
724
+ next() {
725
+ return this.native.next();
726
+ }
727
+ getMetaData() {
728
+ return this.native.getMetaData();
729
+ }
730
+ getNString(columnIndex) {
731
+ return this.native.getNString(columnIndex);
732
+ }
733
+ }
734
+ class Connection {
735
+ constructor(datasourceName) {
736
+ this.native = DatabaseFacade.getConnection(datasourceName);
737
+ }
738
+ /**
739
+ * Checks if the connection is for a specific database system.
740
+ */
741
+ isOfType(databaseSystem) {
742
+ return this.getDatabaseSystem() === databaseSystem;
743
+ }
744
+ /**
745
+ * Returns the type of the underlying database system as a {@link DatabaseSystem} enum.
746
+ */
747
+ getDatabaseSystem() {
748
+ const dbSystem = this.native.getDatabaseSystem().name();
749
+ switch (dbSystem) {
750
+ case "DERBY":
751
+ return 1 /* DERBY */;
752
+ case "POSTGRESQL":
753
+ return 2 /* POSTGRESQL */;
754
+ case "H2":
755
+ return 3 /* H2 */;
756
+ case "MARIADB":
757
+ return 4 /* MARIADB */;
758
+ case "HANA":
759
+ return 5 /* HANA */;
760
+ case "SNOWFLAKE":
761
+ return 6 /* SNOWFLAKE */;
762
+ case "MYSQL":
763
+ return 7 /* MYSQL */;
764
+ case "MONGODB":
765
+ return 8 /* MONGODB */;
766
+ case "SYBASE":
767
+ return 9 /* SYBASE */;
768
+ case "UNKNOWN":
769
+ return 0 /* UNKNOWN */;
770
+ default:
771
+ throw new Error(`Missing mapping for database system type ${dbSystem}`);
772
+ }
773
+ }
774
+ /**
775
+ * Creates a new {@link PreparedStatement} object for sending parameterized SQL statements to the database.
776
+ */
777
+ prepareStatement(sql) {
778
+ return new PreparedStatement(this.native.prepareStatement(sql));
779
+ }
780
+ /**
781
+ * Creates a {@link CallableStatement} object for calling database stored procedures or functions.
782
+ */
783
+ prepareCall(sql) {
784
+ return new CallableStatement(this.native.prepareCall(sql));
785
+ }
786
+ close() {
787
+ if (!this.isClosed()) {
788
+ this.native.close();
789
+ }
790
+ }
791
+ commit() {
792
+ this.native.commit();
793
+ }
794
+ getAutoCommit() {
795
+ return this.native.getAutoCommit();
796
+ }
797
+ getCatalog() {
798
+ return this.native.getCatalog();
799
+ }
800
+ getSchema() {
801
+ return this.native.getSchema();
802
+ }
803
+ getTransactionIsolation() {
804
+ return this.native.getTransactionIsolation();
805
+ }
806
+ isClosed() {
807
+ return this.native.isClosed();
808
+ }
809
+ isReadOnly() {
810
+ return this.native.isReadOnly();
811
+ }
812
+ isValid() {
813
+ return this.native.isValid();
814
+ }
815
+ rollback() {
816
+ this.native.rollback();
817
+ }
818
+ setAutoCommit(autoCommit) {
819
+ this.native.setAutoCommit(autoCommit);
820
+ }
821
+ setCatalog(catalog) {
822
+ this.native.setCatalog(catalog);
823
+ }
824
+ setReadOnly(readOnly) {
825
+ this.native.setReadOnly(readOnly);
826
+ }
827
+ setSchema(schema) {
828
+ this.native.setSchema(schema);
829
+ }
830
+ setTransactionIsolation(transactionIsolation) {
831
+ this.native.setTransactionIsolation(transactionIsolation);
832
+ }
833
+ getMetaData() {
834
+ return this.native.getMetaData();
835
+ }
836
+ }
837
+ class Database {
838
+ /**
839
+ * Returns a list of available data source names.
840
+ */
841
+ static getDataSources() {
842
+ const datasources = DatabaseFacade.getDataSources();
843
+ return datasources ? JSON.parse(datasources) : [];
844
+ }
845
+ /**
846
+ * Returns database metadata for the specified data source.
847
+ */
848
+ static getMetadata(datasourceName) {
849
+ const metadata = DatabaseFacade.getMetadata(datasourceName);
850
+ return metadata ? JSON.parse(metadata) : void 0;
851
+ }
852
+ /**
853
+ * Returns the product name of the underlying database system.
854
+ */
855
+ static getProductName(datasourceName) {
856
+ return DatabaseFacade.getProductName(datasourceName);
857
+ }
858
+ /**
859
+ * Gets a new database connection object.
860
+ */
861
+ static getConnection(datasourceName) {
862
+ return new Connection(datasourceName);
863
+ }
864
+ }
865
+ if (typeof module !== "undefined") {
866
+ module.exports = {
867
+ Database,
868
+ Connection,
869
+ PreparedStatement,
870
+ CallableStatement,
871
+ ResultSet,
872
+ DatabaseSystem,
873
+ SQLTypes
874
+ };
875
+ }
876
+ export {
877
+ CallableStatement,
878
+ Connection,
879
+ Database,
880
+ DatabaseSystem,
881
+ PreparedStatement,
882
+ ResultSet,
883
+ SQLTypes
884
+ };
885
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RiL2RhdGFiYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEFQSSBEYXRhYmFzZVxuICpcbiAqL1xuaW1wb3J0IHsgQnl0ZXMgfSBmcm9tIFwiQGFlcm9raXQvc2RrL2lvL2J5dGVzXCI7XG5pbXBvcnQgeyBJbnB1dFN0cmVhbSB9IGZyb20gXCJAYWVyb2tpdC9zZGsvaW8vc3RyZWFtc1wiO1xuXG5jb25zdCBEYXRhYmFzZUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5kYi5EYXRhYmFzZUZhY2FkZVwiKTtcbmNvbnN0IERhdGFiYXNlUmVzdWx0U2V0SGVscGVyID0gSmF2YS50eXBlKFwib3JnLmVjbGlwc2UuZGlyaWdpYmxlLmNvbXBvbmVudHMuZGF0YS5tYW5hZ2VtZW50LmhlbHBlcnMuRGF0YWJhc2VSZXN1bHRTZXRIZWxwZXJcIik7XG5jb25zdCBKU3FsRGF0ZSA9IEphdmEudHlwZShcImphdmEuc3FsLkRhdGVcIik7XG5jb25zdCBKU3FsVGltZXN0YW1wID0gSmF2YS50eXBlKFwiamF2YS5zcWwuVGltZXN0YW1wXCIpO1xuY29uc3QgSlNxbFRpbWUgPSBKYXZhLnR5cGUoXCJqYXZhLnNxbC5UaW1lXCIpO1xuY29uc3QgU3RyaW5nV3JpdGVyID0gSmF2YS50eXBlKFwiamF2YS5pby5TdHJpbmdXcml0ZXJcIik7XG5jb25zdCBXcml0ZXJPdXRwdXRTdHJlYW0gPSBKYXZhLnR5cGUoXCJvcmcuYXBhY2hlLmNvbW1vbnMuaW8ub3V0cHV0LldyaXRlck91dHB1dFN0cmVhbVwiKTtcbmNvbnN0IFN0YW5kYXJkQ2hhcnNldHMgPSBKYXZhLnR5cGUoXCJqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHNcIik7XG5cbi8qKlxuICogTWFwcGluZyBvZiBTUUwgdHlwZSBuYW1lcyB0byB0aGVpciBqYXZhLnNxbC5UeXBlcyBpbnRlZ2VyIGNvbnN0YW50cy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNRTFR5cGVzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdFwiQk9PTEVBTlwiOiAxNixcblx0XCJEQVRFXCI6IDkxLFxuXHRcIlRJTUVcIjogOTIsXG5cdFwiVElNRVNUQU1QXCI6IDkzLFxuXHRcIkRPVUJMRVwiOiA4LFxuXHRcIkZMT0FUXCI6IDYsXG5cdFwiUkVBTFwiOiA3LFxuXHRcIlRJTllJTlRcIjogLTYsXG5cdFwiU01BTExJTlRcIjogNSxcblx0XCJJTlRFR0VSXCI6IDQsXG5cdFwiQklHSU5UXCI6IC01LFxuXHRcIlZBUkNIQVJcIjogMTIsXG5cdFwiQ0hBUlwiOiAxLFxuXHRcIkNMT0JcIjogMjAwNSxcblx0XCJCTE9CXCI6IDIwMDQsXG5cdFwiVkFSQklOQVJZXCI6IC0zLFxuXHRcIkRFQ0lNQUxcIjogMyxcblx0XCJBUlJBWVwiOiAyMDAzLFxuXHRcIk5WQVJDSEFSXCI6IC05LFxuXHRcIk5DTE9CXCI6IDIwMTEsXG5cdFwiQklUXCI6IC03XG59KTtcblxuZXhwb3J0IGVudW0gRGF0YWJhc2VTeXN0ZW0ge1xuXHRVTktOT1dOLCBERVJCWSwgUE9TVEdSRVNRTCwgSDIsIE1BUklBREIsIEhBTkEsIFNOT1dGTEFLRSwgTVlTUUwsIE1PTkdPREIsIFNZQkFTRVxufVxuXG4vLyAtLS0gTWV0YWRhdGEgSW50ZXJmYWNlcyAtLS1cblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZU1ldGFkYXRhIHtcblx0LyoqIFRoZSBuYW1lLiAqL1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBUaGUgdHlwZS4gKi9cblx0cmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXHQvKiogVGhlIHJlbWFya3MuICovXG5cdHJlYWRvbmx5IHJlbWFya3M6IHN0cmluZztcblx0LyoqIFRoZSBjb2x1bW5zLiAqL1xuXHRyZWFkb25seSBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YVtdO1xuXHQvKiogVGhlIGluZGljZXMuICovXG5cdHJlYWRvbmx5IGluZGljZXM6IEluZGV4TWV0YWRhdGFbXTtcblx0LyoqIFRoZSBpbmRpY2VzLiAqL1xuXHRyZWFkb25seSBmb3JlaWduS2V5czogRm9yZWlnbktleU1ldGFkYXRhW107XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbk1ldGFkYXRhIHtcblx0LyoqIFRoZSBuYW1lLiAqL1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBUaGUgdHlwZS4gKi9cblx0cmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXHQvKiogVGhlIHNpemUuICovXG5cdHJlYWRvbmx5IHNpemU6IG51bWJlcjtcblx0LyoqIFRoZSBudWxsYWJsZS4gKi9cblx0cmVhZG9ubHkgbnVsbGFibGU6IGJvb2xlYW47XG5cdC8qKiBUaGUga2V5LiAqL1xuXHRyZWFkb25seSBrZXk6IGJvb2xlYW47XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xuXHQvKiogVGhlIHNjYWxlLiAqL1xuXHRyZWFkb25seSBzY2FsZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluZGV4TWV0YWRhdGEge1xuXHQvKiogVGhlIG5hbWUuICovXG5cdHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblx0LyoqIFRoZSB0eXBlLiAqL1xuXHRyZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cdC8qKiBUaGUgY29sdW1uLiAqL1xuXHRyZWFkb25seSBjb2x1bW46IHN0cmluZztcblx0LyoqIFRoZSBub24gdW5pcXVlLiAqL1xuXHRyZWFkb25seSBub25VbmlxdWU6IGJvb2xlYW47XG5cdC8qKiBUaGUgcXVhbGlmaWVyLiAqL1xuXHRyZWFkb25seSBxdWFsaWZpZXI6IHN0cmluZztcblx0LyoqIFRoZSBvcmRpbmFsIHBvc2l0aW9uLiAqL1xuXHRyZWFkb25seSBvcmRpbmFsUG9zaXRpb246IHN0cmluZztcblx0LyoqIFRoZSBzb3J0IG9yZGVyLiAqL1xuXHRyZWFkb25seSBzb3J0T3JkZXI6IHN0cmluZztcblx0LyoqIFRoZSBjYXJkaW5hbGl0eS4gKi9cblx0cmVhZG9ubHkgY2FyZGluYWxpdHk6IG51bWJlcjtcblx0LyoqIFRoZSBwYWdlcy4gKi9cblx0cmVhZG9ubHkgcGFnZXM6IG51bWJlcjtcblx0LyoqIFRoZSBmaWx0ZXIgY29uZGl0aW9uLiAqL1xuXHRyZWFkb25seSBmaWx0ZXJDb25kaXRpb246IHN0cmluZztcblx0LyoqIFRoZSBraW5kLiAqL1xuXHRyZWFkb25seSBraW5kOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9yZWlnbktleU1ldGFkYXRhIHtcblx0LyoqIFRoZSBuYW1lLiAqL1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYU1ldGFkYXRhIHtcblx0LyoqIFRoZSBuYW1lLiAqL1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xuXHQvKiogVGhlIHRhYmxlcy4gKi9cblx0cmVhZG9ubHkgdGFibGVzOiBUYWJsZU1ldGFkYXRhW107XG5cdC8qKiBUaGUgdmlld3MuICovXG5cdHJlYWRvbmx5IHZpZXdzOiBUYWJsZU1ldGFkYXRhW107XG5cdC8qKiBUaGUgcHJvY2VkdXJlcy4gKi9cblx0cmVhZG9ubHkgcHJvY2VkdXJlczogUHJvY2VkdXJlTWV0YWRhdGFbXTtcblx0LyoqIFRoZSBmdW5jdGlvbnMuICovXG5cdHJlYWRvbmx5IGZ1bmN0aW9uczogRnVuY3Rpb25NZXRhZGF0YVtdO1xuXHQvKiogVGhlIGZ1bmN0aW9ucy4gKi9cblx0cmVhZG9ubHkgc2VxdWVuY2VzOiBTZXF1ZW5jZU1ldGFkYXRhW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2VkdXJlTWV0YWRhdGEge1xuXHQvKiogVGhlIG5hbWUuICovXG5cdHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblx0LyoqIFRoZSB0eXBlLiAqL1xuXHRyZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cdC8qKiBUaGUgcmVtYXJrcy4gKi9cblx0cmVhZG9ubHkgcmVtYXJrczogc3RyaW5nO1xuXHQvKiogVGhlIGNvbHVtbnMuICovXG5cdHJlYWRvbmx5IGNvbHVtbnM6IFBhcmFtZXRlckNvbHVtbk1ldGFkYXRhW107XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uTWV0YWRhdGEge1xuXHQvKiogVGhlIG5hbWUuICovXG5cdHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblx0LyoqIFRoZSB0eXBlLiAqL1xuXHRyZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cdC8qKiBUaGUgcmVtYXJrcy4gKi9cblx0cmVhZG9ubHkgcmVtYXJrczogc3RyaW5nO1xuXHQvKiogVGhlIGNvbHVtbnMuICovXG5cdHJlYWRvbmx5IGNvbHVtbnM6IFBhcmFtZXRlckNvbHVtbk1ldGFkYXRhW107XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFtZXRlckNvbHVtbk1ldGFkYXRhIHtcblx0LyoqIFRoZSBuYW1lLiAqL1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogbnVtYmVyO1xuXHQvKiogVGhlIHR5cGUuICovXG5cdHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblx0LyoqIFRoZSBwcmVjaXNpb24uICovXG5cdHJlYWRvbmx5IHByZWNpc2lvbjogbnVtYmVyO1xuXHQvKiogVGhlIGxlbmd0aC4gKi9cblx0cmVhZG9ubHkgbGVuZ3RoOiBudW1iZXI7XG5cdC8qKiBUaGUgc2NhbGUuICovXG5cdHJlYWRvbmx5IHNjYWxlOiBudW1iZXI7XG5cdC8qKiBUaGUgcmFkaXguICovXG5cdHJlYWRvbmx5IHJhZGl4OiBudW1iZXI7XG5cdC8qKiBUaGUgbnVsbGFibGUuICovXG5cdHJlYWRvbmx5IG51bGxhYmxlOiBib29sZWFuO1xuXHQvKiogVGhlIHJlbWFya3MuICovXG5cdHJlYWRvbmx5IHJlbWFya3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXF1ZW5jZU1ldGFkYXRhIHtcblx0LyoqIFRoZSBuYW1lLiAqL1xuXHRyZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cdC8qKiBUaGUga2luZC4gKi9cblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlTWV0YWRhdGEge1xuXHRyZWFkb25seSBhbGxQcm9jZWR1cmVzQXJlQ2FsbGFibGU6IGJvb2xlYW47XG5cdHJlYWRvbmx5IGFsbFRhYmxlc0FyZVNlbGVjdGFibGU6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHVybDogc3RyaW5nO1xuXHRyZWFkb25seSB1c2VyTmFtZTogc3RyaW5nO1xuXHRyZWFkb25seSBpc1JlYWRPbmx5OiBib29sZWFuO1xuXHRyZWFkb25seSBudWxsc0FyZVNvcnRlZEhpZ2g6IGJvb2xlYW47XG5cdHJlYWRvbmx5IG51bGxzQXJlU29ydGVkTG93OiBib29sZWFuO1xuXHRyZWFkb25seSBudWxsc0FyZVNvcnRlZEF0U3RhcnQ6IGJvb2xlYW47XG5cdHJlYWRvbmx5IG51bGxzQXJlU29ydGVkQXRFbmQ6IGJvb2xlYW47XG5cdHJlYWRvbmx5IGRhdGFiYXNlUHJvZHVjdE5hbWU6IHN0cmluZztcblx0cmVhZG9ubHkgZGF0YWJhc2VQcm9kdWN0VmVyc2lvbjogc3RyaW5nO1xuXHRyZWFkb25seSBkcml2ZXJOYW1lOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGRyaXZlclZlcnNpb246IHN0cmluZztcblx0cmVhZG9ubHkgZHJpdmVyTWFqb3JWZXJzaW9uOiBudW1iZXI7XG5cdHJlYWRvbmx5IGRyaXZlck1pbm9yVmVyc2lvbjogbnVtYmVyO1xuXHRyZWFkb25seSB1c2VzTG9jYWxGaWxlczogYm9vbGVhbjtcblx0cmVhZG9ubHkgdXNlc0xvY2FsRmlsZVBlclRhYmxlOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c01peGVkQ2FzZUlkZW50aWZpZXJzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdG9yZXNVcHBlckNhc2VJZGVudGlmaWVyczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3RvcmVzTG93ZXJDYXNlSWRlbnRpZmllcnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN0b3Jlc01peGVkQ2FzZUlkZW50aWZpZXJzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c01peGVkQ2FzZVF1b3RlZElkZW50aWZpZXJzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdG9yZXNVcHBlckNhc2VRdW90ZWRJZGVudGlmaWVyczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3RvcmVzTG93ZXJDYXNlUXVvdGVkSWRlbnRpZmllcnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN0b3Jlc01peGVkQ2FzZVF1b3RlZElkZW50aWZpZXJzOiBib29sZWFuO1xuXHRyZWFkb25seSBpZGVudGlmaWVyUXVvdGVTdHJpbmc6IHN0cmluZztcblx0cmVhZG9ubHkgc3FsS2V5d29yZHM6IHN0cmluZztcblx0cmVhZG9ubHkgbnVtZXJpY0Z1bmN0aW9uczogc3RyaW5nO1xuXHRyZWFkb25seSBzdHJpbmdGdW5jdGlvbnM6IHN0cmluZztcblx0cmVhZG9ubHkgc3lzdGVtRnVuY3Rpb25zOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHRpbWVEYXRlRnVuY3Rpb25zOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHNlYXJjaFN0cmluZ0VzY2FwZTogc3RyaW5nO1xuXHRyZWFkb25seSBleHRyYU5hbWVDaGFyYWN0ZXJzOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHN1cHBvcnRzQWx0ZXJUYWJsZVdpdGhBZGRDb2x1bW46IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzQWx0ZXJUYWJsZVdpdGhEcm9wQ29sdW1uOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0NvbHVtbkFsaWFzaW5nOiBib29sZWFuO1xuXHRyZWFkb25seSBudWxsUGx1c05vbk51bGxJc051bGw6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzQ29udmVydDogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNUYWJsZUNvcnJlbGF0aW9uTmFtZXM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzRGlmZmVyZW50VGFibGVDb3JyZWxhdGlvbk5hbWVzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0V4cHJlc3Npb25zSW5PcmRlckJ5OiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c09yZGVyQnlVbnJlbGF0ZWQ6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzR3JvdXBCeTogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNHcm91cEJ5VW5yZWxhdGVkOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0dyb3VwQnlCZXlvbmRTZWxlY3Q6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzTGlrZUVzY2FwZUNsYXVzZTogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNNdWx0aXBsZVJlc3VsdFNldHM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzTXVsdGlwbGVUcmFuc2FjdGlvbnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzTm9uTnVsbGFibGVDb2x1bW5zOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c01pbmltdW1TUUxHcmFtbWFyOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0NvcmVTUUxHcmFtbWFyOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0V4dGVuZGVkU1FMR3JhbW1hcjogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNBTlNJOTJFbnRyeUxldmVsU1FMOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0FOU0k5MkludGVybWVkaWF0ZVNRTDogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNBTlNJOTJGdWxsU1FMOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0ludGVncml0eUVuaGFuY2VtZW50RmFjaWxpdHk6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzT3V0ZXJKb2luczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNGdWxsT3V0ZXJKb2luczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNMaW1pdGVkT3V0ZXJKb2luczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc2NoZW1hVGVybTogc3RyaW5nO1xuXHRyZWFkb25seSBwcm9jZWR1cmVUZXJtOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGNhdGFsb2dUZXJtOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGlzQ2F0YWxvZ0F0U3RhcnQ6IGJvb2xlYW47XG5cdHJlYWRvbmx5IGNhdGFsb2dTZXBhcmF0b3I6IHN0cmluZztcblx0cmVhZG9ubHkgc3VwcG9ydHNTY2hlbWFzSW5EYXRhTWFuaXB1bGF0aW9uOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1NjaGVtYXNJblByb2NlZHVyZUNhbGxzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1NjaGVtYXNJblRhYmxlRGVmaW5pdGlvbnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzU2NoZW1hc0luSW5kZXhEZWZpbml0aW9uczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNTY2hlbWFzSW5Qcml2aWxlZ2VEZWZpbml0aW9uczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNDYXRhbG9nc0luRGF0YU1hbmlwdWxhdGlvbjogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNDYXRhbG9nc0luUHJvY2VkdXJlQ2FsbHM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzQ2F0YWxvZ3NJblRhYmxlRGVmaW5pdGlvbnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzQ2F0YWxvZ3NJbkluZGV4RGVmaW5pdGlvbnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzQ2F0YWxvZ3NJblByaXZpbGVnZURlZmluaXRpb25zOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1Bvc2l0aW9uZWREZWxldGU6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzUG9zaXRpb25lZFVwZGF0ZTogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNTZWxlY3RGb3JVcGRhdGU6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzU3RvcmVkUHJvY2VkdXJlczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNTdWJxdWVyaWVzSW5Db21wYXJpc29uczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNTdWJxdWVyaWVzSW5FeGlzdHM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzU3VicXVlcmllc0luSW5zOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1N1YnF1ZXJpZXNJblF1YW50aWZpZWRzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0NvcnJlbGF0ZWRTdWJxdWVyaWVzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1VuaW9uOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1VuaW9uQWxsOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c09wZW5DdXJzb3JzQWNyb3NzQ29tbWl0OiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c09wZW5DdXJzb3JzQWNyb3NzUm9sbGJhY2s6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzT3BlblN0YXRlbWVudHNBY3Jvc3NDb21taXQ6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzT3BlblN0YXRlbWVudHNBY3Jvc3NSb2xsYmFjazogYm9vbGVhbjtcblx0cmVhZG9ubHkgbWF4QmluYXJ5TGl0ZXJhbExlbmd0aDogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhDaGFyTGl0ZXJhbExlbmd0aDogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhDb2x1bW5OYW1lTGVuZ3RoOiBudW1iZXI7XG5cdHJlYWRvbmx5IG1heENvbHVtbnNJbkdyb3VwQnk6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Q29sdW1uc0luSW5kZXg6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Q29sdW1uc0luT3JkZXJCeTogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhDb2x1bW5zSW5TZWxlY3Q6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Q29sdW1uc0luVGFibGU6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Q29ubmVjdGlvbnM6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Q3Vyc29yTmFtZUxlbmd0aDogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhJbmRleExlbmd0aDogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhTY2hlbWFOYW1lTGVuZ3RoOiBudW1iZXI7XG5cdHJlYWRvbmx5IG1heFByb2NlZHVyZU5hbWVMZW5ndGg6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Q2F0YWxvZ05hbWVMZW5ndGg6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4Um93U2l6ZTogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhSb3dTaXplSW5jbHVkZUJsb2JzOiBib29sZWFuO1xuXHRyZWFkb25seSBtYXhTdGF0ZW1lbnRMZW5ndGg6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4U3RhdGVtZW50czogbnVtYmVyO1xuXHRyZWFkb25seSBtYXhUYWJsZU5hbWVMZW5ndGg6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4VGFibGVzSW5TZWxlY3Q6IG51bWJlcjtcblx0cmVhZG9ubHkgbWF4VXNlck5hbWVMZW5ndGg6IG51bWJlcjtcblx0cmVhZG9ubHkgZGVmYXVsdFRyYW5zYWN0aW9uSXNvbGF0aW9uOiBudW1iZXI7XG5cdHJlYWRvbmx5IHN1cHBvcnRzVHJhbnNhY3Rpb25zOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c0RhdGFEZWZpbml0aW9uQW5kRGF0YU1hbmlwdWxhdGlvblRyYW5zYWN0aW9uczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNEYXRhTWFuaXB1bGF0aW9uVHJhbnNhY3Rpb25zT25seTogYm9vbGVhbjtcblx0cmVhZG9ubHkgZGF0YURlZmluaXRpb25DYXVzZXNUcmFuc2FjdGlvbkNvbW1pdDogYm9vbGVhbjtcblx0cmVhZG9ubHkgZGF0YURlZmluaXRpb25JZ25vcmVkSW5UcmFuc2FjdGlvbnM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzQmF0Y2hVcGRhdGVzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c1NhdmVwb2ludHM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzTmFtZWRQYXJhbWV0ZXJzOiBib29sZWFuO1xuXHRyZWFkb25seSBzdXBwb3J0c011bHRpcGxlT3BlblJlc3VsdHM6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzR2V0R2VuZXJhdGVkS2V5czogYm9vbGVhbjtcblx0cmVhZG9ubHkgcmVzdWx0U2V0SG9sZGFiaWxpdHk6IG51bWJlcjtcblx0cmVhZG9ubHkgZGF0YWJhc2VNYWpvclZlcnNpb246IG51bWJlcjtcblx0cmVhZG9ubHkgZGF0YWJhc2VNaW5vclZlcnNpb246IG51bWJlcjtcblx0cmVhZG9ubHkgamRiY01ham9yVmVyc2lvbjogbnVtYmVyO1xuXHRyZWFkb25seSBqZGJjTWlub3JWZXJzaW9uOiBudW1iZXI7XG5cdHJlYWRvbmx5IHNxbFN0YXRlVHlwZTogbnVtYmVyO1xuXHRyZWFkb25seSBsb2NhdG9yc1VwZGF0ZUNvcHk6IGJvb2xlYW47XG5cdHJlYWRvbmx5IHN1cHBvcnRzU3RhdGVtZW50UG9vbGluZzogYm9vbGVhbjtcblx0cmVhZG9ubHkgc3VwcG9ydHNTdG9yZWRGdW5jdGlvbnNVc2luZ0NhbGxTeW50YXg6IGJvb2xlYW47XG5cdHJlYWRvbmx5IGF1dG9Db21taXRGYWlsdXJlQ2xvc2VzQWxsUmVzdWx0U2V0czogYm9vbGVhbjtcblx0cmVhZG9ubHkgZ2VuZXJhdGVkS2V5QWx3YXlzUmV0dXJuZWQ6IGJvb2xlYW47XG5cdHJlYWRvbmx5IG1heExvZ2ljYWxMb2JTaXplOiBudW1iZXI7XG5cdHJlYWRvbmx5IHN1cHBvcnRzUmVmQ3Vyc29yczogYm9vbGVhbjtcblx0cmVhZG9ubHkgc2NoZW1hczogU2NoZW1hTWV0YWRhdGFbXTtcblx0cmVhZG9ubHkga2luZDogc3RyaW5nO1xufVxuXG4vLyAtLS0gSGVscGVyIEZ1bmN0aW9ucyAtLS1cblxuZnVuY3Rpb24gaXNIYW5hRGF0YWJhc2UoY29ubmVjdGlvbjogYW55KTogYm9vbGVhbiB7XG5cdGxldCBpc0hhbmFEYXRhYmFzZSA9IGZhbHNlO1xuXHRsZXQgbWV0YWRhdGEgPSBjb25uZWN0aW9uLmdldE1ldGFEYXRhKCk7XG5cdGlmIChtZXRhZGF0YSAhPT0gbnVsbCAmJiBtZXRhZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0aXNIYW5hRGF0YWJhc2UgPSBtZXRhZGF0YS5nZXREYXRhYmFzZVByb2R1Y3ROYW1lKCkgPT09IFwiSERCXCI7XG5cdH1cblx0cmV0dXJuIGlzSGFuYURhdGFiYXNlO1xufVxuXG5mdW5jdGlvbiByZWFkQ2xvYlZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmcgfCBhbnkge1xuXHRyZXR1cm4gdmFsdWUgPyB2YWx1ZS5nZXRTdWJTdHJpbmcoMSwgdmFsdWUubGVuZ3RoKCkpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsb2JWYWx1ZShuYXRpdmU6IGFueSwgdmFsdWU6IGFueSk6IGFueSB7XG5cdHRyeSB7XG5cdFx0bGV0IGNvbm5lY3Rpb24gPSBuYXRpdmUuZ2V0Q29ubmVjdGlvbigpOyAvLyBpbnRlbnRpb25hbGx5IG5vdCBjbG9zZWRcblx0XHRpZiAoY29ubmVjdGlvbiA9PT0gbnVsbCB8fCBjb25uZWN0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSBuZXcgJ0Nsb2InIHZhbHVlIGFzIHRoZSBjb25uZWN0aW9uIGlzIG51bGxcIik7XG5cdFx0fVxuXHRcdGxldCBjbG9iID0gbnVsbDtcblx0XHRpZiAoaXNIYW5hRGF0YWJhc2UoY29ubmVjdGlvbikpIHtcblx0XHRcdGxldCBwcyA9IG51bGw7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRwcyA9IGNvbm5lY3Rpb24ucHJlcGFyZVN0YXRlbWVudChcIlNFTEVDVCBUT19DTE9CICg/KSBGUk9NIERVTU1ZO1wiKTtcblx0XHRcdFx0cHMuc2V0U3RyaW5nKDEsIHZhbHVlKTtcblx0XHRcdFx0bGV0IHJzID0gcHMuZXhlY3V0ZVF1ZXJ5KCk7XG5cdFx0XHRcdGlmIChycy5uZXh0KCkpIHtcblx0XHRcdFx0XHRjbG9iID0gcnMuZ2V0Q2xvYigxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aWYgKHBzICE9PSBudWxsICYmIHBzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRwcy5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNsb2IgPSBjb25uZWN0aW9uLmNyZWF0ZUNsb2IoKTtcblx0XHRcdGNsb2Iuc2V0U3RyaW5nKDEsIHZhbHVlKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNsb2I7XG5cdH0gY2F0Y2ggKGU6IGFueSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3Igb2NjdXJlZCBkdXJpbmcgY3JlYXRpb24gb2YgJ0Nsb2InIHZhbHVlOiAke2UubWVzc2FnZX1gKTtcblx0fVxufVxuXG5mdW5jdGlvbiByZWFkTkNsb2JWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHwgYW55IHtcblx0cmV0dXJuIHZhbHVlID8gdmFsdWUuZ2V0U3ViU3RyaW5nKDEsIHZhbHVlLmxlbmd0aCgpKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOQ2xvYlZhbHVlKG5hdGl2ZTogYW55LCB2YWx1ZTogYW55KTogYW55IHtcblx0dHJ5IHtcblx0XHRsZXQgY29ubmVjdGlvbiA9IG5hdGl2ZS5nZXRDb25uZWN0aW9uKCk7IC8vIGludGVudGlvbmFsbHkgbm90IGNsb3NlZFxuXHRcdGlmIChjb25uZWN0aW9uID09PSBudWxsIHx8IGNvbm5lY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY3JlYXRlIG5ldyAnTkNsb2InIHZhbHVlIGFzIHRoZSBjb25uZWN0aW9uIGlzIG51bGxcIik7XG5cdFx0fVxuXHRcdGxldCBuY2xvYiA9IG51bGw7XG5cdFx0aWYgKGlzSGFuYURhdGFiYXNlKGNvbm5lY3Rpb24pKSB7XG5cdFx0XHRsZXQgcHMgPSBudWxsO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cHMgPSBjb25uZWN0aW9uLnByZXBhcmVTdGF0ZW1lbnQoXCJTRUxFQ1QgVE9fTkNMT0IgKD8pIEZST00gRFVNTVk7XCIpO1xuXHRcdFx0XHRwcy5zZXRTdHJpbmcoMSwgdmFsdWUpO1xuXHRcdFx0XHRsZXQgcnMgPSBwcy5leGVjdXRlUXVlcnkoKTtcblx0XHRcdFx0aWYgKHJzLm5leHQoKSkge1xuXHRcdFx0XHRcdG5jbG9iID0gcnMuZ2V0TkNsb2IoMSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGlmIChwcyAhPT0gbnVsbCAmJiBwcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cHMuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRuY2xvYiA9IGNvbm5lY3Rpb24uY3JlYXRlTkNsb2IoKTtcblx0XHRcdG5jbG9iLnNldFN0cmluZygxLCB2YWx1ZSk7XG5cdFx0fVxuXHRcdHJldHVybiBuY2xvYjtcblx0fSBjYXRjaCAoZTogYW55KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBvY2N1cmVkIGR1cmluZyBjcmVhdGlvbiBvZiAnTkNsb2InIHZhbHVlOiAke2UubWVzc2FnZX1gKTtcblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVCbG9iVmFsdWUobmF0aXZlOiBhbnksIHZhbHVlOiBhbnkpOiBhbnkge1xuXHR0cnkge1xuXHRcdGxldCBjb25uZWN0aW9uID0gbmF0aXZlLmdldENvbm5lY3Rpb24oKTsgLy8gaW50ZW50aW9uYWxseSBub3QgY2xvc2VkXG5cdFx0aWYgKGNvbm5lY3Rpb24gPT09IG51bGwgfHwgY29ubmVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgbmV3ICdCbG9iJyB2YWx1ZSBhcyB0aGUgY29ubmVjdGlvbiBpcyBudWxsXCIpO1xuXHRcdH1cblx0XHRsZXQgYmxvYiA9IG51bGw7XG5cdFx0aWYgKGlzSGFuYURhdGFiYXNlKGNvbm5lY3Rpb24pKSB7XG5cdFx0XHRsZXQgcHMgPSBudWxsO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cHMgPSBjb25uZWN0aW9uLnByZXBhcmVTdGF0ZW1lbnQoXCJTRUxFQ1QgVE9fQkxPQiAoPykgRlJPTSBEVU1NWTtcIik7XG5cdFx0XHRcdHBzLnNldEJ5dGVzKDEsIHZhbHVlKTtcblx0XHRcdFx0bGV0IHJzID0gcHMuZXhlY3V0ZVF1ZXJ5KCk7XG5cdFx0XHRcdGlmIChycy5uZXh0KCkpIHtcblx0XHRcdFx0XHRibG9iID0gcnMuZ2V0QmxvYigxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aWYgKHBzICE9PSBudWxsICYmIHBzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRwcy5jbG9zZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJsb2IgPSBjb25uZWN0aW9uLmNyZWF0ZUJsb2IoKTtcblx0XHRcdGJsb2Iuc2V0Qnl0ZXMoMSwgdmFsdWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gYmxvYjtcblx0fSBjYXRjaCAoZTogYW55KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBvY2N1cmVkIGR1cmluZyBjcmVhdGlvbiBvZiAnQ2xvYicgdmFsdWU6ICR7ZS5tZXNzYWdlfWApO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldERhdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgRGF0ZSk6IERhdGUge1xuXHRpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbi8vIC0tLSBTdGF0ZW1lbnQgQ2xhc3NlcyAtLS1cblxuLyoqXG4gKiBTdGF0ZW1lbnQgb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBQcmVwYXJlZFN0YXRlbWVudCB7XG5cblx0cHJpdmF0ZSByZWFkb25seSBuYXRpdmU6IGFueTtcblxuXHRjb25zdHJ1Y3RvcihuYXRpdmU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlID0gbmF0aXZlO1xuXHR9XG5cblx0cHVibGljIGNsb3NlKCk6IHZvaWQge1xuXHRcdHRoaXMubmF0aXZlLmNsb3NlKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmVzdWx0U2V0KCk6IFJlc3VsdFNldCB7XG5cdFx0cmV0dXJuIG5ldyBSZXN1bHRTZXQodGhpcy5uYXRpdmUuZ2V0UmVzdWx0U2V0KCkpO1xuXHR9XG5cblx0cHVibGljIGV4ZWN1dGUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmV4ZWN1dGUoKTtcblx0fVxuXG5cdHB1YmxpYyBleGVjdXRlUXVlcnkoKTogUmVzdWx0U2V0IHtcblx0XHRyZXR1cm4gbmV3IFJlc3VsdFNldCh0aGlzLm5hdGl2ZS5leGVjdXRlUXVlcnkoKSk7XG5cdH1cblxuXHRwdWJsaWMgZXhlY3V0ZVVwZGF0ZSgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5leGVjdXRlVXBkYXRlKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0TnVsbChpbmRleDogbnVtYmVyLCBzcWxUeXBlOiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5zZXROdWxsKGluZGV4LCBzcWxUeXBlKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRCaW5hcnlTdHJlYW0ocGFyYW1ldGVySW5kZXg6IG51bWJlciwgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtLCBsZW5ndGg/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAobGVuZ3RoKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRCaW5hcnlTdHJlYW0ocGFyYW1ldGVySW5kZXgsIGlucHV0U3RyZWFtLCBsZW5ndGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRCaW5hcnlTdHJlYW0ocGFyYW1ldGVySW5kZXgsIGlucHV0U3RyZWFtKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0Qm9vbGVhbihpbmRleDogbnVtYmVyLCB2YWx1ZT86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0Qm9vbGVhbihpbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwoaW5kZXgsIFNRTFR5cGVzLkJPT0xFQU4pO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCeXRlKGluZGV4OiBudW1iZXIsIHZhbHVlPzogYW55IC8qOiBCeXRlKi8pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0Qnl0ZShpbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwoaW5kZXgsIFNRTFR5cGVzLlRJTllJTlQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCbG9iKGluZGV4OiBudW1iZXIsIHZhbHVlPzogYW55IC8qKjogQmxvYiovKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGxldCBibG9iID0gY3JlYXRlQmxvYlZhbHVlKHRoaXMubmF0aXZlLCB2YWx1ZSk7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRCbG9iKGluZGV4LCBibG9iKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5CTE9CKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0Q2xvYihpbmRleDogbnVtYmVyLCB2YWx1ZT86IGFueSAvKjogQ2xvYiovKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGxldCBjbG9iID0gY3JlYXRlQ2xvYlZhbHVlKHRoaXMubmF0aXZlLCB2YWx1ZSk7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRDbG9iKGluZGV4LCBjbG9iKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5DTE9CKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0TkNsb2IoaW5kZXg6IG51bWJlciwgdmFsdWU/OiBhbnkgLyo6IE5DbG9iKi8pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bGV0IG5jbG9iID0gY3JlYXRlTkNsb2JWYWx1ZSh0aGlzLm5hdGl2ZSwgdmFsdWUpO1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0TkNsb2IoaW5kZXgsIG5jbG9iKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5OQ0xPQik7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEJ5dGVzTmF0aXZlKGluZGV4OiBudW1iZXIsIHZhbHVlPzogYW55W10gLypieXRlW10qLyk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRCeXRlcyhpbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwoaW5kZXgsIFNRTFR5cGVzLlZBUkJJTkFSWSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEJ5dGVzKGluZGV4OiBudW1iZXIsIHZhbHVlPzogYW55W10gLypieXRlW10qLyk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YXIgZGF0YSA9IEJ5dGVzLnRvSmF2YUJ5dGVzKHZhbHVlKTtcblx0XHRcdHRoaXMubmF0aXZlLnNldEJ5dGVzKGluZGV4LCBkYXRhKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5WQVJCSU5BUlkpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXREYXRlKGluZGV4OiBudW1iZXIsIHZhbHVlPzogc3RyaW5nIHwgRGF0ZSk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBkYXRlID0gZ2V0RGF0ZVZhbHVlKHZhbHVlKTtcblx0XHRcdHRoaXMubmF0aXZlLnNldERhdGUoaW5kZXgsIG5ldyBKU3FsRGF0ZShkYXRlLmdldFRpbWUoKSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwoaW5kZXgsIFNRTFR5cGVzLkRBVEUpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXREb3VibGUoaW5kZXg6IG51bWJlciwgdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0RG91YmxlKGluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChpbmRleCwgU1FMVHlwZXMuRE9VQkxFKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0RmxvYXQoaW5kZXg6IG51bWJlciwgdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0RmxvYXQoaW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5GTE9BVCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEludChpbmRleDogbnVtYmVyLCB2YWx1ZT86IG51bWJlcik6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRJbnQoaW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5JTlRFR0VSKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0TG9uZyhpbmRleDogbnVtYmVyLCB2YWx1ZT86IG51bWJlcik6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRMb25nKGluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChpbmRleCwgU1FMVHlwZXMuQklHSU5UKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0U2hvcnQoaW5kZXg6IG51bWJlciwgdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0U2hvcnQoaW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5TTUFMTElOVCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldFN0cmluZyhpbmRleDogbnVtYmVyLCB2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRTdHJpbmcoaW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5WQVJDSEFSKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0VGltZShpbmRleDogbnVtYmVyLCB2YWx1ZT86IHN0cmluZyB8IERhdGUpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgZGF0ZSA9IGdldERhdGVWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRUaW1lKGluZGV4LCBuZXcgSlNxbFRpbWUoZGF0ZS5nZXRUaW1lKCkpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5USU1FKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0VGltZXN0YW1wKGluZGV4OiBudW1iZXIsIHZhbHVlPzogc3RyaW5nIHwgRGF0ZSk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBkYXRlID0gZ2V0RGF0ZVZhbHVlKHZhbHVlKTtcblx0XHRcdHRoaXMubmF0aXZlLnNldFRpbWVzdGFtcChpbmRleCwgbmV3IEpTcWxUaW1lc3RhbXAoZGF0ZS5nZXRUaW1lKCkpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5USU1FU1RBTVApO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCaWdEZWNpbWFsKGluZGV4OiBudW1iZXIsIHZhbHVlPzogbnVtYmVyIC8qOiBCaWdEZWNpbWFsKi8pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0QmlnRGVjaW1hbChpbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwoaW5kZXgsIFNRTFR5cGVzLkRFQ0lNQUwpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXROU3RyaW5nKGluZGV4OiBudW1iZXIsIHZhbHVlPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMubmF0aXZlLnNldE5TdHJpbmcoaW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKGluZGV4LCBTUUxUeXBlcy5OVkFSQ0hBUik7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGFkZEJhdGNoKCk6IHZvaWQge1xuXHRcdHRoaXMubmF0aXZlLmFkZEJhdGNoKCk7XG5cdH1cblxuXHRwdWJsaWMgZXhlY3V0ZUJhdGNoKCk6IG51bWJlcltdIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZXhlY3V0ZUJhdGNoKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TWV0YURhdGEoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0TWV0YURhdGEoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRNb3JlUmVzdWx0cygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0TW9yZVJlc3VsdHMoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRQYXJhbWV0ZXJNZXRhRGF0YSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRQYXJhbWV0ZXJNZXRhRGF0YSgpO1xuXHR9XG5cblx0cHVibGljIGdldFNRTFdhcm5pbmcoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0V2FybmluZ3MoKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Nsb3NlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuaXNDbG9zZWQoKTtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgQ2FsbGFibGVTdGF0ZW1lbnQge1xuXHRwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZTogYW55O1xuXG5cdGNvbnN0cnVjdG9yKG5hdGl2ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmUgPSBuYXRpdmU7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmVzdWx0U2V0KCk6IFJlc3VsdFNldCB7XG5cdFx0cmV0dXJuIG5ldyBSZXN1bHRTZXQodGhpcy5uYXRpdmUuZ2V0UmVzdWx0U2V0KCkpO1xuXHR9XG5cblx0cHVibGljIGV4ZWN1dGVRdWVyeSgpOiBSZXN1bHRTZXQge1xuXHRcdHJldHVybiBuZXcgUmVzdWx0U2V0KHRoaXMubmF0aXZlLmV4ZWN1dGVRdWVyeSgpKTtcblx0fVxuXG5cdHB1YmxpYyBleGVjdXRlVXBkYXRlKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmV4ZWN1dGVVcGRhdGUoKTtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3Rlck91dFBhcmFtZXRlcihwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCBzcWxUeXBlOiBrZXlvZiB0eXBlb2YgU1FMVHlwZXMgfCBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5yZWdpc3Rlck91dFBhcmFtZXRlcihwYXJhbWV0ZXJJbmRleCwgc3FsVHlwZSk7XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJPdXRQYXJhbWV0ZXJCeVNjYWxlKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHNxbFR5cGU6IGtleW9mIHR5cGVvZiBTUUxUeXBlcyB8IG51bWJlciwgc2NhbGU6IG51bWJlcik6IHZvaWQge1xuXHRcdHRoaXMubmF0aXZlLnJlZ2lzdGVyT3V0UGFyYW1ldGVyKHBhcmFtZXRlckluZGV4LCBzcWxUeXBlLCBzY2FsZSk7XG5cdH1cblxuXHRwdWJsaWMgcmVnaXN0ZXJPdXRQYXJhbWV0ZXJCeVR5cGVOYW1lKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHNxbFR5cGU6IGtleW9mIHR5cGVvZiBTUUxUeXBlcyB8IG51bWJlciwgdHlwZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMubmF0aXZlLnJlZ2lzdGVyT3V0UGFyYW1ldGVyKHBhcmFtZXRlckluZGV4LCBzcWxUeXBlLCB0eXBlTmFtZSk7XG5cdH1cblxuXHRwdWJsaWMgd2FzTnVsbCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUud2FzTnVsbCgpO1xuXHR9XG5cblx0cHVibGljIGdldFN0cmluZyhwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0U3RyaW5nKHBhcmFtZXRlckluZGV4KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRCb29sZWFuKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0Qm9vbGVhbihwYXJhbWV0ZXJJbmRleCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Qnl0ZShwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogYW55IC8qOiBieXRlKi8ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRCeXRlKHBhcmFtZXRlckluZGV4KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRTaG9ydChwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0U2hvcnQocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldEludChwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0SW50KHBhcmFtZXRlckluZGV4KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMb25nKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRMb25nKHBhcmFtZXRlckluZGV4KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRGbG9hdChwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0RmxvYXQocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldERvdWJsZShwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0RG91YmxlKHBhcmFtZXRlckluZGV4KTtcblx0fVxuXG5cdHB1YmxpYyBnZXREYXRlKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBEYXRlIHtcblx0XHRjb25zdCBkYXRlSW5zdGFuY2UgPSB0aGlzLm5hdGl2ZS5nZXREYXRlKHBhcmFtZXRlckluZGV4KTtcblx0XHRyZXR1cm4gZGF0ZUluc3RhbmNlICE9PSBudWxsICYmIGRhdGVJbnN0YW5jZSAhPT0gdW5kZWZpbmVkID8gbmV3IERhdGUoZGF0ZUluc3RhbmNlLmdldFRpbWUoKSkgOiBkYXRlSW5zdGFuY2U7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VGltZShwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogRGF0ZSB7XG5cdFx0Y29uc3QgZGF0ZUluc3RhbmNlID0gdGhpcy5uYXRpdmUuZ2V0VGltZShwYXJhbWV0ZXJJbmRleCk7XG5cdFx0cmV0dXJuIGRhdGVJbnN0YW5jZSAhPT0gbnVsbCAmJiBkYXRlSW5zdGFuY2UgIT09IHVuZGVmaW5lZCA/IG5ldyBEYXRlKGRhdGVJbnN0YW5jZS5nZXRUaW1lKCkpIDogZGF0ZUluc3RhbmNlO1xuXHR9XG5cblx0cHVibGljIGdldFRpbWVzdGFtcChwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogRGF0ZSB7XG5cdFx0Y29uc3QgZGF0ZUluc3RhbmNlID0gdGhpcy5uYXRpdmUuZ2V0VGltZXN0YW1wKHBhcmFtZXRlckluZGV4KTtcblx0XHRyZXR1cm4gZGF0ZUluc3RhbmNlICE9PSBudWxsICYmIGRhdGVJbnN0YW5jZSAhPT0gdW5kZWZpbmVkID8gbmV3IERhdGUoZGF0ZUluc3RhbmNlLmdldFRpbWUoKSkgOiBkYXRlSW5zdGFuY2U7XG5cdH1cblxuXHRwdWJsaWMgZ2V0T2JqZWN0KHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRPYmplY3QocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldEJpZ0RlY2ltYWwocGFyYW1ldGVySW5kZXg6IG51bWJlcik6IG51bWJlciAvKjogc3FsLkJpZ0RlY2ltYWwqLyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmdldEJpZ0RlY2ltYWwocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldFJlZihwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogYW55IC8qOiBzcWwuUmVmKi8ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRSZWYocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldEJ5dGVzKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBhbnlbXSAvKjogYnl0ZVtdKi8ge1xuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLm5hdGl2ZS5nZXRCeXRlcyhwYXJhbWV0ZXJJbmRleCk7XG5cdFx0cmV0dXJuIEJ5dGVzLnRvSmF2YVNjcmlwdEJ5dGVzKGRhdGEpO1xuXHR9XG5cblx0cHVibGljIGdldEJ5dGVzTmF0aXZlKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBhbnlbXSAvKjogYnl0ZVtdKi8ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRCeXRlcyhwYXJhbWV0ZXJJbmRleCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QmxvYihwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogYW55IC8qOiBzcWwuQmxvYiovIHtcblx0XHRjb25zdCBkYXRhID0gRGF0YWJhc2VGYWNhZGUucmVhZEJsb2JWYWx1ZSh0aGlzLm5hdGl2ZSwgcGFyYW1ldGVySW5kZXgpO1xuXHRcdHJldHVybiBCeXRlcy50b0phdmFTY3JpcHRCeXRlcyhkYXRhKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRCbG9iTmF0aXZlKHBhcmFtZXRlckluZGV4OiBudW1iZXIpOiBhbnkgLyo6IHNxbC5CbG9iKi8ge1xuXHRcdHJldHVybiBEYXRhYmFzZUZhY2FkZS5yZWFkQmxvYlZhbHVlKHRoaXMubmF0aXZlLCBwYXJhbWV0ZXJJbmRleCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q2xvYihwYXJhbWV0ZXJJbmRleDogbnVtYmVyKTogYW55IC8qOiBzcWwuQ2xvYiovIHtcblx0XHRyZXR1cm4gcmVhZENsb2JWYWx1ZSh0aGlzLm5hdGl2ZS5nZXRDbG9iKHBhcmFtZXRlckluZGV4KSk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TkNsb2IocGFyYW1ldGVySW5kZXg6IHN0cmluZyB8IG51bWJlcik6IGFueSAvKjogc3FsLk5DbG9iKi8ge1xuXHRcdHJldHVybiByZWFkTkNsb2JWYWx1ZSh0aGlzLm5hdGl2ZS5nZXROQ2xvYihwYXJhbWV0ZXJJbmRleCkpO1xuXHR9XG5cblx0cHVibGljIGdldE5TdHJpbmcocGFyYW1ldGVySW5kZXg6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmdldE5TdHJpbmcocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldEFycmF5KHBhcmFtZXRlckluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBhbnlbXSAvKjogc3FsLkFycmF5Ki8ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRBcnJheShwYXJhbWV0ZXJJbmRleCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VVJMKHBhcmFtZXRlckluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRVUkwocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldFJvd0lkKHBhcmFtZXRlckluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBhbnkgLyo6IHNxbC5Sb3dJZCovIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0Um93SWQocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIGdldFNRTFhNTChwYXJhbWV0ZXJJbmRleDogc3RyaW5nIHwgbnVtYmVyKTogYW55IC8qOiBzcWwuU1FMWE1MKi8ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRTUUxYTUwocGFyYW1ldGVySW5kZXgpO1xuXHR9XG5cblx0cHVibGljIHNldFVSTChwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5uYXRpdmUuc2V0VVJMKHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdH1cblxuXHRwdWJsaWMgc2V0TnVsbChwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCBzcWxUeXBlU3RyOiBrZXlvZiB0eXBlb2YgU1FMVHlwZXMgfCBudW1iZXIsIHR5cGVOYW1lPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3Qgc3FsVHlwZTogbnVtYmVyID0gTnVtYmVyLmlzSW50ZWdlcihzcWxUeXBlU3RyIGFzIG51bWJlcikgPyBzcWxUeXBlU3RyIGFzIG51bWJlciA6IFNRTFR5cGVzW3NxbFR5cGVTdHIgYXMga2V5b2YgdHlwZW9mIFNRTFR5cGVzXTtcblx0XHRpZiAodHlwZU5hbWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlTmFtZSAhPT0gbnVsbCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgc3FsVHlwZSwgdHlwZU5hbWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXROdWxsKHBhcmFtZXRlckluZGV4LCBzcWxUeXBlKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0Qm9vbGVhbihwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB2YWx1ZT86IGJvb2xlYW4pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0Qm9vbGVhbihwYXJhbWV0ZXJJbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwocGFyYW1ldGVySW5kZXgsIFNRTFR5cGVzLkJPT0xFQU4pO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCeXRlKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlPzogYW55IC8qOiBieXRlKi8pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0Qnl0ZShwYXJhbWV0ZXJJbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwocGFyYW1ldGVySW5kZXgsIFNRTFR5cGVzLkJJVCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldFNob3J0KHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlPzogbnVtYmVyKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMubmF0aXZlLnNldFNob3J0KHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuU01BTExJTlQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRJbnQocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0SW50KHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuSU5URUdFUik7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldExvbmcocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0TG9uZyhwYXJhbWV0ZXJJbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwocGFyYW1ldGVySW5kZXgsIFNRTFR5cGVzLkJJR0lOVCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEZsb2F0KHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlPzogbnVtYmVyKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMubmF0aXZlLnNldEZsb2F0KHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuRkxPQVQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXREb3VibGUocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0RG91YmxlKHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuRE9VQkxFKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0QmlnRGVjaW1hbChwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB2YWx1ZT86IG51bWJlciAvKjogQmlnRGVjaW1hbCovKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMubmF0aXZlLnNldEJpZ0RlY2ltYWwocGFyYW1ldGVySW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKHBhcmFtZXRlckluZGV4LCBTUUxUeXBlcy5ERUNJTUFMKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0U3RyaW5nKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlPzogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMubmF0aXZlLnNldFN0cmluZyhwYXJhbWV0ZXJJbmRleCwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwocGFyYW1ldGVySW5kZXgsIFNRTFR5cGVzLlZBUkNIQVIpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCeXRlcyhwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB2YWx1ZT86IGFueVtdIC8qYnl0ZVtdKi8pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0Qnl0ZXMocGFyYW1ldGVySW5kZXgsIHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKHBhcmFtZXRlckluZGV4LCBTUUxUeXBlcy5BUlJBWSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldERhdGUocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU/OiBzdHJpbmcgfCBEYXRlKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IGRhdGUgPSBnZXREYXRlVmFsdWUodmFsdWUpO1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0RGF0ZShwYXJhbWV0ZXJJbmRleCwgbmV3IEpTcWxEYXRlKGRhdGUuZ2V0VGltZSgpKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuREFURSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldFRpbWUocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU/OiBzdHJpbmcgfCBEYXRlKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IGRhdGUgPSBnZXREYXRlVmFsdWUodmFsdWUpO1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0VGltZShwYXJhbWV0ZXJJbmRleCwgbmV3IEpTcWxUaW1lKGRhdGUuZ2V0VGltZSgpKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuVElNRSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldFRpbWVzdGFtcChwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB2YWx1ZT86IHN0cmluZyB8IERhdGUpOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bGV0IGRhdGUgPSBnZXREYXRlVmFsdWUodmFsdWUpO1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0VGltZXN0YW1wKHBhcmFtZXRlckluZGV4LCBuZXcgSlNxbFRpbWVzdGFtcChkYXRlLmdldFRpbWUoKSkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwocGFyYW1ldGVySW5kZXgsIFNRTFR5cGVzLlRJTUVTVEFNUCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEFzY2lpU3RyZWFtKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbSwgbGVuZ3RoPzogbnVtYmVyKTogdm9pZCB7XG5cdFx0aWYgKGxlbmd0aCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0QXNjaWlTdHJlYW0ocGFyYW1ldGVySW5kZXgsIGlucHV0U3RyZWFtLCBsZW5ndGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRBc2NpaVN0cmVhbShwYXJhbWV0ZXJJbmRleCwgaW5wdXRTdHJlYW0pO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCaW5hcnlTdHJlYW0ocGFyYW1ldGVySW5kZXg6IG51bWJlciwgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtLCBsZW5ndGg/OiBudW1iZXIpOiB2b2lkIHtcblx0XHRpZiAobGVuZ3RoKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRCaW5hcnlTdHJlYW0ocGFyYW1ldGVySW5kZXgsIGlucHV0U3RyZWFtLCBsZW5ndGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRCaW5hcnlTdHJlYW0ocGFyYW1ldGVySW5kZXgsIGlucHV0U3RyZWFtKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0T2JqZWN0KHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnksIHRhcmdldFNxbFR5cGU/OiBudW1iZXIsIHNjYWxlPzogbnVtYmVyKTogdm9pZCB7XG5cdFx0aWYgKHNjYWxlICE9PSB1bmRlZmluZWQgJiYgc2NhbGUgIT09IG51bGwgJiYgdGFyZ2V0U3FsVHlwZSAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNxbFR5cGUgIT09IG51bGwpIHtcblx0XHRcdHRoaXMubmF0aXZlLnNldE9iamVjdChwYXJhbWV0ZXJJbmRleCwgdmFsdWUsIHRhcmdldFNxbFR5cGUsIHNjYWxlKTtcblx0XHR9IGVsc2UgaWYgKHRhcmdldFNxbFR5cGUgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXRTcWxUeXBlICE9PSBudWxsKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRPYmplY3QocGFyYW1ldGVySW5kZXgsIHZhbHVlLCB0YXJnZXRTcWxUeXBlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0T2JqZWN0KHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldFJvd0lkKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlOiBudW1iZXIgLyo6IFJvd0lkKi8pOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5zZXRSb3dJZChwYXJhbWV0ZXJJbmRleCwgdmFsdWUpO1xuXHR9XG5cblx0cHVibGljIHNldE5TdHJpbmcocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXROU3RyaW5nKHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuTlZBUkNIQVIpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRTUUxYTUwocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSAvKjogU1FMWE1MKi8pOiB2b2lkIHtcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5uYXRpdmUuc2V0U1FMWE1MKHBhcmFtZXRlckluZGV4LCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk51bGxhYmxlIFNRTFhNTCB0eXBlIG5vdCBzdXBwb3J0ZWQuXCIpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRCbG9iKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkgLypCbG9iICovKTogdm9pZCB7XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IGJsb2IgPSBjcmVhdGVCbG9iVmFsdWUodGhpcy5uYXRpdmUsIHZhbHVlKTtcblx0XHRcdHRoaXMubmF0aXZlLnNldEJsb2IocGFyYW1ldGVySW5kZXgsIGJsb2IpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNldE51bGwocGFyYW1ldGVySW5kZXgsIFNRTFR5cGVzLkJMT0IpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRDbG9iKHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkgLyo6IENsb2IqLyk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBjbG9iID0gY3JlYXRlQ2xvYlZhbHVlKHRoaXMubmF0aXZlLCB2YWx1ZSk7XG5cdFx0XHR0aGlzLm5hdGl2ZS5zZXRDbG9iKHBhcmFtZXRlckluZGV4LCBjbG9iKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZXROdWxsKHBhcmFtZXRlckluZGV4LCBTUUxUeXBlcy5DTE9CKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0TkNsb2IocGFyYW1ldGVySW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSAvKjogTkNsb2IqLyk6IHZvaWQge1xuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBuY2xvYiA9IGNyZWF0ZU5DbG9iVmFsdWUodGhpcy5uYXRpdmUsIHZhbHVlKTtcblx0XHRcdHRoaXMubmF0aXZlLnNldE5DbG9iKHBhcmFtZXRlckluZGV4LCBuY2xvYik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0TnVsbChwYXJhbWV0ZXJJbmRleCwgU1FMVHlwZXMuTkNMT0IpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBleGVjdXRlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5leGVjdXRlKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TW9yZVJlc3VsdHMoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmdldE1vcmVSZXN1bHRzKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UGFyYW1ldGVyTWV0YURhdGEoKTogYW55IC8qOiBQYXJhbWV0ZXJNZXRhRGF0YSovIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0UGFyYW1ldGVyTWV0YURhdGEoKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Nsb3NlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuaXNDbG9zZWQoKTtcblx0fVxuXG5cdHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5jbG9zZSgpO1xuXHR9XG59XG5cbi8qKlxuICogUmVzdWx0U2V0IG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgUmVzdWx0U2V0IHtcblxuXHRwcml2YXRlIHJlYWRvbmx5IG5hdGl2ZTogYW55O1xuXG5cdGNvbnN0cnVjdG9yKG5hdGl2ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmUgPSBuYXRpdmU7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgdGhlIFJlc3VsdFNldCBpbnRvIGEgSlNPTiBhcnJheSBvZiBvYmplY3RzLlxuXHQgKiBAcGFyYW0gbGltaXRlZCBXaGV0aGVyIHRvIHVzZSBsaW1pdGVkIEpTT04gY29udmVyc2lvbiAob3B0aW1pemVkKS5cblx0ICogQHBhcmFtIHN0cmluZ2lmeSBXaGV0aGVyIHRvIHJldHVybiB0aGUgSlNPTiBhcyBhIHN0cmluZyBvciBhIHBhcnNlZCBhcnJheS5cblx0ICogQHJldHVybnMgQSBKYXZhU2NyaXB0IGFycmF5IG9mIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSByZXN1bHQgc2V0LCBvciBhIHN0cmluZyBpZiBzdHJpbmdpZnkgaXMgdHJ1ZS5cblx0ICovXG5cdHB1YmxpYyB0b0pzb24obGltaXRlZCA9IGZhbHNlLCBzdHJpbmdpZnkgPSBmYWxzZSk6IGFueVtdIHtcblx0XHRjb25zdCBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTtcblx0XHRjb25zdCBvdXRwdXQgPSBXcml0ZXJPdXRwdXRTdHJlYW1cblx0XHRcdC5idWlsZGVyKClcblx0XHRcdC5zZXRXcml0ZXIoc3cpXG5cdFx0XHQuc2V0Q2hhcnNldChTdGFuZGFyZENoYXJzZXRzLlVURl84KVxuXHRcdFx0LmdldCgpO1xuXHRcdERhdGFiYXNlUmVzdWx0U2V0SGVscGVyLnRvSnNvbih0aGlzLm5hdGl2ZSwgbGltaXRlZCwgc3RyaW5naWZ5LCBvdXRwdXQpO1xuXHRcdGNvbnN0IGpzb25TdHJpbmcgPSBzdy50b1N0cmluZygpO1xuXHRcdHJldHVybiBzdHJpbmdpZnkgPyBqc29uU3RyaW5nIDogSlNPTi5wYXJzZShqc29uU3RyaW5nKTtcblx0fVxuXG5cdHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5jbG9zZSgpO1xuXHR9XG5cblx0cHVibGljIGdldEJpZ0RlY2ltYWwoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogYW55IC8qOiBCaWdEZWNpbWFsKi8gIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0QmlnRGVjaW1hbChpZGVudGlmaWVyKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRCb29sZWFuKGlkZW50aWZpZXI6IG51bWJlciB8IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRCb29sZWFuKGlkZW50aWZpZXIpO1xuXHR9XG5cblx0cHVibGljIGdldEJ5dGUoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogYW55IC8qOiBieXRlKi8ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRCeXRlKGlkZW50aWZpZXIpO1xuXHR9XG5cblx0cHVibGljIGdldEJ5dGVzKGlkZW50aWZpZXI6IG51bWJlciB8IHN0cmluZyk6IGFueVtdIC8qOiBieXRlW10qLyB7XG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMubmF0aXZlLmdldEJ5dGVzKGlkZW50aWZpZXIpO1xuXHRcdHJldHVybiBCeXRlcy50b0phdmFTY3JpcHRCeXRlcyhkYXRhKTtcblx0fTtcblxuXHRwdWJsaWMgZ2V0Qnl0ZXNOYXRpdmUoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogYW55W10gLyo6IGJ5dGVbXSovIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0Qnl0ZXMoaWRlbnRpZmllcik7XG5cdH07XG5cblx0cHVibGljIGdldEJsb2IoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogYW55IC8qOiBzcWwuQmxvYiovIHtcblx0XHRjb25zdCBkYXRhID0gRGF0YWJhc2VGYWNhZGUucmVhZEJsb2JWYWx1ZSh0aGlzLm5hdGl2ZSwgaWRlbnRpZmllcik7XG5cdFx0cmV0dXJuIEJ5dGVzLnRvSmF2YVNjcmlwdEJ5dGVzKGRhdGEpO1xuXHR9XG5cblx0cHVibGljIGdldEJsb2JOYXRpdmUoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogYW55IC8qOiBzcWwuQmxvYiovIHtcblx0XHRyZXR1cm4gRGF0YWJhc2VGYWNhZGUucmVhZEJsb2JWYWx1ZSh0aGlzLm5hdGl2ZSwgaWRlbnRpZmllcik7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q2xvYihpZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcpOiBhbnkgLyo6IHNxbC5DbG9iKi8ge1xuXHRcdHJldHVybiByZWFkQ2xvYlZhbHVlKHRoaXMubmF0aXZlLmdldENsb2IoaWRlbnRpZmllcikpO1xuXHR9XG5cblx0cHVibGljIGdldE5DbG9iKGlkZW50aWZpZXI6IG51bWJlciB8IHN0cmluZyk6IGFueSAvKjogc3FsLk5DbG9iKi8ge1xuXHRcdHJldHVybiByZWFkTkNsb2JWYWx1ZSh0aGlzLm5hdGl2ZS5nZXROQ2xvYihpZGVudGlmaWVyKSk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RGF0ZShpZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcpOiBEYXRlIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBkYXRlSW5zdGFuY2UgPSB0aGlzLm5hdGl2ZS5nZXREYXRlKGlkZW50aWZpZXIpO1xuXHRcdHJldHVybiBkYXRlSW5zdGFuY2UgIT09IG51bGwgJiYgZGF0ZUluc3RhbmNlICE9PSB1bmRlZmluZWQgPyBuZXcgRGF0ZShkYXRlSW5zdGFuY2UuZ2V0VGltZSgpKSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXREb3VibGUoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0RG91YmxlKGlkZW50aWZpZXIpO1xuXHR9XG5cblx0cHVibGljIGdldEZsb2F0KGlkZW50aWZpZXI6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmdldEZsb2F0KGlkZW50aWZpZXIpO1xuXHR9XG5cblx0cHVibGljIGdldEludChpZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRJbnQoaWRlbnRpZmllcik7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TG9uZyhpZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRMb25nKGlkZW50aWZpZXIpO1xuXHR9XG5cblx0cHVibGljIGdldFNob3J0KGlkZW50aWZpZXI6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmdldFNob3J0KGlkZW50aWZpZXIpO1xuXHR9XG5cblx0cHVibGljIGdldFN0cmluZyhpZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRTdHJpbmcoaWRlbnRpZmllcik7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VGltZShpZGVudGlmaWVyOiBudW1iZXIgfCBzdHJpbmcpOiBEYXRlIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBkYXRlSW5zdGFuY2UgPSB0aGlzLm5hdGl2ZS5nZXRUaW1lKGlkZW50aWZpZXIpO1xuXHRcdHJldHVybiBkYXRlSW5zdGFuY2UgIT09IG51bGwgJiYgZGF0ZUluc3RhbmNlICE9PSB1bmRlZmluZWQgPyBuZXcgRGF0ZShkYXRlSW5zdGFuY2UuZ2V0VGltZSgpKSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRUaW1lc3RhbXAoaWRlbnRpZmllcjogbnVtYmVyIHwgc3RyaW5nKTogRGF0ZSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgZGF0ZUluc3RhbmNlID0gdGhpcy5uYXRpdmUuZ2V0VGltZXN0YW1wKGlkZW50aWZpZXIpO1xuXHRcdHJldHVybiBkYXRlSW5zdGFuY2UgIT09IG51bGwgJiYgZGF0ZUluc3RhbmNlICE9PSB1bmRlZmluZWQgPyBuZXcgRGF0ZShkYXRlSW5zdGFuY2UuZ2V0VGltZSgpKSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBpc0FmdGVyTGFzdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuaXNBZnRlckxhc3QoKTtcblx0fVxuXG5cdHB1YmxpYyBpc0JlZm9yZUZpcnN0KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5pc0JlZm9yZUZpcnN0KCk7XG5cdH1cblxuXHRwdWJsaWMgaXNDbG9zZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmlzQ2xvc2VkKCk7XG5cdH1cblxuXHRwdWJsaWMgaXNGaXJzdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuaXNGaXJzdCgpO1xuXHR9XG5cblx0cHVibGljIGlzTGFzdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuaXNMYXN0KCk7XG5cdH1cblxuXHRwdWJsaWMgbmV4dCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUubmV4dCgpO1xuXHR9XG5cblx0cHVibGljIGdldE1ldGFEYXRhKCk6IGFueSAvKjogUmVzdWx0U2V0TWV0YURhdGEqLyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmdldE1ldGFEYXRhKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TlN0cmluZyhjb2x1bW5JbmRleDogbnVtYmVyKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0TlN0cmluZyhjb2x1bW5JbmRleCk7XG5cdH1cbn1cblxuLy8gLS0tIENvbm5lY3Rpb24gQ2xhc3MgLS0tXG5cbi8qKlxuICogQ29ubmVjdGlvbiBvYmplY3Qgd3JhcHBlciBhcm91bmQgYSBuYXRpdmUgSmF2YSBgQ29ubmVjdGlvbmAuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uIHtcblxuXHRwdWJsaWMgcmVhZG9ubHkgbmF0aXZlOiBhbnk7XG5cblx0Y29uc3RydWN0b3IoZGF0YXNvdXJjZU5hbWU/OiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZSA9IERhdGFiYXNlRmFjYWRlLmdldENvbm5lY3Rpb24oZGF0YXNvdXJjZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgY29ubmVjdGlvbiBpcyBmb3IgYSBzcGVjaWZpYyBkYXRhYmFzZSBzeXN0ZW0uXG5cdCAqL1xuXHRwdWJsaWMgaXNPZlR5cGUoZGF0YWJhc2VTeXN0ZW06IERhdGFiYXNlU3lzdGVtKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2VTeXN0ZW0oKSA9PT0gZGF0YWJhc2VTeXN0ZW07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSBzeXN0ZW0gYXMgYSB7QGxpbmsgRGF0YWJhc2VTeXN0ZW19IGVudW0uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RGF0YWJhc2VTeXN0ZW0oKTogRGF0YWJhc2VTeXN0ZW0ge1xuXHRcdGNvbnN0IGRiU3lzdGVtOiBzdHJpbmcgPSB0aGlzLm5hdGl2ZS5nZXREYXRhYmFzZVN5c3RlbSgpLm5hbWUoKTtcblx0XHRzd2l0Y2ggKGRiU3lzdGVtKSB7XG5cdFx0XHRjYXNlIFwiREVSQllcIjpcblx0XHRcdFx0cmV0dXJuIERhdGFiYXNlU3lzdGVtLkRFUkJZO1xuXHRcdFx0Y2FzZSBcIlBPU1RHUkVTUUxcIjpcblx0XHRcdFx0cmV0dXJuIERhdGFiYXNlU3lzdGVtLlBPU1RHUkVTUUw7XG5cdFx0XHRjYXNlIFwiSDJcIjpcblx0XHRcdFx0cmV0dXJuIERhdGFiYXNlU3lzdGVtLkgyO1xuXHRcdFx0Y2FzZSBcIk1BUklBREJcIjpcblx0XHRcdFx0cmV0dXJuIERhdGFiYXNlU3lzdGVtLk1BUklBREI7XG5cdFx0XHRjYXNlIFwiSEFOQVwiOlxuXHRcdFx0XHRyZXR1cm4gRGF0YWJhc2VTeXN0ZW0uSEFOQTtcblx0XHRcdGNhc2UgXCJTTk9XRkxBS0VcIjpcblx0XHRcdFx0cmV0dXJuIERhdGFiYXNlU3lzdGVtLlNOT1dGTEFLRTtcblx0XHRcdGNhc2UgXCJNWVNRTFwiOlxuXHRcdFx0XHRyZXR1cm4gRGF0YWJhc2VTeXN0ZW0uTVlTUUw7XG5cdFx0XHRjYXNlIFwiTU9OR09EQlwiOlxuXHRcdFx0XHRyZXR1cm4gRGF0YWJhc2VTeXN0ZW0uTU9OR09EQjtcblx0XHRcdGNhc2UgXCJTWUJBU0VcIjpcblx0XHRcdFx0cmV0dXJuIERhdGFiYXNlU3lzdGVtLlNZQkFTRTtcblx0XHRcdGNhc2UgXCJVTktOT1dOXCI6XG5cdFx0XHRcdHJldHVybiBEYXRhYmFzZVN5c3RlbS5VTktOT1dOO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG1hcHBpbmcgZm9yIGRhdGFiYXNlIHN5c3RlbSB0eXBlICR7ZGJTeXN0ZW19YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFByZXBhcmVkU3RhdGVtZW50fSBvYmplY3QgZm9yIHNlbmRpbmcgcGFyYW1ldGVyaXplZCBTUUwgc3RhdGVtZW50cyB0byB0aGUgZGF0YWJhc2UuXG5cdCAqL1xuXHRwdWJsaWMgcHJlcGFyZVN0YXRlbWVudChzcWw6IHN0cmluZyk6IFByZXBhcmVkU3RhdGVtZW50IHtcblx0XHRyZXR1cm4gbmV3IFByZXBhcmVkU3RhdGVtZW50KHRoaXMubmF0aXZlLnByZXBhcmVTdGF0ZW1lbnQoc3FsKSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIHtAbGluayBDYWxsYWJsZVN0YXRlbWVudH0gb2JqZWN0IGZvciBjYWxsaW5nIGRhdGFiYXNlIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGZ1bmN0aW9ucy5cblx0ICovXG5cdHB1YmxpYyBwcmVwYXJlQ2FsbChzcWw6IHN0cmluZyk6IENhbGxhYmxlU3RhdGVtZW50IHtcblx0XHRyZXR1cm4gbmV3IENhbGxhYmxlU3RhdGVtZW50KHRoaXMubmF0aXZlLnByZXBhcmVDYWxsKHNxbCkpO1xuXHR9XG5cblx0cHVibGljIGNsb3NlKCk6IHZvaWQge1xuXHRcdGlmICghdGhpcy5pc0Nsb3NlZCgpKSB7XG5cdFx0XHR0aGlzLm5hdGl2ZS5jbG9zZSgpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjb21taXQoKTogdm9pZCB7XG5cdFx0dGhpcy5uYXRpdmUuY29tbWl0KCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QXV0b0NvbW1pdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0QXV0b0NvbW1pdCgpO1xuXHR9XG5cblx0cHVibGljIGdldENhdGFsb2coKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0Q2F0YWxvZygpO1xuXHR9XG5cblx0cHVibGljIGdldFNjaGVtYSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRTY2hlbWEoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRUcmFuc2FjdGlvbklzb2xhdGlvbigpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5nZXRUcmFuc2FjdGlvbklzb2xhdGlvbigpO1xuXHR9XG5cblx0cHVibGljIGlzQ2xvc2VkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5pc0Nsb3NlZCgpO1xuXHR9XG5cblx0cHVibGljIGlzUmVhZE9ubHkoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlLmlzUmVhZE9ubHkoKTtcblx0fVxuXG5cdHB1YmxpYyBpc1ZhbGlkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZS5pc1ZhbGlkKCk7XG5cdH1cblxuXHRwdWJsaWMgcm9sbGJhY2soKTogdm9pZCB7XG5cdFx0dGhpcy5uYXRpdmUucm9sbGJhY2soKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRBdXRvQ29tbWl0KGF1dG9Db21taXQ6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5zZXRBdXRvQ29tbWl0KGF1dG9Db21taXQpO1xuXHR9XG5cblx0cHVibGljIHNldENhdGFsb2coY2F0YWxvZzogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5uYXRpdmUuc2V0Q2F0YWxvZyhjYXRhbG9nKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRSZWFkT25seShyZWFkT25seTogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMubmF0aXZlLnNldFJlYWRPbmx5KHJlYWRPbmx5KTtcblx0fVxuXG5cdHB1YmxpYyBzZXRTY2hlbWEoc2NoZW1hOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLm5hdGl2ZS5zZXRTY2hlbWEoc2NoZW1hKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRUcmFuc2FjdGlvbklzb2xhdGlvbih0cmFuc2FjdGlvbklzb2xhdGlvbjogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy5uYXRpdmUuc2V0VHJhbnNhY3Rpb25Jc29sYXRpb24odHJhbnNhY3Rpb25Jc29sYXRpb24pO1xuXHR9XG5cblx0cHVibGljIGdldE1ldGFEYXRhKCk6IGFueSAvKjogRGF0YWJhc2VNZXRhRGF0YSovIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmUuZ2V0TWV0YURhdGEoKTtcblx0fVxufVxuXG4vLyAtLS0gRGF0YWJhc2UgQ2xhc3MgLS0tXG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZSB7XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBsaXN0IG9mIGF2YWlsYWJsZSBkYXRhIHNvdXJjZSBuYW1lcy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0RGF0YVNvdXJjZXMoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IGRhdGFzb3VyY2VzID0gRGF0YWJhc2VGYWNhZGUuZ2V0RGF0YVNvdXJjZXMoKTtcblx0XHRyZXR1cm4gZGF0YXNvdXJjZXMgPyBKU09OLnBhcnNlKGRhdGFzb3VyY2VzKSA6IFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgZGF0YWJhc2UgbWV0YWRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgZGF0YSBzb3VyY2UuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldE1ldGFkYXRhKGRhdGFzb3VyY2VOYW1lPzogc3RyaW5nKTogRGF0YWJhc2VNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBEYXRhYmFzZUZhY2FkZS5nZXRNZXRhZGF0YShkYXRhc291cmNlTmFtZSk7XG5cdFx0cmV0dXJuIG1ldGFkYXRhID8gSlNPTi5wYXJzZShtZXRhZGF0YSkgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcHJvZHVjdCBuYW1lIG9mIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHN5c3RlbS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0UHJvZHVjdE5hbWUoZGF0YXNvdXJjZU5hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBEYXRhYmFzZUZhY2FkZS5nZXRQcm9kdWN0TmFtZShkYXRhc291cmNlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0Q29ubmVjdGlvbihkYXRhc291cmNlTmFtZT86IHN0cmluZyk6IENvbm5lY3Rpb24ge1xuXHRcdHJldHVybiBuZXcgQ29ubmVjdGlvbihkYXRhc291cmNlTmFtZSk7XG5cdH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0bW9kdWxlLmV4cG9ydHMgPSB7XG5cdFx0RGF0YWJhc2UsXG5cdFx0Q29ubmVjdGlvbixcblx0XHRQcmVwYXJlZFN0YXRlbWVudCxcblx0XHRDYWxsYWJsZVN0YXRlbWVudCxcblx0XHRSZXN1bHRT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YyxpQkFBMkI7QUFDeEMsVUFBTSxjQUFjLGVBQWUsZUFBZTtBQUNsRCxXQUFPLGNBQWMsS0FBSyxNQUFNLFdBQVcsSUFBSSxDQUFDO0FBQUEsRUFDakQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE9BQWMsWUFBWSxnQkFBdUQ7QUFDaEYsVUFBTSxXQUFXLGVBQWUsWUFBWSxjQUFjO0FBQzFELFdBQU8sV0FBVyxLQUFLLE1BQU0sUUFBUSxJQUFJO0FBQUEsRUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE9BQWMsZUFBZSxnQkFBaUM7QUFDN0QsV0FBTyxlQUFlLGVBQWUsY0FBYztBQUFBLEVBQ3BEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxPQUFjLGNBQWMsZ0JBQXFDO0FBQ2hFLFdBQU8sSUFBSSxXQUFXLGNBQWM7QUFBQSxFQUNyQztBQUNEO0FBR0EsSUFBSSxPQUFPLFdBQVcsYUFBYTtBQUVsQyxTQUFPLFVBQVU7QUFBQSxJQUNoQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Q7QUFDRDsiLAogICJuYW1lcyI6IFsiRGF0YWJhc2VTeXN0ZW0iLCAiaXNIYW5hRGF0YWJhc2UiXQp9Cg==