cdktn 0.23.2 → 0.23.4

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 (383) hide show
  1. package/.jsii +468 -251
  2. package/README.md +3 -3
  3. package/lib/annotations.js +1 -1
  4. package/lib/app.js +1 -1
  5. package/lib/aspect.js +1 -1
  6. package/lib/backends/azurerm-backend.js +2 -2
  7. package/lib/backends/cloud-backend.js +4 -4
  8. package/lib/backends/consul-backend.js +2 -2
  9. package/lib/backends/cos-backend.js +2 -2
  10. package/lib/backends/gcs-backend.js +2 -2
  11. package/lib/backends/http-backend.js +2 -2
  12. package/lib/backends/local-backend.js +2 -2
  13. package/lib/backends/oss-backend.js +2 -2
  14. package/lib/backends/pg-backend.js +2 -2
  15. package/lib/backends/remote-backend.js +4 -4
  16. package/lib/backends/s3-backend.d.ts +11 -1
  17. package/lib/backends/s3-backend.js +11 -4
  18. package/lib/backends/swift-backend.js +2 -2
  19. package/lib/complex-computed-list.js +25 -25
  20. package/lib/errors.d.ts +1 -2
  21. package/lib/errors.js +11 -8
  22. package/lib/features.d.ts +9 -0
  23. package/lib/features.js +11 -2
  24. package/lib/functions/function-availability.generated.d.ts +16 -0
  25. package/lib/functions/function-availability.generated.js +21 -0
  26. package/lib/functions/helpers.js +3 -1
  27. package/lib/functions/terraform-functions.generated.d.ts +40 -2
  28. package/lib/functions/terraform-functions.generated.js +57 -5
  29. package/lib/functions/usage-registry.d.ts +6 -0
  30. package/lib/functions/usage-registry.js +34 -0
  31. package/lib/importable-resource.js +1 -1
  32. package/lib/manifest.js +4 -5
  33. package/lib/resource.js +1 -1
  34. package/lib/synthesize/synthesizer.js +8 -5
  35. package/lib/terraform-asset.js +1 -1
  36. package/lib/terraform-backend.js +1 -1
  37. package/lib/terraform-count.js +1 -1
  38. package/lib/terraform-data-resource.js +1 -1
  39. package/lib/terraform-data-source.js +1 -1
  40. package/lib/terraform-dynamic-block.js +2 -2
  41. package/lib/terraform-dynamic-expression.js +2 -2
  42. package/lib/terraform-element.js +1 -1
  43. package/lib/terraform-functions.js +1 -1
  44. package/lib/terraform-hcl-module.js +1 -1
  45. package/lib/terraform-iterator.js +5 -5
  46. package/lib/terraform-local.js +1 -1
  47. package/lib/terraform-module.js +1 -1
  48. package/lib/terraform-operators.js +1 -1
  49. package/lib/terraform-output.js +1 -1
  50. package/lib/terraform-provider.js +1 -1
  51. package/lib/terraform-provisioner.js +1 -1
  52. package/lib/terraform-remote-state.js +1 -1
  53. package/lib/terraform-resource-targets.js +1 -1
  54. package/lib/terraform-resource.js +1 -1
  55. package/lib/terraform-stack.js +6 -2
  56. package/lib/terraform-variable.js +2 -2
  57. package/lib/testing/index.js +8 -9
  58. package/lib/testing/matchers.js +1 -1
  59. package/lib/tokens/lazy.js +4 -4
  60. package/lib/tokens/private/intrinsic.d.ts +0 -5
  61. package/lib/tokens/private/intrinsic.js +2 -9
  62. package/lib/tokens/private/stack-trace.d.ts +6 -0
  63. package/lib/tokens/private/stack-trace.js +14 -1
  64. package/lib/tokens/resolvable.js +4 -4
  65. package/lib/tokens/string-fragments.js +1 -1
  66. package/lib/tokens/token.js +2 -2
  67. package/lib/tsconfig.tsbuildinfo +1 -1
  68. package/lib/upgrade-id-aspect.js +1 -1
  69. package/lib/validations/index.d.ts +3 -0
  70. package/lib/validations/index.js +4 -1
  71. package/lib/validations/target-versions.d.ts +71 -0
  72. package/lib/validations/target-versions.js +132 -0
  73. package/lib/validations/validate-binary-version.d.ts +10 -0
  74. package/lib/validations/validate-binary-version.js +11 -1
  75. package/lib/validations/validate-function-version-support.d.ts +21 -0
  76. package/lib/validations/validate-function-version-support.js +53 -0
  77. package/lib/validations/validate-terraform-feature-version.d.ts +34 -0
  78. package/lib/validations/validate-terraform-feature-version.js +34 -0
  79. package/node_modules/{call-bind-apply-helpers → safe-stable-stringify}/LICENSE +2 -2
  80. package/node_modules/safe-stable-stringify/esm/package.json +4 -0
  81. package/node_modules/safe-stable-stringify/esm/wrapper.d.ts +4 -0
  82. package/node_modules/safe-stable-stringify/esm/wrapper.js +6 -0
  83. package/node_modules/safe-stable-stringify/index.d.ts +22 -0
  84. package/node_modules/safe-stable-stringify/index.js +625 -0
  85. package/node_modules/safe-stable-stringify/package.json +65 -0
  86. package/node_modules/safe-stable-stringify/readme.md +179 -0
  87. package/package.json +11 -12
  88. package/scripts/pack.mjs +168 -0
  89. package/node_modules/call-bind/.eslintignore +0 -1
  90. package/node_modules/call-bind/.eslintrc +0 -16
  91. package/node_modules/call-bind/.github/FUNDING.yml +0 -12
  92. package/node_modules/call-bind/.nycrc +0 -9
  93. package/node_modules/call-bind/CHANGELOG.md +0 -106
  94. package/node_modules/call-bind/LICENSE +0 -21
  95. package/node_modules/call-bind/README.md +0 -64
  96. package/node_modules/call-bind/callBound.js +0 -15
  97. package/node_modules/call-bind/index.js +0 -24
  98. package/node_modules/call-bind/package.json +0 -93
  99. package/node_modules/call-bind/test/callBound.js +0 -54
  100. package/node_modules/call-bind/test/index.js +0 -74
  101. package/node_modules/call-bind-apply-helpers/.eslintrc +0 -17
  102. package/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +0 -12
  103. package/node_modules/call-bind-apply-helpers/.nycrc +0 -9
  104. package/node_modules/call-bind-apply-helpers/CHANGELOG.md +0 -30
  105. package/node_modules/call-bind-apply-helpers/README.md +0 -62
  106. package/node_modules/call-bind-apply-helpers/actualApply.d.ts +0 -1
  107. package/node_modules/call-bind-apply-helpers/actualApply.js +0 -10
  108. package/node_modules/call-bind-apply-helpers/applyBind.d.ts +0 -19
  109. package/node_modules/call-bind-apply-helpers/applyBind.js +0 -10
  110. package/node_modules/call-bind-apply-helpers/functionApply.d.ts +0 -1
  111. package/node_modules/call-bind-apply-helpers/functionApply.js +0 -4
  112. package/node_modules/call-bind-apply-helpers/functionCall.d.ts +0 -1
  113. package/node_modules/call-bind-apply-helpers/functionCall.js +0 -4
  114. package/node_modules/call-bind-apply-helpers/index.d.ts +0 -64
  115. package/node_modules/call-bind-apply-helpers/index.js +0 -15
  116. package/node_modules/call-bind-apply-helpers/package.json +0 -85
  117. package/node_modules/call-bind-apply-helpers/reflectApply.d.ts +0 -3
  118. package/node_modules/call-bind-apply-helpers/reflectApply.js +0 -4
  119. package/node_modules/call-bind-apply-helpers/test/index.js +0 -63
  120. package/node_modules/call-bind-apply-helpers/tsconfig.json +0 -9
  121. package/node_modules/call-bound/.eslintrc +0 -13
  122. package/node_modules/call-bound/.github/FUNDING.yml +0 -12
  123. package/node_modules/call-bound/.nycrc +0 -9
  124. package/node_modules/call-bound/CHANGELOG.md +0 -42
  125. package/node_modules/call-bound/LICENSE +0 -21
  126. package/node_modules/call-bound/README.md +0 -53
  127. package/node_modules/call-bound/index.d.ts +0 -94
  128. package/node_modules/call-bound/index.js +0 -19
  129. package/node_modules/call-bound/package.json +0 -99
  130. package/node_modules/call-bound/test/index.js +0 -61
  131. package/node_modules/call-bound/tsconfig.json +0 -10
  132. package/node_modules/define-data-property/.eslintrc +0 -24
  133. package/node_modules/define-data-property/.github/FUNDING.yml +0 -12
  134. package/node_modules/define-data-property/.nycrc +0 -13
  135. package/node_modules/define-data-property/CHANGELOG.md +0 -70
  136. package/node_modules/define-data-property/LICENSE +0 -21
  137. package/node_modules/define-data-property/README.md +0 -67
  138. package/node_modules/define-data-property/index.d.ts +0 -12
  139. package/node_modules/define-data-property/index.js +0 -56
  140. package/node_modules/define-data-property/package.json +0 -106
  141. package/node_modules/define-data-property/test/index.js +0 -392
  142. package/node_modules/define-data-property/tsconfig.json +0 -59
  143. package/node_modules/dunder-proto/.eslintrc +0 -5
  144. package/node_modules/dunder-proto/.github/FUNDING.yml +0 -12
  145. package/node_modules/dunder-proto/.nycrc +0 -13
  146. package/node_modules/dunder-proto/CHANGELOG.md +0 -24
  147. package/node_modules/dunder-proto/LICENSE +0 -21
  148. package/node_modules/dunder-proto/README.md +0 -54
  149. package/node_modules/dunder-proto/get.d.ts +0 -5
  150. package/node_modules/dunder-proto/get.js +0 -30
  151. package/node_modules/dunder-proto/package.json +0 -76
  152. package/node_modules/dunder-proto/set.d.ts +0 -5
  153. package/node_modules/dunder-proto/set.js +0 -35
  154. package/node_modules/dunder-proto/test/get.js +0 -34
  155. package/node_modules/dunder-proto/test/index.js +0 -4
  156. package/node_modules/dunder-proto/test/set.js +0 -50
  157. package/node_modules/dunder-proto/tsconfig.json +0 -9
  158. package/node_modules/es-define-property/.eslintrc +0 -13
  159. package/node_modules/es-define-property/.github/FUNDING.yml +0 -12
  160. package/node_modules/es-define-property/.nycrc +0 -9
  161. package/node_modules/es-define-property/CHANGELOG.md +0 -29
  162. package/node_modules/es-define-property/LICENSE +0 -21
  163. package/node_modules/es-define-property/README.md +0 -49
  164. package/node_modules/es-define-property/index.d.ts +0 -3
  165. package/node_modules/es-define-property/index.js +0 -14
  166. package/node_modules/es-define-property/package.json +0 -81
  167. package/node_modules/es-define-property/test/index.js +0 -56
  168. package/node_modules/es-define-property/tsconfig.json +0 -10
  169. package/node_modules/es-errors/.eslintrc +0 -5
  170. package/node_modules/es-errors/.github/FUNDING.yml +0 -12
  171. package/node_modules/es-errors/CHANGELOG.md +0 -40
  172. package/node_modules/es-errors/LICENSE +0 -21
  173. package/node_modules/es-errors/README.md +0 -55
  174. package/node_modules/es-errors/eval.d.ts +0 -3
  175. package/node_modules/es-errors/eval.js +0 -4
  176. package/node_modules/es-errors/index.d.ts +0 -3
  177. package/node_modules/es-errors/index.js +0 -4
  178. package/node_modules/es-errors/package.json +0 -80
  179. package/node_modules/es-errors/range.d.ts +0 -3
  180. package/node_modules/es-errors/range.js +0 -4
  181. package/node_modules/es-errors/ref.d.ts +0 -3
  182. package/node_modules/es-errors/ref.js +0 -4
  183. package/node_modules/es-errors/syntax.d.ts +0 -3
  184. package/node_modules/es-errors/syntax.js +0 -4
  185. package/node_modules/es-errors/test/index.js +0 -19
  186. package/node_modules/es-errors/tsconfig.json +0 -49
  187. package/node_modules/es-errors/type.d.ts +0 -3
  188. package/node_modules/es-errors/type.js +0 -4
  189. package/node_modules/es-errors/uri.d.ts +0 -3
  190. package/node_modules/es-errors/uri.js +0 -4
  191. package/node_modules/es-object-atoms/.eslintrc +0 -16
  192. package/node_modules/es-object-atoms/.github/FUNDING.yml +0 -12
  193. package/node_modules/es-object-atoms/CHANGELOG.md +0 -37
  194. package/node_modules/es-object-atoms/LICENSE +0 -21
  195. package/node_modules/es-object-atoms/README.md +0 -63
  196. package/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +0 -3
  197. package/node_modules/es-object-atoms/RequireObjectCoercible.js +0 -11
  198. package/node_modules/es-object-atoms/ToObject.d.ts +0 -7
  199. package/node_modules/es-object-atoms/ToObject.js +0 -10
  200. package/node_modules/es-object-atoms/index.d.ts +0 -3
  201. package/node_modules/es-object-atoms/index.js +0 -4
  202. package/node_modules/es-object-atoms/isObject.d.ts +0 -3
  203. package/node_modules/es-object-atoms/isObject.js +0 -6
  204. package/node_modules/es-object-atoms/package.json +0 -80
  205. package/node_modules/es-object-atoms/test/index.js +0 -38
  206. package/node_modules/es-object-atoms/tsconfig.json +0 -6
  207. package/node_modules/function-bind/.eslintrc +0 -21
  208. package/node_modules/function-bind/.github/FUNDING.yml +0 -12
  209. package/node_modules/function-bind/.github/SECURITY.md +0 -3
  210. package/node_modules/function-bind/.nycrc +0 -13
  211. package/node_modules/function-bind/CHANGELOG.md +0 -136
  212. package/node_modules/function-bind/LICENSE +0 -20
  213. package/node_modules/function-bind/README.md +0 -46
  214. package/node_modules/function-bind/implementation.js +0 -84
  215. package/node_modules/function-bind/index.js +0 -5
  216. package/node_modules/function-bind/package.json +0 -87
  217. package/node_modules/function-bind/test/.eslintrc +0 -9
  218. package/node_modules/function-bind/test/index.js +0 -252
  219. package/node_modules/get-intrinsic/.eslintrc +0 -42
  220. package/node_modules/get-intrinsic/.github/FUNDING.yml +0 -12
  221. package/node_modules/get-intrinsic/.nycrc +0 -9
  222. package/node_modules/get-intrinsic/CHANGELOG.md +0 -186
  223. package/node_modules/get-intrinsic/LICENSE +0 -21
  224. package/node_modules/get-intrinsic/README.md +0 -71
  225. package/node_modules/get-intrinsic/index.js +0 -378
  226. package/node_modules/get-intrinsic/package.json +0 -97
  227. package/node_modules/get-intrinsic/test/GetIntrinsic.js +0 -274
  228. package/node_modules/get-proto/.eslintrc +0 -10
  229. package/node_modules/get-proto/.github/FUNDING.yml +0 -12
  230. package/node_modules/get-proto/.nycrc +0 -9
  231. package/node_modules/get-proto/CHANGELOG.md +0 -21
  232. package/node_modules/get-proto/LICENSE +0 -21
  233. package/node_modules/get-proto/Object.getPrototypeOf.d.ts +0 -5
  234. package/node_modules/get-proto/Object.getPrototypeOf.js +0 -6
  235. package/node_modules/get-proto/README.md +0 -50
  236. package/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +0 -3
  237. package/node_modules/get-proto/Reflect.getPrototypeOf.js +0 -4
  238. package/node_modules/get-proto/index.d.ts +0 -5
  239. package/node_modules/get-proto/index.js +0 -27
  240. package/node_modules/get-proto/package.json +0 -81
  241. package/node_modules/get-proto/test/index.js +0 -68
  242. package/node_modules/get-proto/tsconfig.json +0 -9
  243. package/node_modules/gopd/.eslintrc +0 -16
  244. package/node_modules/gopd/.github/FUNDING.yml +0 -12
  245. package/node_modules/gopd/CHANGELOG.md +0 -45
  246. package/node_modules/gopd/LICENSE +0 -21
  247. package/node_modules/gopd/README.md +0 -40
  248. package/node_modules/gopd/gOPD.d.ts +0 -1
  249. package/node_modules/gopd/gOPD.js +0 -4
  250. package/node_modules/gopd/index.d.ts +0 -5
  251. package/node_modules/gopd/index.js +0 -15
  252. package/node_modules/gopd/package.json +0 -77
  253. package/node_modules/gopd/test/index.js +0 -36
  254. package/node_modules/gopd/tsconfig.json +0 -9
  255. package/node_modules/has-property-descriptors/.eslintrc +0 -13
  256. package/node_modules/has-property-descriptors/.github/FUNDING.yml +0 -12
  257. package/node_modules/has-property-descriptors/.nycrc +0 -9
  258. package/node_modules/has-property-descriptors/CHANGELOG.md +0 -35
  259. package/node_modules/has-property-descriptors/LICENSE +0 -21
  260. package/node_modules/has-property-descriptors/README.md +0 -43
  261. package/node_modules/has-property-descriptors/index.js +0 -22
  262. package/node_modules/has-property-descriptors/package.json +0 -77
  263. package/node_modules/has-property-descriptors/test/index.js +0 -57
  264. package/node_modules/has-symbols/.eslintrc +0 -11
  265. package/node_modules/has-symbols/.github/FUNDING.yml +0 -12
  266. package/node_modules/has-symbols/.nycrc +0 -9
  267. package/node_modules/has-symbols/CHANGELOG.md +0 -91
  268. package/node_modules/has-symbols/LICENSE +0 -21
  269. package/node_modules/has-symbols/README.md +0 -46
  270. package/node_modules/has-symbols/index.d.ts +0 -3
  271. package/node_modules/has-symbols/index.js +0 -14
  272. package/node_modules/has-symbols/package.json +0 -111
  273. package/node_modules/has-symbols/shams.d.ts +0 -3
  274. package/node_modules/has-symbols/shams.js +0 -45
  275. package/node_modules/has-symbols/test/index.js +0 -22
  276. package/node_modules/has-symbols/test/shams/core-js.js +0 -29
  277. package/node_modules/has-symbols/test/shams/get-own-property-symbols.js +0 -29
  278. package/node_modules/has-symbols/test/tests.js +0 -58
  279. package/node_modules/has-symbols/tsconfig.json +0 -10
  280. package/node_modules/hasown/.eslintrc +0 -5
  281. package/node_modules/hasown/.github/FUNDING.yml +0 -12
  282. package/node_modules/hasown/.nycrc +0 -13
  283. package/node_modules/hasown/CHANGELOG.md +0 -40
  284. package/node_modules/hasown/LICENSE +0 -21
  285. package/node_modules/hasown/README.md +0 -40
  286. package/node_modules/hasown/index.d.ts +0 -3
  287. package/node_modules/hasown/index.js +0 -8
  288. package/node_modules/hasown/package.json +0 -92
  289. package/node_modules/hasown/tsconfig.json +0 -6
  290. package/node_modules/isarray/LICENSE +0 -21
  291. package/node_modules/isarray/README.md +0 -38
  292. package/node_modules/isarray/index.js +0 -5
  293. package/node_modules/isarray/package.json +0 -48
  294. package/node_modules/json-stable-stringify/.eslintrc +0 -31
  295. package/node_modules/json-stable-stringify/.github/FUNDING.yml +0 -12
  296. package/node_modules/json-stable-stringify/CHANGELOG.md +0 -160
  297. package/node_modules/json-stable-stringify/LICENSE +0 -21
  298. package/node_modules/json-stable-stringify/README.md +0 -157
  299. package/node_modules/json-stable-stringify/example/key_cmp.js +0 -9
  300. package/node_modules/json-stable-stringify/example/nested.js +0 -7
  301. package/node_modules/json-stable-stringify/example/str.js +0 -7
  302. package/node_modules/json-stable-stringify/example/value_cmp.js +0 -12
  303. package/node_modules/json-stable-stringify/index.d.ts +0 -25
  304. package/node_modules/json-stable-stringify/index.js +0 -124
  305. package/node_modules/json-stable-stringify/package.json +0 -88
  306. package/node_modules/json-stable-stringify/test/cmp.js +0 -33
  307. package/node_modules/json-stable-stringify/test/nested.js +0 -48
  308. package/node_modules/json-stable-stringify/test/replacer.js +0 -81
  309. package/node_modules/json-stable-stringify/test/space.js +0 -127
  310. package/node_modules/json-stable-stringify/test/str.js +0 -46
  311. package/node_modules/json-stable-stringify/test/to-json.js +0 -22
  312. package/node_modules/json-stable-stringify/tsconfig.json +0 -10
  313. package/node_modules/jsonify/.eslintrc +0 -21
  314. package/node_modules/jsonify/.github/FUNDING.yml +0 -12
  315. package/node_modules/jsonify/CHANGELOG.md +0 -48
  316. package/node_modules/jsonify/README.md +0 -66
  317. package/node_modules/jsonify/index.js +0 -4
  318. package/node_modules/jsonify/lib/parse.js +0 -261
  319. package/node_modules/jsonify/lib/stringify.js +0 -151
  320. package/node_modules/jsonify/package.json +0 -62
  321. package/node_modules/jsonify/test/parse.js +0 -20
  322. package/node_modules/jsonify/test/stringify.js +0 -18
  323. package/node_modules/math-intrinsics/.eslintrc +0 -16
  324. package/node_modules/math-intrinsics/.github/FUNDING.yml +0 -12
  325. package/node_modules/math-intrinsics/CHANGELOG.md +0 -24
  326. package/node_modules/math-intrinsics/LICENSE +0 -21
  327. package/node_modules/math-intrinsics/README.md +0 -50
  328. package/node_modules/math-intrinsics/abs.d.ts +0 -1
  329. package/node_modules/math-intrinsics/abs.js +0 -4
  330. package/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +0 -3
  331. package/node_modules/math-intrinsics/constants/maxArrayLength.js +0 -4
  332. package/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +0 -3
  333. package/node_modules/math-intrinsics/constants/maxSafeInteger.js +0 -5
  334. package/node_modules/math-intrinsics/constants/maxValue.d.ts +0 -3
  335. package/node_modules/math-intrinsics/constants/maxValue.js +0 -5
  336. package/node_modules/math-intrinsics/floor.d.ts +0 -1
  337. package/node_modules/math-intrinsics/floor.js +0 -4
  338. package/node_modules/math-intrinsics/isFinite.d.ts +0 -3
  339. package/node_modules/math-intrinsics/isFinite.js +0 -12
  340. package/node_modules/math-intrinsics/isInteger.d.ts +0 -3
  341. package/node_modules/math-intrinsics/isInteger.js +0 -16
  342. package/node_modules/math-intrinsics/isNaN.d.ts +0 -1
  343. package/node_modules/math-intrinsics/isNaN.js +0 -6
  344. package/node_modules/math-intrinsics/isNegativeZero.d.ts +0 -3
  345. package/node_modules/math-intrinsics/isNegativeZero.js +0 -6
  346. package/node_modules/math-intrinsics/max.d.ts +0 -1
  347. package/node_modules/math-intrinsics/max.js +0 -4
  348. package/node_modules/math-intrinsics/min.d.ts +0 -1
  349. package/node_modules/math-intrinsics/min.js +0 -4
  350. package/node_modules/math-intrinsics/mod.d.ts +0 -3
  351. package/node_modules/math-intrinsics/mod.js +0 -9
  352. package/node_modules/math-intrinsics/package.json +0 -86
  353. package/node_modules/math-intrinsics/pow.d.ts +0 -1
  354. package/node_modules/math-intrinsics/pow.js +0 -4
  355. package/node_modules/math-intrinsics/round.d.ts +0 -1
  356. package/node_modules/math-intrinsics/round.js +0 -4
  357. package/node_modules/math-intrinsics/sign.d.ts +0 -3
  358. package/node_modules/math-intrinsics/sign.js +0 -11
  359. package/node_modules/math-intrinsics/test/index.js +0 -192
  360. package/node_modules/math-intrinsics/tsconfig.json +0 -3
  361. package/node_modules/object-keys/.editorconfig +0 -13
  362. package/node_modules/object-keys/.eslintrc +0 -17
  363. package/node_modules/object-keys/.travis.yml +0 -277
  364. package/node_modules/object-keys/CHANGELOG.md +0 -232
  365. package/node_modules/object-keys/LICENSE +0 -21
  366. package/node_modules/object-keys/README.md +0 -76
  367. package/node_modules/object-keys/implementation.js +0 -122
  368. package/node_modules/object-keys/index.js +0 -32
  369. package/node_modules/object-keys/isArguments.js +0 -17
  370. package/node_modules/object-keys/package.json +0 -88
  371. package/node_modules/object-keys/test/index.js +0 -5
  372. package/node_modules/set-function-length/.eslintrc +0 -27
  373. package/node_modules/set-function-length/.github/FUNDING.yml +0 -12
  374. package/node_modules/set-function-length/.nycrc +0 -13
  375. package/node_modules/set-function-length/CHANGELOG.md +0 -70
  376. package/node_modules/set-function-length/LICENSE +0 -21
  377. package/node_modules/set-function-length/README.md +0 -56
  378. package/node_modules/set-function-length/env.d.ts +0 -9
  379. package/node_modules/set-function-length/env.js +0 -25
  380. package/node_modules/set-function-length/index.d.ts +0 -7
  381. package/node_modules/set-function-length/index.js +0 -42
  382. package/node_modules/set-function-length/package.json +0 -102
  383. package/node_modules/set-function-length/tsconfig.json +0 -9
@@ -7,7 +7,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7
7
  // SPDX-License-Identifier: MPL-2.0
8
8
  /*
9
9
  * This file is generated by tools/generate-function-bindings.
10
- * To update this file execute 'yarn run generate-function-bindings' in the root of the repository
10
+ * To update this file execute 'pnpm generate-function-bindings' in the root of the repository
11
11
  */
12
12
  const helpers_1 = require("./helpers");
13
13
  // eslint-disable-next-line jsdoc/require-jsdoc
@@ -54,6 +54,13 @@ class FnGenerated {
54
54
  static base64encode(str) {
55
55
  return (0, helpers_1.asString)((0, helpers_1.terraformFunction)("base64encode", [helpers_1.stringValue])(str));
56
56
  }
57
+ /**
58
+ * {@link https://opentofu.org/docs/language/functions/base64gunzip base64gunzip} decodes a Base64-encoded string and uncompresses the result with gzip.
59
+ * @param {string} str
60
+ */
61
+ static base64gunzip(str) {
62
+ return (0, helpers_1.asString)((0, helpers_1.terraformFunction)("base64gunzip", [helpers_1.stringValue])(str));
63
+ }
57
64
  /**
58
65
  * {@link https://developer.hashicorp.com/terraform/language/functions/base64gzip base64gzip} compresses a string with gzip and then encodes the result in Base64 encoding.
59
66
  * @param {string} str
@@ -120,6 +127,14 @@ class FnGenerated {
120
127
  static chunklist(list, size) {
121
128
  return (0, helpers_1.asList)((0, helpers_1.terraformFunction)("chunklist", [(0, helpers_1.listOf)(helpers_1.anyValue), helpers_1.numericValue])(list, size));
122
129
  }
130
+ /**
131
+ * {@link https://opentofu.org/docs/language/functions/cidrcontains cidrcontains} determines whether a given IP address or an address prefix given in CIDR notation is within a given IP network address prefix.
132
+ * @param {string} containing_prefix
133
+ * @param {string} contained_ip_or_prefix
134
+ */
135
+ static cidrcontains(containing_prefix, contained_ip_or_prefix) {
136
+ return (0, helpers_1.asBoolean)((0, helpers_1.terraformFunction)("cidrcontains", [helpers_1.stringValue, helpers_1.stringValue])(containing_prefix, contained_ip_or_prefix));
137
+ }
123
138
  /**
124
139
  * {@link https://developer.hashicorp.com/terraform/language/functions/cidrhost cidrhost} calculates a full host IP address for a given host number within a given IP network address prefix.
125
140
  * @param {string} prefix
@@ -192,6 +207,14 @@ class FnGenerated {
192
207
  static contains(list, value) {
193
208
  return (0, helpers_1.asAny)((0, helpers_1.terraformFunction)("contains", [helpers_1.anyValue, helpers_1.anyValue])(list, value));
194
209
  }
210
+ /**
211
+ * {@link https://developer.hashicorp.com/terraform/language/functions/convert convert} converts a value to the given type constraint.
212
+ * @param {any} value
213
+ * @param {any} type
214
+ */
215
+ static convert(value, type) {
216
+ return (0, helpers_1.asAny)((0, helpers_1.terraformFunction)("convert", [helpers_1.anyValue, helpers_1.anyValue])(value, type));
217
+ }
195
218
  /**
196
219
  * {@link https://developer.hashicorp.com/terraform/language/functions/csvdecode csvdecode} decodes a string containing CSV-formatted data and produces a list of maps representing that data.
197
220
  * @param {string} str
@@ -229,6 +252,13 @@ class FnGenerated {
229
252
  static endswith(str, suffix) {
230
253
  return (0, helpers_1.asBoolean)((0, helpers_1.terraformFunction)("endswith", [helpers_1.stringValue, helpers_1.stringValue])(str, suffix));
231
254
  }
255
+ /**
256
+ * {@link https://developer.hashicorp.com/terraform/language/functions/ephemeralasnull ephemeralasnull} takes a value of any type and returns a similar value of the same type with any ephemeral values replaced with non-ephemeral null values and all non-ephemeral values preserved.
257
+ * @param {any} value
258
+ */
259
+ static ephemeralasnull(value) {
260
+ return (0, helpers_1.asAny)((0, helpers_1.terraformFunction)("ephemeralasnull", [helpers_1.anyValue])(value));
261
+ }
232
262
  /**
233
263
  * {@link https://developer.hashicorp.com/terraform/language/functions/file file} reads the contents of a file at the given path and returns them as a string.
234
264
  * @param {string} path
@@ -320,7 +350,7 @@ class FnGenerated {
320
350
  * @param {Array<any>} args
321
351
  */
322
352
  static format(format, args) {
323
- return (0, helpers_1.asAny)((0, helpers_1.terraformFunction)("format", [helpers_1.stringValue, (0, helpers_1.variadic)(helpers_1.anyValue)])(format, args));
353
+ return (0, helpers_1.asString)((0, helpers_1.terraformFunction)("format", [helpers_1.stringValue, (0, helpers_1.variadic)(helpers_1.anyValue)])(format, args));
324
354
  }
325
355
  /**
326
356
  * {@link https://developer.hashicorp.com/terraform/language/functions/formatdate formatdate} converts a timestamp into a different time format.
@@ -336,7 +366,7 @@ class FnGenerated {
336
366
  * @param {Array<any>} args
337
367
  */
338
368
  static formatlist(format, args) {
339
- return (0, helpers_1.asAny)((0, helpers_1.terraformFunction)("formatlist", [helpers_1.stringValue, (0, helpers_1.variadic)(helpers_1.anyValue)])(format, args));
369
+ return (0, helpers_1.asList)((0, helpers_1.terraformFunction)("formatlist", [helpers_1.stringValue, (0, helpers_1.variadic)(helpers_1.anyValue)])(format, args));
340
370
  }
341
371
  /**
342
372
  * {@link https://developer.hashicorp.com/terraform/language/functions/indent indent} adds a given number of spaces to the beginnings of all but the first line in a given multi-line string.
@@ -354,6 +384,13 @@ class FnGenerated {
354
384
  static index(list, value) {
355
385
  return (0, helpers_1.asAny)((0, helpers_1.terraformFunction)("index", [helpers_1.anyValue, helpers_1.anyValue])(list, value));
356
386
  }
387
+ /**
388
+ * {@link https://developer.hashicorp.com/terraform/language/functions/issensitive issensitive} takes a value and returns a boolean indicating if the value is sensitive.
389
+ * @param {any} value
390
+ */
391
+ static issensitive(value) {
392
+ return (0, helpers_1.asBoolean)((0, helpers_1.terraformFunction)("issensitive", [helpers_1.anyValue])(value));
393
+ }
357
394
  /**
358
395
  * @internal
359
396
  * {@link https://developer.hashicorp.com/terraform/language/functions/join join} produces a string by concatenating together all elements of a given list of strings with the given delimiter.
@@ -691,6 +728,14 @@ class FnGenerated {
691
728
  static templatefile(path, vars) {
692
729
  return (0, helpers_1.asAny)((0, helpers_1.terraformFunction)("templatefile", [helpers_1.stringValue, helpers_1.anyValue])(path, vars));
693
730
  }
731
+ /**
732
+ * {@link https://developer.hashicorp.com/terraform/language/functions/templatestring templatestring} takes a string from elsewhere in the module and renders its content as a template using a supplied set of template variables.
733
+ * @param {string} template
734
+ * @param {any} vars
735
+ */
736
+ static templatestring(template, vars) {
737
+ return (0, helpers_1.asString)((0, helpers_1.terraformFunction)("templatestring", [helpers_1.stringValue, helpers_1.anyValue])(template, vars));
738
+ }
694
739
  /**
695
740
  * {@link https://developer.hashicorp.com/terraform/language/functions/textdecodebase64 textdecodebase64} function decodes a string that was previously Base64-encoded, and then interprets the result as characters in a specified character encoding.
696
741
  * @param {string} source
@@ -830,6 +875,13 @@ class FnGenerated {
830
875
  static upper(str) {
831
876
  return (0, helpers_1.asString)((0, helpers_1.terraformFunction)("upper", [helpers_1.stringValue])(str));
832
877
  }
878
+ /**
879
+ * {@link https://opentofu.org/docs/language/functions/urldecode urldecode} applies URL decoding to a given encoded string.
880
+ * @param {string} str
881
+ */
882
+ static urldecode(str) {
883
+ return (0, helpers_1.asString)((0, helpers_1.terraformFunction)("urldecode", [helpers_1.stringValue])(str));
884
+ }
833
885
  /**
834
886
  * {@link https://developer.hashicorp.com/terraform/language/functions/urlencode urlencode} applies URL encoding to a given string.
835
887
  * @param {string} str
@@ -883,5 +935,5 @@ class FnGenerated {
883
935
  }
884
936
  exports.FnGenerated = FnGenerated;
885
937
  _a = JSII_RTTI_SYMBOL_1;
886
- FnGenerated[_a] = { fqn: "cdktn.FnGenerated", version: "0.23.2" };
887
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLWZ1bmN0aW9ucy5nZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3Rpb25zL3RlcnJhZm9ybS1mdW5jdGlvbnMuZ2VuZXJhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQzs7O0dBR0c7QUFDSCx1Q0FhbUI7QUFDbkIsK0NBQStDO0FBQy9DLE1BQWEsV0FBVztJQUN0Qjs7O09BR0c7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQVc7UUFDcEIsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxLQUFLLEVBQUUsQ0FBQyxzQkFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVk7UUFDekIsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxTQUFTLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVc7UUFDeEIsT0FBTyxJQUFBLG1CQUFTLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxTQUFTLEVBQUUsQ0FBQyxJQUFBLGdCQUFNLEVBQUMsa0JBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVc7UUFDeEIsT0FBTyxJQUFBLG1CQUFTLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxTQUFTLEVBQUUsQ0FBQyxJQUFBLGdCQUFNLEVBQUMsa0JBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQVc7UUFDN0IsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxjQUFjLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQVc7UUFDN0IsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxjQUFjLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQVc7UUFDM0IsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxZQUFZLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQVc7UUFDN0IsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxjQUFjLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQVc7UUFDN0IsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxjQUFjLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQVk7UUFDMUIsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxVQUFVLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FB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Q0FBQztJQUN0RSxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBYyxFQUFFLE1BQVc7UUFDdkMsT0FBTyxJQUFBLGVBQUssRUFDVixJQUFBLDJCQUFpQixFQUFDLFFBQVEsRUFBRSxDQUFDLElBQUEsZ0JBQU0sRUFBQyxrQkFBUSxDQUFDLEVBQUUsa0JBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUN4RSxDQUFDO0lBQ0osQ0FBQzs7QUFqL0JILGtDQWsvQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuLypcbiAqIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgdG9vbHMvZ2VuZXJhdGUtZnVuY3Rpb24tYmluZGluZ3MuXG4gKiBUbyB1cGRhdGUgdGhpcyBmaWxlIGV4ZWN1dGUgJ3lhcm4gcnVuIGdlbmVyYXRlLWZ1bmN0aW9uLWJpbmRpbmdzJyBpbiB0aGUgcm9vdCBvZiB0aGUgcmVwb3NpdG9yeVxuICovXG5pbXBvcnQge1xuICBhbnlWYWx1ZSxcbiAgYXNBbnksXG4gIGFzQm9vbGVhbixcbiAgYXNMaXN0LFxuICBhc051bWJlcixcbiAgYXNTdHJpbmcsXG4gIGxpc3RPZixcbiAgbWFwVmFsdWUsXG4gIG51bWVyaWNWYWx1ZSxcbiAgc3RyaW5nVmFsdWUsXG4gIHRlcnJhZm9ybUZ1bmN0aW9uLFxuICB2YXJpYWRpYyxcbn0gZnJvbSBcIi4vaGVscGVyc1wiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBjbGFzcyBGbkdlbmVyYXRlZCB7XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2FicyBhYnN9IHJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBnaXZlbiBudW1iZXIuIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgbnVtYmVyIGlzIHplcm8gb3IgcG9zaXRpdmUgdGhlbiBpdCBpcyByZXR1cm5lZCBhcy1pcywgYnV0IGlmIGl0IGlzIG5lZ2F0aXZlIHRoZW4gaXQgaXMgbXVsdGlwbGllZCBieSAtMSB0byBtYWtlIGl0IHBvc2l0aXZlIGJlZm9yZSByZXR1cm5pbmcgaXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1cbiAgICovXG4gIHN0YXRpYyBhYnMobnVtOiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXNOdW1iZXIodGVycmFmb3JtRnVuY3Rpb24oXCJhYnNcIiwgW251bWVyaWNWYWx1ZV0pKG51bSkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Fic3BhdGggYWJzcGF0aH0gdGFrZXMgYSBzdHJpbmcgY29udGFpbmluZyBhIGZpbGVzeXN0ZW0gcGF0aCBhbmQgY29udmVydHMgaXQgdG8gYW4gYWJzb2x1dGUgcGF0aC4gVGhhdCBpcywgaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlLCBpdCB3aWxsIGJlIGpvaW5lZCB3aXRoIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGFic3BhdGgocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYWJzcGF0aFwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvYWxsdHJ1ZSBhbGx0cnVlfSByZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgaW4gYSBnaXZlbiBjb2xsZWN0aW9uIGFyZSBgdHJ1ZWAgb3IgYFwidHJ1ZVwiYC4gSXQgYWxzbyByZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eS5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBsaXN0XG4gICAqL1xuICBzdGF0aWMgYWxsdHJ1ZShsaXN0OiBhbnlbXSkge1xuICAgIHJldHVybiBhc0Jvb2xlYW4odGVycmFmb3JtRnVuY3Rpb24oXCJhbGx0cnVlXCIsIFtsaXN0T2YoYW55VmFsdWUpXSkobGlzdCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2FueXRydWUgYW55dHJ1ZX0gcmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgaW4gYSBnaXZlbiBjb2xsZWN0aW9uIGlzIGB0cnVlYCBvciBgXCJ0cnVlXCJgLiBJdCBhbHNvIHJldHVybnMgYGZhbHNlYCBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eS5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBsaXN0XG4gICAqL1xuICBzdGF0aWMgYW55dHJ1ZShsaXN0OiBhbnlbXSkge1xuICAgIHJldHVybiBhc0Jvb2xlYW4odGVycmFmb3JtRnVuY3Rpb24oXCJhbnl0cnVlXCIsIFtsaXN0T2YoYW55VmFsdWUpXSkobGlzdCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Jhc2U2NGRlY29kZSBiYXNlNjRkZWNvZGV9IHRha2VzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBCYXNlNjQgY2hhcmFjdGVyIHNlcXVlbmNlIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBiYXNlNjRkZWNvZGUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJiYXNlNjRkZWNvZGVcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvYmFzZTY0ZW5jb2RlIGJhc2U2NGVuY29kZX0gYXBwbGllcyBCYXNlNjQgZW5jb2RpbmcgdG8gYSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBiYXNlNjRlbmNvZGUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJiYXNlNjRlbmNvZGVcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvYmFzZTY0Z3ppcCBiYXNlNjRnemlwfSBjb21wcmVzc2VzIGEgc3RyaW5nIHdpdGggZ3ppcCBhbmQgdGhlbiBlbmNvZGVzIHRoZSByZXN1bHQgaW4gQmFzZTY0IGVuY29kaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgYmFzZTY0Z3ppcChzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImJhc2U2NGd6aXBcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvYmFzZTY0c2hhMjU2IGJhc2U2NHNoYTI1Nn0gY29tcHV0ZXMgdGhlIFNIQTI1NiBoYXNoIG9mIGEgZ2l2ZW4gc3RyaW5nIGFuZCBlbmNvZGVzIGl0IHdpdGggQmFzZTY0LiBUaGlzIGlzIG5vdCBlcXVpdmFsZW50IHRvIGBiYXNlNjRlbmNvZGUoc2hhMjU2KFwidGVzdFwiKSlgIHNpbmNlIGBzaGEyNTYoKWAgcmV0dXJucyBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIGJhc2U2NHNoYTI1NihzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImJhc2U2NHNoYTI1NlwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9iYXNlNjRzaGE1MTIgYmFzZTY0c2hhNTEyfSBjb21wdXRlcyB0aGUgU0hBNTEyIGhhc2ggb2YgYSBnaXZlbiBzdHJpbmcgYW5kIGVuY29kZXMgaXQgd2l0aCBCYXNlNjQuIFRoaXMgaXMgbm90IGVxdWl2YWxlbnQgdG8gYGJhc2U2NGVuY29kZShzaGE1MTIoXCJ0ZXN0XCIpKWAgc2luY2UgYHNoYTUxMigpYCByZXR1cm5zIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgYmFzZTY0c2hhNTEyKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYmFzZTY0c2hhNTEyXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Jhc2VuYW1lIGJhc2VuYW1lfSB0YWtlcyBhIHN0cmluZyBjb250YWluaW5nIGEgZmlsZXN5c3RlbSBwYXRoIGFuZCByZW1vdmVzIGFsbCBleGNlcHQgdGhlIGxhc3QgcG9ydGlvbiBmcm9tIGl0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGJhc2VuYW1lKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImJhc2VuYW1lXCIsIFtzdHJpbmdWYWx1ZV0pKHBhdGgpKTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvYmNyeXB0IGJjcnlwdH0gY29tcHV0ZXMgYSBoYXNoIG9mIHRoZSBnaXZlbiBzdHJpbmcgdXNpbmcgdGhlIEJsb3dmaXNoIGNpcGhlciwgcmV0dXJuaW5nIGEgc3RyaW5nIGluIFt0aGUgX01vZHVsYXIgQ3J5cHQgRm9ybWF0X10oaHR0cHM6Ly9wYXNzbGliLnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJsZS9tb2R1bGFyX2NyeXB0X2Zvcm1hdC5odG1sKSB1c3VhbGx5IGV4cGVjdGVkIGluIHRoZSBzaGFkb3cgcGFzc3dvcmQgZmlsZSBvbiBtYW55IFVuaXggc3lzdGVtcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGNvc3RcbiAgICovXG4gIHN0YXRpYyBfYmNyeXB0KHN0cjogc3RyaW5nLCBjb3N0OiBudW1iZXJbXSkge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiYmNyeXB0XCIsIFtzdHJpbmdWYWx1ZSwgdmFyaWFkaWMobnVtZXJpY1ZhbHVlKV0pKFxuICAgICAgICBzdHIsXG4gICAgICAgIGNvc3QsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY2FuIGNhbn0gZXZhbHVhdGVzIHRoZSBnaXZlbiBleHByZXNzaW9uIGFuZCByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gcHJvZHVjZWQgYSByZXN1bHQgd2l0aG91dCBhbnkgZXJyb3JzLlxuICAgKiBAcGFyYW0ge2FueX0gZXhwcmVzc2lvblxuICAgKi9cbiAgc3RhdGljIGNhbihleHByZXNzaW9uOiBhbnkpIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKHRlcnJhZm9ybUZ1bmN0aW9uKFwiY2FuXCIsIFthbnlWYWx1ZV0pKGV4cHJlc3Npb24pKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9jZWlsIGNlaWx9IHJldHVybnMgdGhlIGNsb3Nlc3Qgd2hvbGUgbnVtYmVyIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiB2YWx1ZSwgd2hpY2ggbWF5IGJlIGEgZnJhY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1cbiAgICovXG4gIHN0YXRpYyBjZWlsKG51bTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKHRlcnJhZm9ybUZ1bmN0aW9uKFwiY2VpbFwiLCBbbnVtZXJpY1ZhbHVlXSkobnVtKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY2hvbXAgY2hvbXB9IHJlbW92ZXMgbmV3bGluZSBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQgb2YgYSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBjaG9tcChzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImNob21wXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NodW5rbGlzdCBjaHVua2xpc3R9IHNwbGl0cyBhIHNpbmdsZSBsaXN0IGludG8gZml4ZWQtc2l6ZSBjaHVua3MsIHJldHVybmluZyBhIGxpc3Qgb2YgbGlzdHMuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gbGlzdFxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICAgKi9cbiAgc3RhdGljIGNodW5rbGlzdChsaXN0OiBhbnlbXSwgc2l6ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzTGlzdChcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiY2h1bmtsaXN0XCIsIFtsaXN0T2YoYW55VmFsdWUpLCBudW1lcmljVmFsdWVdKShcbiAgICAgICAgbGlzdCxcbiAgICAgICAgc2l6ZSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9jaWRyaG9zdCBjaWRyaG9zdH0gY2FsY3VsYXRlcyBhIGZ1bGwgaG9zdCBJUCBhZGRyZXNzIGZvciBhIGdpdmVuIGhvc3QgbnVtYmVyIHdpdGhpbiBhIGdpdmVuIElQIG5ldHdvcmsgYWRkcmVzcyBwcmVmaXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhvc3RudW1cbiAgICovXG4gIHN0YXRpYyBjaWRyaG9zdChwcmVmaXg6IHN0cmluZywgaG9zdG51bTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJjaWRyaG9zdFwiLCBbc3RyaW5nVmFsdWUsIG51bWVyaWNWYWx1ZV0pKFxuICAgICAgICBwcmVmaXgsXG4gICAgICAgIGhvc3RudW0sXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY2lkcm5ldG1hc2sgY2lkcm5ldG1hc2t9IGNvbnZlcnRzIGFuIElQdjQgYWRkcmVzcyBwcmVmaXggZ2l2ZW4gaW4gQ0lEUiBub3RhdGlvbiBpbnRvIGEgc3VibmV0IG1hc2sgYWRkcmVzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKi9cbiAgc3RhdGljIGNpZHJuZXRtYXNrKHByZWZpeDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiY2lkcm5ldG1hc2tcIiwgW3N0cmluZ1ZhbHVlXSkocHJlZml4KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY2lkcnN1Ym5ldCBjaWRyc3VibmV0fSBjYWxjdWxhdGVzIGEgc3VibmV0IGFkZHJlc3Mgd2l0aGluIGdpdmVuIElQIG5ldHdvcmsgYWRkcmVzcyBwcmVmaXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld2JpdHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ldG51bVxuICAgKi9cbiAgc3RhdGljIGNpZHJzdWJuZXQocHJlZml4OiBzdHJpbmcsIG5ld2JpdHM6IG51bWJlciwgbmV0bnVtOiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImNpZHJzdWJuZXRcIiwgW1xuICAgICAgICBzdHJpbmdWYWx1ZSxcbiAgICAgICAgbnVtZXJpY1ZhbHVlLFxuICAgICAgICBudW1lcmljVmFsdWUsXG4gICAgICBdKShwcmVmaXgsIG5ld2JpdHMsIG5ldG51bSksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9jaWRyc3VibmV0cyBjaWRyc3VibmV0c30gY2FsY3VsYXRlcyBhIHNlcXVlbmNlIG9mIGNvbnNlY3V0aXZlIElQIGFkZHJlc3MgcmFuZ2VzIHdpdGhpbiBhIHBhcnRpY3VsYXIgQ0lEUiBwcmVmaXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBuZXdiaXRzXG4gICAqL1xuICBzdGF0aWMgY2lkcnN1Ym5ldHMocHJlZml4OiBzdHJpbmcsIG5ld2JpdHM6IG51bWJlcltdKSB7XG4gICAgcmV0dXJuIGFzTGlzdChcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiY2lkcnN1Ym5ldHNcIiwgW3N0cmluZ1ZhbHVlLCB2YXJpYWRpYyhudW1lcmljVmFsdWUpXSkoXG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgbmV3Yml0cyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9jb2FsZXNjZSBjb2FsZXNjZX0gdGFrZXMgYW55IG51bWJlciBvZiBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IG51bGwgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IHZhbHNcbiAgICovXG4gIHN0YXRpYyBjb2FsZXNjZSh2YWxzOiBhbnlbXSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcImNvYWxlc2NlXCIsIFt2YXJpYWRpYyhhbnlWYWx1ZSldKSh2YWxzKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY29hbGVzY2VsaXN0IGNvYWxlc2NlbGlzdH0gdGFrZXMgYW55IG51bWJlciBvZiBsaXN0IGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgZW1wdHkuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gdmFsc1xuICAgKi9cbiAgc3RhdGljIGNvYWxlc2NlbGlzdCh2YWxzOiBhbnlbXSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcImNvYWxlc2NlbGlzdFwiLCBbdmFyaWFkaWMoYW55VmFsdWUpXSkodmFscykpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NvbXBhY3QgY29tcGFjdH0gdGFrZXMgYSBsaXN0IG9mIHN0cmluZ3MgYW5kIHJldHVybnMgYSBuZXcgbGlzdCB3aXRoIGFueSBlbXB0eSBzdHJpbmcgZWxlbWVudHMgcmVtb3ZlZC5cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBsaXN0XG4gICAqL1xuICBzdGF0aWMgY29tcGFjdChsaXN0OiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBhc0xpc3QodGVycmFmb3JtRnVuY3Rpb24oXCJjb21wYWN0XCIsIFtsaXN0T2YoYW55VmFsdWUpXSkobGlzdCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NvbmNhdCBjb25jYXR9IHRha2VzIHR3byBvciBtb3JlIGxpc3RzIGFuZCBjb21iaW5lcyB0aGVtIGludG8gYSBzaW5nbGUgbGlzdC5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBzZXFzXG4gICAqL1xuICBzdGF0aWMgY29uY2F0KHNlcXM6IGFueVtdKSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwiY29uY2F0XCIsIFt2YXJpYWRpYyhhbnlWYWx1ZSldKShzZXFzKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY29udGFpbnMgY29udGFpbnN9IGRldGVybWluZXMgd2hldGhlciBhIGdpdmVuIGxpc3Qgb3Igc2V0IGNvbnRhaW5zIGEgZ2l2ZW4gc2luZ2xlIHZhbHVlIGFzIG9uZSBvZiBpdHMgZWxlbWVudHMuXG4gICAqIEBwYXJhbSB7YW55fSBsaXN0XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIGNvbnRhaW5zKGxpc3Q6IGFueSwgdmFsdWU6IGFueSkge1xuICAgIHJldHVybiBhc0FueShcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiY29udGFpbnNcIiwgW2FueVZhbHVlLCBhbnlWYWx1ZV0pKGxpc3QsIHZhbHVlKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NzdmRlY29kZSBjc3ZkZWNvZGV9IGRlY29kZXMgYSBzdHJpbmcgY29udGFpbmluZyBDU1YtZm9ybWF0dGVkIGRhdGEgYW5kIHByb2R1Y2VzIGEgbGlzdCBvZiBtYXBzIHJlcHJlc2VudGluZyB0aGF0IGRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBjc3ZkZWNvZGUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJjc3ZkZWNvZGVcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZGlybmFtZSBkaXJuYW1lfSB0YWtlcyBhIHN0cmluZyBjb250YWluaW5nIGEgZmlsZXN5c3RlbSBwYXRoIGFuZCByZW1vdmVzIHRoZSBsYXN0IHBvcnRpb24gZnJvbSBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHN0YXRpYyBkaXJuYW1lKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImRpcm5hbWVcIiwgW3N0cmluZ1ZhbHVlXSkocGF0aCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Rpc3RpbmN0IGRpc3RpbmN0fSB0YWtlcyBhIGxpc3QgYW5kIHJldHVybnMgYSBuZXcgbGlzdCB3aXRoIGFueSBkdXBsaWNhdGUgZWxlbWVudHMgcmVtb3ZlZC5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBsaXN0XG4gICAqL1xuICBzdGF0aWMgZGlzdGluY3QobGlzdDogYW55W10pIHtcbiAgICByZXR1cm4gYXNMaXN0KHRlcnJhZm9ybUZ1bmN0aW9uKFwiZGlzdGluY3RcIiwgW2xpc3RPZihhbnlWYWx1ZSldKShsaXN0KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZWxlbWVudCBlbGVtZW50fSByZXRyaWV2ZXMgYSBzaW5nbGUgZWxlbWVudCBmcm9tIGEgbGlzdC5cbiAgICogQHBhcmFtIHthbnl9IGxpc3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAqL1xuICBzdGF0aWMgZWxlbWVudChsaXN0OiBhbnksIGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImVsZW1lbnRcIiwgW2FueVZhbHVlLCBudW1lcmljVmFsdWVdKShsaXN0LCBpbmRleCksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9lbmRzd2l0aCBlbmRzd2l0aH0gdGFrZXMgdHdvIHZhbHVlczogYSBzdHJpbmcgdG8gY2hlY2sgYW5kIGEgc3VmZml4IHN0cmluZy4gVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlyc3Qgc3RyaW5nIGVuZHMgd2l0aCB0aGF0IGV4YWN0IHN1ZmZpeC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqL1xuICBzdGF0aWMgZW5kc3dpdGgoc3RyOiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzQm9vbGVhbihcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiZW5kc3dpdGhcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKHN0ciwgc3VmZml4KSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2ZpbGUgZmlsZX0gcmVhZHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBhdCB0aGUgZ2l2ZW4gcGF0aCBhbmQgcmV0dXJucyB0aGVtIGFzIGEgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGUocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZVwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZWJhc2U2NCBmaWxlYmFzZTY0fSByZWFkcyB0aGUgY29udGVudHMgb2YgYSBmaWxlIGF0IHRoZSBnaXZlbiBwYXRoIGFuZCByZXR1cm5zIHRoZW0gYXMgYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBzdGF0aWMgZmlsZWJhc2U2NChwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJmaWxlYmFzZTY0XCIsIFtzdHJpbmdWYWx1ZV0pKHBhdGgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9maWxlYmFzZTY0c2hhMjU2IGZpbGViYXNlNjRzaGEyNTZ9IGlzIGEgdmFyaWFudCBvZiBgYmFzZTY0c2hhMjU2YCB0aGF0IGhhc2hlcyB0aGUgY29udGVudHMgb2YgYSBnaXZlbiBmaWxlIHJhdGhlciB0aGFuIGEgbGl0ZXJhbCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBzdGF0aWMgZmlsZWJhc2U2NHNoYTI1NihwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJmaWxlYmFzZTY0c2hhMjU2XCIsIFtzdHJpbmdWYWx1ZV0pKHBhdGgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9maWxlYmFzZTY0c2hhNTEyIGZpbGViYXNlNjRzaGE1MTJ9IGlzIGEgdmFyaWFudCBvZiBgYmFzZTY0c2hhNTEyYCB0aGF0IGhhc2hlcyB0aGUgY29udGVudHMgb2YgYSBnaXZlbiBmaWxlIHJhdGhlciB0aGFuIGEgbGl0ZXJhbCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBzdGF0aWMgZmlsZWJhc2U2NHNoYTUxMihwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJmaWxlYmFzZTY0c2hhNTEyXCIsIFtzdHJpbmdWYWx1ZV0pKHBhdGgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9maWxlZXhpc3RzIGZpbGVleGlzdHN9IGRldGVybWluZXMgd2hldGhlciBhIGZpbGUgZXhpc3RzIGF0IGEgZ2l2ZW4gcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHN0YXRpYyBmaWxlZXhpc3RzKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBhc0Jvb2xlYW4odGVycmFmb3JtRnVuY3Rpb24oXCJmaWxlZXhpc3RzXCIsIFtzdHJpbmdWYWx1ZV0pKHBhdGgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9maWxlbWQ1IGZpbGVtZDV9IGlzIGEgdmFyaWFudCBvZiBgbWQ1YCB0aGF0IGhhc2hlcyB0aGUgY29udGVudHMgb2YgYSBnaXZlbiBmaWxlIHJhdGhlciB0aGFuIGEgbGl0ZXJhbCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBzdGF0aWMgZmlsZW1kNShwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJmaWxlbWQ1XCIsIFtzdHJpbmdWYWx1ZV0pKHBhdGgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9maWxlc2V0IGZpbGVzZXR9IGVudW1lcmF0ZXMgYSBzZXQgb2YgcmVndWxhciBmaWxlIG5hbWVzIGdpdmVuIGEgcGF0aCBhbmQgcGF0dGVybi4gVGhlIHBhdGggaXMgYXV0b21hdGljYWxseSByZW1vdmVkIGZyb20gdGhlIHJlc3VsdGluZyBzZXQgb2YgZmlsZSBuYW1lcyBhbmQgYW55IHJlc3VsdCBzdGlsbCBjb250YWluaW5nIHBhdGggc2VwYXJhdG9ycyBhbHdheXMgcmV0dXJucyBmb3J3YXJkIHNsYXNoIChgL2ApIGFzIHRoZSBwYXRoIHNlcGFyYXRvciBmb3IgY3Jvc3Mtc3lzdGVtIGNvbXBhdGliaWxpdHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG4gICAqL1xuICBzdGF0aWMgZmlsZXNldChwYXRoOiBzdHJpbmcsIHBhdHRlcm46IHN0cmluZykge1xuICAgIHJldHVybiBhc0xpc3QoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImZpbGVzZXRcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKHBhdGgsIHBhdHRlcm4pLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZXNoYTEgZmlsZXNoYTF9IGlzIGEgdmFyaWFudCBvZiBgc2hhMWAgdGhhdCBoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZmlsZSByYXRoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGVzaGExKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImZpbGVzaGExXCIsIFtzdHJpbmdWYWx1ZV0pKHBhdGgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9maWxlc2hhMjU2IGZpbGVzaGEyNTZ9IGlzIGEgdmFyaWFudCBvZiBgc2hhMjU2YCB0aGF0IGhhc2hlcyB0aGUgY29udGVudHMgb2YgYSBnaXZlbiBmaWxlIHJhdGhlciB0aGFuIGEgbGl0ZXJhbCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBzdGF0aWMgZmlsZXNoYTI1NihwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJmaWxlc2hhMjU2XCIsIFtzdHJpbmdWYWx1ZV0pKHBhdGgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9maWxlc2hhNTEyIGZpbGVzaGE1MTJ9IGlzIGEgdmFyaWFudCBvZiBgc2hhNTEyYCB0aGF0IGhhc2hlcyB0aGUgY29udGVudHMgb2YgYSBnaXZlbiBmaWxlIHJhdGhlciB0aGFuIGEgbGl0ZXJhbCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBzdGF0aWMgZmlsZXNoYTUxMihwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJmaWxlc2hhNTEyXCIsIFtzdHJpbmdWYWx1ZV0pKHBhdGgpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9mbGF0dGVuIGZsYXR0ZW59IHRha2VzIGEgbGlzdCBhbmQgcmVwbGFjZXMgYW55IGVsZW1lbnRzIHRoYXQgYXJlIGxpc3RzIHdpdGggYSBmbGF0dGVuZWQgc2VxdWVuY2Ugb2YgdGhlIGxpc3QgY29udGVudHMuXG4gICAqIEBwYXJhbSB7YW55fSBsaXN0XG4gICAqL1xuICBzdGF0aWMgZmxhdHRlbihsaXN0OiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJmbGF0dGVuXCIsIFthbnlWYWx1ZV0pKGxpc3QpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9mbG9vciBmbG9vcn0gcmV0dXJucyB0aGUgY2xvc2VzdCB3aG9sZSBudW1iZXIgdGhhdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIHZhbHVlLCB3aGljaCBtYXkgYmUgYSBmcmFjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG51bVxuICAgKi9cbiAgc3RhdGljIGZsb29yKG51bTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmxvb3JcIiwgW251bWVyaWNWYWx1ZV0pKG51bSkpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9mb3JtYXQgZm9ybWF0fSBmdW5jdGlvbiBwcm9kdWNlcyBhIHN0cmluZyBieSBmb3JtYXR0aW5nIGEgbnVtYmVyIG9mIG90aGVyIHZhbHVlcyBhY2NvcmRpbmcgdG8gYSBzcGVjaWZpY2F0aW9uIHN0cmluZy4gSXQgaXMgc2ltaWxhciB0byB0aGUgYHByaW50ZmAgZnVuY3Rpb24gaW4gQywgYW5kIG90aGVyIHNpbWlsYXIgZnVuY3Rpb25zIGluIG90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdFxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IGFyZ3NcbiAgICovXG4gIHN0YXRpYyBmb3JtYXQoZm9ybWF0OiBzdHJpbmcsIGFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIGFzQW55KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJmb3JtYXRcIiwgW3N0cmluZ1ZhbHVlLCB2YXJpYWRpYyhhbnlWYWx1ZSldKShcbiAgICAgICAgZm9ybWF0LFxuICAgICAgICBhcmdzLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Zvcm1hdGRhdGUgZm9ybWF0ZGF0ZX0gY29udmVydHMgYSB0aW1lc3RhbXAgaW50byBhIGRpZmZlcmVudCB0aW1lIGZvcm1hdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZVxuICAgKi9cbiAgc3RhdGljIGZvcm1hdGRhdGUoZm9ybWF0OiBzdHJpbmcsIHRpbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiZm9ybWF0ZGF0ZVwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoZm9ybWF0LCB0aW1lKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Zvcm1hdGxpc3QgZm9ybWF0bGlzdH0gcHJvZHVjZXMgYSBsaXN0IG9mIHN0cmluZ3MgYnkgZm9ybWF0dGluZyBhIG51bWJlciBvZiBvdGhlciB2YWx1ZXMgYWNjb3JkaW5nIHRvIGEgc3BlY2lmaWNhdGlvbiBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXRcbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcmdzXG4gICAqL1xuICBzdGF0aWMgZm9ybWF0bGlzdChmb3JtYXQ6IHN0cmluZywgYXJnczogYW55W10pIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImZvcm1hdGxpc3RcIiwgW3N0cmluZ1ZhbHVlLCB2YXJpYWRpYyhhbnlWYWx1ZSldKShcbiAgICAgICAgZm9ybWF0LFxuICAgICAgICBhcmdzLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2luZGVudCBpbmRlbnR9IGFkZHMgYSBnaXZlbiBudW1iZXIgb2Ygc3BhY2VzIHRvIHRoZSBiZWdpbm5pbmdzIG9mIGFsbCBidXQgdGhlIGZpcnN0IGxpbmUgaW4gYSBnaXZlbiBtdWx0aS1saW5lIHN0cmluZy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNwYWNlc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgaW5kZW50KHNwYWNlczogbnVtYmVyLCBzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiaW5kZW50XCIsIFtudW1lcmljVmFsdWUsIHN0cmluZ1ZhbHVlXSkoc3BhY2VzLCBzdHIpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvaW5kZXggaW5kZXh9IGZpbmRzIHRoZSBlbGVtZW50IGluZGV4IGZvciBhIGdpdmVuIHZhbHVlIGluIGEgbGlzdC5cbiAgICogQHBhcmFtIHthbnl9IGxpc3RcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqL1xuICBzdGF0aWMgaW5kZXgobGlzdDogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwiaW5kZXhcIiwgW2FueVZhbHVlLCBhbnlWYWx1ZV0pKGxpc3QsIHZhbHVlKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2pvaW4gam9pbn0gcHJvZHVjZXMgYSBzdHJpbmcgYnkgY29uY2F0ZW5hdGluZyB0b2dldGhlciBhbGwgZWxlbWVudHMgb2YgYSBnaXZlbiBsaXN0IG9mIHN0cmluZ3Mgd2l0aCB0aGUgZ2l2ZW4gZGVsaW1pdGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VwYXJhdG9yXG4gICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8c3RyaW5nPj59IGxpc3RzXG4gICAqL1xuICBzdGF0aWMgX2pvaW4oc2VwYXJhdG9yOiBzdHJpbmcsIGxpc3RzOiBzdHJpbmdbXVtdKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJqb2luXCIsIFtzdHJpbmdWYWx1ZSwgdmFyaWFkaWMobGlzdE9mKGFueVZhbHVlKSldKShcbiAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICBsaXN0cyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9qc29uZGVjb2RlIGpzb25kZWNvZGV9IGludGVycHJldHMgYSBnaXZlbiBzdHJpbmcgYXMgSlNPTiwgcmV0dXJuaW5nIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlc3VsdCBvZiBkZWNvZGluZyB0aGF0IHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIGpzb25kZWNvZGUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJqc29uZGVjb2RlXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2pzb25lbmNvZGUganNvbmVuY29kZX0gZW5jb2RlcyBhIGdpdmVuIHZhbHVlIHRvIGEgc3RyaW5nIHVzaW5nIEpTT04gc3ludGF4LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAqL1xuICBzdGF0aWMganNvbmVuY29kZSh2YWw6IGFueSkge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImpzb25lbmNvZGVcIiwgW2FueVZhbHVlXSkodmFsKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMva2V5cyBrZXlzfSB0YWtlcyBhIG1hcCBhbmQgcmV0dXJucyBhIGxpc3QgY29udGFpbmluZyB0aGUga2V5cyBmcm9tIHRoYXQgbWFwLlxuICAgKiBAcGFyYW0ge2FueX0gaW5wdXRNYXBcbiAgICovXG4gIHN0YXRpYyBrZXlzKGlucHV0TWFwOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJrZXlzXCIsIFthbnlWYWx1ZV0pKGlucHV0TWFwKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvbGVuZ3RoIGxlbmd0aH0gZGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIGEgZ2l2ZW4gbGlzdCwgbWFwLCBvciBzdHJpbmcuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIGxlbmd0aE9mKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gYXNOdW1iZXIodGVycmFmb3JtRnVuY3Rpb24oXCJsZW5ndGhcIiwgW2FueVZhbHVlXSkodmFsdWUpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9sb2cgbG9nfSByZXR1cm5zIHRoZSBsb2dhcml0aG0gb2YgYSBnaXZlbiBudW1iZXIgaW4gYSBnaXZlbiBiYXNlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlXG4gICAqL1xuICBzdGF0aWMgbG9nKG51bTogbnVtYmVyLCBiYXNlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXNOdW1iZXIoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImxvZ1wiLCBbbnVtZXJpY1ZhbHVlLCBudW1lcmljVmFsdWVdKShudW0sIGJhc2UpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2xvb2t1cCBsb29rdXB9IHJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgZWxlbWVudCBmcm9tIGEgbWFwLCBnaXZlbiBpdHMga2V5LiBJZiB0aGUgZ2l2ZW4ga2V5IGRvZXMgbm90IGV4aXN0LCB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBpcyByZXR1cm5lZCBpbnN0ZWFkLlxuICAgKiBAcGFyYW0ge2FueX0gaW5wdXRNYXBcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IGRlZmF1bHRWYWx1ZVxuICAgKi9cbiAgc3RhdGljIF9sb29rdXAoaW5wdXRNYXA6IGFueSwga2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogYW55W10pIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImxvb2t1cFwiLCBbYW55VmFsdWUsIHN0cmluZ1ZhbHVlLCB2YXJpYWRpYyhhbnlWYWx1ZSldKShcbiAgICAgICAgaW5wdXRNYXAsXG4gICAgICAgIGtleSxcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2xvd2VyIGxvd2VyfSBjb252ZXJ0cyBhbGwgY2FzZWQgbGV0dGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIHRvIGxvd2VyY2FzZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIGxvd2VyKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwibG93ZXJcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvbWF0Y2hrZXlzIG1hdGNoa2V5c30gY29uc3RydWN0cyBhIG5ldyBsaXN0IGJ5IHRha2luZyBhIHN1YnNldCBvZiBlbGVtZW50cyBmcm9tIG9uZSBsaXN0IHdob3NlIGluZGV4ZXMgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXhlcyBvZiB2YWx1ZXMgaW4gYW5vdGhlciBsaXN0LlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IHZhbHVlc1xuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IGtleXNcbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBzZWFyY2hzZXRcbiAgICovXG4gIHN0YXRpYyBtYXRjaGtleXModmFsdWVzOiBhbnlbXSwga2V5czogYW55W10sIHNlYXJjaHNldDogYW55W10pIHtcbiAgICByZXR1cm4gYXNMaXN0KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJtYXRjaGtleXNcIiwgW1xuICAgICAgICBsaXN0T2YoYW55VmFsdWUpLFxuICAgICAgICBsaXN0T2YoYW55VmFsdWUpLFxuICAgICAgICBsaXN0T2YoYW55VmFsdWUpLFxuICAgICAgXSkodmFsdWVzLCBrZXlzLCBzZWFyY2hzZXQpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvbWF4IG1heH0gdGFrZXMgb25lIG9yIG1vcmUgbnVtYmVycyBhbmQgcmV0dXJucyB0aGUgZ3JlYXRlc3QgbnVtYmVyIGZyb20gdGhlIHNldC5cbiAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBudW1iZXJzXG4gICAqL1xuICBzdGF0aWMgbWF4KG51bWJlcnM6IG51bWJlcltdKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJtYXhcIiwgW3ZhcmlhZGljKG51bWVyaWNWYWx1ZSldKShudW1iZXJzKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL21kNSBtZDV9IGNvbXB1dGVzIHRoZSBNRDUgaGFzaCBvZiBhIGdpdmVuIHN0cmluZyBhbmQgZW5jb2RlcyBpdCB3aXRoIGhleGFkZWNpbWFsIGRpZ2l0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIG1kNShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcIm1kNVwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9tZXJnZSBtZXJnZX0gdGFrZXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBtYXBzIG9yIG9iamVjdHMsIGFuZCByZXR1cm5zIGEgc2luZ2xlIG1hcCBvciBvYmplY3QgdGhhdCBjb250YWlucyBhIG1lcmdlZCBzZXQgb2YgZWxlbWVudHMgZnJvbSBhbGwgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IG1hcHNcbiAgICovXG4gIHN0YXRpYyBtZXJnZShtYXBzOiBhbnlbXSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcIm1lcmdlXCIsIFt2YXJpYWRpYyhhbnlWYWx1ZSldKShtYXBzKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvbWluIG1pbn0gdGFrZXMgb25lIG9yIG1vcmUgbnVtYmVycyBhbmQgcmV0dXJucyB0aGUgc21hbGxlc3QgbnVtYmVyIGZyb20gdGhlIHNldC5cbiAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBudW1iZXJzXG4gICAqL1xuICBzdGF0aWMgbWluKG51bWJlcnM6IG51bWJlcltdKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJtaW5cIiwgW3ZhcmlhZGljKG51bWVyaWNWYWx1ZSldKShudW1iZXJzKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL25vbnNlbnNpdGl2ZSBub25zZW5zaXRpdmV9IHRha2VzIGEgc2Vuc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIGEgY29weSBvZiB0aGF0IHZhbHVlIHdpdGggdGhlIHNlbnNpdGl2ZSBtYXJraW5nIHJlbW92ZWQsIHRoZXJlYnkgZXhwb3NpbmcgdGhlIHNlbnNpdGl2ZSB2YWx1ZS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqL1xuICBzdGF0aWMgbm9uc2Vuc2l0aXZlKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJub25zZW5zaXRpdmVcIiwgW2FueVZhbHVlXSkodmFsdWUpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9vbmUgb25lfSB0YWtlcyBhIGxpc3QsIHNldCwgb3IgdHVwbGUgdmFsdWUgd2l0aCBlaXRoZXIgemVybyBvciBvbmUgZWxlbWVudHMuIElmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LCBgb25lYCByZXR1cm5zIGBudWxsYC4gT3RoZXJ3aXNlLCBgb25lYCByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50LiBJZiB0aGVyZSBhcmUgdHdvIG9yIG1vcmUgZWxlbWVudHMgdGhlbiBgb25lYCB3aWxsIHJldHVybiBhbiBlcnJvci5cbiAgICogQHBhcmFtIHthbnl9IGxpc3RcbiAgICovXG4gIHN0YXRpYyBvbmUobGlzdDogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwib25lXCIsIFthbnlWYWx1ZV0pKGxpc3QpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9wYXJzZWludCBwYXJzZWludH0gcGFyc2VzIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIGluIHRoZSBzcGVjaWZpZWQgYmFzZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIG51bWJlci4gVGhlIGJhc2UgbXVzdCBiZSBiZXR3ZWVuIDIgYW5kIDYyIGluY2x1c2l2ZS5cbiAgICogQHBhcmFtIHthbnl9IG51bWJlclxuICAgKiBAcGFyYW0ge251bWJlcn0gYmFzZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlaW50KG51bWJlcjogYW55LCBiYXNlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInBhcnNlaW50XCIsIFthbnlWYWx1ZSwgbnVtZXJpY1ZhbHVlXSkobnVtYmVyLCBiYXNlKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3BhdGhleHBhbmQgcGF0aGV4cGFuZH0gdGFrZXMgYSBmaWxlc3lzdGVtIHBhdGggdGhhdCBtaWdodCBiZWdpbiB3aXRoIGEgYH5gIHNlZ21lbnQsIGFuZCBpZiBzbyBpdCByZXBsYWNlcyB0aGF0IHNlZ21lbnQgd2l0aCB0aGUgY3VycmVudCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHN0YXRpYyBwYXRoZXhwYW5kKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInBhdGhleHBhbmRcIiwgW3N0cmluZ1ZhbHVlXSkocGF0aCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3BsYW50aW1lc3RhbXAgcGxhbnRpbWVzdGFtcH0gcmV0dXJucyBhIFVUQyB0aW1lc3RhbXAgc3RyaW5nIGluIFtSRkMgMzMzOV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzMzMzkpIGZvcm1hdCwgZml4ZWQgdG8gYSBjb25zdGFudCB0aW1lIHJlcHJlc2VudGluZyB0aGUgdGltZSBvZiB0aGUgcGxhbi5cbiAgICovXG4gIHN0YXRpYyBwbGFudGltZXN0YW1wKCkge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInBsYW50aW1lc3RhbXBcIiwgW10pKCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3BvdyBwb3d9IGNhbGN1bGF0ZXMgYW4gZXhwb25lbnQsIGJ5IHJhaXNpbmcgaXRzIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBwb3dlciBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwb3dlclxuICAgKi9cbiAgc3RhdGljIHBvdyhudW06IG51bWJlciwgcG93ZXI6IG51bWJlcikge1xuICAgIHJldHVybiBhc051bWJlcihcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwicG93XCIsIFtudW1lcmljVmFsdWUsIG51bWVyaWNWYWx1ZV0pKG51bSwgcG93ZXIpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3JhbmdlIHJhbmdlfSBnZW5lcmF0ZXMgYSBsaXN0IG9mIG51bWJlcnMgdXNpbmcgYSBzdGFydCB2YWx1ZSwgYSBsaW1pdCB2YWx1ZSwgYW5kIGEgc3RlcCB2YWx1ZS5cbiAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBwYXJhbXNcbiAgICovXG4gIHN0YXRpYyBfcmFuZ2UocGFyYW1zOiBudW1iZXJbXSkge1xuICAgIHJldHVybiBhc0xpc3QodGVycmFmb3JtRnVuY3Rpb24oXCJyYW5nZVwiLCBbdmFyaWFkaWMobnVtZXJpY1ZhbHVlKV0pKHBhcmFtcykpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3JlZ2V4IHJlZ2V4fSBhcHBsaWVzIGEgW3JlZ3VsYXIgZXhwcmVzc2lvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmVndWxhcl9leHByZXNzaW9uKSB0byBhIHN0cmluZyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgc3Vic3RyaW5ncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHJlZ2V4KHBhdHRlcm46IHN0cmluZywgc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInJlZ2V4XCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShwYXR0ZXJuLCBzdHIpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvcmVnZXhhbGwgcmVnZXhhbGx9IGFwcGxpZXMgYSBbcmVndWxhciBleHByZXNzaW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZWd1bGFyX2V4cHJlc3Npb24pIHRvIGEgc3RyaW5nIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgbWF0Y2hlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHJlZ2V4YWxsKHBhdHRlcm46IHN0cmluZywgc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNMaXN0KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJyZWdleGFsbFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkocGF0dGVybiwgc3RyKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3JlcGxhY2UgcmVwbGFjZX0gc2VhcmNoZXMgYSBnaXZlbiBzdHJpbmcgZm9yIGFub3RoZXIgZ2l2ZW4gc3Vic3RyaW5nLCBhbmQgcmVwbGFjZXMgZWFjaCBvY2N1cnJlbmNlIHdpdGggYSBnaXZlbiByZXBsYWNlbWVudCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVwbGFjZVxuICAgKi9cbiAgc3RhdGljIHJlcGxhY2Uoc3RyOiBzdHJpbmcsIHN1YnN0cjogc3RyaW5nLCByZXBsYWNlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInJlcGxhY2VcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShcbiAgICAgICAgc3RyLFxuICAgICAgICBzdWJzdHIsXG4gICAgICAgIHJlcGxhY2UsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvcmV2ZXJzZSByZXZlcnNlfSB0YWtlcyBhIHNlcXVlbmNlIGFuZCBwcm9kdWNlcyBhIG5ldyBzZXF1ZW5jZSBvZiB0aGUgc2FtZSBsZW5ndGggd2l0aCBhbGwgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXMgdGhlIGdpdmVuIHNlcXVlbmNlIGJ1dCBpbiByZXZlcnNlIG9yZGVyLlxuICAgKiBAcGFyYW0ge2FueX0gbGlzdFxuICAgKi9cbiAgc3RhdGljIHJldmVyc2UobGlzdDogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwicmV2ZXJzZVwiLCBbYW55VmFsdWVdKShsaXN0KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvcnNhZGVjcnlwdCByc2FkZWNyeXB0fSBkZWNyeXB0cyBhbiBSU0EtZW5jcnlwdGVkIGNpcGhlcnRleHQsIHJldHVybmluZyB0aGUgY29ycmVzcG9uZGluZyBjbGVhcnRleHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaXBoZXJ0ZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRla2V5XG4gICAqL1xuICBzdGF0aWMgcnNhZGVjcnlwdChjaXBoZXJ0ZXh0OiBzdHJpbmcsIHByaXZhdGVrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwicnNhZGVjcnlwdFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoXG4gICAgICAgIGNpcGhlcnRleHQsXG4gICAgICAgIHByaXZhdGVrZXksXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc2Vuc2l0aXZlIHNlbnNpdGl2ZX0gdGFrZXMgYW55IHZhbHVlIGFuZCByZXR1cm5zIGEgY29weSBvZiBpdCBtYXJrZWQgc28gdGhhdCBUZXJyYWZvcm0gd2lsbCB0cmVhdCBpdCBhcyBzZW5zaXRpdmUsIHdpdGggdGhlIHNhbWUgbWVhbmluZyBhbmQgYmVoYXZpb3IgYXMgZm9yIFtzZW5zaXRpdmUgaW5wdXQgdmFyaWFibGVzXSgvdGVycmFmb3JtL2xhbmd1YWdlL3ZhbHVlcy92YXJpYWJsZXMjc3VwcHJlc3NpbmctdmFsdWVzLWluLWNsaS1vdXRwdXQpLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICovXG4gIHN0YXRpYyBzZW5zaXRpdmUodmFsdWU6IGFueSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcInNlbnNpdGl2ZVwiLCBbYW55VmFsdWVdKSh2YWx1ZSkpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zZXRpbnRlcnNlY3Rpb24gc2V0aW50ZXJzZWN0aW9ufSBmdW5jdGlvbiB0YWtlcyBtdWx0aXBsZSBzZXRzIGFuZCBwcm9kdWNlcyBhIHNpbmdsZSBzZXQgY29udGFpbmluZyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IGFsbCBvZiB0aGUgZ2l2ZW4gc2V0cyBoYXZlIGluIGNvbW1vbi4gSW4gb3RoZXIgd29yZHMsIGl0IGNvbXB1dGVzIHRoZSBbaW50ZXJzZWN0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbnRlcnNlY3Rpb25fXFwoc2V0X3RoZW9yeVxcKSkgb2YgdGhlIHNldHMuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gZmlyc3Rfc2V0XG4gICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8YW55Pj59IG90aGVyX3NldHNcbiAgICovXG4gIHN0YXRpYyBzZXRpbnRlcnNlY3Rpb24oZmlyc3Rfc2V0OiBhbnlbXSwgb3RoZXJfc2V0czogYW55W11bXSkge1xuICAgIHJldHVybiBhc0xpc3QoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInNldGludGVyc2VjdGlvblwiLCBbXG4gICAgICAgIGxpc3RPZihhbnlWYWx1ZSksXG4gICAgICAgIHZhcmlhZGljKGxpc3RPZihhbnlWYWx1ZSkpLFxuICAgICAgXSkoZmlyc3Rfc2V0LCBvdGhlcl9zZXRzKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zZXRwcm9kdWN0IHNldHByb2R1Y3R9IGZ1bmN0aW9uIGZpbmRzIGFsbCBvZiB0aGUgcG9zc2libGUgY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIGZyb20gYWxsIG9mIHRoZSBnaXZlbiBzZXRzIGJ5IGNvbXB1dGluZyB0aGUgW0NhcnRlc2lhbiBwcm9kdWN0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYXJ0ZXNpYW5fcHJvZHVjdCkuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gc2V0c1xuICAgKi9cbiAgc3RhdGljIHNldHByb2R1Y3Qoc2V0czogYW55W10pIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJzZXRwcm9kdWN0XCIsIFt2YXJpYWRpYyhhbnlWYWx1ZSldKShzZXRzKSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NldHN1YnRyYWN0IHNldHN1YnRyYWN0fSBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IHNldCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBmaXJzdCBzZXQgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIHNlY29uZCBzZXQuIEluIG90aGVyIHdvcmRzLCBpdCBjb21wdXRlcyB0aGUgW3JlbGF0aXZlIGNvbXBsZW1lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbXBsZW1lbnRfXFwoc2V0X3RoZW9yeVxcKSNSZWxhdGl2ZV9jb21wbGVtZW50KSBvZiB0aGUgc2Vjb25kIHNldC5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBhXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYlxuICAgKi9cbiAgc3RhdGljIHNldHN1YnRyYWN0KGE6IGFueVtdLCBiOiBhbnlbXSkge1xuICAgIHJldHVybiBhc0xpc3QoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInNldHN1YnRyYWN0XCIsIFtsaXN0T2YoYW55VmFsdWUpLCBsaXN0T2YoYW55VmFsdWUpXSkoXG4gICAgICAgIGEsXG4gICAgICAgIGIsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NldHVuaW9uIHNldHVuaW9ufSBmdW5jdGlvbiB0YWtlcyBtdWx0aXBsZSBzZXRzIGFuZCBwcm9kdWNlcyBhIHNpbmdsZSBzZXQgY29udGFpbmluZyB0aGUgZWxlbWVudHMgZnJvbSBhbGwgb2YgdGhlIGdpdmVuIHNldHMuIEluIG90aGVyIHdvcmRzLCBpdCBjb21wdXRlcyB0aGUgW3VuaW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbmlvbl9cXChzZXRfdGhlb3J5XFwpKSBvZiB0aGUgc2V0cy5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBmaXJzdF9zZXRcbiAgICogQHBhcmFtIHtBcnJheTxBcnJheTxhbnk+Pn0gb3RoZXJfc2V0c1xuICAgKi9cbiAgc3RhdGljIHNldHVuaW9uKGZpcnN0X3NldDogYW55W10sIG90aGVyX3NldHM6IGFueVtdW10pIHtcbiAgICByZXR1cm4gYXNMaXN0KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJzZXR1bmlvblwiLCBbXG4gICAgICAgIGxpc3RPZihhbnlWYWx1ZSksXG4gICAgICAgIHZhcmlhZGljKGxpc3RPZihhbnlWYWx1ZSkpLFxuICAgICAgXSkoZmlyc3Rfc2V0LCBvdGhlcl9zZXRzKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NoYTEgc2hhMX0gY29tcHV0ZXMgdGhlIFNIQTEgaGFzaCBvZiBhIGdpdmVuIHN0cmluZyBhbmQgZW5jb2RlcyBpdCB3aXRoIGhleGFkZWNpbWFsIGRpZ2l0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHNoYTEoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJzaGExXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NoYTI1NiBzaGEyNTZ9IGNvbXB1dGVzIHRoZSBTSEEyNTYgaGFzaCBvZiBhIGdpdmVuIHN0cmluZyBhbmQgZW5jb2RlcyBpdCB3aXRoIGhleGFkZWNpbWFsIGRpZ2l0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHNoYTI1NihzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInNoYTI1NlwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zaGE1MTIgc2hhNTEyfSBjb21wdXRlcyB0aGUgU0hBNTEyIGhhc2ggb2YgYSBnaXZlbiBzdHJpbmcgYW5kIGVuY29kZXMgaXQgd2l0aCBoZXhhZGVjaW1hbCBkaWdpdHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBzaGE1MTIoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJzaGE1MTJcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc2lnbnVtIHNpZ251bX0gZGV0ZXJtaW5lcyB0aGUgc2lnbiBvZiBhIG51bWJlciwgcmV0dXJuaW5nIGEgbnVtYmVyIGJldHdlZW4gLTEgYW5kIDEgdG8gcmVwcmVzZW50IHRoZSBzaWduLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gICAqL1xuICBzdGF0aWMgc2lnbnVtKG51bTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKHRlcnJhZm9ybUZ1bmN0aW9uKFwic2lnbnVtXCIsIFtudW1lcmljVmFsdWVdKShudW0pKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zbGljZSBzbGljZX0gZXh0cmFjdHMgc29tZSBjb25zZWN1dGl2ZSBlbGVtZW50cyBmcm9tIHdpdGhpbiBhIGxpc3QuXG4gICAqIEBwYXJhbSB7YW55fSBsaXN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydF9pbmRleFxuICAgKiBAcGFyYW0ge251bWJlcn0gZW5kX2luZGV4XG4gICAqL1xuICBzdGF0aWMgc2xpY2UobGlzdDogYW55LCBzdGFydF9pbmRleDogbnVtYmVyLCBlbmRfaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBhc0FueShcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwic2xpY2VcIiwgW2FueVZhbHVlLCBudW1lcmljVmFsdWUsIG51bWVyaWNWYWx1ZV0pKFxuICAgICAgICBsaXN0LFxuICAgICAgICBzdGFydF9pbmRleCxcbiAgICAgICAgZW5kX2luZGV4LFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NvcnQgc29ydH0gdGFrZXMgYSBsaXN0IG9mIHN0cmluZ3MgYW5kIHJldHVybnMgYSBuZXcgbGlzdCB3aXRoIHRob3NlIHN0cmluZ3Mgc29ydGVkIGxleGljb2dyYXBoaWNhbGx5LlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGxpc3RcbiAgICovXG4gIHN0YXRpYyBzb3J0KGxpc3Q6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIGFzTGlzdCh0ZXJyYWZvcm1GdW5jdGlvbihcInNvcnRcIiwgW2xpc3RPZihhbnlWYWx1ZSldKShsaXN0KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc3BsaXQgc3BsaXR9IHByb2R1Y2VzIGEgbGlzdCBieSBkaXZpZGluZyBhIGdpdmVuIHN0cmluZyBhdCBhbGwgb2NjdXJyZW5jZXMgb2YgYSBnaXZlbiBzZXBhcmF0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXBhcmF0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHNwbGl0KHNlcGFyYXRvcjogc3RyaW5nLCBzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc0xpc3QoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInNwbGl0XCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShzZXBhcmF0b3IsIHN0ciksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zdGFydHN3aXRoIHN0YXJ0c3dpdGh9IHRha2VzIHR3byB2YWx1ZXM6IGEgc3RyaW5nIHRvIGNoZWNrIGFuZCBhIHByZWZpeCBzdHJpbmcuIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBiZWdpbnMgd2l0aCB0aGF0IGV4YWN0IHByZWZpeC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqL1xuICBzdGF0aWMgc3RhcnRzd2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJzdGFydHN3aXRoXCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShzdHIsIHByZWZpeCksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zdHJjb250YWlucyBzdHJjb250YWluc30gdGFrZXMgdHdvIHZhbHVlczogYSBzdHJpbmcgdG8gY2hlY2sgYW5kIGFuIGV4cGVjdGVkIHN1YnN0cmluZy4gVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIGhhcyB0aGUgc3Vic3RyaW5nIGNvbnRhaW5lZCB3aXRoaW4gaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnN0clxuICAgKi9cbiAgc3RhdGljIHN0cmNvbnRhaW5zKHN0cjogc3RyaW5nLCBzdWJzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc0Jvb2xlYW4oXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInN0cmNvbnRhaW5zXCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShzdHIsIHN1YnN0ciksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zdHJyZXYgc3RycmV2fSByZXZlcnNlcyB0aGUgY2hhcmFjdGVycyBpbiBhIHN0cmluZy4gTm90ZSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGFzIF9Vbmljb2RlIGNoYXJhY3RlcnNfIChpbiB0ZWNobmljYWwgdGVybXMsIFVuaWNvZGUgW2dyYXBoZW1lIGNsdXN0ZXIgYm91bmRhcmllc10oaHR0cHM6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyMjkvI0dyYXBoZW1lX0NsdXN0ZXJfQm91bmRhcmllcykgYXJlIHJlc3BlY3RlZCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBzdHJyZXYoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJzdHJyZXZcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc3Vic3RyIHN1YnN0cn0gZXh0cmFjdHMgYSBzdWJzdHJpbmcgZnJvbSBhIGdpdmVuIHN0cmluZyBieSBvZmZzZXQgYW5kIChtYXhpbXVtKSBsZW5ndGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gICAqL1xuICBzdGF0aWMgc3Vic3RyKHN0cjogc3RyaW5nLCBvZmZzZXQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInN1YnN0clwiLCBbc3RyaW5nVmFsdWUsIG51bWVyaWNWYWx1ZSwgbnVtZXJpY1ZhbHVlXSkoXG4gICAgICAgIHN0cixcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBsZW5ndGgsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc3VtIHN1bX0gdGFrZXMgYSBsaXN0IG9yIHNldCBvZiBudW1iZXJzIGFuZCByZXR1cm5zIHRoZSBzdW0gb2YgdGhvc2UgbnVtYmVycy5cbiAgICogQHBhcmFtIHthbnl9IGxpc3RcbiAgICovXG4gIHN0YXRpYyBzdW0obGlzdDogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwic3VtXCIsIFthbnlWYWx1ZV0pKGxpc3QpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90ZW1wbGF0ZWZpbGUgdGVtcGxhdGVmaWxlfSByZWFkcyB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gcGF0aCBhbmQgcmVuZGVycyBpdHMgY29udGVudCBhcyBhIHRlbXBsYXRlIHVzaW5nIGEgc3VwcGxpZWQgc2V0IG9mIHRlbXBsYXRlIHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHthbnl9IHZhcnNcbiAgICovXG4gIHN0YXRpYyB0ZW1wbGF0ZWZpbGUocGF0aDogc3RyaW5nLCB2YXJzOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInRlbXBsYXRlZmlsZVwiLCBbc3RyaW5nVmFsdWUsIGFueVZhbHVlXSkocGF0aCwgdmFycyksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90ZXh0ZGVjb2RlYmFzZTY0IHRleHRkZWNvZGViYXNlNjR9IGZ1bmN0aW9uIGRlY29kZXMgYSBzdHJpbmcgdGhhdCB3YXMgcHJldmlvdXNseSBCYXNlNjQtZW5jb2RlZCwgYW5kIHRoZW4gaW50ZXJwcmV0cyB0aGUgcmVzdWx0IGFzIGNoYXJhY3RlcnMgaW4gYSBzcGVjaWZpZWQgY2hhcmFjdGVyIGVuY29kaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGluZ1xuICAgKi9cbiAgc3RhdGljIHRleHRkZWNvZGViYXNlNjQoc291cmNlOiBzdHJpbmcsIGVuY29kaW5nOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInRleHRkZWNvZGViYXNlNjRcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGVuY29kaW5nLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RleHRlbmNvZGViYXNlNjQgdGV4dGVuY29kZWJhc2U2NH0gZW5jb2RlcyB0aGUgdW5pY29kZSBjaGFyYWN0ZXJzIGluIGEgZ2l2ZW4gc3RyaW5nIHVzaW5nIGEgc3BlY2lmaWVkIGNoYXJhY3RlciBlbmNvZGluZywgcmV0dXJuaW5nIHRoZSByZXN1bHQgYmFzZTY0IGVuY29kZWQgYmVjYXVzZSBUZXJyYWZvcm0gbGFuZ3VhZ2Ugc3RyaW5ncyBhcmUgYWx3YXlzIHNlcXVlbmNlcyBvZiB1bmljb2RlIGNoYXJhY3RlcnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nXG4gICAqL1xuICBzdGF0aWMgdGV4dGVuY29kZWJhc2U2NChzdHI6IHN0cmluZywgZW5jb2Rpbmc6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwidGV4dGVuY29kZWJhc2U2NFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoXG4gICAgICAgIHN0cixcbiAgICAgICAgZW5jb2RpbmcsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdGltZWFkZCB0aW1lYWRkfSBhZGRzIGEgZHVyYXRpb24gdG8gYSB0aW1lc3RhbXAsIHJldHVybmluZyBhIG5ldyB0aW1lc3RhbXAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lc3RhbXBcbiAgICogQHBhcmFtIHtzdHJpbmd9IGR1cmF0aW9uXG4gICAqL1xuICBzdGF0aWMgdGltZWFkZCh0aW1lc3RhbXA6IHN0cmluZywgZHVyYXRpb246IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwidGltZWFkZFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoXG4gICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdGltZWNtcCB0aW1lY21wfSBjb21wYXJlcyB0d28gdGltZXN0YW1wcyBhbmQgcmV0dXJucyBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIG9yZGVyaW5nIG9mIHRoZSBpbnN0YW50cyB0aG9zZSB0aW1lc3RhbXBzIHJlcHJlc2VudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVzdGFtcF9hXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lc3RhbXBfYlxuICAgKi9cbiAgc3RhdGljIHRpbWVjbXAodGltZXN0YW1wX2E6IHN0cmluZywgdGltZXN0YW1wX2I6IHN0cmluZykge1xuICAgIHJldHVybiBhc051bWJlcihcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwidGltZWNtcFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoXG4gICAgICAgIHRpbWVzdGFtcF9hLFxuICAgICAgICB0aW1lc3RhbXBfYixcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90aW1lc3RhbXAgdGltZXN0YW1wfSByZXR1cm5zIGEgVVRDIHRpbWVzdGFtcCBzdHJpbmcgaW4gW1JGQyAzMzM5XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzMzOSkgZm9ybWF0LlxuICAgKi9cbiAgc3RhdGljIHRpbWVzdGFtcCgpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJ0aW1lc3RhbXBcIiwgW10pKCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RpdGxlIHRpdGxlfSBjb252ZXJ0cyB0aGUgZmlyc3QgbGV0dGVyIG9mIGVhY2ggd29yZCBpbiB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHVwcGVyY2FzZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHRpdGxlKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwidGl0bGVcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdG9ib29sIHRvYm9vbH0gY29udmVydHMgaXRzIGFyZ3VtZW50IHRvIGEgYm9vbGVhbiB2YWx1ZS5cbiAgICogQHBhcmFtIHthbnl9IHZcbiAgICovXG4gIHN0YXRpYyB0b2Jvb2wodjogYW55KSB7XG4gICAgcmV0dXJuIGFzQm9vbGVhbih0ZXJyYWZvcm1GdW5jdGlvbihcInRvYm9vbFwiLCBbYW55VmFsdWVdKSh2KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdG9saXN0IHRvbGlzdH0gY29udmVydHMgaXRzIGFyZ3VtZW50IHRvIGEgbGlzdCB2YWx1ZS5cbiAgICogQHBhcmFtIHthbnl9IHZcbiAgICovXG4gIHN0YXRpYyB0b2xpc3QodjogYW55KSB7XG4gICAgcmV0dXJuIGFzTGlzdCh0ZXJyYWZvcm1GdW5jdGlvbihcInRvbGlzdFwiLCBbYW55VmFsdWVdKSh2KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdG9tYXAgdG9tYXB9IGNvbnZlcnRzIGl0cyBhcmd1bWVudCB0byBhIG1hcCB2YWx1ZS5cbiAgICogQHBhcmFtIHthbnl9IHZcbiAgICovXG4gIHN0YXRpYyB0b21hcCh2OiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJ0b21hcFwiLCBbYW55VmFsdWVdKSh2KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdG9udW1iZXIgdG9udW1iZXJ9IGNvbnZlcnRzIGl0cyBhcmd1bWVudCB0byBhIG51bWJlciB2YWx1ZS5cbiAgICogQHBhcmFtIHthbnl9IHZcbiAgICovXG4gIHN0YXRpYyB0b251bWJlcih2OiBhbnkpIHtcbiAgICByZXR1cm4gYXNOdW1iZXIodGVycmFmb3JtRnVuY3Rpb24oXCJ0b251bWJlclwiLCBbYW55VmFsdWVdKSh2KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdG9zZXQgdG9zZXR9IGNvbnZlcnRzIGl0cyBhcmd1bWVudCB0byBhIHNldCB2YWx1ZS5cbiAgICogQHBhcmFtIHthbnl9IHZcbiAgICovXG4gIHN0YXRpYyB0b3NldCh2OiBhbnkpIHtcbiAgICByZXR1cm4gYXNMaXN0KHRlcnJhZm9ybUZ1bmN0aW9uKFwidG9zZXRcIiwgW2FueVZhbHVlXSkodikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3Rvc3RyaW5nIHRvc3RyaW5nfSBjb252ZXJ0cyBpdHMgYXJndW1lbnQgdG8gYSBzdHJpbmcgdmFsdWUuXG4gICAqIEBwYXJhbSB7YW55fSB2XG4gICAqL1xuICBzdGF0aWMgdG9zdHJpbmcodjogYW55KSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwidG9zdHJpbmdcIiwgW2FueVZhbHVlXSkodikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RyYW5zcG9zZSB0cmFuc3Bvc2V9IHRha2VzIGEgbWFwIG9mIGxpc3RzIG9mIHN0cmluZ3MgYW5kIHN3YXBzIHRoZSBrZXlzIGFuZCB2YWx1ZXMgdG8gcHJvZHVjZSBhIG5ldyBtYXAgb2YgbGlzdHMgb2Ygc3RyaW5ncy5cbiAgICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBBcnJheTxzdHJpbmc+Pn0gdmFsdWVzXG4gICAqL1xuICBzdGF0aWMgdHJhbnNwb3NlKHZhbHVlczogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwidHJhbnNwb3NlXCIsIFttYXBWYWx1ZV0pKHZhbHVlcykpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RyaW0gdHJpbX0gcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHNldCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGdpdmVuIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3V0c2V0XG4gICAqL1xuICBzdGF0aWMgdHJpbShzdHI6IHN0cmluZywgY3V0c2V0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInRyaW1cIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKHN0ciwgY3V0c2V0KSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RyaW1wcmVmaXggdHJpbXByZWZpeH0gcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHByZWZpeCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZ2l2ZW4gc3RyaW5nLiBJZiB0aGUgc3RyaW5nIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIHByZWZpeCwgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKi9cbiAgc3RhdGljIHRyaW1wcmVmaXgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJ0cmltcHJlZml4XCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShzdHIsIHByZWZpeCksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90cmltc3BhY2UgdHJpbXNwYWNlfSByZW1vdmVzIGFueSBzcGFjZSBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGdpdmVuIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHRyaW1zcGFjZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInRyaW1zcGFjZVwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90cmltc3VmZml4IHRyaW1zdWZmaXh9IHJlbW92ZXMgdGhlIHNwZWNpZmllZCBzdWZmaXggZnJvbSB0aGUgZW5kIG9mIHRoZSBnaXZlbiBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKi9cbiAgc3RhdGljIHRyaW1zdWZmaXgoc3RyOiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJ0cmltc3VmZml4XCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShzdHIsIHN1ZmZpeCksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90cnkgdHJ5fSBldmFsdWF0ZXMgYWxsIG9mIGl0cyBhcmd1bWVudCBleHByZXNzaW9ucyBpbiB0dXJuIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGZpcnN0IG9uZSB0aGF0IGRvZXMgbm90IHByb2R1Y2UgYW55IGVycm9ycy5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBleHByZXNzaW9uc1xuICAgKi9cbiAgc3RhdGljIHRyeShleHByZXNzaW9uczogYW55W10pIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJ0cnlcIiwgW3ZhcmlhZGljKGFueVZhbHVlKV0pKGV4cHJlc3Npb25zKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdXBwZXIgdXBwZXJ9IGNvbnZlcnRzIGFsbCBjYXNlZCBsZXR0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcgdG8gdXBwZXJjYXNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgdXBwZXIoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJ1cHBlclwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy91cmxlbmNvZGUgdXJsZW5jb2RlfSBhcHBsaWVzIFVSTCBlbmNvZGluZyB0byBhIGdpdmVuIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHVybGVuY29kZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInVybGVuY29kZVwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy91dWlkIHV1aWR9IGdlbmVyYXRlcyBhIHVuaXF1ZSBpZGVudGlmaWVyIHN0cmluZy5cbiAgICovXG4gIHN0YXRpYyB1dWlkKCkge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInV1aWRcIiwgW10pKCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3V1aWR2NSB1dWlkdjV9IGdlbmVyYXRlcyBhIF9uYW1lLWJhc2VkXyBVVUlELCBhcyBkZXNjcmliZWQgaW4gW1JGQyA0MTIyIHNlY3Rpb24gNC4zXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDEyMiNzZWN0aW9uLTQuMyksIGFsc28ga25vd24gYXMgYSBcInZlcnNpb24gNVwiIFVVSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIHN0YXRpYyB1dWlkdjUobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwidXVpZHY1XCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShuYW1lc3BhY2UsIG5hbWUpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdmFsdWVzIHZhbHVlc30gdGFrZXMgYSBtYXAgYW5kIHJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhhdCBtYXAuXG4gICAqIEBwYXJhbSB7YW55fSBtYXBwaW5nXG4gICAqL1xuICBzdGF0aWMgdmFsdWVzKG1hcHBpbmc6IGFueSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcInZhbHVlc1wiLCBbYW55VmFsdWVdKShtYXBwaW5nKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMveWFtbGRlY29kZSB5YW1sZGVjb2RlfSBwYXJzZXMgYSBzdHJpbmcgYXMgYSBzdWJzZXQgb2YgWUFNTCwgYW5kIHByb2R1Y2VzIGEgcmVwcmVzZW50YXRpb24gb2YgaXRzIHZhbHVlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3JjXG4gICAqL1xuICBzdGF0aWMgeWFtbGRlY29kZShzcmM6IHN0cmluZykge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcInlhbWxkZWNvZGVcIiwgW3N0cmluZ1ZhbHVlXSkoc3JjKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMveWFtbGVuY29kZSB5YW1sZW5jb2RlfSBlbmNvZGVzIGEgZ2l2ZW4gdmFsdWUgdG8gYSBzdHJpbmcgdXNpbmcgW1lBTUwgMS4yXShodHRwczovL3lhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCkgYmxvY2sgc3ludGF4LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICovXG4gIHN0YXRpYyB5YW1sZW5jb2RlKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJ5YW1sZW5jb2RlXCIsIFthbnlWYWx1ZV0pKHZhbHVlKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvemlwbWFwIHppcG1hcH0gY29uc3RydWN0cyBhIG1hcCBmcm9tIGEgbGlzdCBvZiBrZXlzIGFuZCBhIGNvcnJlc3BvbmRpbmcgbGlzdCBvZiB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0ga2V5c1xuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVzXG4gICAqL1xuICBzdGF0aWMgemlwbWFwKGtleXM6IHN0cmluZ1tdLCB2YWx1ZXM6IGFueSkge1xuICAgIHJldHVybiBhc0FueShcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiemlwbWFwXCIsIFtsaXN0T2YoYW55VmFsdWUpLCBhbnlWYWx1ZV0pKGtleXMsIHZhbHVlcyksXG4gICAgKTtcbiAgfVxufVxuIl19
938
+ FnGenerated[_a] = { fqn: "cdktn.FnGenerated", version: "0.23.4" };
939
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLWZ1bmN0aW9ucy5nZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3Rpb25zL3RlcnJhZm9ybS1mdW5jdGlvbnMuZ2VuZXJhdGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQzs7O0dBR0c7QUFDSCx1Q0FhbUI7QUFDbkIsK0NBQStDO0FBQy9DLE1BQWEsV0FBVztJQUN0Qjs7O09BR0c7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQVc7UUFDcEIsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxLQUFLLEVBQUUsQ0FBQyxzQkFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVk7UUFDekIsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxTQUFTLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVc7UUFDeEIsT0FBTyxJQUFBLG1CQUFTLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxTQUFTLEVBQUUsQ0FBQyxJQUFBLGdCQUFNLEVBQUMsa0JBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVc7UUFDeEIsT0FBTyxJQUFBLG1CQUFTLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxTQUFTLEVBQUUsQ0FBQyxJQUFBLGdCQUFNLEVBQUMsa0JBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQVc7UUFDN0IsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxjQUFjLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQVc7UUFDN0IsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxjQUFjLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQVc7UUFDN0IsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxjQUFjLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQVc7UUFDM0IsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxZQUFZLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQVc7UUFDN0IsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxjQUFjLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQVc7UUFDN0IsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxjQUFjLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FB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OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFXO1FBQzNCLE9BQU8sSUFBQSxlQUFLLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxZQUFZLEVBQUUsQ0FBQyxxQkFBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQVU7UUFDMUIsT0FBTyxJQUFBLGtCQUFRLEVBQUMsSUFBQSwyQkFBaUIsRUFBQyxZQUFZLEVBQUUsQ0FBQyxrQkFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFjLEVBQUUsTUFBVztRQUN2QyxPQUFPLElBQUEsZUFBSyxFQUNWLElBQUEsMkJBQWlCLEVBQUMsUUFBUSxFQUFFLENBQUMsSUFBQSxnQkFBTSxFQUFDLGtCQUFRLENBQUMsRUFBRSxrQkFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQ3hFLENBQUM7SUFDSixDQUFDOztBQXBqQ0gsa0NBcWpDQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4vKlxuICogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSB0b29scy9nZW5lcmF0ZS1mdW5jdGlvbi1iaW5kaW5ncy5cbiAqIFRvIHVwZGF0ZSB0aGlzIGZpbGUgZXhlY3V0ZSAncG5wbSBnZW5lcmF0ZS1mdW5jdGlvbi1iaW5kaW5ncycgaW4gdGhlIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnlcbiAqL1xuaW1wb3J0IHtcbiAgYW55VmFsdWUsXG4gIGFzQW55LFxuICBhc0Jvb2xlYW4sXG4gIGFzTGlzdCxcbiAgYXNOdW1iZXIsXG4gIGFzU3RyaW5nLFxuICBsaXN0T2YsXG4gIG1hcFZhbHVlLFxuICBudW1lcmljVmFsdWUsXG4gIHN0cmluZ1ZhbHVlLFxuICB0ZXJyYWZvcm1GdW5jdGlvbixcbiAgdmFyaWFkaWMsXG59IGZyb20gXCIuL2hlbHBlcnNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgY2xhc3MgRm5HZW5lcmF0ZWQge1xuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9hYnMgYWJzfSByZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbnVtYmVyLiBJbiBvdGhlciB3b3JkcywgaWYgdGhlIG51bWJlciBpcyB6ZXJvIG9yIHBvc2l0aXZlIHRoZW4gaXQgaXMgcmV0dXJuZWQgYXMtaXMsIGJ1dCBpZiBpdCBpcyBuZWdhdGl2ZSB0aGVuIGl0IGlzIG11bHRpcGxpZWQgYnkgLTEgdG8gbWFrZSBpdCBwb3NpdGl2ZSBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gICAqL1xuICBzdGF0aWMgYWJzKG51bTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYWJzXCIsIFtudW1lcmljVmFsdWVdKShudW0pKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9hYnNwYXRoIGFic3BhdGh9IHRha2VzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBmaWxlc3lzdGVtIHBhdGggYW5kIGNvbnZlcnRzIGl0IHRvIGFuIGFic29sdXRlIHBhdGguIFRoYXQgaXMsIGlmIHRoZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSwgaXQgd2lsbCBiZSBqb2luZWQgd2l0aCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHN0YXRpYyBhYnNwYXRoKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImFic3BhdGhcIiwgW3N0cmluZ1ZhbHVlXSkocGF0aCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2FsbHRydWUgYWxsdHJ1ZX0gcmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIGluIGEgZ2l2ZW4gY29sbGVjdGlvbiBhcmUgYHRydWVgIG9yIGBcInRydWVcImAuIEl0IGFsc28gcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gbGlzdFxuICAgKi9cbiAgc3RhdGljIGFsbHRydWUobGlzdDogYW55W10pIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYWxsdHJ1ZVwiLCBbbGlzdE9mKGFueVZhbHVlKV0pKGxpc3QpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9hbnl0cnVlIGFueXRydWV9IHJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IGluIGEgZ2l2ZW4gY29sbGVjdGlvbiBpcyBgdHJ1ZWAgb3IgYFwidHJ1ZVwiYC4gSXQgYWxzbyByZXR1cm5zIGBmYWxzZWAgaWYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gbGlzdFxuICAgKi9cbiAgc3RhdGljIGFueXRydWUobGlzdDogYW55W10pIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYW55dHJ1ZVwiLCBbbGlzdE9mKGFueVZhbHVlKV0pKGxpc3QpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9iYXNlNjRkZWNvZGUgYmFzZTY0ZGVjb2RlfSB0YWtlcyBhIHN0cmluZyBjb250YWluaW5nIGEgQmFzZTY0IGNoYXJhY3RlciBzZXF1ZW5jZSBhbmQgcmV0dXJucyB0aGUgb3JpZ2luYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgYmFzZTY0ZGVjb2RlKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYmFzZTY0ZGVjb2RlXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Jhc2U2NGVuY29kZSBiYXNlNjRlbmNvZGV9IGFwcGxpZXMgQmFzZTY0IGVuY29kaW5nIHRvIGEgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgYmFzZTY0ZW5jb2RlKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYmFzZTY0ZW5jb2RlXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9vcGVudG9mdS5vcmcvZG9jcy9sYW5ndWFnZS9mdW5jdGlvbnMvYmFzZTY0Z3VuemlwIGJhc2U2NGd1bnppcH0gZGVjb2RlcyBhIEJhc2U2NC1lbmNvZGVkIHN0cmluZyBhbmQgdW5jb21wcmVzc2VzIHRoZSByZXN1bHQgd2l0aCBnemlwLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgYmFzZTY0Z3VuemlwKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiYmFzZTY0Z3VuemlwXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Jhc2U2NGd6aXAgYmFzZTY0Z3ppcH0gY29tcHJlc3NlcyBhIHN0cmluZyB3aXRoIGd6aXAgYW5kIHRoZW4gZW5jb2RlcyB0aGUgcmVzdWx0IGluIEJhc2U2NCBlbmNvZGluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIGJhc2U2NGd6aXAoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJiYXNlNjRnemlwXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Jhc2U2NHNoYTI1NiBiYXNlNjRzaGEyNTZ9IGNvbXB1dGVzIHRoZSBTSEEyNTYgaGFzaCBvZiBhIGdpdmVuIHN0cmluZyBhbmQgZW5jb2RlcyBpdCB3aXRoIEJhc2U2NC4gVGhpcyBpcyBub3QgZXF1aXZhbGVudCB0byBgYmFzZTY0ZW5jb2RlKHNoYTI1NihcInRlc3RcIikpYCBzaW5jZSBgc2hhMjU2KClgIHJldHVybnMgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBiYXNlNjRzaGEyNTYoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJiYXNlNjRzaGEyNTZcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvYmFzZTY0c2hhNTEyIGJhc2U2NHNoYTUxMn0gY29tcHV0ZXMgdGhlIFNIQTUxMiBoYXNoIG9mIGEgZ2l2ZW4gc3RyaW5nIGFuZCBlbmNvZGVzIGl0IHdpdGggQmFzZTY0LiBUaGlzIGlzIG5vdCBlcXVpdmFsZW50IHRvIGBiYXNlNjRlbmNvZGUoc2hhNTEyKFwidGVzdFwiKSlgIHNpbmNlIGBzaGE1MTIoKWAgcmV0dXJucyBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIGJhc2U2NHNoYTUxMihzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImJhc2U2NHNoYTUxMlwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9iYXNlbmFtZSBiYXNlbmFtZX0gdGFrZXMgYSBzdHJpbmcgY29udGFpbmluZyBhIGZpbGVzeXN0ZW0gcGF0aCBhbmQgcmVtb3ZlcyBhbGwgZXhjZXB0IHRoZSBsYXN0IHBvcnRpb24gZnJvbSBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHN0YXRpYyBiYXNlbmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJiYXNlbmFtZVwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2JjcnlwdCBiY3J5cHR9IGNvbXB1dGVzIGEgaGFzaCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIHRoZSBCbG93ZmlzaCBjaXBoZXIsIHJldHVybmluZyBhIHN0cmluZyBpbiBbdGhlIF9Nb2R1bGFyIENyeXB0IEZvcm1hdF9dKGh0dHBzOi8vcGFzc2xpYi5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvbW9kdWxhcl9jcnlwdF9mb3JtYXQuaHRtbCkgdXN1YWxseSBleHBlY3RlZCBpbiB0aGUgc2hhZG93IHBhc3N3b3JkIGZpbGUgb24gbWFueSBVbml4IHN5c3RlbXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBjb3N0XG4gICAqL1xuICBzdGF0aWMgX2JjcnlwdChzdHI6IHN0cmluZywgY29zdDogbnVtYmVyW10pIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImJjcnlwdFwiLCBbc3RyaW5nVmFsdWUsIHZhcmlhZGljKG51bWVyaWNWYWx1ZSldKShcbiAgICAgICAgc3RyLFxuICAgICAgICBjb3N0LFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NhbiBjYW59IGV2YWx1YXRlcyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIHByb2R1Y2VkIGEgcmVzdWx0IHdpdGhvdXQgYW55IGVycm9ycy5cbiAgICogQHBhcmFtIHthbnl9IGV4cHJlc3Npb25cbiAgICovXG4gIHN0YXRpYyBjYW4oZXhwcmVzc2lvbjogYW55KSB7XG4gICAgcmV0dXJuIGFzQm9vbGVhbih0ZXJyYWZvcm1GdW5jdGlvbihcImNhblwiLCBbYW55VmFsdWVdKShleHByZXNzaW9uKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY2VpbCBjZWlsfSByZXR1cm5zIHRoZSBjbG9zZXN0IHdob2xlIG51bWJlciB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gdmFsdWUsIHdoaWNoIG1heSBiZSBhIGZyYWN0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gICAqL1xuICBzdGF0aWMgY2VpbChudW06IG51bWJlcikge1xuICAgIHJldHVybiBhc051bWJlcih0ZXJyYWZvcm1GdW5jdGlvbihcImNlaWxcIiwgW251bWVyaWNWYWx1ZV0pKG51bSkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2Nob21wIGNob21wfSByZW1vdmVzIG5ld2xpbmUgY2hhcmFjdGVycyBhdCB0aGUgZW5kIG9mIGEgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgY2hvbXAoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJjaG9tcFwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9jaHVua2xpc3QgY2h1bmtsaXN0fSBzcGxpdHMgYSBzaW5nbGUgbGlzdCBpbnRvIGZpeGVkLXNpemUgY2h1bmtzLCByZXR1cm5pbmcgYSBsaXN0IG9mIGxpc3RzLlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IGxpc3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAgICovXG4gIHN0YXRpYyBjaHVua2xpc3QobGlzdDogYW55W10sIHNpemU6IG51bWJlcikge1xuICAgIHJldHVybiBhc0xpc3QoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImNodW5rbGlzdFwiLCBbbGlzdE9mKGFueVZhbHVlKSwgbnVtZXJpY1ZhbHVlXSkoXG4gICAgICAgIGxpc3QsXG4gICAgICAgIHNpemUsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL29wZW50b2Z1Lm9yZy9kb2NzL2xhbmd1YWdlL2Z1bmN0aW9ucy9jaWRyY29udGFpbnMgY2lkcmNvbnRhaW5zfSBkZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBJUCBhZGRyZXNzIG9yIGFuIGFkZHJlc3MgcHJlZml4IGdpdmVuIGluIENJRFIgbm90YXRpb24gaXMgd2l0aGluIGEgZ2l2ZW4gSVAgbmV0d29yayBhZGRyZXNzIHByZWZpeC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRhaW5pbmdfcHJlZml4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250YWluZWRfaXBfb3JfcHJlZml4XG4gICAqL1xuICBzdGF0aWMgY2lkcmNvbnRhaW5zKFxuICAgIGNvbnRhaW5pbmdfcHJlZml4OiBzdHJpbmcsXG4gICAgY29udGFpbmVkX2lwX29yX3ByZWZpeDogc3RyaW5nLFxuICApIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJjaWRyY29udGFpbnNcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKFxuICAgICAgICBjb250YWluaW5nX3ByZWZpeCxcbiAgICAgICAgY29udGFpbmVkX2lwX29yX3ByZWZpeCxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9jaWRyaG9zdCBjaWRyaG9zdH0gY2FsY3VsYXRlcyBhIGZ1bGwgaG9zdCBJUCBhZGRyZXNzIGZvciBhIGdpdmVuIGhvc3QgbnVtYmVyIHdpdGhpbiBhIGdpdmVuIElQIG5ldHdvcmsgYWRkcmVzcyBwcmVmaXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhvc3RudW1cbiAgICovXG4gIHN0YXRpYyBjaWRyaG9zdChwcmVmaXg6IHN0cmluZywgaG9zdG51bTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJjaWRyaG9zdFwiLCBbc3RyaW5nVmFsdWUsIG51bWVyaWNWYWx1ZV0pKFxuICAgICAgICBwcmVmaXgsXG4gICAgICAgIGhvc3RudW0sXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY2lkcm5ldG1hc2sgY2lkcm5ldG1hc2t9IGNvbnZlcnRzIGFuIElQdjQgYWRkcmVzcyBwcmVmaXggZ2l2ZW4gaW4gQ0lEUiBub3RhdGlvbiBpbnRvIGEgc3VibmV0IG1hc2sgYWRkcmVzcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKi9cbiAgc3RhdGljIGNpZHJuZXRtYXNrKHByZWZpeDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiY2lkcm5ldG1hc2tcIiwgW3N0cmluZ1ZhbHVlXSkocHJlZml4KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY2lkcnN1Ym5ldCBjaWRyc3VibmV0fSBjYWxjdWxhdGVzIGEgc3VibmV0IGFkZHJlc3Mgd2l0aGluIGdpdmVuIElQIG5ldHdvcmsgYWRkcmVzcyBwcmVmaXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld2JpdHNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ldG51bVxuICAgKi9cbiAgc3RhdGljIGNpZHJzdWJuZXQocHJlZml4OiBzdHJpbmcsIG5ld2JpdHM6IG51bWJlciwgbmV0bnVtOiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImNpZHJzdWJuZXRcIiwgW1xuICAgICAgICBzdHJpbmdWYWx1ZSxcbiAgICAgICAgbnVtZXJpY1ZhbHVlLFxuICAgICAgICBudW1lcmljVmFsdWUsXG4gICAgICBdKShwcmVmaXgsIG5ld2JpdHMsIG5ldG51bSksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9jaWRyc3VibmV0cyBjaWRyc3VibmV0c30gY2FsY3VsYXRlcyBhIHNlcXVlbmNlIG9mIGNvbnNlY3V0aXZlIElQIGFkZHJlc3MgcmFuZ2VzIHdpdGhpbiBhIHBhcnRpY3VsYXIgQ0lEUiBwcmVmaXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBuZXdiaXRzXG4gICAqL1xuICBzdGF0aWMgY2lkcnN1Ym5ldHMocHJlZml4OiBzdHJpbmcsIG5ld2JpdHM6IG51bWJlcltdKSB7XG4gICAgcmV0dXJuIGFzTGlzdChcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiY2lkcnN1Ym5ldHNcIiwgW3N0cmluZ1ZhbHVlLCB2YXJpYWRpYyhudW1lcmljVmFsdWUpXSkoXG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgbmV3Yml0cyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9jb2FsZXNjZSBjb2FsZXNjZX0gdGFrZXMgYW55IG51bWJlciBvZiBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IG51bGwgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IHZhbHNcbiAgICovXG4gIHN0YXRpYyBjb2FsZXNjZSh2YWxzOiBhbnlbXSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcImNvYWxlc2NlXCIsIFt2YXJpYWRpYyhhbnlWYWx1ZSldKSh2YWxzKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY29hbGVzY2VsaXN0IGNvYWxlc2NlbGlzdH0gdGFrZXMgYW55IG51bWJlciBvZiBsaXN0IGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgZW1wdHkuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gdmFsc1xuICAgKi9cbiAgc3RhdGljIGNvYWxlc2NlbGlzdCh2YWxzOiBhbnlbXSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcImNvYWxlc2NlbGlzdFwiLCBbdmFyaWFkaWMoYW55VmFsdWUpXSkodmFscykpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NvbXBhY3QgY29tcGFjdH0gdGFrZXMgYSBsaXN0IG9mIHN0cmluZ3MgYW5kIHJldHVybnMgYSBuZXcgbGlzdCB3aXRoIGFueSBlbXB0eSBzdHJpbmcgZWxlbWVudHMgcmVtb3ZlZC5cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBsaXN0XG4gICAqL1xuICBzdGF0aWMgY29tcGFjdChsaXN0OiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBhc0xpc3QodGVycmFmb3JtRnVuY3Rpb24oXCJjb21wYWN0XCIsIFtsaXN0T2YoYW55VmFsdWUpXSkobGlzdCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NvbmNhdCBjb25jYXR9IHRha2VzIHR3byBvciBtb3JlIGxpc3RzIGFuZCBjb21iaW5lcyB0aGVtIGludG8gYSBzaW5nbGUgbGlzdC5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBzZXFzXG4gICAqL1xuICBzdGF0aWMgY29uY2F0KHNlcXM6IGFueVtdKSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwiY29uY2F0XCIsIFt2YXJpYWRpYyhhbnlWYWx1ZSldKShzZXFzKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY29udGFpbnMgY29udGFpbnN9IGRldGVybWluZXMgd2hldGhlciBhIGdpdmVuIGxpc3Qgb3Igc2V0IGNvbnRhaW5zIGEgZ2l2ZW4gc2luZ2xlIHZhbHVlIGFzIG9uZSBvZiBpdHMgZWxlbWVudHMuXG4gICAqIEBwYXJhbSB7YW55fSBsaXN0XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIGNvbnRhaW5zKGxpc3Q6IGFueSwgdmFsdWU6IGFueSkge1xuICAgIHJldHVybiBhc0FueShcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiY29udGFpbnNcIiwgW2FueVZhbHVlLCBhbnlWYWx1ZV0pKGxpc3QsIHZhbHVlKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2NvbnZlcnQgY29udmVydH0gY29udmVydHMgYSB2YWx1ZSB0byB0aGUgZ2l2ZW4gdHlwZSBjb25zdHJhaW50LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHBhcmFtIHthbnl9IHR5cGVcbiAgICovXG4gIHN0YXRpYyBjb252ZXJ0KHZhbHVlOiBhbnksIHR5cGU6IGFueSkge1xuICAgIHJldHVybiBhc0FueShcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiY29udmVydFwiLCBbYW55VmFsdWUsIGFueVZhbHVlXSkodmFsdWUsIHR5cGUpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvY3N2ZGVjb2RlIGNzdmRlY29kZX0gZGVjb2RlcyBhIHN0cmluZyBjb250YWluaW5nIENTVi1mb3JtYXR0ZWQgZGF0YSBhbmQgcHJvZHVjZXMgYSBsaXN0IG9mIG1hcHMgcmVwcmVzZW50aW5nIHRoYXQgZGF0YS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIGNzdmRlY29kZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcImNzdmRlY29kZVwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9kaXJuYW1lIGRpcm5hbWV9IHRha2VzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBmaWxlc3lzdGVtIHBhdGggYW5kIHJlbW92ZXMgdGhlIGxhc3QgcG9ydGlvbiBmcm9tIGl0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGRpcm5hbWUocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZGlybmFtZVwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZGlzdGluY3QgZGlzdGluY3R9IHRha2VzIGEgbGlzdCBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IHdpdGggYW55IGR1cGxpY2F0ZSBlbGVtZW50cyByZW1vdmVkLlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IGxpc3RcbiAgICovXG4gIHN0YXRpYyBkaXN0aW5jdChsaXN0OiBhbnlbXSkge1xuICAgIHJldHVybiBhc0xpc3QodGVycmFmb3JtRnVuY3Rpb24oXCJkaXN0aW5jdFwiLCBbbGlzdE9mKGFueVZhbHVlKV0pKGxpc3QpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9lbGVtZW50IGVsZW1lbnR9IHJldHJpZXZlcyBhIHNpbmdsZSBlbGVtZW50IGZyb20gYSBsaXN0LlxuICAgKiBAcGFyYW0ge2FueX0gbGlzdFxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICovXG4gIHN0YXRpYyBlbGVtZW50KGxpc3Q6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBhc0FueShcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiZWxlbWVudFwiLCBbYW55VmFsdWUsIG51bWVyaWNWYWx1ZV0pKGxpc3QsIGluZGV4KSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2VuZHN3aXRoIGVuZHN3aXRofSB0YWtlcyB0d28gdmFsdWVzOiBhIHN0cmluZyB0byBjaGVjayBhbmQgYSBzdWZmaXggc3RyaW5nLiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBmaXJzdCBzdHJpbmcgZW5kcyB3aXRoIHRoYXQgZXhhY3Qgc3VmZml4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICovXG4gIHN0YXRpYyBlbmRzd2l0aChzdHI6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJlbmRzd2l0aFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoc3RyLCBzdWZmaXgpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZXBoZW1lcmFsYXNudWxsIGVwaGVtZXJhbGFzbnVsbH0gdGFrZXMgYSB2YWx1ZSBvZiBhbnkgdHlwZSBhbmQgcmV0dXJucyBhIHNpbWlsYXIgdmFsdWUgb2YgdGhlIHNhbWUgdHlwZSB3aXRoIGFueSBlcGhlbWVyYWwgdmFsdWVzIHJlcGxhY2VkIHdpdGggbm9uLWVwaGVtZXJhbCBudWxsIHZhbHVlcyBhbmQgYWxsIG5vbi1lcGhlbWVyYWwgdmFsdWVzIHByZXNlcnZlZC5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqL1xuICBzdGF0aWMgZXBoZW1lcmFsYXNudWxsKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJlcGhlbWVyYWxhc251bGxcIiwgW2FueVZhbHVlXSkodmFsdWUpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9maWxlIGZpbGV9IHJlYWRzIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgYXQgdGhlIGdpdmVuIHBhdGggYW5kIHJldHVybnMgdGhlbSBhcyBhIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHN0YXRpYyBmaWxlKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImZpbGVcIiwgW3N0cmluZ1ZhbHVlXSkocGF0aCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2ZpbGViYXNlNjQgZmlsZWJhc2U2NH0gcmVhZHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBhdCB0aGUgZ2l2ZW4gcGF0aCBhbmQgcmV0dXJucyB0aGVtIGFzIGEgYmFzZTY0LWVuY29kZWQgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGViYXNlNjQocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZWJhc2U2NFwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZWJhc2U2NHNoYTI1NiBmaWxlYmFzZTY0c2hhMjU2fSBpcyBhIHZhcmlhbnQgb2YgYGJhc2U2NHNoYTI1NmAgdGhhdCBoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZmlsZSByYXRoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGViYXNlNjRzaGEyNTYocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZWJhc2U2NHNoYTI1NlwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZWJhc2U2NHNoYTUxMiBmaWxlYmFzZTY0c2hhNTEyfSBpcyBhIHZhcmlhbnQgb2YgYGJhc2U2NHNoYTUxMmAgdGhhdCBoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZmlsZSByYXRoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGViYXNlNjRzaGE1MTIocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZWJhc2U2NHNoYTUxMlwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZWV4aXN0cyBmaWxlZXhpc3RzfSBkZXRlcm1pbmVzIHdoZXRoZXIgYSBmaWxlIGV4aXN0cyBhdCBhIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBzdGF0aWMgZmlsZWV4aXN0cyhwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZWV4aXN0c1wiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZW1kNSBmaWxlbWQ1fSBpcyBhIHZhcmlhbnQgb2YgYG1kNWAgdGhhdCBoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZmlsZSByYXRoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGVtZDUocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZW1kNVwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZXNldCBmaWxlc2V0fSBlbnVtZXJhdGVzIGEgc2V0IG9mIHJlZ3VsYXIgZmlsZSBuYW1lcyBnaXZlbiBhIHBhdGggYW5kIHBhdHRlcm4uIFRoZSBwYXRoIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBmcm9tIHRoZSByZXN1bHRpbmcgc2V0IG9mIGZpbGUgbmFtZXMgYW5kIGFueSByZXN1bHQgc3RpbGwgY29udGFpbmluZyBwYXRoIHNlcGFyYXRvcnMgYWx3YXlzIHJldHVybnMgZm9yd2FyZCBzbGFzaCAoYC9gKSBhcyB0aGUgcGF0aCBzZXBhcmF0b3IgZm9yIGNyb3NzLXN5c3RlbSBjb21wYXRpYmlsaXR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuICAgKi9cbiAgc3RhdGljIGZpbGVzZXQocGF0aDogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNMaXN0KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJmaWxlc2V0XCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShwYXRoLCBwYXR0ZXJuKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2ZpbGVzaGExIGZpbGVzaGExfSBpcyBhIHZhcmlhbnQgb2YgYHNoYTFgIHRoYXQgaGFzaGVzIHRoZSBjb250ZW50cyBvZiBhIGdpdmVuIGZpbGUgcmF0aGVyIHRoYW4gYSBsaXRlcmFsIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHN0YXRpYyBmaWxlc2hhMShwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJmaWxlc2hhMVwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZXNoYTI1NiBmaWxlc2hhMjU2fSBpcyBhIHZhcmlhbnQgb2YgYHNoYTI1NmAgdGhhdCBoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZmlsZSByYXRoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGVzaGEyNTYocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZXNoYTI1NlwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmlsZXNoYTUxMiBmaWxlc2hhNTEyfSBpcyBhIHZhcmlhbnQgb2YgYHNoYTUxMmAgdGhhdCBoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZmlsZSByYXRoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgc3RhdGljIGZpbGVzaGE1MTIocGF0aDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmlsZXNoYTUxMlwiLCBbc3RyaW5nVmFsdWVdKShwYXRoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmxhdHRlbiBmbGF0dGVufSB0YWtlcyBhIGxpc3QgYW5kIHJlcGxhY2VzIGFueSBlbGVtZW50cyB0aGF0IGFyZSBsaXN0cyB3aXRoIGEgZmxhdHRlbmVkIHNlcXVlbmNlIG9mIHRoZSBsaXN0IGNvbnRlbnRzLlxuICAgKiBAcGFyYW0ge2FueX0gbGlzdFxuICAgKi9cbiAgc3RhdGljIGZsYXR0ZW4obGlzdDogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwiZmxhdHRlblwiLCBbYW55VmFsdWVdKShsaXN0KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZmxvb3IgZmxvb3J9IHJldHVybnMgdGhlIGNsb3Nlc3Qgd2hvbGUgbnVtYmVyIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiB2YWx1ZSwgd2hpY2ggbWF5IGJlIGEgZnJhY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1cbiAgICovXG4gIHN0YXRpYyBmbG9vcihudW06IG51bWJlcikge1xuICAgIHJldHVybiBhc051bWJlcih0ZXJyYWZvcm1GdW5jdGlvbihcImZsb29yXCIsIFtudW1lcmljVmFsdWVdKShudW0pKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvZm9ybWF0IGZvcm1hdH0gZnVuY3Rpb24gcHJvZHVjZXMgYSBzdHJpbmcgYnkgZm9ybWF0dGluZyBhIG51bWJlciBvZiBvdGhlciB2YWx1ZXMgYWNjb3JkaW5nIHRvIGEgc3BlY2lmaWNhdGlvbiBzdHJpbmcuIEl0IGlzIHNpbWlsYXIgdG8gdGhlIGBwcmludGZgIGZ1bmN0aW9uIGluIEMsIGFuZCBvdGhlciBzaW1pbGFyIGZ1bmN0aW9ucyBpbiBvdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXRcbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcmdzXG4gICAqL1xuICBzdGF0aWMgZm9ybWF0KGZvcm1hdDogc3RyaW5nLCBhcmdzOiBhbnlbXSkge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiZm9ybWF0XCIsIFtzdHJpbmdWYWx1ZSwgdmFyaWFkaWMoYW55VmFsdWUpXSkoXG4gICAgICAgIGZvcm1hdCxcbiAgICAgICAgYXJncyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9mb3JtYXRkYXRlIGZvcm1hdGRhdGV9IGNvbnZlcnRzIGEgdGltZXN0YW1wIGludG8gYSBkaWZmZXJlbnQgdGltZSBmb3JtYXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVcbiAgICovXG4gIHN0YXRpYyBmb3JtYXRkYXRlKGZvcm1hdDogc3RyaW5nLCB0aW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImZvcm1hdGRhdGVcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKGZvcm1hdCwgdGltZSksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9mb3JtYXRsaXN0IGZvcm1hdGxpc3R9IHByb2R1Y2VzIGEgbGlzdCBvZiBzdHJpbmdzIGJ5IGZvcm1hdHRpbmcgYSBudW1iZXIgb2Ygb3RoZXIgdmFsdWVzIGFjY29yZGluZyB0byBhIHNwZWNpZmljYXRpb24gc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0XG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYXJnc1xuICAgKi9cbiAgc3RhdGljIGZvcm1hdGxpc3QoZm9ybWF0OiBzdHJpbmcsIGFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIGFzTGlzdChcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiZm9ybWF0bGlzdFwiLCBbc3RyaW5nVmFsdWUsIHZhcmlhZGljKGFueVZhbHVlKV0pKFxuICAgICAgICBmb3JtYXQsXG4gICAgICAgIGFyZ3MsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvaW5kZW50IGluZGVudH0gYWRkcyBhIGdpdmVuIG51bWJlciBvZiBzcGFjZXMgdG8gdGhlIGJlZ2lubmluZ3Mgb2YgYWxsIGJ1dCB0aGUgZmlyc3QgbGluZSBpbiBhIGdpdmVuIG11bHRpLWxpbmUgc3RyaW5nLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc3BhY2VzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBpbmRlbnQoc3BhY2VzOiBudW1iZXIsIHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJpbmRlbnRcIiwgW251bWVyaWNWYWx1ZSwgc3RyaW5nVmFsdWVdKShzcGFjZXMsIHN0ciksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9pbmRleCBpbmRleH0gZmluZHMgdGhlIGVsZW1lbnQgaW5kZXggZm9yIGEgZ2l2ZW4gdmFsdWUgaW4gYSBsaXN0LlxuICAgKiBAcGFyYW0ge2FueX0gbGlzdFxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICovXG4gIHN0YXRpYyBpbmRleChsaXN0OiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJpbmRleFwiLCBbYW55VmFsdWUsIGFueVZhbHVlXSkobGlzdCwgdmFsdWUpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9pc3NlbnNpdGl2ZSBpc3NlbnNpdGl2ZX0gdGFrZXMgYSB2YWx1ZSBhbmQgcmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgdmFsdWUgaXMgc2Vuc2l0aXZlLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICovXG4gIHN0YXRpYyBpc3NlbnNpdGl2ZSh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIGFzQm9vbGVhbih0ZXJyYWZvcm1GdW5jdGlvbihcImlzc2Vuc2l0aXZlXCIsIFthbnlWYWx1ZV0pKHZhbHVlKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2pvaW4gam9pbn0gcHJvZHVjZXMgYSBzdHJpbmcgYnkgY29uY2F0ZW5hdGluZyB0b2dldGhlciBhbGwgZWxlbWVudHMgb2YgYSBnaXZlbiBsaXN0IG9mIHN0cmluZ3Mgd2l0aCB0aGUgZ2l2ZW4gZGVsaW1pdGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VwYXJhdG9yXG4gICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8c3RyaW5nPj59IGxpc3RzXG4gICAqL1xuICBzdGF0aWMgX2pvaW4oc2VwYXJhdG9yOiBzdHJpbmcsIGxpc3RzOiBzdHJpbmdbXVtdKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJqb2luXCIsIFtzdHJpbmdWYWx1ZSwgdmFyaWFkaWMobGlzdE9mKGFueVZhbHVlKSldKShcbiAgICAgICAgc2VwYXJhdG9yLFxuICAgICAgICBsaXN0cyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9qc29uZGVjb2RlIGpzb25kZWNvZGV9IGludGVycHJldHMgYSBnaXZlbiBzdHJpbmcgYXMgSlNPTiwgcmV0dXJuaW5nIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlc3VsdCBvZiBkZWNvZGluZyB0aGF0IHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIGpzb25kZWNvZGUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJqc29uZGVjb2RlXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2pzb25lbmNvZGUganNvbmVuY29kZX0gZW5jb2RlcyBhIGdpdmVuIHZhbHVlIHRvIGEgc3RyaW5nIHVzaW5nIEpTT04gc3ludGF4LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAqL1xuICBzdGF0aWMganNvbmVuY29kZSh2YWw6IGFueSkge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcImpzb25lbmNvZGVcIiwgW2FueVZhbHVlXSkodmFsKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMva2V5cyBrZXlzfSB0YWtlcyBhIG1hcCBhbmQgcmV0dXJucyBhIGxpc3QgY29udGFpbmluZyB0aGUga2V5cyBmcm9tIHRoYXQgbWFwLlxuICAgKiBAcGFyYW0ge2FueX0gaW5wdXRNYXBcbiAgICovXG4gIHN0YXRpYyBrZXlzKGlucHV0TWFwOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJrZXlzXCIsIFthbnlWYWx1ZV0pKGlucHV0TWFwKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvbGVuZ3RoIGxlbmd0aH0gZGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIG9mIGEgZ2l2ZW4gbGlzdCwgbWFwLCBvciBzdHJpbmcuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIGxlbmd0aE9mKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gYXNOdW1iZXIodGVycmFmb3JtRnVuY3Rpb24oXCJsZW5ndGhcIiwgW2FueVZhbHVlXSkodmFsdWUpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9sb2cgbG9nfSByZXR1cm5zIHRoZSBsb2dhcml0aG0gb2YgYSBnaXZlbiBudW1iZXIgaW4gYSBnaXZlbiBiYXNlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBiYXNlXG4gICAqL1xuICBzdGF0aWMgbG9nKG51bTogbnVtYmVyLCBiYXNlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXNOdW1iZXIoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImxvZ1wiLCBbbnVtZXJpY1ZhbHVlLCBudW1lcmljVmFsdWVdKShudW0sIGJhc2UpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2xvb2t1cCBsb29rdXB9IHJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgZWxlbWVudCBmcm9tIGEgbWFwLCBnaXZlbiBpdHMga2V5LiBJZiB0aGUgZ2l2ZW4ga2V5IGRvZXMgbm90IGV4aXN0LCB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBpcyByZXR1cm5lZCBpbnN0ZWFkLlxuICAgKiBAcGFyYW0ge2FueX0gaW5wdXRNYXBcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IGRlZmF1bHRWYWx1ZVxuICAgKi9cbiAgc3RhdGljIF9sb29rdXAoaW5wdXRNYXA6IGFueSwga2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogYW55W10pIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcImxvb2t1cFwiLCBbYW55VmFsdWUsIHN0cmluZ1ZhbHVlLCB2YXJpYWRpYyhhbnlWYWx1ZSldKShcbiAgICAgICAgaW5wdXRNYXAsXG4gICAgICAgIGtleSxcbiAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL2xvd2VyIGxvd2VyfSBjb252ZXJ0cyBhbGwgY2FzZWQgbGV0dGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIHRvIGxvd2VyY2FzZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIGxvd2VyKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwibG93ZXJcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvbWF0Y2hrZXlzIG1hdGNoa2V5c30gY29uc3RydWN0cyBhIG5ldyBsaXN0IGJ5IHRha2luZyBhIHN1YnNldCBvZiBlbGVtZW50cyBmcm9tIG9uZSBsaXN0IHdob3NlIGluZGV4ZXMgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXhlcyBvZiB2YWx1ZXMgaW4gYW5vdGhlciBsaXN0LlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IHZhbHVlc1xuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IGtleXNcbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBzZWFyY2hzZXRcbiAgICovXG4gIHN0YXRpYyBtYXRjaGtleXModmFsdWVzOiBhbnlbXSwga2V5czogYW55W10sIHNlYXJjaHNldDogYW55W10pIHtcbiAgICByZXR1cm4gYXNMaXN0KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJtYXRjaGtleXNcIiwgW1xuICAgICAgICBsaXN0T2YoYW55VmFsdWUpLFxuICAgICAgICBsaXN0T2YoYW55VmFsdWUpLFxuICAgICAgICBsaXN0T2YoYW55VmFsdWUpLFxuICAgICAgXSkodmFsdWVzLCBrZXlzLCBzZWFyY2hzZXQpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvbWF4IG1heH0gdGFrZXMgb25lIG9yIG1vcmUgbnVtYmVycyBhbmQgcmV0dXJucyB0aGUgZ3JlYXRlc3QgbnVtYmVyIGZyb20gdGhlIHNldC5cbiAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBudW1iZXJzXG4gICAqL1xuICBzdGF0aWMgbWF4KG51bWJlcnM6IG51bWJlcltdKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJtYXhcIiwgW3ZhcmlhZGljKG51bWVyaWNWYWx1ZSldKShudW1iZXJzKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL21kNSBtZDV9IGNvbXB1dGVzIHRoZSBNRDUgaGFzaCBvZiBhIGdpdmVuIHN0cmluZyBhbmQgZW5jb2RlcyBpdCB3aXRoIGhleGFkZWNpbWFsIGRpZ2l0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIG1kNShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcIm1kNVwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9tZXJnZSBtZXJnZX0gdGFrZXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBtYXBzIG9yIG9iamVjdHMsIGFuZCByZXR1cm5zIGEgc2luZ2xlIG1hcCBvciBvYmplY3QgdGhhdCBjb250YWlucyBhIG1lcmdlZCBzZXQgb2YgZWxlbWVudHMgZnJvbSBhbGwgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IG1hcHNcbiAgICovXG4gIHN0YXRpYyBtZXJnZShtYXBzOiBhbnlbXSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcIm1lcmdlXCIsIFt2YXJpYWRpYyhhbnlWYWx1ZSldKShtYXBzKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvbWluIG1pbn0gdGFrZXMgb25lIG9yIG1vcmUgbnVtYmVycyBhbmQgcmV0dXJucyB0aGUgc21hbGxlc3QgbnVtYmVyIGZyb20gdGhlIHNldC5cbiAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBudW1iZXJzXG4gICAqL1xuICBzdGF0aWMgbWluKG51bWJlcnM6IG51bWJlcltdKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJtaW5cIiwgW3ZhcmlhZGljKG51bWVyaWNWYWx1ZSldKShudW1iZXJzKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL25vbnNlbnNpdGl2ZSBub25zZW5zaXRpdmV9IHRha2VzIGEgc2Vuc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIGEgY29weSBvZiB0aGF0IHZhbHVlIHdpdGggdGhlIHNlbnNpdGl2ZSBtYXJraW5nIHJlbW92ZWQsIHRoZXJlYnkgZXhwb3NpbmcgdGhlIHNlbnNpdGl2ZSB2YWx1ZS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqL1xuICBzdGF0aWMgbm9uc2Vuc2l0aXZlKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJub25zZW5zaXRpdmVcIiwgW2FueVZhbHVlXSkodmFsdWUpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9vbmUgb25lfSB0YWtlcyBhIGxpc3QsIHNldCwgb3IgdHVwbGUgdmFsdWUgd2l0aCBlaXRoZXIgemVybyBvciBvbmUgZWxlbWVudHMuIElmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LCBgb25lYCByZXR1cm5zIGBudWxsYC4gT3RoZXJ3aXNlLCBgb25lYCByZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50LiBJZiB0aGVyZSBhcmUgdHdvIG9yIG1vcmUgZWxlbWVudHMgdGhlbiBgb25lYCB3aWxsIHJldHVybiBhbiBlcnJvci5cbiAgICogQHBhcmFtIHthbnl9IGxpc3RcbiAgICovXG4gIHN0YXRpYyBvbmUobGlzdDogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwib25lXCIsIFthbnlWYWx1ZV0pKGxpc3QpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9wYXJzZWludCBwYXJzZWludH0gcGFyc2VzIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIGluIHRoZSBzcGVjaWZpZWQgYmFzZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIG51bWJlci4gVGhlIGJhc2UgbXVzdCBiZSBiZXR3ZWVuIDIgYW5kIDYyIGluY2x1c2l2ZS5cbiAgICogQHBhcmFtIHthbnl9IG51bWJlclxuICAgKiBAcGFyYW0ge251bWJlcn0gYmFzZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlaW50KG51bWJlcjogYW55LCBiYXNlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInBhcnNlaW50XCIsIFthbnlWYWx1ZSwgbnVtZXJpY1ZhbHVlXSkobnVtYmVyLCBiYXNlKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3BhdGhleHBhbmQgcGF0aGV4cGFuZH0gdGFrZXMgYSBmaWxlc3lzdGVtIHBhdGggdGhhdCBtaWdodCBiZWdpbiB3aXRoIGEgYH5gIHNlZ21lbnQsIGFuZCBpZiBzbyBpdCByZXBsYWNlcyB0aGF0IHNlZ21lbnQgd2l0aCB0aGUgY3VycmVudCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHN0YXRpYyBwYXRoZXhwYW5kKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInBhdGhleHBhbmRcIiwgW3N0cmluZ1ZhbHVlXSkocGF0aCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3BsYW50aW1lc3RhbXAgcGxhbnRpbWVzdGFtcH0gcmV0dXJucyBhIFVUQyB0aW1lc3RhbXAgc3RyaW5nIGluIFtSRkMgMzMzOV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzMzMzkpIGZvcm1hdCwgZml4ZWQgdG8gYSBjb25zdGFudCB0aW1lIHJlcHJlc2VudGluZyB0aGUgdGltZSBvZiB0aGUgcGxhbi5cbiAgICovXG4gIHN0YXRpYyBwbGFudGltZXN0YW1wKCkge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInBsYW50aW1lc3RhbXBcIiwgW10pKCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3BvdyBwb3d9IGNhbGN1bGF0ZXMgYW4gZXhwb25lbnQsIGJ5IHJhaXNpbmcgaXRzIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBwb3dlciBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwb3dlclxuICAgKi9cbiAgc3RhdGljIHBvdyhudW06IG51bWJlciwgcG93ZXI6IG51bWJlcikge1xuICAgIHJldHVybiBhc051bWJlcihcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwicG93XCIsIFtudW1lcmljVmFsdWUsIG51bWVyaWNWYWx1ZV0pKG51bSwgcG93ZXIpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3JhbmdlIHJhbmdlfSBnZW5lcmF0ZXMgYSBsaXN0IG9mIG51bWJlcnMgdXNpbmcgYSBzdGFydCB2YWx1ZSwgYSBsaW1pdCB2YWx1ZSwgYW5kIGEgc3RlcCB2YWx1ZS5cbiAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBwYXJhbXNcbiAgICovXG4gIHN0YXRpYyBfcmFuZ2UocGFyYW1zOiBudW1iZXJbXSkge1xuICAgIHJldHVybiBhc0xpc3QodGVycmFmb3JtRnVuY3Rpb24oXCJyYW5nZVwiLCBbdmFyaWFkaWMobnVtZXJpY1ZhbHVlKV0pKHBhcmFtcykpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3JlZ2V4IHJlZ2V4fSBhcHBsaWVzIGEgW3JlZ3VsYXIgZXhwcmVzc2lvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUmVndWxhcl9leHByZXNzaW9uKSB0byBhIHN0cmluZyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgc3Vic3RyaW5ncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHJlZ2V4KHBhdHRlcm46IHN0cmluZywgc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInJlZ2V4XCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShwYXR0ZXJuLCBzdHIpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvcmVnZXhhbGwgcmVnZXhhbGx9IGFwcGxpZXMgYSBbcmVndWxhciBleHByZXNzaW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SZWd1bGFyX2V4cHJlc3Npb24pIHRvIGEgc3RyaW5nIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgbWF0Y2hlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHJlZ2V4YWxsKHBhdHRlcm46IHN0cmluZywgc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNMaXN0KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJyZWdleGFsbFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkocGF0dGVybiwgc3RyKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3JlcGxhY2UgcmVwbGFjZX0gc2VhcmNoZXMgYSBnaXZlbiBzdHJpbmcgZm9yIGFub3RoZXIgZ2l2ZW4gc3Vic3RyaW5nLCBhbmQgcmVwbGFjZXMgZWFjaCBvY2N1cnJlbmNlIHdpdGggYSBnaXZlbiByZXBsYWNlbWVudCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVwbGFjZVxuICAgKi9cbiAgc3RhdGljIHJlcGxhY2Uoc3RyOiBzdHJpbmcsIHN1YnN0cjogc3RyaW5nLCByZXBsYWNlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInJlcGxhY2VcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShcbiAgICAgICAgc3RyLFxuICAgICAgICBzdWJzdHIsXG4gICAgICAgIHJlcGxhY2UsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvcmV2ZXJzZSByZXZlcnNlfSB0YWtlcyBhIHNlcXVlbmNlIGFuZCBwcm9kdWNlcyBhIG5ldyBzZXF1ZW5jZSBvZiB0aGUgc2FtZSBsZW5ndGggd2l0aCBhbGwgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXMgdGhlIGdpdmVuIHNlcXVlbmNlIGJ1dCBpbiByZXZlcnNlIG9yZGVyLlxuICAgKiBAcGFyYW0ge2FueX0gbGlzdFxuICAgKi9cbiAgc3RhdGljIHJldmVyc2UobGlzdDogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwicmV2ZXJzZVwiLCBbYW55VmFsdWVdKShsaXN0KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvcnNhZGVjcnlwdCByc2FkZWNyeXB0fSBkZWNyeXB0cyBhbiBSU0EtZW5jcnlwdGVkIGNpcGhlcnRleHQsIHJldHVybmluZyB0aGUgY29ycmVzcG9uZGluZyBjbGVhcnRleHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaXBoZXJ0ZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRla2V5XG4gICAqL1xuICBzdGF0aWMgcnNhZGVjcnlwdChjaXBoZXJ0ZXh0OiBzdHJpbmcsIHByaXZhdGVrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwicnNhZGVjcnlwdFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoXG4gICAgICAgIGNpcGhlcnRleHQsXG4gICAgICAgIHByaXZhdGVrZXksXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc2Vuc2l0aXZlIHNlbnNpdGl2ZX0gdGFrZXMgYW55IHZhbHVlIGFuZCByZXR1cm5zIGEgY29weSBvZiBpdCBtYXJrZWQgc28gdGhhdCBUZXJyYWZvcm0gd2lsbCB0cmVhdCBpdCBhcyBzZW5zaXRpdmUsIHdpdGggdGhlIHNhbWUgbWVhbmluZyBhbmQgYmVoYXZpb3IgYXMgZm9yIFtzZW5zaXRpdmUgaW5wdXQgdmFyaWFibGVzXSgvdGVycmFmb3JtL2xhbmd1YWdlL3ZhbHVlcy92YXJpYWJsZXMjc3VwcHJlc3NpbmctdmFsdWVzLWluLWNsaS1vdXRwdXQpLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICovXG4gIHN0YXRpYyBzZW5zaXRpdmUodmFsdWU6IGFueSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcInNlbnNpdGl2ZVwiLCBbYW55VmFsdWVdKSh2YWx1ZSkpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zZXRpbnRlcnNlY3Rpb24gc2V0aW50ZXJzZWN0aW9ufSBmdW5jdGlvbiB0YWtlcyBtdWx0aXBsZSBzZXRzIGFuZCBwcm9kdWNlcyBhIHNpbmdsZSBzZXQgY29udGFpbmluZyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IGFsbCBvZiB0aGUgZ2l2ZW4gc2V0cyBoYXZlIGluIGNvbW1vbi4gSW4gb3RoZXIgd29yZHMsIGl0IGNvbXB1dGVzIHRoZSBbaW50ZXJzZWN0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbnRlcnNlY3Rpb25fXFwoc2V0X3RoZW9yeVxcKSkgb2YgdGhlIHNldHMuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gZmlyc3Rfc2V0XG4gICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8YW55Pj59IG90aGVyX3NldHNcbiAgICovXG4gIHN0YXRpYyBzZXRpbnRlcnNlY3Rpb24oZmlyc3Rfc2V0OiBhbnlbXSwgb3RoZXJfc2V0czogYW55W11bXSkge1xuICAgIHJldHVybiBhc0xpc3QoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInNldGludGVyc2VjdGlvblwiLCBbXG4gICAgICAgIGxpc3RPZihhbnlWYWx1ZSksXG4gICAgICAgIHZhcmlhZGljKGxpc3RPZihhbnlWYWx1ZSkpLFxuICAgICAgXSkoZmlyc3Rfc2V0LCBvdGhlcl9zZXRzKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zZXRwcm9kdWN0IHNldHByb2R1Y3R9IGZ1bmN0aW9uIGZpbmRzIGFsbCBvZiB0aGUgcG9zc2libGUgY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIGZyb20gYWxsIG9mIHRoZSBnaXZlbiBzZXRzIGJ5IGNvbXB1dGluZyB0aGUgW0NhcnRlc2lhbiBwcm9kdWN0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYXJ0ZXNpYW5fcHJvZHVjdCkuXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gc2V0c1xuICAgKi9cbiAgc3RhdGljIHNldHByb2R1Y3Qoc2V0czogYW55W10pIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJzZXRwcm9kdWN0XCIsIFt2YXJpYWRpYyhhbnlWYWx1ZSldKShzZXRzKSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NldHN1YnRyYWN0IHNldHN1YnRyYWN0fSBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IHNldCBjb250YWluaW5nIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBmaXJzdCBzZXQgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIHNlY29uZCBzZXQuIEluIG90aGVyIHdvcmRzLCBpdCBjb21wdXRlcyB0aGUgW3JlbGF0aXZlIGNvbXBsZW1lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbXBsZW1lbnRfXFwoc2V0X3RoZW9yeVxcKSNSZWxhdGl2ZV9jb21wbGVtZW50KSBvZiB0aGUgc2Vjb25kIHNldC5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBhXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYlxuICAgKi9cbiAgc3RhdGljIHNldHN1YnRyYWN0KGE6IGFueVtdLCBiOiBhbnlbXSkge1xuICAgIHJldHVybiBhc0xpc3QoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInNldHN1YnRyYWN0XCIsIFtsaXN0T2YoYW55VmFsdWUpLCBsaXN0T2YoYW55VmFsdWUpXSkoXG4gICAgICAgIGEsXG4gICAgICAgIGIsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NldHVuaW9uIHNldHVuaW9ufSBmdW5jdGlvbiB0YWtlcyBtdWx0aXBsZSBzZXRzIGFuZCBwcm9kdWNlcyBhIHNpbmdsZSBzZXQgY29udGFpbmluZyB0aGUgZWxlbWVudHMgZnJvbSBhbGwgb2YgdGhlIGdpdmVuIHNldHMuIEluIG90aGVyIHdvcmRzLCBpdCBjb21wdXRlcyB0aGUgW3VuaW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbmlvbl9cXChzZXRfdGhlb3J5XFwpKSBvZiB0aGUgc2V0cy5cbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBmaXJzdF9zZXRcbiAgICogQHBhcmFtIHtBcnJheTxBcnJheTxhbnk+Pn0gb3RoZXJfc2V0c1xuICAgKi9cbiAgc3RhdGljIHNldHVuaW9uKGZpcnN0X3NldDogYW55W10sIG90aGVyX3NldHM6IGFueVtdW10pIHtcbiAgICByZXR1cm4gYXNMaXN0KFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJzZXR1bmlvblwiLCBbXG4gICAgICAgIGxpc3RPZihhbnlWYWx1ZSksXG4gICAgICAgIHZhcmlhZGljKGxpc3RPZihhbnlWYWx1ZSkpLFxuICAgICAgXSkoZmlyc3Rfc2V0LCBvdGhlcl9zZXRzKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NoYTEgc2hhMX0gY29tcHV0ZXMgdGhlIFNIQTEgaGFzaCBvZiBhIGdpdmVuIHN0cmluZyBhbmQgZW5jb2RlcyBpdCB3aXRoIGhleGFkZWNpbWFsIGRpZ2l0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHNoYTEoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJzaGExXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NoYTI1NiBzaGEyNTZ9IGNvbXB1dGVzIHRoZSBTSEEyNTYgaGFzaCBvZiBhIGdpdmVuIHN0cmluZyBhbmQgZW5jb2RlcyBpdCB3aXRoIGhleGFkZWNpbWFsIGRpZ2l0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHNoYTI1NihzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInNoYTI1NlwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zaGE1MTIgc2hhNTEyfSBjb21wdXRlcyB0aGUgU0hBNTEyIGhhc2ggb2YgYSBnaXZlbiBzdHJpbmcgYW5kIGVuY29kZXMgaXQgd2l0aCBoZXhhZGVjaW1hbCBkaWdpdHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBzaGE1MTIoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJzaGE1MTJcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc2lnbnVtIHNpZ251bX0gZGV0ZXJtaW5lcyB0aGUgc2lnbiBvZiBhIG51bWJlciwgcmV0dXJuaW5nIGEgbnVtYmVyIGJldHdlZW4gLTEgYW5kIDEgdG8gcmVwcmVzZW50IHRoZSBzaWduLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtXG4gICAqL1xuICBzdGF0aWMgc2lnbnVtKG51bTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKHRlcnJhZm9ybUZ1bmN0aW9uKFwic2lnbnVtXCIsIFtudW1lcmljVmFsdWVdKShudW0pKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zbGljZSBzbGljZX0gZXh0cmFjdHMgc29tZSBjb25zZWN1dGl2ZSBlbGVtZW50cyBmcm9tIHdpdGhpbiBhIGxpc3QuXG4gICAqIEBwYXJhbSB7YW55fSBsaXN0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydF9pbmRleFxuICAgKiBAcGFyYW0ge251bWJlcn0gZW5kX2luZGV4XG4gICAqL1xuICBzdGF0aWMgc2xpY2UobGlzdDogYW55LCBzdGFydF9pbmRleDogbnVtYmVyLCBlbmRfaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBhc0FueShcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwic2xpY2VcIiwgW2FueVZhbHVlLCBudW1lcmljVmFsdWUsIG51bWVyaWNWYWx1ZV0pKFxuICAgICAgICBsaXN0LFxuICAgICAgICBzdGFydF9pbmRleCxcbiAgICAgICAgZW5kX2luZGV4LFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3NvcnQgc29ydH0gdGFrZXMgYSBsaXN0IG9mIHN0cmluZ3MgYW5kIHJldHVybnMgYSBuZXcgbGlzdCB3aXRoIHRob3NlIHN0cmluZ3Mgc29ydGVkIGxleGljb2dyYXBoaWNhbGx5LlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGxpc3RcbiAgICovXG4gIHN0YXRpYyBzb3J0KGxpc3Q6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIGFzTGlzdCh0ZXJyYWZvcm1GdW5jdGlvbihcInNvcnRcIiwgW2xpc3RPZihhbnlWYWx1ZSldKShsaXN0KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc3BsaXQgc3BsaXR9IHByb2R1Y2VzIGEgbGlzdCBieSBkaXZpZGluZyBhIGdpdmVuIHN0cmluZyBhdCBhbGwgb2NjdXJyZW5jZXMgb2YgYSBnaXZlbiBzZXBhcmF0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXBhcmF0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHNwbGl0KHNlcGFyYXRvcjogc3RyaW5nLCBzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc0xpc3QoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInNwbGl0XCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShzZXBhcmF0b3IsIHN0ciksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zdGFydHN3aXRoIHN0YXJ0c3dpdGh9IHRha2VzIHR3byB2YWx1ZXM6IGEgc3RyaW5nIHRvIGNoZWNrIGFuZCBhIHByZWZpeCBzdHJpbmcuIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBiZWdpbnMgd2l0aCB0aGF0IGV4YWN0IHByZWZpeC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqL1xuICBzdGF0aWMgc3RhcnRzd2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJzdGFydHN3aXRoXCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShzdHIsIHByZWZpeCksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zdHJjb250YWlucyBzdHJjb250YWluc30gdGFrZXMgdHdvIHZhbHVlczogYSBzdHJpbmcgdG8gY2hlY2sgYW5kIGFuIGV4cGVjdGVkIHN1YnN0cmluZy4gVGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIGhhcyB0aGUgc3Vic3RyaW5nIGNvbnRhaW5lZCB3aXRoaW4gaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnN0clxuICAgKi9cbiAgc3RhdGljIHN0cmNvbnRhaW5zKHN0cjogc3RyaW5nLCBzdWJzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc0Jvb2xlYW4oXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInN0cmNvbnRhaW5zXCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShzdHIsIHN1YnN0ciksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy9zdHJyZXYgc3RycmV2fSByZXZlcnNlcyB0aGUgY2hhcmFjdGVycyBpbiBhIHN0cmluZy4gTm90ZSB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGFzIF9Vbmljb2RlIGNoYXJhY3RlcnNfIChpbiB0ZWNobmljYWwgdGVybXMsIFVuaWNvZGUgW2dyYXBoZW1lIGNsdXN0ZXIgYm91bmRhcmllc10oaHR0cHM6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyMjkvI0dyYXBoZW1lX0NsdXN0ZXJfQm91bmRhcmllcykgYXJlIHJlc3BlY3RlZCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyBzdHJyZXYoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJzdHJyZXZcIiwgW3N0cmluZ1ZhbHVlXSkoc3RyKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc3Vic3RyIHN1YnN0cn0gZXh0cmFjdHMgYSBzdWJzdHJpbmcgZnJvbSBhIGdpdmVuIHN0cmluZyBieSBvZmZzZXQgYW5kIChtYXhpbXVtKSBsZW5ndGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gICAqL1xuICBzdGF0aWMgc3Vic3RyKHN0cjogc3RyaW5nLCBvZmZzZXQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInN1YnN0clwiLCBbc3RyaW5nVmFsdWUsIG51bWVyaWNWYWx1ZSwgbnVtZXJpY1ZhbHVlXSkoXG4gICAgICAgIHN0cixcbiAgICAgICAgb2Zmc2V0LFxuICAgICAgICBsZW5ndGgsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvc3VtIHN1bX0gdGFrZXMgYSBsaXN0IG9yIHNldCBvZiBudW1iZXJzIGFuZCByZXR1cm5zIHRoZSBzdW0gb2YgdGhvc2UgbnVtYmVycy5cbiAgICogQHBhcmFtIHthbnl9IGxpc3RcbiAgICovXG4gIHN0YXRpYyBzdW0obGlzdDogYW55KSB7XG4gICAgcmV0dXJuIGFzQW55KHRlcnJhZm9ybUZ1bmN0aW9uKFwic3VtXCIsIFthbnlWYWx1ZV0pKGxpc3QpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90ZW1wbGF0ZWZpbGUgdGVtcGxhdGVmaWxlfSByZWFkcyB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gcGF0aCBhbmQgcmVuZGVycyBpdHMgY29udGVudCBhcyBhIHRlbXBsYXRlIHVzaW5nIGEgc3VwcGxpZWQgc2V0IG9mIHRlbXBsYXRlIHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHthbnl9IHZhcnNcbiAgICovXG4gIHN0YXRpYyB0ZW1wbGF0ZWZpbGUocGF0aDogc3RyaW5nLCB2YXJzOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInRlbXBsYXRlZmlsZVwiLCBbc3RyaW5nVmFsdWUsIGFueVZhbHVlXSkocGF0aCwgdmFycyksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90ZW1wbGF0ZXN0cmluZyB0ZW1wbGF0ZXN0cmluZ30gdGFrZXMgYSBzdHJpbmcgZnJvbSBlbHNld2hlcmUgaW4gdGhlIG1vZHVsZSBhbmQgcmVuZGVycyBpdHMgY29udGVudCBhcyBhIHRlbXBsYXRlIHVzaW5nIGEgc3VwcGxpZWQgc2V0IG9mIHRlbXBsYXRlIHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlXG4gICAqIEBwYXJhbSB7YW55fSB2YXJzXG4gICAqL1xuICBzdGF0aWMgdGVtcGxhdGVzdHJpbmcodGVtcGxhdGU6IHN0cmluZywgdmFyczogYW55KSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJ0ZW1wbGF0ZXN0cmluZ1wiLCBbc3RyaW5nVmFsdWUsIGFueVZhbHVlXSkoXG4gICAgICAgIHRlbXBsYXRlLFxuICAgICAgICB2YXJzLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RleHRkZWNvZGViYXNlNjQgdGV4dGRlY29kZWJhc2U2NH0gZnVuY3Rpb24gZGVjb2RlcyBhIHN0cmluZyB0aGF0IHdhcyBwcmV2aW91c2x5IEJhc2U2NC1lbmNvZGVkLCBhbmQgdGhlbiBpbnRlcnByZXRzIHRoZSByZXN1bHQgYXMgY2hhcmFjdGVycyBpbiBhIHNwZWNpZmllZCBjaGFyYWN0ZXIgZW5jb2RpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nXG4gICAqL1xuICBzdGF0aWMgdGV4dGRlY29kZWJhc2U2NChzb3VyY2U6IHN0cmluZywgZW5jb2Rpbmc6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwidGV4dGRlY29kZWJhc2U2NFwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgZW5jb2RpbmcsXG4gICAgICApLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdGV4dGVuY29kZWJhc2U2NCB0ZXh0ZW5jb2RlYmFzZTY0fSBlbmNvZGVzIHRoZSB1bmljb2RlIGNoYXJhY3RlcnMgaW4gYSBnaXZlbiBzdHJpbmcgdXNpbmcgYSBzcGVjaWZpZWQgY2hhcmFjdGVyIGVuY29kaW5nLCByZXR1cm5pbmcgdGhlIHJlc3VsdCBiYXNlNjQgZW5jb2RlZCBiZWNhdXNlIFRlcnJhZm9ybSBsYW5ndWFnZSBzdHJpbmdzIGFyZSBhbHdheXMgc2VxdWVuY2VzIG9mIHVuaWNvZGUgY2hhcmFjdGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAgICovXG4gIHN0YXRpYyB0ZXh0ZW5jb2RlYmFzZTY0KHN0cjogc3RyaW5nLCBlbmNvZGluZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJ0ZXh0ZW5jb2RlYmFzZTY0XCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShcbiAgICAgICAgc3RyLFxuICAgICAgICBlbmNvZGluZyxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90aW1lYWRkIHRpbWVhZGR9IGFkZHMgYSBkdXJhdGlvbiB0byBhIHRpbWVzdGFtcCwgcmV0dXJuaW5nIGEgbmV3IHRpbWVzdGFtcC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVzdGFtcFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZHVyYXRpb25cbiAgICovXG4gIHN0YXRpYyB0aW1lYWRkKHRpbWVzdGFtcDogc3RyaW5nLCBkdXJhdGlvbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJ0aW1lYWRkXCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShcbiAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90aW1lY21wIHRpbWVjbXB9IGNvbXBhcmVzIHR3byB0aW1lc3RhbXBzIGFuZCByZXR1cm5zIGEgbnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgb3JkZXJpbmcgb2YgdGhlIGluc3RhbnRzIHRob3NlIHRpbWVzdGFtcHMgcmVwcmVzZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZXN0YW1wX2FcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVzdGFtcF9iXG4gICAqL1xuICBzdGF0aWMgdGltZWNtcCh0aW1lc3RhbXBfYTogc3RyaW5nLCB0aW1lc3RhbXBfYjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyKFxuICAgICAgdGVycmFmb3JtRnVuY3Rpb24oXCJ0aW1lY21wXCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShcbiAgICAgICAgdGltZXN0YW1wX2EsXG4gICAgICAgIHRpbWVzdGFtcF9iLFxuICAgICAgKSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RpbWVzdGFtcCB0aW1lc3RhbXB9IHJldHVybnMgYSBVVEMgdGltZXN0YW1wIHN0cmluZyBpbiBbUkZDIDMzMzldKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMzM5KSBmb3JtYXQuXG4gICAqL1xuICBzdGF0aWMgdGltZXN0YW1wKCkge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInRpbWVzdGFtcFwiLCBbXSkoKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdGl0bGUgdGl0bGV9IGNvbnZlcnRzIHRoZSBmaXJzdCBsZXR0ZXIgb2YgZWFjaCB3b3JkIGluIHRoZSBnaXZlbiBzdHJpbmcgdG8gdXBwZXJjYXNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgdGl0bGUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJ0aXRsZVwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90b2Jvb2wgdG9ib29sfSBjb252ZXJ0cyBpdHMgYXJndW1lbnQgdG8gYSBib29sZWFuIHZhbHVlLlxuICAgKiBAcGFyYW0ge2FueX0gdlxuICAgKi9cbiAgc3RhdGljIHRvYm9vbCh2OiBhbnkpIHtcbiAgICByZXR1cm4gYXNCb29sZWFuKHRlcnJhZm9ybUZ1bmN0aW9uKFwidG9ib29sXCIsIFthbnlWYWx1ZV0pKHYpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90b2xpc3QgdG9saXN0fSBjb252ZXJ0cyBpdHMgYXJndW1lbnQgdG8gYSBsaXN0IHZhbHVlLlxuICAgKiBAcGFyYW0ge2FueX0gdlxuICAgKi9cbiAgc3RhdGljIHRvbGlzdCh2OiBhbnkpIHtcbiAgICByZXR1cm4gYXNMaXN0KHRlcnJhZm9ybUZ1bmN0aW9uKFwidG9saXN0XCIsIFthbnlWYWx1ZV0pKHYpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90b21hcCB0b21hcH0gY29udmVydHMgaXRzIGFyZ3VtZW50IHRvIGEgbWFwIHZhbHVlLlxuICAgKiBAcGFyYW0ge2FueX0gdlxuICAgKi9cbiAgc3RhdGljIHRvbWFwKHY6IGFueSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcInRvbWFwXCIsIFthbnlWYWx1ZV0pKHYpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90b251bWJlciB0b251bWJlcn0gY29udmVydHMgaXRzIGFyZ3VtZW50IHRvIGEgbnVtYmVyIHZhbHVlLlxuICAgKiBAcGFyYW0ge2FueX0gdlxuICAgKi9cbiAgc3RhdGljIHRvbnVtYmVyKHY6IGFueSkge1xuICAgIHJldHVybiBhc051bWJlcih0ZXJyYWZvcm1GdW5jdGlvbihcInRvbnVtYmVyXCIsIFthbnlWYWx1ZV0pKHYpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy90b3NldCB0b3NldH0gY29udmVydHMgaXRzIGFyZ3VtZW50IHRvIGEgc2V0IHZhbHVlLlxuICAgKiBAcGFyYW0ge2FueX0gdlxuICAgKi9cbiAgc3RhdGljIHRvc2V0KHY6IGFueSkge1xuICAgIHJldHVybiBhc0xpc3QodGVycmFmb3JtRnVuY3Rpb24oXCJ0b3NldFwiLCBbYW55VmFsdWVdKSh2KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdG9zdHJpbmcgdG9zdHJpbmd9IGNvbnZlcnRzIGl0cyBhcmd1bWVudCB0byBhIHN0cmluZyB2YWx1ZS5cbiAgICogQHBhcmFtIHthbnl9IHZcbiAgICovXG4gIHN0YXRpYyB0b3N0cmluZyh2OiBhbnkpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJ0b3N0cmluZ1wiLCBbYW55VmFsdWVdKSh2KSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdHJhbnNwb3NlIHRyYW5zcG9zZX0gdGFrZXMgYSBtYXAgb2YgbGlzdHMgb2Ygc3RyaW5ncyBhbmQgc3dhcHMgdGhlIGtleXMgYW5kIHZhbHVlcyB0byBwcm9kdWNlIGEgbmV3IG1hcCBvZiBsaXN0cyBvZiBzdHJpbmdzLlxuICAgKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIEFycmF5PHN0cmluZz4+fSB2YWx1ZXNcbiAgICovXG4gIHN0YXRpYyB0cmFuc3Bvc2UodmFsdWVzOiBhbnkpIHtcbiAgICByZXR1cm4gYXNBbnkodGVycmFmb3JtRnVuY3Rpb24oXCJ0cmFuc3Bvc2VcIiwgW21hcFZhbHVlXSkodmFsdWVzKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdHJpbSB0cmltfSByZW1vdmVzIHRoZSBzcGVjaWZpZWQgc2V0IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXRzZXRcbiAgICovXG4gIHN0YXRpYyB0cmltKHN0cjogc3RyaW5nLCBjdXRzZXQ6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwidHJpbVwiLCBbc3RyaW5nVmFsdWUsIHN0cmluZ1ZhbHVlXSkoc3RyLCBjdXRzZXQpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdHJpbXByZWZpeCB0cmltcHJlZml4fSByZW1vdmVzIHRoZSBzcGVjaWZpZWQgcHJlZml4IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBnaXZlbiBzdHJpbmcuIElmIHRoZSBzdHJpbmcgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgcHJlZml4LCB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqL1xuICBzdGF0aWMgdHJpbXByZWZpeChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInRyaW1wcmVmaXhcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKHN0ciwgcHJlZml4KSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RyaW1zcGFjZSB0cmltc3BhY2V9IHJlbW92ZXMgYW55IHNwYWNlIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZ2l2ZW4gc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqL1xuICBzdGF0aWMgdHJpbXNwYWNlKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzU3RyaW5nKHRlcnJhZm9ybUZ1bmN0aW9uKFwidHJpbXNwYWNlXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RyaW1zdWZmaXggdHJpbXN1ZmZpeH0gcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHN1ZmZpeCBmcm9tIHRoZSBlbmQgb2YgdGhlIGdpdmVuIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqL1xuICBzdGF0aWMgdHJpbXN1ZmZpeChzdHI6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcoXG4gICAgICB0ZXJyYWZvcm1GdW5jdGlvbihcInRyaW1zdWZmaXhcIiwgW3N0cmluZ1ZhbHVlLCBzdHJpbmdWYWx1ZV0pKHN0ciwgc3VmZml4KSxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3RyeSB0cnl9IGV2YWx1YXRlcyBhbGwgb2YgaXRzIGFyZ3VtZW50IGV4cHJlc3Npb25zIGluIHR1cm4gYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgZmlyc3Qgb25lIHRoYXQgZG9lcyBub3QgcHJvZHVjZSBhbnkgZXJyb3JzLlxuICAgKiBAcGFyYW0ge0FycmF5PGFueT59IGV4cHJlc3Npb25zXG4gICAqL1xuICBzdGF0aWMgdHJ5KGV4cHJlc3Npb25zOiBhbnlbXSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcInRyeVwiLCBbdmFyaWFkaWMoYW55VmFsdWUpXSkoZXhwcmVzc2lvbnMpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy91cHBlciB1cHBlcn0gY29udmVydHMgYWxsIGNhc2VkIGxldHRlcnMgaW4gdGhlIGdpdmVuIHN0cmluZyB0byB1cHBlcmNhc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICovXG4gIHN0YXRpYyB1cHBlcihzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInVwcGVyXCIsIFtzdHJpbmdWYWx1ZV0pKHN0cikpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9vcGVudG9mdS5vcmcvZG9jcy9sYW5ndWFnZS9mdW5jdGlvbnMvdXJsZGVjb2RlIHVybGRlY29kZX0gYXBwbGllcyBVUkwgZGVjb2RpbmcgdG8gYSBnaXZlbiBlbmNvZGVkIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHVybGRlY29kZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInVybGRlY29kZVwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy91cmxlbmNvZGUgdXJsZW5jb2RlfSBhcHBsaWVzIFVSTCBlbmNvZGluZyB0byBhIGdpdmVuIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKi9cbiAgc3RhdGljIHVybGVuY29kZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInVybGVuY29kZVwiLCBbc3RyaW5nVmFsdWVdKShzdHIpKTtcbiAgfVxuICAvKipcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmhhc2hpY29ycC5jb20vdGVycmFmb3JtL2xhbmd1YWdlL2Z1bmN0aW9ucy91dWlkIHV1aWR9IGdlbmVyYXRlcyBhIHVuaXF1ZSBpZGVudGlmaWVyIHN0cmluZy5cbiAgICovXG4gIHN0YXRpYyB1dWlkKCkge1xuICAgIHJldHVybiBhc1N0cmluZyh0ZXJyYWZvcm1GdW5jdGlvbihcInV1aWRcIiwgW10pKCkpO1xuICB9XG4gIC8qKlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuaGFzaGljb3JwLmNvbS90ZXJyYWZvcm0vbGFuZ3VhZ2UvZnVuY3Rpb25zL3V1aWR2NSB1dWlkdjV9IGdlbmVyYXRlcyBhIF9uYW1lLWJhc2VkXyBVVUlELCBhcyBkZXNjcmliZWQgaW4gW1JGQyA0MTIyIHNlY3Rpb24gNC4zXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDEyMiNzZWN0aW9uLTQuMyksIGFsc28ga25vd24gYXMgYSBcInZlcnNpb24gNVwiIFVVSUQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIHN0YXRpYyB1dWlkdjUobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc1N0cmluZyhcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwidXVpZHY1XCIsIFtzdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWVdKShuYW1lc3BhY2UsIG5hbWUpLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvdmFsdWVzIHZhbHVlc30gdGFrZXMgYSBtYXAgYW5kIHJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhhdCBtYXAuXG4gICAqIEBwYXJhbSB7YW55fSBtYXBwaW5nXG4gICAqL1xuICBzdGF0aWMgdmFsdWVzKG1hcHBpbmc6IGFueSkge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcInZhbHVlc1wiLCBbYW55VmFsdWVdKShtYXBwaW5nKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMveWFtbGRlY29kZSB5YW1sZGVjb2RlfSBwYXJzZXMgYSBzdHJpbmcgYXMgYSBzdWJzZXQgb2YgWUFNTCwgYW5kIHByb2R1Y2VzIGEgcmVwcmVzZW50YXRpb24gb2YgaXRzIHZhbHVlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3JjXG4gICAqL1xuICBzdGF0aWMgeWFtbGRlY29kZShzcmM6IHN0cmluZykge1xuICAgIHJldHVybiBhc0FueSh0ZXJyYWZvcm1GdW5jdGlvbihcInlhbWxkZWNvZGVcIiwgW3N0cmluZ1ZhbHVlXSkoc3JjKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMveWFtbGVuY29kZSB5YW1sZW5jb2RlfSBlbmNvZGVzIGEgZ2l2ZW4gdmFsdWUgdG8gYSBzdHJpbmcgdXNpbmcgW1lBTUwgMS4yXShodHRwczovL3lhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCkgYmxvY2sgc3ludGF4LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICovXG4gIHN0YXRpYyB5YW1sZW5jb2RlKHZhbHVlOiBhbnkpIHtcbiAgICByZXR1cm4gYXNTdHJpbmcodGVycmFmb3JtRnVuY3Rpb24oXCJ5YW1sZW5jb2RlXCIsIFthbnlWYWx1ZV0pKHZhbHVlKSk7XG4gIH1cbiAgLyoqXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5oYXNoaWNvcnAuY29tL3RlcnJhZm9ybS9sYW5ndWFnZS9mdW5jdGlvbnMvemlwbWFwIHppcG1hcH0gY29uc3RydWN0cyBhIG1hcCBmcm9tIGEgbGlzdCBvZiBrZXlzIGFuZCBhIGNvcnJlc3BvbmRpbmcgbGlzdCBvZiB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0ga2V5c1xuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVzXG4gICAqL1xuICBzdGF0aWMgemlwbWFwKGtleXM6IHN0cmluZ1tdLCB2YWx1ZXM6IGFueSkge1xuICAgIHJldHVybiBhc0FueShcbiAgICAgIHRlcnJhZm9ybUZ1bmN0aW9uKFwiemlwbWFwXCIsIFtsaXN0T2YoYW55VmFsdWUpLCBhbnlWYWx1ZV0pKGtleXMsIHZhbHVlcyksXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,6 @@
1
+ export declare function recordFunctionUsage(functionName: string): void;
2
+ export declare function getUsedFunctions(): string[];
3
+ /**
4
+ * Clears the recorded function usage; intended for tests.
5
+ */
6
+ export declare function resetFunctionUsageRegistry(): void;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ // Copyright (c) HashiCorp, Inc
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.recordFunctionUsage = recordFunctionUsage;
6
+ exports.getUsedFunctions = getUsedFunctions;
7
+ exports.resetFunctionUsageRegistry = resetFunctionUsageRegistry;
8
+ /**
9
+ * Records which Terraform functions have been called through the `Fn` class
10
+ * so that synthesis-time validations can check them against the version of
11
+ * the selected Terraform-compatible CLI.
12
+ *
13
+ * The registry is intentionally process-global rather than stack-scoped:
14
+ * an `Fn.*()` result is a plain token that can be shared freely across
15
+ * stacks, so reliable per-stack attribution is impossible anyway. Functions
16
+ * used through raw escape hatches (overrides, hand-built expression strings)
17
+ * are not recorded.
18
+ */
19
+ const usedFunctions = new Set();
20
+ // eslint-disable-next-line jsdoc/require-jsdoc
21
+ function recordFunctionUsage(functionName) {
22
+ usedFunctions.add(functionName);
23
+ }
24
+ // eslint-disable-next-line jsdoc/require-jsdoc
25
+ function getUsedFunctions() {
26
+ return Array.from(usedFunctions);
27
+ }
28
+ /**
29
+ * Clears the recorded function usage; intended for tests.
30
+ */
31
+ function resetFunctionUsageRegistry() {
32
+ usedFunctions.clear();
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNhZ2UtcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3Rpb25zL3VzYWdlLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DOztBQWdCbkMsa0RBRUM7QUFHRCw0Q0FFQztBQUtELGdFQUVDO0FBNUJEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0FBRXhDLCtDQUErQztBQUMvQyxTQUFnQixtQkFBbUIsQ0FBQyxZQUFvQjtJQUN0RCxhQUFhLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsU0FBZ0IsZ0JBQWdCO0lBQzlCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQiwwQkFBMEI7SUFDeEMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuXG4vKipcbiAqIFJlY29yZHMgd2hpY2ggVGVycmFmb3JtIGZ1bmN0aW9ucyBoYXZlIGJlZW4gY2FsbGVkIHRocm91Z2ggdGhlIGBGbmAgY2xhc3NcbiAqIHNvIHRoYXQgc3ludGhlc2lzLXRpbWUgdmFsaWRhdGlvbnMgY2FuIGNoZWNrIHRoZW0gYWdhaW5zdCB0aGUgdmVyc2lvbiBvZlxuICogdGhlIHNlbGVjdGVkIFRlcnJhZm9ybS1jb21wYXRpYmxlIENMSS5cbiAqXG4gKiBUaGUgcmVnaXN0cnkgaXMgaW50ZW50aW9uYWxseSBwcm9jZXNzLWdsb2JhbCByYXRoZXIgdGhhbiBzdGFjay1zY29wZWQ6XG4gKiBhbiBgRm4uKigpYCByZXN1bHQgaXMgYSBwbGFpbiB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgZnJlZWx5IGFjcm9zc1xuICogc3RhY2tzLCBzbyByZWxpYWJsZSBwZXItc3RhY2sgYXR0cmlidXRpb24gaXMgaW1wb3NzaWJsZSBhbnl3YXkuIEZ1bmN0aW9uc1xuICogdXNlZCB0aHJvdWdoIHJhdyBlc2NhcGUgaGF0Y2hlcyAob3ZlcnJpZGVzLCBoYW5kLWJ1aWx0IGV4cHJlc3Npb24gc3RyaW5ncylcbiAqIGFyZSBub3QgcmVjb3JkZWQuXG4gKi9cbmNvbnN0IHVzZWRGdW5jdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRGdW5jdGlvblVzYWdlKGZ1bmN0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIHVzZWRGdW5jdGlvbnMuYWRkKGZ1bmN0aW9uTmFtZSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlZEZ1bmN0aW9ucygpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHVzZWRGdW5jdGlvbnMpO1xufVxuXG4vKipcbiAqIENsZWFycyB0aGUgcmVjb3JkZWQgZnVuY3Rpb24gdXNhZ2U7IGludGVuZGVkIGZvciB0ZXN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0RnVuY3Rpb25Vc2FnZVJlZ2lzdHJ5KCk6IHZvaWQge1xuICB1c2VkRnVuY3Rpb25zLmNsZWFyKCk7XG59XG4iXX0=