@appconda/nextjs 1.0.114 → 1.0.116

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 (302) hide show
  1. package/dist/actions/actionClient.d.ts +10 -0
  2. package/dist/actions/actionClient.js +41 -0
  3. package/dist/actions/auth.d.ts +1 -0
  4. package/dist/actions/auth.js +7 -0
  5. package/dist/actions/authOptions.d.ts +5 -0
  6. package/dist/actions/authOptions.js +235 -0
  7. package/dist/actions/index.d.ts +3 -0
  8. package/dist/actions/index.js +4 -0
  9. package/dist/actions/nextAuthHandler.d.ts +1 -0
  10. package/dist/actions/nextAuthHandler.js +6 -0
  11. package/dist/client.d.ts +141 -0
  12. package/dist/client.js +335 -0
  13. package/dist/decorators/Cache.d.ts +1 -0
  14. package/dist/decorators/Cache.js +79 -0
  15. package/dist/decorators/CacheKey.d.ts +1 -0
  16. package/dist/decorators/CacheKey.js +9 -0
  17. package/dist/decorators/Invalidate.d.ts +1 -0
  18. package/dist/decorators/Invalidate.js +47 -0
  19. package/dist/enums/api-service.d.ts +13 -0
  20. package/dist/enums/api-service.js +15 -0
  21. package/dist/enums/api.d.ts +5 -0
  22. package/dist/enums/api.js +7 -0
  23. package/dist/enums/auth-method.d.ts +9 -0
  24. package/dist/enums/auth-method.js +11 -0
  25. package/dist/enums/browser.d.ts +16 -0
  26. package/dist/enums/browser.js +18 -0
  27. package/dist/enums/compression.d.ts +5 -0
  28. package/dist/enums/compression.js +7 -0
  29. package/dist/enums/credit-card.d.ts +18 -0
  30. package/dist/enums/credit-card.js +20 -0
  31. package/dist/enums/database-usage-range.d.ts +5 -0
  32. package/dist/enums/database-usage-range.js +7 -0
  33. package/dist/enums/email-template-locale.d.ts +133 -0
  34. package/dist/enums/email-template-locale.js +135 -0
  35. package/dist/enums/email-template-type.d.ts +9 -0
  36. package/dist/enums/email-template-type.js +11 -0
  37. package/dist/enums/entities/EntityLimitType.d.ts +4 -0
  38. package/dist/enums/entities/EntityLimitType.js +6 -0
  39. package/dist/enums/entities/PropertyAttributeName.d.ts +27 -0
  40. package/dist/enums/entities/PropertyAttributeName.js +29 -0
  41. package/dist/enums/entities/PropertyCondition.d.ts +7 -0
  42. package/dist/enums/entities/PropertyCondition.js +10 -0
  43. package/dist/enums/entities/PropertyType.d.ts +12 -0
  44. package/dist/enums/entities/PropertyType.js +18 -0
  45. package/dist/enums/entities/PropertyValueType.d.ts +6 -0
  46. package/dist/enums/entities/PropertyValueType.js +8 -0
  47. package/dist/enums/entities/RowAccess.d.ts +2 -0
  48. package/dist/enums/entities/RowAccess.js +2 -0
  49. package/dist/enums/entities/ViewFilterCondition.d.ts +12 -0
  50. package/dist/enums/entities/ViewFilterCondition.js +14 -0
  51. package/dist/enums/execution-method.d.ts +8 -0
  52. package/dist/enums/execution-method.js +10 -0
  53. package/dist/enums/flag.d.ts +197 -0
  54. package/dist/enums/flag.js +199 -0
  55. package/dist/enums/function-usage-range.d.ts +5 -0
  56. package/dist/enums/function-usage-range.js +7 -0
  57. package/dist/enums/image-format.d.ts +7 -0
  58. package/dist/enums/image-format.js +9 -0
  59. package/dist/enums/image-gravity.d.ts +11 -0
  60. package/dist/enums/image-gravity.js +13 -0
  61. package/dist/enums/index-type.d.ts +5 -0
  62. package/dist/enums/index-type.js +7 -0
  63. package/dist/enums/messaging-provider-type.d.ts +5 -0
  64. package/dist/enums/messaging-provider-type.js +7 -0
  65. package/dist/enums/name.d.ts +14 -0
  66. package/dist/enums/name.js +16 -0
  67. package/dist/enums/o-auth-provider copy.d.ts +41 -0
  68. package/dist/enums/o-auth-provider copy.js +43 -0
  69. package/dist/enums/password-hash.d.ts +13 -0
  70. package/dist/enums/password-hash.js +15 -0
  71. package/dist/enums/platform-type.d.ts +17 -0
  72. package/dist/enums/platform-type.js +19 -0
  73. package/dist/enums/project-usage-range.d.ts +4 -0
  74. package/dist/enums/project-usage-range.js +6 -0
  75. package/dist/enums/region.d.ts +4 -0
  76. package/dist/enums/region.js +6 -0
  77. package/dist/enums/relation-mutate.d.ts +5 -0
  78. package/dist/enums/relation-mutate.js +7 -0
  79. package/dist/enums/relationship-type.d.ts +6 -0
  80. package/dist/enums/relationship-type.js +8 -0
  81. package/dist/enums/resource-type.d.ts +4 -0
  82. package/dist/enums/resource-type.js +6 -0
  83. package/dist/enums/runtime.d.ts +48 -0
  84. package/dist/enums/runtime.js +50 -0
  85. package/dist/enums/s-m-t-p-secure.d.ts +3 -0
  86. package/dist/enums/s-m-t-p-secure.js +5 -0
  87. package/dist/enums/shared/ApplicationLayout.d.ts +4 -0
  88. package/dist/enums/shared/ApplicationLayout.js +6 -0
  89. package/dist/enums/shared/Colors.d.ts +24 -0
  90. package/dist/enums/shared/Colors.js +26 -0
  91. package/dist/enums/shared/InputType.d.ts +6 -0
  92. package/dist/enums/shared/InputType.js +8 -0
  93. package/dist/enums/shared/Periodicity.d.ts +7 -0
  94. package/dist/enums/shared/Periodicity.js +9 -0
  95. package/dist/enums/shared/SvgIcon.d.ts +37 -0
  96. package/dist/enums/shared/SvgIcon.js +39 -0
  97. package/dist/enums/shared/Theme.d.ts +4 -0
  98. package/dist/enums/shared/Theme.js +6 -0
  99. package/dist/enums/sms-template-locale.d.ts +133 -0
  100. package/dist/enums/sms-template-locale.js +135 -0
  101. package/dist/enums/sms-template-type.d.ts +6 -0
  102. package/dist/enums/sms-template-type.js +8 -0
  103. package/dist/enums/smtp-encryption.d.ts +5 -0
  104. package/dist/enums/smtp-encryption.js +7 -0
  105. package/dist/enums/storage-usage-range.d.ts +5 -0
  106. package/dist/enums/storage-usage-range.js +7 -0
  107. package/dist/enums/subscriptions/PricingModel.d.ts +11 -0
  108. package/dist/enums/subscriptions/PricingModel.js +12 -0
  109. package/dist/enums/subscriptions/SubscriptionBillingPeriod.d.ts +10 -0
  110. package/dist/enums/subscriptions/SubscriptionBillingPeriod.js +11 -0
  111. package/dist/enums/subscriptions/SubscriptionFeatureLimitType.d.ts +10 -0
  112. package/dist/enums/subscriptions/SubscriptionFeatureLimitType.js +13 -0
  113. package/dist/enums/subscriptions/SubscriptionPriceType.d.ts +7 -0
  114. package/dist/enums/subscriptions/SubscriptionPriceType.js +8 -0
  115. package/dist/enums/tenants/LinkedAccountStatus.d.ts +5 -0
  116. package/dist/enums/tenants/LinkedAccountStatus.js +7 -0
  117. package/dist/enums/tenants/TenantUserJoined.d.ts +6 -0
  118. package/dist/enums/tenants/TenantUserJoined.js +8 -0
  119. package/dist/enums/tenants/TenantUserStatus.d.ts +6 -0
  120. package/dist/enums/tenants/TenantUserStatus.js +8 -0
  121. package/dist/enums/tenants/TenantUserType.d.ts +5 -0
  122. package/dist/enums/tenants/TenantUserType.js +7 -0
  123. package/dist/enums/user-usage-range.d.ts +5 -0
  124. package/dist/enums/user-usage-range.js +7 -0
  125. package/dist/getAppcondaClient.d.ts +2 -0
  126. package/dist/getAppcondaClient.js +44 -0
  127. package/dist/getSDKForCurrentUser.d.ts +43 -0
  128. package/dist/getSDKForCurrentUser.js +76 -0
  129. package/dist/getSDKForService.d.ts +6 -0
  130. package/dist/getSDKForService.js +51 -0
  131. package/dist/getSDKForTenant.d.ts +20 -0
  132. package/dist/getSDKForTenant.js +44 -0
  133. package/dist/id.d.ts +20 -0
  134. package/dist/id.js +45 -0
  135. package/dist/index.d.ts +44 -0
  136. package/dist/index.js +42 -0
  137. package/dist/inputFile.d.ts +6 -0
  138. package/dist/inputFile.js +17 -0
  139. package/dist/lib/Cache/Adapter.d.ts +10 -0
  140. package/dist/lib/Cache/Adapter.js +2 -0
  141. package/dist/lib/Cache/Adapters/Filesystem.d.ts +16 -0
  142. package/dist/lib/Cache/Adapters/Filesystem.js +103 -0
  143. package/dist/lib/Cache/Adapters/Memory.d.ts +18 -0
  144. package/dist/lib/Cache/Adapters/Memory.js +47 -0
  145. package/dist/lib/Cache/Adapters/None.d.ts +12 -0
  146. package/dist/lib/Cache/Adapters/None.js +28 -0
  147. package/dist/lib/Cache/Adapters/Sharding.d.ts +17 -0
  148. package/dist/lib/Cache/Adapters/Sharding.js +73 -0
  149. package/dist/lib/Cache/Cache.d.ts +16 -0
  150. package/dist/lib/Cache/Cache.js +52 -0
  151. package/dist/lib/Cache/index.d.ts +4 -0
  152. package/dist/lib/Cache/index.js +5 -0
  153. package/dist/lib/Cache/test.d.ts +0 -0
  154. package/dist/lib/Cache/test.js +1 -0
  155. package/dist/lib/Registry/Registry.d.ts +38 -0
  156. package/dist/lib/Registry/Registry.js +56 -0
  157. package/dist/lib/Registry/index.d.ts +1 -0
  158. package/dist/lib/Registry/index.js +2 -0
  159. package/dist/lib/Services.d.ts +6 -0
  160. package/dist/lib/Services.js +14 -0
  161. package/dist/lib/crypto.d.ts +23 -0
  162. package/dist/lib/crypto.js +78 -0
  163. package/dist/lib/env.d.ts +1 -0
  164. package/dist/lib/env.js +137 -0
  165. package/dist/lib/errors.d.ts +70 -0
  166. package/dist/lib/errors.js +76 -0
  167. package/dist/lib/index.d.ts +2 -0
  168. package/dist/lib/index.js +3 -0
  169. package/dist/lib/jwt.d.ts +12 -0
  170. package/dist/lib/jwt.js +103 -0
  171. package/dist/models.d.ts +3272 -0
  172. package/dist/models.js +2 -0
  173. package/dist/modules/account/actions.d.ts +31 -0
  174. package/dist/modules/account/actions.js +18 -0
  175. package/dist/modules/account/enums/authentication-factor.d.ts +6 -0
  176. package/dist/modules/account/enums/authentication-factor.js +8 -0
  177. package/dist/modules/account/enums/authenticator-type.d.ts +3 -0
  178. package/dist/modules/account/enums/authenticator-type.js +5 -0
  179. package/dist/modules/account/enums/o-auth-provider.d.ts +41 -0
  180. package/dist/modules/account/enums/o-auth-provider.js +43 -0
  181. package/dist/modules/account/index.d.ts +3 -0
  182. package/dist/modules/account/index.js +4 -0
  183. package/dist/modules/account/schema.d.ts +17 -0
  184. package/dist/modules/account/schema.js +8 -0
  185. package/dist/modules/account/service.d.ts +530 -0
  186. package/dist/modules/account/service.js +1260 -0
  187. package/dist/modules/account/types.d.ts +411 -0
  188. package/dist/modules/account/types.js +2 -0
  189. package/dist/modules/acl/service.d.ts +26 -0
  190. package/dist/modules/acl/service.js +27 -0
  191. package/dist/modules/agent/action.d.ts +57 -0
  192. package/dist/modules/agent/action.js +64 -0
  193. package/dist/modules/agent/index.d.ts +4 -0
  194. package/dist/modules/agent/index.js +5 -0
  195. package/dist/modules/agent/schema.d.ts +48 -0
  196. package/dist/modules/agent/schema.js +21 -0
  197. package/dist/modules/agent/service.d.ts +12 -0
  198. package/dist/modules/agent/service.js +22 -0
  199. package/dist/modules/agent/types.d.ts +11 -0
  200. package/dist/modules/agent/types.js +2 -0
  201. package/dist/modules/ai/index.d.ts +1 -0
  202. package/dist/modules/ai/index.js +2 -0
  203. package/dist/modules/ai/node/actions.d.ts +4 -0
  204. package/dist/modules/ai/node/actions.js +16 -0
  205. package/dist/modules/ai/node/index.d.ts +2 -0
  206. package/dist/modules/ai/node/index.js +3 -0
  207. package/dist/modules/ai/node/service.d.ts +5 -0
  208. package/dist/modules/ai/node/service.js +12 -0
  209. package/dist/modules/index.d.ts +6 -0
  210. package/dist/modules/index.js +7 -0
  211. package/dist/modules/task/action.d.ts +201 -0
  212. package/dist/modules/task/action.js +147 -0
  213. package/dist/modules/task/index.d.ts +4 -0
  214. package/dist/modules/task/index.js +5 -0
  215. package/dist/modules/task/schema.d.ts +107 -0
  216. package/dist/modules/task/schema.js +44 -0
  217. package/dist/modules/task/service.d.ts +19 -0
  218. package/dist/modules/task/service.js +43 -0
  219. package/dist/modules/task/types.d.ts +84 -0
  220. package/dist/modules/task/types.js +2 -0
  221. package/dist/modules/tenant/actions.d.ts +49 -0
  222. package/dist/modules/tenant/actions.js +38 -0
  223. package/dist/modules/tenant/index.d.ts +3 -0
  224. package/dist/modules/tenant/index.js +4 -0
  225. package/dist/modules/tenant/tenant.d.ts +32 -0
  226. package/dist/modules/tenant/tenant.js +125 -0
  227. package/dist/modules/tenant/types.d.ts +11 -0
  228. package/dist/modules/tenant/types.js +2 -0
  229. package/dist/modules/waitlist/action.d.ts +71 -0
  230. package/dist/modules/waitlist/action.js +78 -0
  231. package/dist/modules/waitlist/index.d.ts +4 -0
  232. package/dist/modules/waitlist/index.js +5 -0
  233. package/dist/modules/waitlist/schema.d.ts +39 -0
  234. package/dist/modules/waitlist/schema.js +18 -0
  235. package/dist/modules/waitlist/service.d.ts +13 -0
  236. package/dist/modules/waitlist/service.js +28 -0
  237. package/dist/modules/waitlist/types.d.ts +14 -0
  238. package/dist/modules/waitlist/types.js +2 -0
  239. package/dist/permission.d.ts +43 -0
  240. package/dist/permission.js +54 -0
  241. package/dist/query.d.ts +194 -0
  242. package/dist/query.js +204 -0
  243. package/dist/role.d.ts +70 -0
  244. package/dist/role.js +94 -0
  245. package/dist/schemas/nodes.d.ts +0 -0
  246. package/dist/schemas/nodes.js +1 -0
  247. package/dist/service-client.d.ts +7 -0
  248. package/dist/service-client.js +14 -0
  249. package/dist/service.d.ts +11 -0
  250. package/dist/service.js +23 -0
  251. package/dist/services/applets.d.ts +9 -0
  252. package/dist/services/applets.js +40 -0
  253. package/dist/services/avatars.d.ts +115 -0
  254. package/dist/services/avatars.js +251 -0
  255. package/dist/services/chat-flow.d.ts +7 -0
  256. package/dist/services/chat-flow.js +26 -0
  257. package/dist/services/community.d.ts +19 -0
  258. package/dist/services/community.js +69 -0
  259. package/dist/services/configuration.d.ts +5 -0
  260. package/dist/services/configuration.js +11 -0
  261. package/dist/services/databases.d.ts +613 -0
  262. package/dist/services/databases.js +1736 -0
  263. package/dist/services/functions.d.ts +319 -0
  264. package/dist/services/functions.js +810 -0
  265. package/dist/services/graphql.d.ts +25 -0
  266. package/dist/services/graphql.js +57 -0
  267. package/dist/services/health.d.ts +231 -0
  268. package/dist/services/health.js +463 -0
  269. package/dist/services/locale.d.ts +80 -0
  270. package/dist/services/locale.js +144 -0
  271. package/dist/services/messaging.d.ts +685 -0
  272. package/dist/services/messaging.js +1920 -0
  273. package/dist/services/permissions.d.ts +20 -0
  274. package/dist/services/permissions.js +90 -0
  275. package/dist/services/pricing.d.ts +15 -0
  276. package/dist/services/pricing.js +21 -0
  277. package/dist/services/projects.d.ts +542 -0
  278. package/dist/services/projects.js +1526 -0
  279. package/dist/services/roles.d.ts +19 -0
  280. package/dist/services/roles.js +72 -0
  281. package/dist/services/schema.d.ts +17 -0
  282. package/dist/services/schema.js +48 -0
  283. package/dist/services/storage.d.ts +189 -0
  284. package/dist/services/storage.js +474 -0
  285. package/dist/services/subscription.d.ts +15 -0
  286. package/dist/services/subscription.js +30 -0
  287. package/dist/services/teams.d.ts +167 -0
  288. package/dist/services/teams.js +395 -0
  289. package/dist/services/tenant-subscription.d.ts +12 -0
  290. package/dist/services/tenant-subscription.js +52 -0
  291. package/dist/services/users.d.ts +499 -0
  292. package/dist/services/users.js +1283 -0
  293. package/package.json +3 -3
  294. package/src/actions/actionClient.ts +6 -3
  295. package/src/actions/auth.ts +2 -1
  296. package/src/actions/authOptions.ts +1 -1
  297. package/src/client.ts +1 -1
  298. package/src/lib/env.ts +1 -1
  299. package/src/lib/jwt.ts +1 -1
  300. package/src/modules/account/actions.ts +1 -1
  301. package/src/modules/task/schema.ts +1 -1
  302. package/tsconfig.json +2 -0
@@ -0,0 +1,810 @@
1
+ import { AppcondaException } from '../client';
2
+ export class Functions {
3
+ constructor(client) {
4
+ this.client = client;
5
+ }
6
+ /**
7
+ * List functions
8
+ *
9
+ * Get a list of all the project's functions. You can use the query params to filter your results.
10
+ *
11
+ * @param {string[]} queries
12
+ * @param {string} search
13
+ * @throws {AppcondaException}
14
+ * @returns {Promise<Models.FunctionList>}
15
+ */
16
+ async list(queries, search) {
17
+ const apiPath = '/functions';
18
+ const payload = {};
19
+ if (typeof queries !== 'undefined') {
20
+ payload['queries'] = queries;
21
+ }
22
+ if (typeof search !== 'undefined') {
23
+ payload['search'] = search;
24
+ }
25
+ const uri = new URL(this.client.config.endpoint + apiPath);
26
+ const apiHeaders = {
27
+ 'content-type': 'application/json',
28
+ };
29
+ return await this.client.call('get', uri, apiHeaders, payload);
30
+ }
31
+ /**
32
+ * Create function
33
+ *
34
+ * Create a new function. You can pass a list of [permissions](https://appconda.io/docs/permissions) to allow different project users or team with access to execute the function using the client API.
35
+ *
36
+ * @param {string} functionId
37
+ * @param {string} name
38
+ * @param {Runtime} runtime
39
+ * @param {string[]} execute
40
+ * @param {string[]} events
41
+ * @param {string} schedule
42
+ * @param {number} timeout
43
+ * @param {boolean} enabled
44
+ * @param {boolean} logging
45
+ * @param {string} entrypoint
46
+ * @param {string} commands
47
+ * @param {string[]} scopes
48
+ * @param {string} installationId
49
+ * @param {string} providerRepositoryId
50
+ * @param {string} providerBranch
51
+ * @param {boolean} providerSilentMode
52
+ * @param {string} providerRootDirectory
53
+ * @param {string} templateRepository
54
+ * @param {string} templateOwner
55
+ * @param {string} templateRootDirectory
56
+ * @param {string} templateVersion
57
+ * @param {string} specification
58
+ * @throws {AppcondaException}
59
+ * @returns {Promise<Models.Function>}
60
+ */
61
+ async create(functionId, name, runtime, execute, events, schedule, timeout, enabled, logging, entrypoint, commands, scopes, installationId, providerRepositoryId, providerBranch, providerSilentMode, providerRootDirectory, templateRepository, templateOwner, templateRootDirectory, templateVersion, specification) {
62
+ if (typeof functionId === 'undefined') {
63
+ throw new AppcondaException('Missing required parameter: "functionId"');
64
+ }
65
+ if (typeof name === 'undefined') {
66
+ throw new AppcondaException('Missing required parameter: "name"');
67
+ }
68
+ if (typeof runtime === 'undefined') {
69
+ throw new AppcondaException('Missing required parameter: "runtime"');
70
+ }
71
+ const apiPath = '/functions';
72
+ const payload = {};
73
+ if (typeof functionId !== 'undefined') {
74
+ payload['functionId'] = functionId;
75
+ }
76
+ if (typeof name !== 'undefined') {
77
+ payload['name'] = name;
78
+ }
79
+ if (typeof runtime !== 'undefined') {
80
+ payload['runtime'] = runtime;
81
+ }
82
+ if (typeof execute !== 'undefined') {
83
+ payload['execute'] = execute;
84
+ }
85
+ if (typeof events !== 'undefined') {
86
+ payload['events'] = events;
87
+ }
88
+ if (typeof schedule !== 'undefined') {
89
+ payload['schedule'] = schedule;
90
+ }
91
+ if (typeof timeout !== 'undefined') {
92
+ payload['timeout'] = timeout;
93
+ }
94
+ if (typeof enabled !== 'undefined') {
95
+ payload['enabled'] = enabled;
96
+ }
97
+ if (typeof logging !== 'undefined') {
98
+ payload['logging'] = logging;
99
+ }
100
+ if (typeof entrypoint !== 'undefined') {
101
+ payload['entrypoint'] = entrypoint;
102
+ }
103
+ if (typeof commands !== 'undefined') {
104
+ payload['commands'] = commands;
105
+ }
106
+ if (typeof scopes !== 'undefined') {
107
+ payload['scopes'] = scopes;
108
+ }
109
+ if (typeof installationId !== 'undefined') {
110
+ payload['installationId'] = installationId;
111
+ }
112
+ if (typeof providerRepositoryId !== 'undefined') {
113
+ payload['providerRepositoryId'] = providerRepositoryId;
114
+ }
115
+ if (typeof providerBranch !== 'undefined') {
116
+ payload['providerBranch'] = providerBranch;
117
+ }
118
+ if (typeof providerSilentMode !== 'undefined') {
119
+ payload['providerSilentMode'] = providerSilentMode;
120
+ }
121
+ if (typeof providerRootDirectory !== 'undefined') {
122
+ payload['providerRootDirectory'] = providerRootDirectory;
123
+ }
124
+ if (typeof templateRepository !== 'undefined') {
125
+ payload['templateRepository'] = templateRepository;
126
+ }
127
+ if (typeof templateOwner !== 'undefined') {
128
+ payload['templateOwner'] = templateOwner;
129
+ }
130
+ if (typeof templateRootDirectory !== 'undefined') {
131
+ payload['templateRootDirectory'] = templateRootDirectory;
132
+ }
133
+ if (typeof templateVersion !== 'undefined') {
134
+ payload['templateVersion'] = templateVersion;
135
+ }
136
+ if (typeof specification !== 'undefined') {
137
+ payload['specification'] = specification;
138
+ }
139
+ const uri = new URL(this.client.config.endpoint + apiPath);
140
+ const apiHeaders = {
141
+ 'content-type': 'application/json',
142
+ };
143
+ return await this.client.call('post', uri, apiHeaders, payload);
144
+ }
145
+ /**
146
+ * List runtimes
147
+ *
148
+ * Get a list of all runtimes that are currently active on your instance.
149
+ *
150
+ * @throws {AppcondaException}
151
+ * @returns {Promise<Models.RuntimeList>}
152
+ */
153
+ async listRuntimes() {
154
+ const apiPath = '/functions/runtimes';
155
+ const payload = {};
156
+ const uri = new URL(this.client.config.endpoint + apiPath);
157
+ const apiHeaders = {
158
+ 'content-type': 'application/json',
159
+ };
160
+ return await this.client.call('get', uri, apiHeaders, payload);
161
+ }
162
+ /**
163
+ * List available function runtime specifications
164
+ *
165
+ * List allowed function specifications for this instance.
166
+
167
+ *
168
+ * @throws {AppcondaException}
169
+ * @returns {Promise<Models.SpecificationList>}
170
+ */
171
+ async listSpecifications() {
172
+ const apiPath = '/functions/specifications';
173
+ const payload = {};
174
+ const uri = new URL(this.client.config.endpoint + apiPath);
175
+ const apiHeaders = {
176
+ 'content-type': 'application/json',
177
+ };
178
+ return await this.client.call('get', uri, apiHeaders, payload);
179
+ }
180
+ /**
181
+ * Get function
182
+ *
183
+ * Get a function by its unique ID.
184
+ *
185
+ * @param {string} functionId
186
+ * @throws {AppcondaException}
187
+ * @returns {Promise<Models.Function>}
188
+ */
189
+ async get(functionId) {
190
+ if (typeof functionId === 'undefined') {
191
+ throw new AppcondaException('Missing required parameter: "functionId"');
192
+ }
193
+ const apiPath = '/functions/{functionId}'.replace('{functionId}', functionId);
194
+ const payload = {};
195
+ const uri = new URL(this.client.config.endpoint + apiPath);
196
+ const apiHeaders = {
197
+ 'content-type': 'application/json',
198
+ };
199
+ return await this.client.call('get', uri, apiHeaders, payload);
200
+ }
201
+ /**
202
+ * Update function
203
+ *
204
+ * Update function by its unique ID.
205
+ *
206
+ * @param {string} functionId
207
+ * @param {string} name
208
+ * @param {Runtime} runtime
209
+ * @param {string[]} execute
210
+ * @param {string[]} events
211
+ * @param {string} schedule
212
+ * @param {number} timeout
213
+ * @param {boolean} enabled
214
+ * @param {boolean} logging
215
+ * @param {string} entrypoint
216
+ * @param {string} commands
217
+ * @param {string[]} scopes
218
+ * @param {string} installationId
219
+ * @param {string} providerRepositoryId
220
+ * @param {string} providerBranch
221
+ * @param {boolean} providerSilentMode
222
+ * @param {string} providerRootDirectory
223
+ * @param {string} specification
224
+ * @throws {AppcondaException}
225
+ * @returns {Promise<Models.Function>}
226
+ */
227
+ async update(functionId, name, runtime, execute, events, schedule, timeout, enabled, logging, entrypoint, commands, scopes, installationId, providerRepositoryId, providerBranch, providerSilentMode, providerRootDirectory, specification) {
228
+ if (typeof functionId === 'undefined') {
229
+ throw new AppcondaException('Missing required parameter: "functionId"');
230
+ }
231
+ if (typeof name === 'undefined') {
232
+ throw new AppcondaException('Missing required parameter: "name"');
233
+ }
234
+ const apiPath = '/functions/{functionId}'.replace('{functionId}', functionId);
235
+ const payload = {};
236
+ if (typeof name !== 'undefined') {
237
+ payload['name'] = name;
238
+ }
239
+ if (typeof runtime !== 'undefined') {
240
+ payload['runtime'] = runtime;
241
+ }
242
+ if (typeof execute !== 'undefined') {
243
+ payload['execute'] = execute;
244
+ }
245
+ if (typeof events !== 'undefined') {
246
+ payload['events'] = events;
247
+ }
248
+ if (typeof schedule !== 'undefined') {
249
+ payload['schedule'] = schedule;
250
+ }
251
+ if (typeof timeout !== 'undefined') {
252
+ payload['timeout'] = timeout;
253
+ }
254
+ if (typeof enabled !== 'undefined') {
255
+ payload['enabled'] = enabled;
256
+ }
257
+ if (typeof logging !== 'undefined') {
258
+ payload['logging'] = logging;
259
+ }
260
+ if (typeof entrypoint !== 'undefined') {
261
+ payload['entrypoint'] = entrypoint;
262
+ }
263
+ if (typeof commands !== 'undefined') {
264
+ payload['commands'] = commands;
265
+ }
266
+ if (typeof scopes !== 'undefined') {
267
+ payload['scopes'] = scopes;
268
+ }
269
+ if (typeof installationId !== 'undefined') {
270
+ payload['installationId'] = installationId;
271
+ }
272
+ if (typeof providerRepositoryId !== 'undefined') {
273
+ payload['providerRepositoryId'] = providerRepositoryId;
274
+ }
275
+ if (typeof providerBranch !== 'undefined') {
276
+ payload['providerBranch'] = providerBranch;
277
+ }
278
+ if (typeof providerSilentMode !== 'undefined') {
279
+ payload['providerSilentMode'] = providerSilentMode;
280
+ }
281
+ if (typeof providerRootDirectory !== 'undefined') {
282
+ payload['providerRootDirectory'] = providerRootDirectory;
283
+ }
284
+ if (typeof specification !== 'undefined') {
285
+ payload['specification'] = specification;
286
+ }
287
+ const uri = new URL(this.client.config.endpoint + apiPath);
288
+ const apiHeaders = {
289
+ 'content-type': 'application/json',
290
+ };
291
+ return await this.client.call('put', uri, apiHeaders, payload);
292
+ }
293
+ /**
294
+ * Delete function
295
+ *
296
+ * Delete a function by its unique ID.
297
+ *
298
+ * @param {string} functionId
299
+ * @throws {AppcondaException}
300
+ * @returns {Promise<{}>}
301
+ */
302
+ async delete(functionId) {
303
+ if (typeof functionId === 'undefined') {
304
+ throw new AppcondaException('Missing required parameter: "functionId"');
305
+ }
306
+ const apiPath = '/functions/{functionId}'.replace('{functionId}', functionId);
307
+ const payload = {};
308
+ const uri = new URL(this.client.config.endpoint + apiPath);
309
+ const apiHeaders = {
310
+ 'content-type': 'application/json',
311
+ };
312
+ return await this.client.call('delete', uri, apiHeaders, payload);
313
+ }
314
+ /**
315
+ * List deployments
316
+ *
317
+ * Get a list of all the project&#039;s code deployments. You can use the query params to filter your results.
318
+ *
319
+ * @param {string} functionId
320
+ * @param {string[]} queries
321
+ * @param {string} search
322
+ * @throws {AppcondaException}
323
+ * @returns {Promise<Models.DeploymentList>}
324
+ */
325
+ async listDeployments(functionId, queries, search) {
326
+ if (typeof functionId === 'undefined') {
327
+ throw new AppcondaException('Missing required parameter: "functionId"');
328
+ }
329
+ const apiPath = '/functions/{functionId}/deployments'.replace('{functionId}', functionId);
330
+ const payload = {};
331
+ if (typeof queries !== 'undefined') {
332
+ payload['queries'] = queries;
333
+ }
334
+ if (typeof search !== 'undefined') {
335
+ payload['search'] = search;
336
+ }
337
+ const uri = new URL(this.client.config.endpoint + apiPath);
338
+ const apiHeaders = {
339
+ 'content-type': 'application/json',
340
+ };
341
+ return await this.client.call('get', uri, apiHeaders, payload);
342
+ }
343
+ /**
344
+ * Create deployment
345
+ *
346
+ * Create a new function code deployment. Use this endpoint to upload a new version of your code function. To execute your newly uploaded code, you&#039;ll need to update the function&#039;s deployment to use your new deployment UID.
347
+
348
+ This endpoint accepts a tar.gz file compressed with your code. Make sure to include any dependencies your code has within the compressed file. You can learn more about code packaging in the [Appconda Cloud Functions tutorial](https://appconda.io/docs/functions).
349
+
350
+ Use the &quot;command&quot; param to set the entrypoint used to execute your code.
351
+ *
352
+ * @param {string} functionId
353
+ * @param {File} code
354
+ * @param {boolean} activate
355
+ * @param {string} entrypoint
356
+ * @param {string} commands
357
+ * @throws {AppcondaException}
358
+ * @returns {Promise<Models.Deployment>}
359
+ */
360
+ async createDeployment(functionId, code, activate, entrypoint, commands, onProgress = (progress) => { }) {
361
+ if (typeof functionId === 'undefined') {
362
+ throw new AppcondaException('Missing required parameter: "functionId"');
363
+ }
364
+ if (typeof code === 'undefined') {
365
+ throw new AppcondaException('Missing required parameter: "code"');
366
+ }
367
+ if (typeof activate === 'undefined') {
368
+ throw new AppcondaException('Missing required parameter: "activate"');
369
+ }
370
+ const apiPath = '/functions/{functionId}/deployments'.replace('{functionId}', functionId);
371
+ const payload = {};
372
+ if (typeof entrypoint !== 'undefined') {
373
+ payload['entrypoint'] = entrypoint;
374
+ }
375
+ if (typeof commands !== 'undefined') {
376
+ payload['commands'] = commands;
377
+ }
378
+ if (typeof code !== 'undefined') {
379
+ payload['code'] = code;
380
+ }
381
+ if (typeof activate !== 'undefined') {
382
+ payload['activate'] = activate;
383
+ }
384
+ const uri = new URL(this.client.config.endpoint + apiPath);
385
+ const apiHeaders = {
386
+ 'content-type': 'multipart/form-data',
387
+ };
388
+ return await this.client.chunkedUpload('post', uri, apiHeaders, payload, onProgress);
389
+ }
390
+ /**
391
+ * Get deployment
392
+ *
393
+ * Get a code deployment by its unique ID.
394
+ *
395
+ * @param {string} functionId
396
+ * @param {string} deploymentId
397
+ * @throws {AppcondaException}
398
+ * @returns {Promise<Models.Deployment>}
399
+ */
400
+ async getDeployment(functionId, deploymentId) {
401
+ if (typeof functionId === 'undefined') {
402
+ throw new AppcondaException('Missing required parameter: "functionId"');
403
+ }
404
+ if (typeof deploymentId === 'undefined') {
405
+ throw new AppcondaException('Missing required parameter: "deploymentId"');
406
+ }
407
+ const apiPath = '/functions/{functionId}/deployments/{deploymentId}'.replace('{functionId}', functionId).replace('{deploymentId}', deploymentId);
408
+ const payload = {};
409
+ const uri = new URL(this.client.config.endpoint + apiPath);
410
+ const apiHeaders = {
411
+ 'content-type': 'application/json',
412
+ };
413
+ return await this.client.call('get', uri, apiHeaders, payload);
414
+ }
415
+ /**
416
+ * Update deployment
417
+ *
418
+ * Update the function code deployment ID using the unique function ID. Use this endpoint to switch the code deployment that should be executed by the execution endpoint.
419
+ *
420
+ * @param {string} functionId
421
+ * @param {string} deploymentId
422
+ * @throws {AppcondaException}
423
+ * @returns {Promise<Models.Function>}
424
+ */
425
+ async updateDeployment(functionId, deploymentId) {
426
+ if (typeof functionId === 'undefined') {
427
+ throw new AppcondaException('Missing required parameter: "functionId"');
428
+ }
429
+ if (typeof deploymentId === 'undefined') {
430
+ throw new AppcondaException('Missing required parameter: "deploymentId"');
431
+ }
432
+ const apiPath = '/functions/{functionId}/deployments/{deploymentId}'.replace('{functionId}', functionId).replace('{deploymentId}', deploymentId);
433
+ const payload = {};
434
+ const uri = new URL(this.client.config.endpoint + apiPath);
435
+ const apiHeaders = {
436
+ 'content-type': 'application/json',
437
+ };
438
+ return await this.client.call('patch', uri, apiHeaders, payload);
439
+ }
440
+ /**
441
+ * Delete deployment
442
+ *
443
+ * Delete a code deployment by its unique ID.
444
+ *
445
+ * @param {string} functionId
446
+ * @param {string} deploymentId
447
+ * @throws {AppcondaException}
448
+ * @returns {Promise<{}>}
449
+ */
450
+ async deleteDeployment(functionId, deploymentId) {
451
+ if (typeof functionId === 'undefined') {
452
+ throw new AppcondaException('Missing required parameter: "functionId"');
453
+ }
454
+ if (typeof deploymentId === 'undefined') {
455
+ throw new AppcondaException('Missing required parameter: "deploymentId"');
456
+ }
457
+ const apiPath = '/functions/{functionId}/deployments/{deploymentId}'.replace('{functionId}', functionId).replace('{deploymentId}', deploymentId);
458
+ const payload = {};
459
+ const uri = new URL(this.client.config.endpoint + apiPath);
460
+ const apiHeaders = {
461
+ 'content-type': 'application/json',
462
+ };
463
+ return await this.client.call('delete', uri, apiHeaders, payload);
464
+ }
465
+ /**
466
+ * Rebuild deployment
467
+ *
468
+ *
469
+ * @param {string} functionId
470
+ * @param {string} deploymentId
471
+ * @param {string} buildId
472
+ * @throws {AppcondaException}
473
+ * @returns {Promise<{}>}
474
+ */
475
+ async createBuild(functionId, deploymentId, buildId) {
476
+ if (typeof functionId === 'undefined') {
477
+ throw new AppcondaException('Missing required parameter: "functionId"');
478
+ }
479
+ if (typeof deploymentId === 'undefined') {
480
+ throw new AppcondaException('Missing required parameter: "deploymentId"');
481
+ }
482
+ const apiPath = '/functions/{functionId}/deployments/{deploymentId}/build'.replace('{functionId}', functionId).replace('{deploymentId}', deploymentId);
483
+ const payload = {};
484
+ if (typeof buildId !== 'undefined') {
485
+ payload['buildId'] = buildId;
486
+ }
487
+ const uri = new URL(this.client.config.endpoint + apiPath);
488
+ const apiHeaders = {
489
+ 'content-type': 'application/json',
490
+ };
491
+ return await this.client.call('post', uri, apiHeaders, payload);
492
+ }
493
+ /**
494
+ * Cancel deployment
495
+ *
496
+ *
497
+ * @param {string} functionId
498
+ * @param {string} deploymentId
499
+ * @throws {AppcondaException}
500
+ * @returns {Promise<Models.Build>}
501
+ */
502
+ async updateDeploymentBuild(functionId, deploymentId) {
503
+ if (typeof functionId === 'undefined') {
504
+ throw new AppcondaException('Missing required parameter: "functionId"');
505
+ }
506
+ if (typeof deploymentId === 'undefined') {
507
+ throw new AppcondaException('Missing required parameter: "deploymentId"');
508
+ }
509
+ const apiPath = '/functions/{functionId}/deployments/{deploymentId}/build'.replace('{functionId}', functionId).replace('{deploymentId}', deploymentId);
510
+ const payload = {};
511
+ const uri = new URL(this.client.config.endpoint + apiPath);
512
+ const apiHeaders = {
513
+ 'content-type': 'application/json',
514
+ };
515
+ return await this.client.call('patch', uri, apiHeaders, payload);
516
+ }
517
+ /**
518
+ * Download deployment
519
+ *
520
+ * Get a Deployment&#039;s contents by its unique ID. This endpoint supports range requests for partial or streaming file download.
521
+ *
522
+ * @param {string} functionId
523
+ * @param {string} deploymentId
524
+ * @throws {AppcondaException}
525
+ * @returns {Promise<ArrayBuffer>}
526
+ */
527
+ async getDeploymentDownload(functionId, deploymentId) {
528
+ if (typeof functionId === 'undefined') {
529
+ throw new AppcondaException('Missing required parameter: "functionId"');
530
+ }
531
+ if (typeof deploymentId === 'undefined') {
532
+ throw new AppcondaException('Missing required parameter: "deploymentId"');
533
+ }
534
+ const apiPath = '/functions/{functionId}/deployments/{deploymentId}/download'.replace('{functionId}', functionId).replace('{deploymentId}', deploymentId);
535
+ const payload = {};
536
+ const uri = new URL(this.client.config.endpoint + apiPath);
537
+ const apiHeaders = {
538
+ 'content-type': 'application/json',
539
+ };
540
+ return await this.client.call('get', uri, apiHeaders, payload, 'arrayBuffer');
541
+ }
542
+ /**
543
+ * List executions
544
+ *
545
+ * Get a list of all the current user function execution logs. You can use the query params to filter your results.
546
+ *
547
+ * @param {string} functionId
548
+ * @param {string[]} queries
549
+ * @param {string} search
550
+ * @throws {AppcondaException}
551
+ * @returns {Promise<Models.ExecutionList>}
552
+ */
553
+ async listExecutions(functionId, queries, search) {
554
+ if (typeof functionId === 'undefined') {
555
+ throw new AppcondaException('Missing required parameter: "functionId"');
556
+ }
557
+ const apiPath = '/functions/{functionId}/executions'.replace('{functionId}', functionId);
558
+ const payload = {};
559
+ if (typeof queries !== 'undefined') {
560
+ payload['queries'] = queries;
561
+ }
562
+ if (typeof search !== 'undefined') {
563
+ payload['search'] = search;
564
+ }
565
+ const uri = new URL(this.client.config.endpoint + apiPath);
566
+ const apiHeaders = {
567
+ 'content-type': 'application/json',
568
+ };
569
+ return await this.client.call('get', uri, apiHeaders, payload);
570
+ }
571
+ /**
572
+ * Create execution
573
+ *
574
+ * Trigger a function execution. The returned object will return you the current execution status. You can ping the `Get Execution` endpoint to get updates on the current execution status. Once this endpoint is called, your function execution process will start asynchronously.
575
+ *
576
+ * @param {string} functionId
577
+ * @param {string} body
578
+ * @param {boolean} async
579
+ * @param {string} xpath
580
+ * @param {ExecutionMethod} method
581
+ * @param {object} headers
582
+ * @param {string} scheduledAt
583
+ * @throws {AppcondaException}
584
+ * @returns {Promise<Models.Execution>}
585
+ */
586
+ async createExecution(functionId, body, async, xpath, method, headers, scheduledAt) {
587
+ if (typeof functionId === 'undefined') {
588
+ throw new AppcondaException('Missing required parameter: "functionId"');
589
+ }
590
+ const apiPath = '/functions/{functionId}/executions'.replace('{functionId}', functionId);
591
+ const payload = {};
592
+ if (typeof body !== 'undefined') {
593
+ payload['body'] = body;
594
+ }
595
+ if (typeof async !== 'undefined') {
596
+ payload['async'] = async;
597
+ }
598
+ if (typeof xpath !== 'undefined') {
599
+ payload['path'] = xpath;
600
+ }
601
+ if (typeof method !== 'undefined') {
602
+ payload['method'] = method;
603
+ }
604
+ if (typeof headers !== 'undefined') {
605
+ payload['headers'] = headers;
606
+ }
607
+ if (typeof scheduledAt !== 'undefined') {
608
+ payload['scheduledAt'] = scheduledAt;
609
+ }
610
+ const uri = new URL(this.client.config.endpoint + apiPath);
611
+ const apiHeaders = {
612
+ 'content-type': 'application/json',
613
+ };
614
+ return await this.client.call('post', uri, apiHeaders, payload);
615
+ }
616
+ /**
617
+ * Get execution
618
+ *
619
+ * Get a function execution log by its unique ID.
620
+ *
621
+ * @param {string} functionId
622
+ * @param {string} executionId
623
+ * @throws {AppcondaException}
624
+ * @returns {Promise<Models.Execution>}
625
+ */
626
+ async getExecution(functionId, executionId) {
627
+ if (typeof functionId === 'undefined') {
628
+ throw new AppcondaException('Missing required parameter: "functionId"');
629
+ }
630
+ if (typeof executionId === 'undefined') {
631
+ throw new AppcondaException('Missing required parameter: "executionId"');
632
+ }
633
+ const apiPath = '/functions/{functionId}/executions/{executionId}'.replace('{functionId}', functionId).replace('{executionId}', executionId);
634
+ const payload = {};
635
+ const uri = new URL(this.client.config.endpoint + apiPath);
636
+ const apiHeaders = {
637
+ 'content-type': 'application/json',
638
+ };
639
+ return await this.client.call('get', uri, apiHeaders, payload);
640
+ }
641
+ /**
642
+ * Delete execution
643
+ *
644
+ * Delete a function execution by its unique ID.
645
+
646
+ *
647
+ * @param {string} functionId
648
+ * @param {string} executionId
649
+ * @throws {AppcondaException}
650
+ * @returns {Promise<{}>}
651
+ */
652
+ async deleteExecution(functionId, executionId) {
653
+ if (typeof functionId === 'undefined') {
654
+ throw new AppcondaException('Missing required parameter: "functionId"');
655
+ }
656
+ if (typeof executionId === 'undefined') {
657
+ throw new AppcondaException('Missing required parameter: "executionId"');
658
+ }
659
+ const apiPath = '/functions/{functionId}/executions/{executionId}'.replace('{functionId}', functionId).replace('{executionId}', executionId);
660
+ const payload = {};
661
+ const uri = new URL(this.client.config.endpoint + apiPath);
662
+ const apiHeaders = {
663
+ 'content-type': 'application/json',
664
+ };
665
+ return await this.client.call('delete', uri, apiHeaders, payload);
666
+ }
667
+ /**
668
+ * List variables
669
+ *
670
+ * Get a list of all variables of a specific function.
671
+ *
672
+ * @param {string} functionId
673
+ * @throws {AppcondaException}
674
+ * @returns {Promise<Models.VariableList>}
675
+ */
676
+ async listVariables(functionId) {
677
+ if (typeof functionId === 'undefined') {
678
+ throw new AppcondaException('Missing required parameter: "functionId"');
679
+ }
680
+ const apiPath = '/functions/{functionId}/variables'.replace('{functionId}', functionId);
681
+ const payload = {};
682
+ const uri = new URL(this.client.config.endpoint + apiPath);
683
+ const apiHeaders = {
684
+ 'content-type': 'application/json',
685
+ };
686
+ return await this.client.call('get', uri, apiHeaders, payload);
687
+ }
688
+ /**
689
+ * Create variable
690
+ *
691
+ * Create a new function environment variable. These variables can be accessed in the function at runtime as environment variables.
692
+ *
693
+ * @param {string} functionId
694
+ * @param {string} key
695
+ * @param {string} value
696
+ * @throws {AppcondaException}
697
+ * @returns {Promise<Models.Variable>}
698
+ */
699
+ async createVariable(functionId, key, value) {
700
+ if (typeof functionId === 'undefined') {
701
+ throw new AppcondaException('Missing required parameter: "functionId"');
702
+ }
703
+ if (typeof key === 'undefined') {
704
+ throw new AppcondaException('Missing required parameter: "key"');
705
+ }
706
+ if (typeof value === 'undefined') {
707
+ throw new AppcondaException('Missing required parameter: "value"');
708
+ }
709
+ const apiPath = '/functions/{functionId}/variables'.replace('{functionId}', functionId);
710
+ const payload = {};
711
+ if (typeof key !== 'undefined') {
712
+ payload['key'] = key;
713
+ }
714
+ if (typeof value !== 'undefined') {
715
+ payload['value'] = value;
716
+ }
717
+ const uri = new URL(this.client.config.endpoint + apiPath);
718
+ const apiHeaders = {
719
+ 'content-type': 'application/json',
720
+ };
721
+ return await this.client.call('post', uri, apiHeaders, payload);
722
+ }
723
+ /**
724
+ * Get variable
725
+ *
726
+ * Get a variable by its unique ID.
727
+ *
728
+ * @param {string} functionId
729
+ * @param {string} variableId
730
+ * @throws {AppcondaException}
731
+ * @returns {Promise<Models.Variable>}
732
+ */
733
+ async getVariable(functionId, variableId) {
734
+ if (typeof functionId === 'undefined') {
735
+ throw new AppcondaException('Missing required parameter: "functionId"');
736
+ }
737
+ if (typeof variableId === 'undefined') {
738
+ throw new AppcondaException('Missing required parameter: "variableId"');
739
+ }
740
+ const apiPath = '/functions/{functionId}/variables/{variableId}'.replace('{functionId}', functionId).replace('{variableId}', variableId);
741
+ const payload = {};
742
+ const uri = new URL(this.client.config.endpoint + apiPath);
743
+ const apiHeaders = {
744
+ 'content-type': 'application/json',
745
+ };
746
+ return await this.client.call('get', uri, apiHeaders, payload);
747
+ }
748
+ /**
749
+ * Update variable
750
+ *
751
+ * Update variable by its unique ID.
752
+ *
753
+ * @param {string} functionId
754
+ * @param {string} variableId
755
+ * @param {string} key
756
+ * @param {string} value
757
+ * @throws {AppcondaException}
758
+ * @returns {Promise<Models.Variable>}
759
+ */
760
+ async updateVariable(functionId, variableId, key, value) {
761
+ if (typeof functionId === 'undefined') {
762
+ throw new AppcondaException('Missing required parameter: "functionId"');
763
+ }
764
+ if (typeof variableId === 'undefined') {
765
+ throw new AppcondaException('Missing required parameter: "variableId"');
766
+ }
767
+ if (typeof key === 'undefined') {
768
+ throw new AppcondaException('Missing required parameter: "key"');
769
+ }
770
+ const apiPath = '/functions/{functionId}/variables/{variableId}'.replace('{functionId}', functionId).replace('{variableId}', variableId);
771
+ const payload = {};
772
+ if (typeof key !== 'undefined') {
773
+ payload['key'] = key;
774
+ }
775
+ if (typeof value !== 'undefined') {
776
+ payload['value'] = value;
777
+ }
778
+ const uri = new URL(this.client.config.endpoint + apiPath);
779
+ const apiHeaders = {
780
+ 'content-type': 'application/json',
781
+ };
782
+ return await this.client.call('put', uri, apiHeaders, payload);
783
+ }
784
+ /**
785
+ * Delete variable
786
+ *
787
+ * Delete a variable by its unique ID.
788
+ *
789
+ * @param {string} functionId
790
+ * @param {string} variableId
791
+ * @throws {AppcondaException}
792
+ * @returns {Promise<{}>}
793
+ */
794
+ async deleteVariable(functionId, variableId) {
795
+ if (typeof functionId === 'undefined') {
796
+ throw new AppcondaException('Missing required parameter: "functionId"');
797
+ }
798
+ if (typeof variableId === 'undefined') {
799
+ throw new AppcondaException('Missing required parameter: "variableId"');
800
+ }
801
+ const apiPath = '/functions/{functionId}/variables/{variableId}'.replace('{functionId}', functionId).replace('{variableId}', variableId);
802
+ const payload = {};
803
+ const uri = new URL(this.client.config.endpoint + apiPath);
804
+ const apiHeaders = {
805
+ 'content-type': 'application/json',
806
+ };
807
+ return await this.client.call('delete', uri, apiHeaders, payload);
808
+ }
809
+ }
810
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2Z1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQXdDLE1BQU0sV0FBVyxDQUFDO0FBS3BGLE1BQU0sT0FBTyxTQUFTO0lBR2xCLFlBQVksTUFBYztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFrQixFQUFFLE1BQWU7UUFDMUMsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO1FBQzdCLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTZCRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBa0IsRUFBRSxJQUFZLEVBQUUsT0FBZ0IsRUFBRSxPQUFrQixFQUFFLE1BQWlCLEVBQUUsUUFBaUIsRUFBRSxPQUFnQixFQUFFLE9BQWlCLEVBQUUsT0FBaUIsRUFBRSxVQUFtQixFQUFFLFFBQWlCLEVBQUUsTUFBaUIsRUFBRSxjQUF1QixFQUFFLG9CQUE2QixFQUFFLGNBQXVCLEVBQUUsa0JBQTRCLEVBQUUscUJBQThCLEVBQUUsa0JBQTJCLEVBQUUsYUFBc0IsRUFBRSxxQkFBOEIsRUFBRSxlQUF3QixFQUFFLGFBQXNCO1FBQzlmLElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLGlCQUFpQixDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQztRQUM3QixNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDNUIsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDbEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxPQUFPLGNBQWMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN4QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxjQUFjLENBQUM7UUFDL0MsQ0FBQztRQUNELElBQUksT0FBTyxvQkFBb0IsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM5QyxPQUFPLENBQUMsc0JBQXNCLENBQUMsR0FBRyxvQkFBb0IsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxPQUFPLGNBQWMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN4QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxjQUFjLENBQUM7UUFDL0MsQ0FBQztRQUNELElBQUksT0FBTyxrQkFBa0IsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM1QyxPQUFPLENBQUMsb0JBQW9CLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBSSxPQUFPLHFCQUFxQixLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQy9DLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLHFCQUFxQixDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLE9BQU8sa0JBQWtCLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDNUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsa0JBQWtCLENBQUM7UUFDdkQsQ0FBQztRQUNELElBQUksT0FBTyxhQUFhLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDdkMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLGFBQWEsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxPQUFPLHFCQUFxQixLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQy9DLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLHFCQUFxQixDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLE9BQU8sZUFBZSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLGVBQWUsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsSUFBSSxPQUFPLGFBQWEsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN2QyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsYUFBYSxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsTUFBTSxFQUNOLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxZQUFZO1FBQ2QsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUUzRCxNQUFNLFVBQVUsR0FBaUM7WUFDN0MsY0FBYyxFQUFFLGtCQUFrQjtTQUNyQyxDQUFBO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6QixLQUFLLEVBQ0wsR0FBRyxFQUNILFVBQVUsRUFDVixPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7SUFDRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxrQkFBa0I7UUFDcEIsTUFBTSxPQUFPLEdBQUcsMkJBQTJCLENBQUM7UUFDNUMsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUUzRCxNQUFNLFVBQVUsR0FBaUM7WUFDN0MsY0FBYyxFQUFFLGtCQUFrQjtTQUNyQyxDQUFBO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6QixLQUFLLEVBQ0wsR0FBRyxFQUNILFVBQVUsRUFDVixPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7SUFDRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBa0I7UUFDeEIsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksaUJBQWlCLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM5RSxNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUJHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFrQixFQUFFLElBQVksRUFBRSxPQUFpQixFQUFFLE9BQWtCLEVBQUUsTUFBaUIsRUFBRSxRQUFpQixFQUFFLE9BQWdCLEVBQUUsT0FBaUIsRUFBRSxPQUFpQixFQUFFLFVBQW1CLEVBQUUsUUFBaUIsRUFBRSxNQUFpQixFQUFFLGNBQXVCLEVBQUUsb0JBQTZCLEVBQUUsY0FBdUIsRUFBRSxrQkFBNEIsRUFBRSxxQkFBOEIsRUFBRSxhQUFzQjtRQUNoWixJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDbEMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxPQUFPLGNBQWMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN4QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxjQUFjLENBQUM7UUFDL0MsQ0FBQztRQUNELElBQUksT0FBTyxvQkFBb0IsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM5QyxPQUFPLENBQUMsc0JBQXNCLENBQUMsR0FBRyxvQkFBb0IsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsSUFBSSxPQUFPLGNBQWMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN4QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxjQUFjLENBQUM7UUFDL0MsQ0FBQztRQUNELElBQUksT0FBTyxrQkFBa0IsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM1QyxPQUFPLENBQUMsb0JBQW9CLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBSSxPQUFPLHFCQUFxQixLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQy9DLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLHFCQUFxQixDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLE9BQU8sYUFBYSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDN0MsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUUzRCxNQUFNLFVBQVUsR0FBaUM7WUFDN0MsY0FBYyxFQUFFLGtCQUFrQjtTQUNyQyxDQUFBO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6QixLQUFLLEVBQ0wsR0FBRyxFQUNILFVBQVUsRUFDVixPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7SUFDRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBa0I7UUFDM0IsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksaUJBQWlCLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM5RSxNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLFFBQVEsRUFDUixHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsT0FBa0IsRUFBRSxNQUFlO1FBQ3pFLElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLHFDQUFxQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUYsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQzVCLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQy9CLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsS0FBSyxFQUNMLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBa0IsRUFBRSxJQUFVLEVBQUUsUUFBaUIsRUFBRSxVQUFtQixFQUFFLFFBQWlCLEVBQUUsYUFBYSxDQUFDLFFBQXdCLEVBQUUsRUFBRSxHQUFFLENBQUM7UUFDM0osSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksaUJBQWlCLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxPQUFPLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksaUJBQWlCLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksaUJBQWlCLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcscUNBQXFDLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRixNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDNUIsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNsQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBQ25DLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxxQkFBcUI7U0FDeEMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FDbEMsTUFBTSxFQUNOLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxFQUNQLFVBQVUsQ0FDYixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBa0IsRUFBRSxZQUFvQjtRQUN4RCxJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxJQUFJLE9BQU8sWUFBWSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxvREFBb0QsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqSixNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFrQixFQUFFLFlBQW9CO1FBQzNELElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksT0FBTyxZQUFZLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLG9EQUFvRCxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pKLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsT0FBTyxFQUNQLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFVBQWtCLEVBQUUsWUFBb0I7UUFDM0QsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksaUJBQWlCLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxPQUFPLFlBQVksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksaUJBQWlCLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsb0RBQW9ELENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDakosTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUUzRCxNQUFNLFVBQVUsR0FBaUM7WUFDN0MsY0FBYyxFQUFFLGtCQUFrQjtTQUNyQyxDQUFBO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6QixRQUFRLEVBQ1IsR0FBRyxFQUNILFVBQVUsRUFDVixPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7SUFDRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLFVBQWtCLEVBQUUsWUFBb0IsRUFBRSxPQUFnQjtRQUN4RSxJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxJQUFJLE9BQU8sWUFBWSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRywwREFBMEQsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN2SixNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDNUIsSUFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsTUFBTSxFQUNOLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQUMsVUFBa0IsRUFBRSxZQUFvQjtRQUNoRSxJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxJQUFJLE9BQU8sWUFBWSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRywwREFBMEQsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN2SixNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLE9BQU8sRUFDUCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxVQUFrQixFQUFFLFlBQW9CO1FBQ2hFLElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksT0FBTyxZQUFZLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLDZEQUE2RCxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFKLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsS0FBSyxFQUNMLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxFQUNQLGFBQWEsQ0FDaEIsQ0FBQztJQUNOLENBQUM7SUFDRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFrQixFQUFFLE9BQWtCLEVBQUUsTUFBZTtRQUN4RSxJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxvQ0FBb0MsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxVQUFrQixFQUFFLElBQWEsRUFBRSxLQUFlLEVBQUUsS0FBYyxFQUFFLE1BQXdCLEVBQUUsT0FBZ0IsRUFBRSxXQUFvQjtRQUN0SixJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxvQ0FBb0MsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDM0IsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM3QixDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLFdBQVcsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsTUFBTSxFQUNOLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFrQixFQUFFLFdBQW1CO1FBQ3RELElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksT0FBTyxXQUFXLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLGtEQUFrRCxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM3SSxNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQWtCLEVBQUUsV0FBbUI7UUFDekQsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksaUJBQWlCLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxPQUFPLFdBQVcsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksaUJBQWlCLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsa0RBQWtELENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzdJLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsUUFBUSxFQUNSLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQWtCO1FBQ2xDLElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLG1DQUFtQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEYsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUUzRCxNQUFNLFVBQVUsR0FBaUM7WUFDN0MsY0FBYyxFQUFFLGtCQUFrQjtTQUNyQyxDQUFBO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6QixLQUFLLEVBQ0wsR0FBRyxFQUNILFVBQVUsRUFDVixPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7SUFDRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFrQixFQUFFLEdBQVcsRUFBRSxLQUFhO1FBQy9ELElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksT0FBTyxHQUFHLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLGlCQUFpQixDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLGlCQUFpQixDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLG1DQUFtQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEYsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQzVCLElBQUksT0FBTyxHQUFHLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzdCLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsTUFBTSxFQUNOLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxVQUFrQixFQUFFLFVBQWtCO1FBQ3BELElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLGdEQUFnRCxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6SSxNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFrQixFQUFFLFVBQWtCLEVBQUUsR0FBVyxFQUFFLEtBQWM7UUFDcEYsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksaUJBQWlCLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksaUJBQWlCLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxPQUFPLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksaUJBQWlCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsZ0RBQWdELENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pJLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sR0FBRyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUM3QixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBa0IsRUFBRSxVQUFrQjtRQUN2RCxJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxnREFBZ0QsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekksTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUUzRCxNQUFNLFVBQVUsR0FBaUM7WUFDN0MsY0FBYyxFQUFFLGtCQUFrQjtTQUNyQyxDQUFBO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6QixRQUFRLEVBQ1IsR0FBRyxFQUNILFVBQVUsRUFDVixPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcGNvbmRhRXhjZXB0aW9uLCBDbGllbnQsIHR5cGUgUGF5bG9hZCwgVXBsb2FkUHJvZ3Jlc3MgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBNb2RlbHMgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgUnVudGltZSB9IGZyb20gJy4uL2VudW1zL3J1bnRpbWUnO1xuaW1wb3J0IHsgRXhlY3V0aW9uTWV0aG9kIH0gZnJvbSAnLi4vZW51bXMvZXhlY3V0aW9uLW1ldGhvZCc7XG5cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbnMge1xuICAgIGNsaWVudDogQ2xpZW50O1xuXG4gICAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBmdW5jdGlvbnNcbiAgICAgKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBwcm9qZWN0JiMwMzk7cyBmdW5jdGlvbnMuIFlvdSBjYW4gdXNlIHRoZSBxdWVyeSBwYXJhbXMgdG8gZmlsdGVyIHlvdXIgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkZ1bmN0aW9uTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdChxdWVyaWVzPzogc3RyaW5nW10sIHNlYXJjaD86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLkZ1bmN0aW9uTGlzdD4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcXVlcmllcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3F1ZXJpZXMnXSA9IHF1ZXJpZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWFyY2ggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZWFyY2gnXSA9IHNlYXJjaDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZnVuY3Rpb25cbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIG5ldyBmdW5jdGlvbi4gWW91IGNhbiBwYXNzIGEgbGlzdCBvZiBbcGVybWlzc2lvbnNdKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9wZXJtaXNzaW9ucykgdG8gYWxsb3cgZGlmZmVyZW50IHByb2plY3QgdXNlcnMgb3IgdGVhbSB3aXRoIGFjY2VzcyB0byBleGVjdXRlIHRoZSBmdW5jdGlvbiB1c2luZyB0aGUgY2xpZW50IEFQSS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge1J1bnRpbWV9IHJ1bnRpbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBleGVjdXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gZXZlbnRzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVkdWxlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGxvZ2dpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZW50cnlwb2ludFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHNjb3Blc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YWxsYXRpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlclJlcG9zaXRvcnlJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlckJyYW5jaFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJvdmlkZXJTaWxlbnRNb2RlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyUm9vdERpcmVjdG9yeVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZW1wbGF0ZVJlcG9zaXRvcnlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGVPd25lclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZW1wbGF0ZVJvb3REaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGVWZXJzaW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmljYXRpb25cbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuRnVuY3Rpb24+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZShmdW5jdGlvbklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcnVudGltZTogUnVudGltZSwgZXhlY3V0ZT86IHN0cmluZ1tdLCBldmVudHM/OiBzdHJpbmdbXSwgc2NoZWR1bGU/OiBzdHJpbmcsIHRpbWVvdXQ/OiBudW1iZXIsIGVuYWJsZWQ/OiBib29sZWFuLCBsb2dnaW5nPzogYm9vbGVhbiwgZW50cnlwb2ludD86IHN0cmluZywgY29tbWFuZHM/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdLCBpbnN0YWxsYXRpb25JZD86IHN0cmluZywgcHJvdmlkZXJSZXBvc2l0b3J5SWQ/OiBzdHJpbmcsIHByb3ZpZGVyQnJhbmNoPzogc3RyaW5nLCBwcm92aWRlclNpbGVudE1vZGU/OiBib29sZWFuLCBwcm92aWRlclJvb3REaXJlY3Rvcnk/OiBzdHJpbmcsIHRlbXBsYXRlUmVwb3NpdG9yeT86IHN0cmluZywgdGVtcGxhdGVPd25lcj86IHN0cmluZywgdGVtcGxhdGVSb290RGlyZWN0b3J5Pzogc3RyaW5nLCB0ZW1wbGF0ZVZlcnNpb24/OiBzdHJpbmcsIHNwZWNpZmljYXRpb24/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5GdW5jdGlvbj4ge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZ1bmN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibmFtZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBydW50aW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJydW50aW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25JZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2Z1bmN0aW9uSWQnXSA9IGZ1bmN0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJ1bnRpbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydydW50aW1lJ10gPSBydW50aW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZXhlY3V0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2V4ZWN1dGUnXSA9IGV4ZWN1dGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBldmVudHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydldmVudHMnXSA9IGV2ZW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNjaGVkdWxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2NoZWR1bGUnXSA9IHNjaGVkdWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGltZW91dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RpbWVvdXQnXSA9IHRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxvZ2dpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydsb2dnaW5nJ10gPSBsb2dnaW5nO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnlwb2ludCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VudHJ5cG9pbnQnXSA9IGVudHJ5cG9pbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb21tYW5kcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2NvbW1hbmRzJ10gPSBjb21tYW5kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNjb3BlcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Njb3BlcyddID0gc2NvcGVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFsbGF0aW9uSWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydpbnN0YWxsYXRpb25JZCddID0gaW5zdGFsbGF0aW9uSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlclJlcG9zaXRvcnlJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVyUmVwb3NpdG9yeUlkJ10gPSBwcm92aWRlclJlcG9zaXRvcnlJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVyQnJhbmNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJCcmFuY2gnXSA9IHByb3ZpZGVyQnJhbmNoO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJTaWxlbnRNb2RlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJTaWxlbnRNb2RlJ10gPSBwcm92aWRlclNpbGVudE1vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlclJvb3REaXJlY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwcm92aWRlclJvb3REaXJlY3RvcnknXSA9IHByb3ZpZGVyUm9vdERpcmVjdG9yeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRlbXBsYXRlUmVwb3NpdG9yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlbXBsYXRlUmVwb3NpdG9yeSddID0gdGVtcGxhdGVSZXBvc2l0b3J5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGVPd25lciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlbXBsYXRlT3duZXInXSA9IHRlbXBsYXRlT3duZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZVJvb3REaXJlY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0ZW1wbGF0ZVJvb3REaXJlY3RvcnknXSA9IHRlbXBsYXRlUm9vdERpcmVjdG9yeTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRlbXBsYXRlVmVyc2lvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlbXBsYXRlVmVyc2lvbiddID0gdGVtcGxhdGVWZXJzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3BlY2lmaWNhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NwZWNpZmljYXRpb24nXSA9IHNwZWNpZmljYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgcnVudGltZXNcbiAgICAgKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgYWxsIHJ1bnRpbWVzIHRoYXQgYXJlIGN1cnJlbnRseSBhY3RpdmUgb24geW91ciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5SdW50aW1lTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFJ1bnRpbWVzKCk6IFByb21pc2U8TW9kZWxzLlJ1bnRpbWVMaXN0PiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy9ydW50aW1lcyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCBhdmFpbGFibGUgZnVuY3Rpb24gcnVudGltZSBzcGVjaWZpY2F0aW9uc1xuICAgICAqXG4gICAgICogTGlzdCBhbGxvd2VkIGZ1bmN0aW9uIHNwZWNpZmljYXRpb25zIGZvciB0aGlzIGluc3RhbmNlLlxuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuU3BlY2lmaWNhdGlvbkxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RTcGVjaWZpY2F0aW9ucygpOiBQcm9taXNlPE1vZGVscy5TcGVjaWZpY2F0aW9uTGlzdD4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMvc3BlY2lmaWNhdGlvbnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBmdW5jdGlvblxuICAgICAqXG4gICAgICogR2V0IGEgZnVuY3Rpb24gYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkZ1bmN0aW9uPn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXQoZnVuY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuRnVuY3Rpb24+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMve2Z1bmN0aW9uSWR9Jy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZnVuY3Rpb25cbiAgICAgKlxuICAgICAqIFVwZGF0ZSBmdW5jdGlvbiBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7UnVudGltZX0gcnVudGltZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGV4ZWN1dGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBldmVudHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbG9nZ2luZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbnRyeXBvaW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmRzXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2NvcGVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGluc3RhbGxhdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyUmVwb3NpdG9yeUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyQnJhbmNoXG4gICAgICogQHBhcmFtIHtib29sZWFufSBwcm92aWRlclNpbGVudE1vZGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJSb290RGlyZWN0b3J5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmljYXRpb25cbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuRnVuY3Rpb24+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZShmdW5jdGlvbklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcnVudGltZT86IFJ1bnRpbWUsIGV4ZWN1dGU/OiBzdHJpbmdbXSwgZXZlbnRzPzogc3RyaW5nW10sIHNjaGVkdWxlPzogc3RyaW5nLCB0aW1lb3V0PzogbnVtYmVyLCBlbmFibGVkPzogYm9vbGVhbiwgbG9nZ2luZz86IGJvb2xlYW4sIGVudHJ5cG9pbnQ/OiBzdHJpbmcsIGNvbW1hbmRzPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSwgaW5zdGFsbGF0aW9uSWQ/OiBzdHJpbmcsIHByb3ZpZGVyUmVwb3NpdG9yeUlkPzogc3RyaW5nLCBwcm92aWRlckJyYW5jaD86IHN0cmluZywgcHJvdmlkZXJTaWxlbnRNb2RlPzogYm9vbGVhbiwgcHJvdmlkZXJSb290RGlyZWN0b3J5Pzogc3RyaW5nLCBzcGVjaWZpY2F0aW9uPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuRnVuY3Rpb24+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy97ZnVuY3Rpb25JZH0nLnJlcGxhY2UoJ3tmdW5jdGlvbklkfScsIGZ1bmN0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBydW50aW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncnVudGltZSddID0gcnVudGltZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGV4ZWN1dGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydleGVjdXRlJ10gPSBleGVjdXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZXZlbnRzJ10gPSBldmVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NjaGVkdWxlJ10gPSBzY2hlZHVsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRpbWVvdXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0aW1lb3V0J10gPSB0aW1lb3V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsb2dnaW5nICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbG9nZ2luZyddID0gbG9nZ2luZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVudHJ5cG9pbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbnRyeXBvaW50J10gPSBlbnRyeXBvaW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29tbWFuZHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydjb21tYW5kcyddID0gY29tbWFuZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzY29wZXMnXSA9IHNjb3BlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGluc3RhbGxhdGlvbklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaW5zdGFsbGF0aW9uSWQnXSA9IGluc3RhbGxhdGlvbklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJSZXBvc2l0b3J5SWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwcm92aWRlclJlcG9zaXRvcnlJZCddID0gcHJvdmlkZXJSZXBvc2l0b3J5SWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlckJyYW5jaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVyQnJhbmNoJ10gPSBwcm92aWRlckJyYW5jaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVyU2lsZW50TW9kZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVyU2lsZW50TW9kZSddID0gcHJvdmlkZXJTaWxlbnRNb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJSb290RGlyZWN0b3J5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJSb290RGlyZWN0b3J5J10gPSBwcm92aWRlclJvb3REaXJlY3Rvcnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzcGVjaWZpY2F0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3BlY2lmaWNhdGlvbiddID0gc3BlY2lmaWNhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncHV0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgZnVuY3Rpb25cbiAgICAgKlxuICAgICAqIERlbGV0ZSBhIGZ1bmN0aW9uIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25JZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHt9Pn1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUoZnVuY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZ1bmN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy97ZnVuY3Rpb25JZH0nLnJlcGxhY2UoJ3tmdW5jdGlvbklkfScsIGZ1bmN0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgZGVwbG95bWVudHNcbiAgICAgKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBwcm9qZWN0JiMwMzk7cyBjb2RlIGRlcGxveW1lbnRzLiBZb3UgY2FuIHVzZSB0aGUgcXVlcnkgcGFyYW1zIHRvIGZpbHRlciB5b3VyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkRlcGxveW1lbnRMaXN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0RGVwbG95bWVudHMoZnVuY3Rpb25JZDogc3RyaW5nLCBxdWVyaWVzPzogc3RyaW5nW10sIHNlYXJjaD86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLkRlcGxveW1lbnRMaXN0PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZnVuY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS9kZXBsb3ltZW50cycucmVwbGFjZSgne2Z1bmN0aW9uSWR9JywgZnVuY3Rpb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncXVlcmllcyddID0gcXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlYXJjaCddID0gc2VhcmNoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBkZXBsb3ltZW50XG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgZnVuY3Rpb24gY29kZSBkZXBsb3ltZW50LiBVc2UgdGhpcyBlbmRwb2ludCB0byB1cGxvYWQgYSBuZXcgdmVyc2lvbiBvZiB5b3VyIGNvZGUgZnVuY3Rpb24uIFRvIGV4ZWN1dGUgeW91ciBuZXdseSB1cGxvYWRlZCBjb2RlLCB5b3UmIzAzOTtsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgZnVuY3Rpb24mIzAzOTtzIGRlcGxveW1lbnQgdG8gdXNlIHlvdXIgbmV3IGRlcGxveW1lbnQgVUlELlxuXG5UaGlzIGVuZHBvaW50IGFjY2VwdHMgYSB0YXIuZ3ogZmlsZSBjb21wcmVzc2VkIHdpdGggeW91ciBjb2RlLiBNYWtlIHN1cmUgdG8gaW5jbHVkZSBhbnkgZGVwZW5kZW5jaWVzIHlvdXIgY29kZSBoYXMgd2l0aGluIHRoZSBjb21wcmVzc2VkIGZpbGUuIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBjb2RlIHBhY2thZ2luZyBpbiB0aGUgW0FwcGNvbmRhIENsb3VkIEZ1bmN0aW9ucyB0dXRvcmlhbF0oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL2Z1bmN0aW9ucykuXG5cblVzZSB0aGUgJnF1b3Q7Y29tbWFuZCZxdW90OyBwYXJhbSB0byBzZXQgdGhlIGVudHJ5cG9pbnQgdXNlZCB0byBleGVjdXRlIHlvdXIgY29kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHBhcmFtIHtGaWxlfSBjb2RlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhY3RpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbnRyeXBvaW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmRzXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkRlcGxveW1lbnQ+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZURlcGxveW1lbnQoZnVuY3Rpb25JZDogc3RyaW5nLCBjb2RlOiBGaWxlLCBhY3RpdmF0ZTogYm9vbGVhbiwgZW50cnlwb2ludD86IHN0cmluZywgY29tbWFuZHM/OiBzdHJpbmcsIG9uUHJvZ3Jlc3MgPSAocHJvZ3Jlc3M6IFVwbG9hZFByb2dyZXNzKSA9PiB7fSk6IFByb21pc2U8TW9kZWxzLkRlcGxveW1lbnQ+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvZGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvZGVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aXZhdGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImFjdGl2YXRlXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMve2Z1bmN0aW9uSWR9L2RlcGxveW1lbnRzJy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5cG9pbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbnRyeXBvaW50J10gPSBlbnRyeXBvaW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29tbWFuZHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydjb21tYW5kcyddID0gY29tbWFuZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb2RlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnY29kZSddID0gY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFjdGl2YXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYWN0aXZhdGUnXSA9IGFjdGl2YXRlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2h1bmtlZFVwbG9hZChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgb25Qcm9ncmVzc1xuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgZGVwbG95bWVudFxuICAgICAqXG4gICAgICogR2V0IGEgY29kZSBkZXBsb3ltZW50IGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXBsb3ltZW50SWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuRGVwbG95bWVudD59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0RGVwbG95bWVudChmdW5jdGlvbklkOiBzdHJpbmcsIGRlcGxveW1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuRGVwbG95bWVudD4ge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZ1bmN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGVwbG95bWVudElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkZXBsb3ltZW50SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy97ZnVuY3Rpb25JZH0vZGVwbG95bWVudHMve2RlcGxveW1lbnRJZH0nLnJlcGxhY2UoJ3tmdW5jdGlvbklkfScsIGZ1bmN0aW9uSWQpLnJlcGxhY2UoJ3tkZXBsb3ltZW50SWR9JywgZGVwbG95bWVudElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZGVwbG95bWVudFxuICAgICAqXG4gICAgICogVXBkYXRlIHRoZSBmdW5jdGlvbiBjb2RlIGRlcGxveW1lbnQgSUQgdXNpbmcgdGhlIHVuaXF1ZSBmdW5jdGlvbiBJRC4gVXNlIHRoaXMgZW5kcG9pbnQgdG8gc3dpdGNoIHRoZSBjb2RlIGRlcGxveW1lbnQgdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQgYnkgdGhlIGV4ZWN1dGlvbiBlbmRwb2ludC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlcGxveW1lbnRJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5GdW5jdGlvbj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlRGVwbG95bWVudChmdW5jdGlvbklkOiBzdHJpbmcsIGRlcGxveW1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuRnVuY3Rpb24+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRlcGxveW1lbnRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGVwbG95bWVudElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMve2Z1bmN0aW9uSWR9L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50SWR9Jy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKS5yZXBsYWNlKCd7ZGVwbG95bWVudElkfScsIGRlcGxveW1lbnRJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgZGVwbG95bWVudFxuICAgICAqXG4gICAgICogRGVsZXRlIGEgY29kZSBkZXBsb3ltZW50IGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXBsb3ltZW50SWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlRGVwbG95bWVudChmdW5jdGlvbklkOiBzdHJpbmcsIGRlcGxveW1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZ1bmN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGVwbG95bWVudElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkZXBsb3ltZW50SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy97ZnVuY3Rpb25JZH0vZGVwbG95bWVudHMve2RlcGxveW1lbnRJZH0nLnJlcGxhY2UoJ3tmdW5jdGlvbklkfScsIGZ1bmN0aW9uSWQpLnJlcGxhY2UoJ3tkZXBsb3ltZW50SWR9JywgZGVwbG95bWVudElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWJ1aWxkIGRlcGxveW1lbnRcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVwbG95bWVudElkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1aWxkSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQnVpbGQoZnVuY3Rpb25JZDogc3RyaW5nLCBkZXBsb3ltZW50SWQ6IHN0cmluZywgYnVpbGRJZD86IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRlcGxveW1lbnRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGVwbG95bWVudElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMve2Z1bmN0aW9uSWR9L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50SWR9L2J1aWxkJy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKS5yZXBsYWNlKCd7ZGVwbG95bWVudElkfScsIGRlcGxveW1lbnRJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBidWlsZElkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYnVpbGRJZCddID0gYnVpbGRJZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FuY2VsIGRlcGxveW1lbnRcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVwbG95bWVudElkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkJ1aWxkPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVEZXBsb3ltZW50QnVpbGQoZnVuY3Rpb25JZDogc3RyaW5nLCBkZXBsb3ltZW50SWQ6IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLkJ1aWxkPiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZnVuY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkZXBsb3ltZW50SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRlcGxveW1lbnRJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudElkfS9idWlsZCcucmVwbGFjZSgne2Z1bmN0aW9uSWR9JywgZnVuY3Rpb25JZCkucmVwbGFjZSgne2RlcGxveW1lbnRJZH0nLCBkZXBsb3ltZW50SWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRG93bmxvYWQgZGVwbG95bWVudFxuICAgICAqXG4gICAgICogR2V0IGEgRGVwbG95bWVudCYjMDM5O3MgY29udGVudHMgYnkgaXRzIHVuaXF1ZSBJRC4gVGhpcyBlbmRwb2ludCBzdXBwb3J0cyByYW5nZSByZXF1ZXN0cyBmb3IgcGFydGlhbCBvciBzdHJlYW1pbmcgZmlsZSBkb3dubG9hZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlcGxveW1lbnRJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5QnVmZmVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXREZXBsb3ltZW50RG93bmxvYWQoZnVuY3Rpb25JZDogc3RyaW5nLCBkZXBsb3ltZW50SWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRlcGxveW1lbnRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGVwbG95bWVudElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMve2Z1bmN0aW9uSWR9L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50SWR9L2Rvd25sb2FkJy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKS5yZXBsYWNlKCd7ZGVwbG95bWVudElkfScsIGRlcGxveW1lbnRJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICdhcnJheUJ1ZmZlcidcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCBleGVjdXRpb25zXG4gICAgICpcbiAgICAgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgY3VycmVudCB1c2VyIGZ1bmN0aW9uIGV4ZWN1dGlvbiBsb2dzLiBZb3UgY2FuIHVzZSB0aGUgcXVlcnkgcGFyYW1zIHRvIGZpbHRlciB5b3VyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkV4ZWN1dGlvbkxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RFeGVjdXRpb25zKGZ1bmN0aW9uSWQ6IHN0cmluZywgcXVlcmllcz86IHN0cmluZ1tdLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5FeGVjdXRpb25MaXN0PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZnVuY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS9leGVjdXRpb25zJy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VhcmNoJ10gPSBzZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGV4ZWN1dGlvblxuICAgICAqXG4gICAgICogVHJpZ2dlciBhIGZ1bmN0aW9uIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIG9iamVjdCB3aWxsIHJldHVybiB5b3UgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXR1cy4gWW91IGNhbiBwaW5nIHRoZSBgR2V0IEV4ZWN1dGlvbmAgZW5kcG9pbnQgdG8gZ2V0IHVwZGF0ZXMgb24gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXR1cy4gT25jZSB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCwgeW91ciBmdW5jdGlvbiBleGVjdXRpb24gcHJvY2VzcyB3aWxsIHN0YXJ0IGFzeW5jaHJvbm91c2x5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYm9keVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXN5bmNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30geHBhdGhcbiAgICAgKiBAcGFyYW0ge0V4ZWN1dGlvbk1ldGhvZH0gbWV0aG9kXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGhlYWRlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVkQXRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuRXhlY3V0aW9uPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVFeGVjdXRpb24oZnVuY3Rpb25JZDogc3RyaW5nLCBib2R5Pzogc3RyaW5nLCBhc3luYz86IGJvb2xlYW4sIHhwYXRoPzogc3RyaW5nLCBtZXRob2Q/OiBFeGVjdXRpb25NZXRob2QsIGhlYWRlcnM/OiBvYmplY3QsIHNjaGVkdWxlZEF0Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuRXhlY3V0aW9uPiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZnVuY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS9leGVjdXRpb25zJy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGJvZHkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydib2R5J10gPSBib2R5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXN5bmMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhc3luYyddID0gYXN5bmM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4cGF0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3BhdGgnXSA9IHhwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWV0aG9kJ10gPSBtZXRob2Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBoZWFkZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaGVhZGVycyddID0gaGVhZGVycztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNjaGVkdWxlZEF0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2NoZWR1bGVkQXQnXSA9IHNjaGVkdWxlZEF0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgZXhlY3V0aW9uXG4gICAgICpcbiAgICAgKiBHZXQgYSBmdW5jdGlvbiBleGVjdXRpb24gbG9nIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleGVjdXRpb25JZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5FeGVjdXRpb24+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldEV4ZWN1dGlvbihmdW5jdGlvbklkOiBzdHJpbmcsIGV4ZWN1dGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5FeGVjdXRpb24+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGV4ZWN1dGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJleGVjdXRpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS9leGVjdXRpb25zL3tleGVjdXRpb25JZH0nLnJlcGxhY2UoJ3tmdW5jdGlvbklkfScsIGZ1bmN0aW9uSWQpLnJlcGxhY2UoJ3tleGVjdXRpb25JZH0nLCBleGVjdXRpb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIGV4ZWN1dGlvblxuICAgICAqXG4gICAgICogRGVsZXRlIGEgZnVuY3Rpb24gZXhlY3V0aW9uIGJ5IGl0cyB1bmlxdWUgSUQuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4ZWN1dGlvbklkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZUV4ZWN1dGlvbihmdW5jdGlvbklkOiBzdHJpbmcsIGV4ZWN1dGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZnVuY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBleGVjdXRpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZXhlY3V0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy97ZnVuY3Rpb25JZH0vZXhlY3V0aW9ucy97ZXhlY3V0aW9uSWR9Jy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKS5yZXBsYWNlKCd7ZXhlY3V0aW9uSWR9JywgZXhlY3V0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgdmFyaWFibGVzXG4gICAgICpcbiAgICAgKiBHZXQgYSBsaXN0IG9mIGFsbCB2YXJpYWJsZXMgb2YgYSBzcGVjaWZpYyBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbklkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlZhcmlhYmxlTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFZhcmlhYmxlcyhmdW5jdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5WYXJpYWJsZUxpc3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9mdW5jdGlvbnMve2Z1bmN0aW9uSWR9L3ZhcmlhYmxlcycucmVwbGFjZSgne2Z1bmN0aW9uSWR9JywgZnVuY3Rpb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHZhcmlhYmxlXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgZnVuY3Rpb24gZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoZXNlIHZhcmlhYmxlcyBjYW4gYmUgYWNjZXNzZWQgaW4gdGhlIGZ1bmN0aW9uIGF0IHJ1bnRpbWUgYXMgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlZhcmlhYmxlPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVWYXJpYWJsZShmdW5jdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuVmFyaWFibGU+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwia2V5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ2YWx1ZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS92YXJpYWJsZXMnLnJlcGxhY2UoJ3tmdW5jdGlvbklkfScsIGZ1bmN0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsna2V5J10gPSBrZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3ZhbHVlJ10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHZhcmlhYmxlXG4gICAgICpcbiAgICAgKiBHZXQgYSB2YXJpYWJsZSBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFyaWFibGVJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5WYXJpYWJsZT59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0VmFyaWFibGUoZnVuY3Rpb25JZDogc3RyaW5nLCB2YXJpYWJsZUlkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5WYXJpYWJsZT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZ1bmN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFyaWFibGVJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidmFyaWFibGVJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS92YXJpYWJsZXMve3ZhcmlhYmxlSWR9Jy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKS5yZXBsYWNlKCd7dmFyaWFibGVJZH0nLCB2YXJpYWJsZUlkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdmFyaWFibGVcbiAgICAgKlxuICAgICAqIFVwZGF0ZSB2YXJpYWJsZSBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFyaWFibGVJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuVmFyaWFibGU+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVZhcmlhYmxlKGZ1bmN0aW9uSWQ6IHN0cmluZywgdmFyaWFibGVJZDogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5WYXJpYWJsZT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZ1bmN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFyaWFibGVJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidmFyaWFibGVJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImtleVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZnVuY3Rpb25zL3tmdW5jdGlvbklkfS92YXJpYWJsZXMve3ZhcmlhYmxlSWR9Jy5yZXBsYWNlKCd7ZnVuY3Rpb25JZH0nLCBmdW5jdGlvbklkKS5yZXBsYWNlKCd7dmFyaWFibGVJZH0nLCB2YXJpYWJsZUlkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2tleSddID0ga2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd2YWx1ZSddID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3B1dCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIHZhcmlhYmxlXG4gICAgICpcbiAgICAgKiBEZWxldGUgYSB2YXJpYWJsZSBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFyaWFibGVJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHt9Pn1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVWYXJpYWJsZShmdW5jdGlvbklkOiBzdHJpbmcsIHZhcmlhYmxlSWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJmdW5jdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhcmlhYmxlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInZhcmlhYmxlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2Z1bmN0aW9ucy97ZnVuY3Rpb25JZH0vdmFyaWFibGVzL3t2YXJpYWJsZUlkfScucmVwbGFjZSgne2Z1bmN0aW9uSWR9JywgZnVuY3Rpb25JZCkucmVwbGFjZSgne3ZhcmlhYmxlSWR9JywgdmFyaWFibGVJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=