@appconda/nextjs 1.0.112 → 1.0.113

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 (307) hide show
  1. package/package.json +3 -3
  2. package/dist/actions/actionClient.d.ts +0 -10
  3. package/dist/actions/actionClient.js +0 -38
  4. package/dist/actions/auth.d.ts +0 -1
  5. package/dist/actions/auth.js +0 -6
  6. package/dist/actions/authOptions.d.ts +0 -5
  7. package/dist/actions/authOptions.js +0 -235
  8. package/dist/actions/index.d.ts +0 -3
  9. package/dist/actions/index.js +0 -4
  10. package/dist/actions/nextAuthHandler.d.ts +0 -1
  11. package/dist/actions/nextAuthHandler.js +0 -6
  12. package/dist/actions/nodes.d.ts +0 -4
  13. package/dist/actions/nodes.js +0 -15
  14. package/dist/client.d.ts +0 -141
  15. package/dist/client.js +0 -335
  16. package/dist/decorators/Cache.d.ts +0 -1
  17. package/dist/decorators/Cache.js +0 -79
  18. package/dist/decorators/CacheKey.d.ts +0 -1
  19. package/dist/decorators/CacheKey.js +0 -9
  20. package/dist/decorators/Invalidate.d.ts +0 -1
  21. package/dist/decorators/Invalidate.js +0 -47
  22. package/dist/enums/api-service.d.ts +0 -13
  23. package/dist/enums/api-service.js +0 -15
  24. package/dist/enums/api.d.ts +0 -5
  25. package/dist/enums/api.js +0 -7
  26. package/dist/enums/auth-method.d.ts +0 -9
  27. package/dist/enums/auth-method.js +0 -11
  28. package/dist/enums/authentication-factor.d.ts +0 -6
  29. package/dist/enums/authentication-factor.js +0 -7
  30. package/dist/enums/authenticator-type.d.ts +0 -3
  31. package/dist/enums/authenticator-type.js +0 -4
  32. package/dist/enums/browser.d.ts +0 -16
  33. package/dist/enums/browser.js +0 -18
  34. package/dist/enums/compression.d.ts +0 -5
  35. package/dist/enums/compression.js +0 -7
  36. package/dist/enums/credit-card.d.ts +0 -18
  37. package/dist/enums/credit-card.js +0 -20
  38. package/dist/enums/database-usage-range.d.ts +0 -5
  39. package/dist/enums/database-usage-range.js +0 -7
  40. package/dist/enums/email-template-locale.d.ts +0 -133
  41. package/dist/enums/email-template-locale.js +0 -135
  42. package/dist/enums/email-template-type.d.ts +0 -9
  43. package/dist/enums/email-template-type.js +0 -11
  44. package/dist/enums/entities/EntityLimitType.d.ts +0 -4
  45. package/dist/enums/entities/EntityLimitType.js +0 -6
  46. package/dist/enums/entities/PropertyAttributeName.d.ts +0 -27
  47. package/dist/enums/entities/PropertyAttributeName.js +0 -29
  48. package/dist/enums/entities/PropertyCondition.d.ts +0 -7
  49. package/dist/enums/entities/PropertyCondition.js +0 -10
  50. package/dist/enums/entities/PropertyType.d.ts +0 -12
  51. package/dist/enums/entities/PropertyType.js +0 -18
  52. package/dist/enums/entities/PropertyValueType.d.ts +0 -6
  53. package/dist/enums/entities/PropertyValueType.js +0 -8
  54. package/dist/enums/entities/RowAccess.d.ts +0 -2
  55. package/dist/enums/entities/RowAccess.js +0 -2
  56. package/dist/enums/entities/ViewFilterCondition.d.ts +0 -12
  57. package/dist/enums/entities/ViewFilterCondition.js +0 -14
  58. package/dist/enums/execution-method.d.ts +0 -8
  59. package/dist/enums/execution-method.js +0 -10
  60. package/dist/enums/flag.d.ts +0 -197
  61. package/dist/enums/flag.js +0 -199
  62. package/dist/enums/function-usage-range.d.ts +0 -5
  63. package/dist/enums/function-usage-range.js +0 -7
  64. package/dist/enums/image-format.d.ts +0 -7
  65. package/dist/enums/image-format.js +0 -9
  66. package/dist/enums/image-gravity.d.ts +0 -11
  67. package/dist/enums/image-gravity.js +0 -13
  68. package/dist/enums/index-type.d.ts +0 -5
  69. package/dist/enums/index-type.js +0 -7
  70. package/dist/enums/messaging-provider-type.d.ts +0 -5
  71. package/dist/enums/messaging-provider-type.js +0 -7
  72. package/dist/enums/name.d.ts +0 -14
  73. package/dist/enums/name.js +0 -16
  74. package/dist/enums/o-auth-provider copy.d.ts +0 -41
  75. package/dist/enums/o-auth-provider copy.js +0 -43
  76. package/dist/enums/o-auth-provider.d.ts +0 -41
  77. package/dist/enums/o-auth-provider.js +0 -42
  78. package/dist/enums/password-hash.d.ts +0 -13
  79. package/dist/enums/password-hash.js +0 -15
  80. package/dist/enums/platform-type.d.ts +0 -17
  81. package/dist/enums/platform-type.js +0 -19
  82. package/dist/enums/project-usage-range.d.ts +0 -4
  83. package/dist/enums/project-usage-range.js +0 -6
  84. package/dist/enums/region.d.ts +0 -4
  85. package/dist/enums/region.js +0 -6
  86. package/dist/enums/relation-mutate.d.ts +0 -5
  87. package/dist/enums/relation-mutate.js +0 -7
  88. package/dist/enums/relationship-type.d.ts +0 -6
  89. package/dist/enums/relationship-type.js +0 -8
  90. package/dist/enums/resource-type.d.ts +0 -4
  91. package/dist/enums/resource-type.js +0 -6
  92. package/dist/enums/runtime.d.ts +0 -48
  93. package/dist/enums/runtime.js +0 -50
  94. package/dist/enums/s-m-t-p-secure.d.ts +0 -3
  95. package/dist/enums/s-m-t-p-secure.js +0 -5
  96. package/dist/enums/shared/ApplicationLayout.d.ts +0 -4
  97. package/dist/enums/shared/ApplicationLayout.js +0 -6
  98. package/dist/enums/shared/Colors.d.ts +0 -24
  99. package/dist/enums/shared/Colors.js +0 -26
  100. package/dist/enums/shared/InputType.d.ts +0 -6
  101. package/dist/enums/shared/InputType.js +0 -8
  102. package/dist/enums/shared/Periodicity.d.ts +0 -7
  103. package/dist/enums/shared/Periodicity.js +0 -9
  104. package/dist/enums/shared/SvgIcon.d.ts +0 -37
  105. package/dist/enums/shared/SvgIcon.js +0 -39
  106. package/dist/enums/shared/Theme.d.ts +0 -4
  107. package/dist/enums/shared/Theme.js +0 -6
  108. package/dist/enums/sms-template-locale.d.ts +0 -133
  109. package/dist/enums/sms-template-locale.js +0 -135
  110. package/dist/enums/sms-template-type.d.ts +0 -6
  111. package/dist/enums/sms-template-type.js +0 -8
  112. package/dist/enums/smtp-encryption.d.ts +0 -5
  113. package/dist/enums/smtp-encryption.js +0 -7
  114. package/dist/enums/storage-usage-range.d.ts +0 -5
  115. package/dist/enums/storage-usage-range.js +0 -7
  116. package/dist/enums/subscriptions/PricingModel.d.ts +0 -11
  117. package/dist/enums/subscriptions/PricingModel.js +0 -12
  118. package/dist/enums/subscriptions/SubscriptionBillingPeriod.d.ts +0 -10
  119. package/dist/enums/subscriptions/SubscriptionBillingPeriod.js +0 -11
  120. package/dist/enums/subscriptions/SubscriptionFeatureLimitType.d.ts +0 -10
  121. package/dist/enums/subscriptions/SubscriptionFeatureLimitType.js +0 -13
  122. package/dist/enums/subscriptions/SubscriptionPriceType.d.ts +0 -7
  123. package/dist/enums/subscriptions/SubscriptionPriceType.js +0 -8
  124. package/dist/enums/tenants/LinkedAccountStatus.d.ts +0 -5
  125. package/dist/enums/tenants/LinkedAccountStatus.js +0 -7
  126. package/dist/enums/tenants/TenantUserJoined.d.ts +0 -6
  127. package/dist/enums/tenants/TenantUserJoined.js +0 -8
  128. package/dist/enums/tenants/TenantUserStatus.d.ts +0 -6
  129. package/dist/enums/tenants/TenantUserStatus.js +0 -8
  130. package/dist/enums/tenants/TenantUserType.d.ts +0 -5
  131. package/dist/enums/tenants/TenantUserType.js +0 -7
  132. package/dist/enums/user-usage-range.d.ts +0 -5
  133. package/dist/enums/user-usage-range.js +0 -7
  134. package/dist/getAppcondaClient.d.ts +0 -2
  135. package/dist/getAppcondaClient.js +0 -44
  136. package/dist/getSDKForCurrentUser.d.ts +0 -43
  137. package/dist/getSDKForCurrentUser.js +0 -76
  138. package/dist/getSDKForService.d.ts +0 -6
  139. package/dist/getSDKForService.js +0 -51
  140. package/dist/getSDKForTenant.d.ts +0 -20
  141. package/dist/getSDKForTenant.js +0 -44
  142. package/dist/id.d.ts +0 -20
  143. package/dist/id.js +0 -45
  144. package/dist/index.d.ts +0 -44
  145. package/dist/index.js +0 -42
  146. package/dist/inputFile.d.ts +0 -6
  147. package/dist/inputFile.js +0 -17
  148. package/dist/lib/Cache/Adapter.d.ts +0 -10
  149. package/dist/lib/Cache/Adapter.js +0 -2
  150. package/dist/lib/Cache/Adapters/Filesystem.d.ts +0 -16
  151. package/dist/lib/Cache/Adapters/Filesystem.js +0 -103
  152. package/dist/lib/Cache/Adapters/Memory.d.ts +0 -18
  153. package/dist/lib/Cache/Adapters/Memory.js +0 -47
  154. package/dist/lib/Cache/Adapters/None.d.ts +0 -12
  155. package/dist/lib/Cache/Adapters/None.js +0 -28
  156. package/dist/lib/Cache/Adapters/Sharding.d.ts +0 -17
  157. package/dist/lib/Cache/Adapters/Sharding.js +0 -73
  158. package/dist/lib/Cache/Cache.d.ts +0 -16
  159. package/dist/lib/Cache/Cache.js +0 -52
  160. package/dist/lib/Cache/index.d.ts +0 -4
  161. package/dist/lib/Cache/index.js +0 -5
  162. package/dist/lib/Cache/test.d.ts +0 -0
  163. package/dist/lib/Cache/test.js +0 -1
  164. package/dist/lib/Registry/Registry.d.ts +0 -38
  165. package/dist/lib/Registry/Registry.js +0 -56
  166. package/dist/lib/Registry/index.d.ts +0 -1
  167. package/dist/lib/Registry/index.js +0 -2
  168. package/dist/lib/Services.d.ts +0 -6
  169. package/dist/lib/Services.js +0 -14
  170. package/dist/lib/crypto.d.ts +0 -23
  171. package/dist/lib/crypto.js +0 -78
  172. package/dist/lib/env.d.ts +0 -1
  173. package/dist/lib/env.js +0 -137
  174. package/dist/lib/errors.d.ts +0 -70
  175. package/dist/lib/errors.js +0 -76
  176. package/dist/lib/index.d.ts +0 -2
  177. package/dist/lib/index.js +0 -3
  178. package/dist/lib/jwt.d.ts +0 -12
  179. package/dist/lib/jwt.js +0 -103
  180. package/dist/models.d.ts +0 -3272
  181. package/dist/models.js +0 -2
  182. package/dist/modules/account/actions.d.ts +0 -25
  183. package/dist/modules/account/actions.js +0 -18
  184. package/dist/modules/account/enums/authentication-factor.d.ts +0 -6
  185. package/dist/modules/account/enums/authentication-factor.js +0 -8
  186. package/dist/modules/account/enums/authenticator-type.d.ts +0 -3
  187. package/dist/modules/account/enums/authenticator-type.js +0 -5
  188. package/dist/modules/account/enums/o-auth-provider.d.ts +0 -41
  189. package/dist/modules/account/enums/o-auth-provider.js +0 -43
  190. package/dist/modules/account/index.d.ts +0 -3
  191. package/dist/modules/account/index.js +0 -4
  192. package/dist/modules/account/schema.d.ts +0 -17
  193. package/dist/modules/account/schema.js +0 -8
  194. package/dist/modules/account/service.d.ts +0 -530
  195. package/dist/modules/account/service.js +0 -1260
  196. package/dist/modules/account/types.d.ts +0 -411
  197. package/dist/modules/account/types.js +0 -2
  198. package/dist/modules/acl/service.d.ts +0 -26
  199. package/dist/modules/acl/service.js +0 -27
  200. package/dist/modules/agent/action.d.ts +0 -53
  201. package/dist/modules/agent/action.js +0 -64
  202. package/dist/modules/agent/index.d.ts +0 -4
  203. package/dist/modules/agent/index.js +0 -5
  204. package/dist/modules/agent/schema.d.ts +0 -48
  205. package/dist/modules/agent/schema.js +0 -21
  206. package/dist/modules/agent/service.d.ts +0 -12
  207. package/dist/modules/agent/service.js +0 -22
  208. package/dist/modules/agent/types.d.ts +0 -11
  209. package/dist/modules/agent/types.js +0 -2
  210. package/dist/modules/ai/index.d.ts +0 -1
  211. package/dist/modules/ai/index.js +0 -2
  212. package/dist/modules/ai/node/actions.d.ts +0 -4
  213. package/dist/modules/ai/node/actions.js +0 -16
  214. package/dist/modules/ai/node/index.d.ts +0 -2
  215. package/dist/modules/ai/node/index.js +0 -3
  216. package/dist/modules/ai/node/service.d.ts +0 -5
  217. package/dist/modules/ai/node/service.js +0 -12
  218. package/dist/modules/index.d.ts +0 -6
  219. package/dist/modules/index.js +0 -7
  220. package/dist/modules/task/action.d.ts +0 -168
  221. package/dist/modules/task/action.js +0 -163
  222. package/dist/modules/task/index.d.ts +0 -4
  223. package/dist/modules/task/index.js +0 -5
  224. package/dist/modules/task/schema.d.ts +0 -107
  225. package/dist/modules/task/schema.js +0 -44
  226. package/dist/modules/task/service.d.ts +0 -19
  227. package/dist/modules/task/service.js +0 -43
  228. package/dist/modules/task/types.d.ts +0 -84
  229. package/dist/modules/task/types.js +0 -2
  230. package/dist/modules/tenant/actions.d.ts +0 -45
  231. package/dist/modules/tenant/actions.js +0 -38
  232. package/dist/modules/tenant/index.d.ts +0 -3
  233. package/dist/modules/tenant/index.js +0 -4
  234. package/dist/modules/tenant/tenant.d.ts +0 -32
  235. package/dist/modules/tenant/tenant.js +0 -125
  236. package/dist/modules/tenant/types.d.ts +0 -11
  237. package/dist/modules/tenant/types.js +0 -2
  238. package/dist/modules/waitlist/action.d.ts +0 -69
  239. package/dist/modules/waitlist/action.js +0 -78
  240. package/dist/modules/waitlist/index.d.ts +0 -4
  241. package/dist/modules/waitlist/index.js +0 -5
  242. package/dist/modules/waitlist/schema.d.ts +0 -39
  243. package/dist/modules/waitlist/schema.js +0 -18
  244. package/dist/modules/waitlist/service.d.ts +0 -13
  245. package/dist/modules/waitlist/service.js +0 -28
  246. package/dist/modules/waitlist/types.d.ts +0 -14
  247. package/dist/modules/waitlist/types.js +0 -2
  248. package/dist/permission.d.ts +0 -43
  249. package/dist/permission.js +0 -54
  250. package/dist/query.d.ts +0 -194
  251. package/dist/query.js +0 -204
  252. package/dist/role.d.ts +0 -70
  253. package/dist/role.js +0 -94
  254. package/dist/schemas/nodes.d.ts +0 -0
  255. package/dist/schemas/nodes.js +0 -1
  256. package/dist/service-client.d.ts +0 -7
  257. package/dist/service-client.js +0 -14
  258. package/dist/service.d.ts +0 -11
  259. package/dist/service.js +0 -23
  260. package/dist/services/account.d.ts +0 -530
  261. package/dist/services/account.js +0 -1259
  262. package/dist/services/applets.d.ts +0 -9
  263. package/dist/services/applets.js +0 -40
  264. package/dist/services/avatars.d.ts +0 -115
  265. package/dist/services/avatars.js +0 -251
  266. package/dist/services/chat-flow.d.ts +0 -7
  267. package/dist/services/chat-flow.js +0 -26
  268. package/dist/services/community.d.ts +0 -19
  269. package/dist/services/community.js +0 -69
  270. package/dist/services/configuration.d.ts +0 -5
  271. package/dist/services/configuration.js +0 -11
  272. package/dist/services/databases.d.ts +0 -613
  273. package/dist/services/databases.js +0 -1736
  274. package/dist/services/functions.d.ts +0 -319
  275. package/dist/services/functions.js +0 -810
  276. package/dist/services/graphql.d.ts +0 -25
  277. package/dist/services/graphql.js +0 -57
  278. package/dist/services/health.d.ts +0 -231
  279. package/dist/services/health.js +0 -463
  280. package/dist/services/locale.d.ts +0 -80
  281. package/dist/services/locale.js +0 -144
  282. package/dist/services/messaging.d.ts +0 -685
  283. package/dist/services/messaging.js +0 -1920
  284. package/dist/services/node.d.ts +0 -5
  285. package/dist/services/node.js +0 -11
  286. package/dist/services/permissions.d.ts +0 -20
  287. package/dist/services/permissions.js +0 -90
  288. package/dist/services/pricing.d.ts +0 -15
  289. package/dist/services/pricing.js +0 -21
  290. package/dist/services/projects.d.ts +0 -542
  291. package/dist/services/projects.js +0 -1526
  292. package/dist/services/roles.d.ts +0 -19
  293. package/dist/services/roles.js +0 -72
  294. package/dist/services/schema.d.ts +0 -17
  295. package/dist/services/schema.js +0 -48
  296. package/dist/services/storage.d.ts +0 -189
  297. package/dist/services/storage.js +0 -474
  298. package/dist/services/subscription.d.ts +0 -15
  299. package/dist/services/subscription.js +0 -30
  300. package/dist/services/teams.d.ts +0 -167
  301. package/dist/services/teams.js +0 -395
  302. package/dist/services/tenant-subscription.d.ts +0 -12
  303. package/dist/services/tenant-subscription.js +0 -52
  304. package/dist/services/tenant.d.ts +0 -32
  305. package/dist/services/tenant.js +0 -124
  306. package/dist/services/users.d.ts +0 -499
  307. package/dist/services/users.js +0 -1283
@@ -1,1920 +0,0 @@
1
- import { AppcondaException } from '../client';
2
- export class Messaging {
3
- constructor(client) {
4
- this.client = client;
5
- }
6
- /**
7
- * List messages
8
- *
9
- * Get a list of all messages from the current Appconda project.
10
- *
11
- * @param {string[]} queries
12
- * @param {string} search
13
- * @throws {AppcondaException}
14
- * @returns {Promise<Models.MessageList>}
15
- */
16
- async listMessages(queries, search) {
17
- const apiPath = '/messaging/messages';
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 email
33
- *
34
- * Create a new email message.
35
- *
36
- * @param {string} messageId
37
- * @param {string} subject
38
- * @param {string} content
39
- * @param {string[]} topics
40
- * @param {string[]} users
41
- * @param {string[]} targets
42
- * @param {string[]} cc
43
- * @param {string[]} bcc
44
- * @param {string[]} attachments
45
- * @param {boolean} draft
46
- * @param {boolean} html
47
- * @param {string} scheduledAt
48
- * @throws {AppcondaException}
49
- * @returns {Promise<Models.Message>}
50
- */
51
- async createEmail(messageId, subject, content, topics, users, targets, cc, bcc, attachments, draft, html, scheduledAt) {
52
- if (typeof messageId === 'undefined') {
53
- throw new AppcondaException('Missing required parameter: "messageId"');
54
- }
55
- if (typeof subject === 'undefined') {
56
- throw new AppcondaException('Missing required parameter: "subject"');
57
- }
58
- if (typeof content === 'undefined') {
59
- throw new AppcondaException('Missing required parameter: "content"');
60
- }
61
- const apiPath = '/messaging/messages/email';
62
- const payload = {};
63
- if (typeof messageId !== 'undefined') {
64
- payload['messageId'] = messageId;
65
- }
66
- if (typeof subject !== 'undefined') {
67
- payload['subject'] = subject;
68
- }
69
- if (typeof content !== 'undefined') {
70
- payload['content'] = content;
71
- }
72
- if (typeof topics !== 'undefined') {
73
- payload['topics'] = topics;
74
- }
75
- if (typeof users !== 'undefined') {
76
- payload['users'] = users;
77
- }
78
- if (typeof targets !== 'undefined') {
79
- payload['targets'] = targets;
80
- }
81
- if (typeof cc !== 'undefined') {
82
- payload['cc'] = cc;
83
- }
84
- if (typeof bcc !== 'undefined') {
85
- payload['bcc'] = bcc;
86
- }
87
- if (typeof attachments !== 'undefined') {
88
- payload['attachments'] = attachments;
89
- }
90
- if (typeof draft !== 'undefined') {
91
- payload['draft'] = draft;
92
- }
93
- if (typeof html !== 'undefined') {
94
- payload['html'] = html;
95
- }
96
- if (typeof scheduledAt !== 'undefined') {
97
- payload['scheduledAt'] = scheduledAt;
98
- }
99
- const uri = new URL(this.client.config.endpoint + apiPath);
100
- const apiHeaders = {
101
- 'content-type': 'application/json',
102
- };
103
- return await this.client.call('post', uri, apiHeaders, payload);
104
- }
105
- /**
106
- * Update email
107
- *
108
- * Update an email message by its unique ID.
109
-
110
- *
111
- * @param {string} messageId
112
- * @param {string[]} topics
113
- * @param {string[]} users
114
- * @param {string[]} targets
115
- * @param {string} subject
116
- * @param {string} content
117
- * @param {boolean} draft
118
- * @param {boolean} html
119
- * @param {string[]} cc
120
- * @param {string[]} bcc
121
- * @param {string} scheduledAt
122
- * @param {string[]} attachments
123
- * @throws {AppcondaException}
124
- * @returns {Promise<Models.Message>}
125
- */
126
- async updateEmail(messageId, topics, users, targets, subject, content, draft, html, cc, bcc, scheduledAt, attachments) {
127
- if (typeof messageId === 'undefined') {
128
- throw new AppcondaException('Missing required parameter: "messageId"');
129
- }
130
- const apiPath = '/messaging/messages/email/{messageId}'.replace('{messageId}', messageId);
131
- const payload = {};
132
- if (typeof topics !== 'undefined') {
133
- payload['topics'] = topics;
134
- }
135
- if (typeof users !== 'undefined') {
136
- payload['users'] = users;
137
- }
138
- if (typeof targets !== 'undefined') {
139
- payload['targets'] = targets;
140
- }
141
- if (typeof subject !== 'undefined') {
142
- payload['subject'] = subject;
143
- }
144
- if (typeof content !== 'undefined') {
145
- payload['content'] = content;
146
- }
147
- if (typeof draft !== 'undefined') {
148
- payload['draft'] = draft;
149
- }
150
- if (typeof html !== 'undefined') {
151
- payload['html'] = html;
152
- }
153
- if (typeof cc !== 'undefined') {
154
- payload['cc'] = cc;
155
- }
156
- if (typeof bcc !== 'undefined') {
157
- payload['bcc'] = bcc;
158
- }
159
- if (typeof scheduledAt !== 'undefined') {
160
- payload['scheduledAt'] = scheduledAt;
161
- }
162
- if (typeof attachments !== 'undefined') {
163
- payload['attachments'] = attachments;
164
- }
165
- const uri = new URL(this.client.config.endpoint + apiPath);
166
- const apiHeaders = {
167
- 'content-type': 'application/json',
168
- };
169
- return await this.client.call('patch', uri, apiHeaders, payload);
170
- }
171
- /**
172
- * Create push notification
173
- *
174
- * Create a new push notification.
175
- *
176
- * @param {string} messageId
177
- * @param {string} title
178
- * @param {string} body
179
- * @param {string[]} topics
180
- * @param {string[]} users
181
- * @param {string[]} targets
182
- * @param {object} data
183
- * @param {string} action
184
- * @param {string} image
185
- * @param {string} icon
186
- * @param {string} sound
187
- * @param {string} color
188
- * @param {string} tag
189
- * @param {string} badge
190
- * @param {boolean} draft
191
- * @param {string} scheduledAt
192
- * @throws {AppcondaException}
193
- * @returns {Promise<Models.Message>}
194
- */
195
- async createPush(messageId, title, body, topics, users, targets, data, action, image, icon, sound, color, tag, badge, draft, scheduledAt) {
196
- if (typeof messageId === 'undefined') {
197
- throw new AppcondaException('Missing required parameter: "messageId"');
198
- }
199
- if (typeof title === 'undefined') {
200
- throw new AppcondaException('Missing required parameter: "title"');
201
- }
202
- if (typeof body === 'undefined') {
203
- throw new AppcondaException('Missing required parameter: "body"');
204
- }
205
- const apiPath = '/messaging/messages/push';
206
- const payload = {};
207
- if (typeof messageId !== 'undefined') {
208
- payload['messageId'] = messageId;
209
- }
210
- if (typeof title !== 'undefined') {
211
- payload['title'] = title;
212
- }
213
- if (typeof body !== 'undefined') {
214
- payload['body'] = body;
215
- }
216
- if (typeof topics !== 'undefined') {
217
- payload['topics'] = topics;
218
- }
219
- if (typeof users !== 'undefined') {
220
- payload['users'] = users;
221
- }
222
- if (typeof targets !== 'undefined') {
223
- payload['targets'] = targets;
224
- }
225
- if (typeof data !== 'undefined') {
226
- payload['data'] = data;
227
- }
228
- if (typeof action !== 'undefined') {
229
- payload['action'] = action;
230
- }
231
- if (typeof image !== 'undefined') {
232
- payload['image'] = image;
233
- }
234
- if (typeof icon !== 'undefined') {
235
- payload['icon'] = icon;
236
- }
237
- if (typeof sound !== 'undefined') {
238
- payload['sound'] = sound;
239
- }
240
- if (typeof color !== 'undefined') {
241
- payload['color'] = color;
242
- }
243
- if (typeof tag !== 'undefined') {
244
- payload['tag'] = tag;
245
- }
246
- if (typeof badge !== 'undefined') {
247
- payload['badge'] = badge;
248
- }
249
- if (typeof draft !== 'undefined') {
250
- payload['draft'] = draft;
251
- }
252
- if (typeof scheduledAt !== 'undefined') {
253
- payload['scheduledAt'] = scheduledAt;
254
- }
255
- const uri = new URL(this.client.config.endpoint + apiPath);
256
- const apiHeaders = {
257
- 'content-type': 'application/json',
258
- };
259
- return await this.client.call('post', uri, apiHeaders, payload);
260
- }
261
- /**
262
- * Update push notification
263
- *
264
- * Update a push notification by its unique ID.
265
-
266
- *
267
- * @param {string} messageId
268
- * @param {string[]} topics
269
- * @param {string[]} users
270
- * @param {string[]} targets
271
- * @param {string} title
272
- * @param {string} body
273
- * @param {object} data
274
- * @param {string} action
275
- * @param {string} image
276
- * @param {string} icon
277
- * @param {string} sound
278
- * @param {string} color
279
- * @param {string} tag
280
- * @param {number} badge
281
- * @param {boolean} draft
282
- * @param {string} scheduledAt
283
- * @throws {AppcondaException}
284
- * @returns {Promise<Models.Message>}
285
- */
286
- async updatePush(messageId, topics, users, targets, title, body, data, action, image, icon, sound, color, tag, badge, draft, scheduledAt) {
287
- if (typeof messageId === 'undefined') {
288
- throw new AppcondaException('Missing required parameter: "messageId"');
289
- }
290
- const apiPath = '/messaging/messages/push/{messageId}'.replace('{messageId}', messageId);
291
- const payload = {};
292
- if (typeof topics !== 'undefined') {
293
- payload['topics'] = topics;
294
- }
295
- if (typeof users !== 'undefined') {
296
- payload['users'] = users;
297
- }
298
- if (typeof targets !== 'undefined') {
299
- payload['targets'] = targets;
300
- }
301
- if (typeof title !== 'undefined') {
302
- payload['title'] = title;
303
- }
304
- if (typeof body !== 'undefined') {
305
- payload['body'] = body;
306
- }
307
- if (typeof data !== 'undefined') {
308
- payload['data'] = data;
309
- }
310
- if (typeof action !== 'undefined') {
311
- payload['action'] = action;
312
- }
313
- if (typeof image !== 'undefined') {
314
- payload['image'] = image;
315
- }
316
- if (typeof icon !== 'undefined') {
317
- payload['icon'] = icon;
318
- }
319
- if (typeof sound !== 'undefined') {
320
- payload['sound'] = sound;
321
- }
322
- if (typeof color !== 'undefined') {
323
- payload['color'] = color;
324
- }
325
- if (typeof tag !== 'undefined') {
326
- payload['tag'] = tag;
327
- }
328
- if (typeof badge !== 'undefined') {
329
- payload['badge'] = badge;
330
- }
331
- if (typeof draft !== 'undefined') {
332
- payload['draft'] = draft;
333
- }
334
- if (typeof scheduledAt !== 'undefined') {
335
- payload['scheduledAt'] = scheduledAt;
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('patch', uri, apiHeaders, payload);
342
- }
343
- /**
344
- * Create SMS
345
- *
346
- * Create a new SMS message.
347
- *
348
- * @param {string} messageId
349
- * @param {string} content
350
- * @param {string[]} topics
351
- * @param {string[]} users
352
- * @param {string[]} targets
353
- * @param {boolean} draft
354
- * @param {string} scheduledAt
355
- * @throws {AppcondaException}
356
- * @returns {Promise<Models.Message>}
357
- */
358
- async createSms(messageId, content, topics, users, targets, draft, scheduledAt) {
359
- if (typeof messageId === 'undefined') {
360
- throw new AppcondaException('Missing required parameter: "messageId"');
361
- }
362
- if (typeof content === 'undefined') {
363
- throw new AppcondaException('Missing required parameter: "content"');
364
- }
365
- const apiPath = '/messaging/messages/sms';
366
- const payload = {};
367
- if (typeof messageId !== 'undefined') {
368
- payload['messageId'] = messageId;
369
- }
370
- if (typeof content !== 'undefined') {
371
- payload['content'] = content;
372
- }
373
- if (typeof topics !== 'undefined') {
374
- payload['topics'] = topics;
375
- }
376
- if (typeof users !== 'undefined') {
377
- payload['users'] = users;
378
- }
379
- if (typeof targets !== 'undefined') {
380
- payload['targets'] = targets;
381
- }
382
- if (typeof draft !== 'undefined') {
383
- payload['draft'] = draft;
384
- }
385
- if (typeof scheduledAt !== 'undefined') {
386
- payload['scheduledAt'] = scheduledAt;
387
- }
388
- const uri = new URL(this.client.config.endpoint + apiPath);
389
- const apiHeaders = {
390
- 'content-type': 'application/json',
391
- };
392
- return await this.client.call('post', uri, apiHeaders, payload);
393
- }
394
- /**
395
- * Update SMS
396
- *
397
- * Update an email message by its unique ID.
398
-
399
- *
400
- * @param {string} messageId
401
- * @param {string[]} topics
402
- * @param {string[]} users
403
- * @param {string[]} targets
404
- * @param {string} content
405
- * @param {boolean} draft
406
- * @param {string} scheduledAt
407
- * @throws {AppcondaException}
408
- * @returns {Promise<Models.Message>}
409
- */
410
- async updateSms(messageId, topics, users, targets, content, draft, scheduledAt) {
411
- if (typeof messageId === 'undefined') {
412
- throw new AppcondaException('Missing required parameter: "messageId"');
413
- }
414
- const apiPath = '/messaging/messages/sms/{messageId}'.replace('{messageId}', messageId);
415
- const payload = {};
416
- if (typeof topics !== 'undefined') {
417
- payload['topics'] = topics;
418
- }
419
- if (typeof users !== 'undefined') {
420
- payload['users'] = users;
421
- }
422
- if (typeof targets !== 'undefined') {
423
- payload['targets'] = targets;
424
- }
425
- if (typeof content !== 'undefined') {
426
- payload['content'] = content;
427
- }
428
- if (typeof draft !== 'undefined') {
429
- payload['draft'] = draft;
430
- }
431
- if (typeof scheduledAt !== 'undefined') {
432
- payload['scheduledAt'] = scheduledAt;
433
- }
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
- * Get message
442
- *
443
- * Get a message by its unique ID.
444
-
445
- *
446
- * @param {string} messageId
447
- * @throws {AppcondaException}
448
- * @returns {Promise<Models.Message>}
449
- */
450
- async getMessage(messageId) {
451
- if (typeof messageId === 'undefined') {
452
- throw new AppcondaException('Missing required parameter: "messageId"');
453
- }
454
- const apiPath = '/messaging/messages/{messageId}'.replace('{messageId}', messageId);
455
- const payload = {};
456
- const uri = new URL(this.client.config.endpoint + apiPath);
457
- const apiHeaders = {
458
- 'content-type': 'application/json',
459
- };
460
- return await this.client.call('get', uri, apiHeaders, payload);
461
- }
462
- /**
463
- * Delete message
464
- *
465
- * Delete a message. If the message is not a draft or scheduled, but has been sent, this will not recall the message.
466
- *
467
- * @param {string} messageId
468
- * @throws {AppcondaException}
469
- * @returns {Promise<{}>}
470
- */
471
- async delete(messageId) {
472
- if (typeof messageId === 'undefined') {
473
- throw new AppcondaException('Missing required parameter: "messageId"');
474
- }
475
- const apiPath = '/messaging/messages/{messageId}'.replace('{messageId}', messageId);
476
- const payload = {};
477
- const uri = new URL(this.client.config.endpoint + apiPath);
478
- const apiHeaders = {
479
- 'content-type': 'application/json',
480
- };
481
- return await this.client.call('delete', uri, apiHeaders, payload);
482
- }
483
- /**
484
- * List message logs
485
- *
486
- * Get the message activity logs listed by its unique ID.
487
- *
488
- * @param {string} messageId
489
- * @param {string[]} queries
490
- * @throws {AppcondaException}
491
- * @returns {Promise<Models.LogList>}
492
- */
493
- async listMessageLogs(messageId, queries) {
494
- if (typeof messageId === 'undefined') {
495
- throw new AppcondaException('Missing required parameter: "messageId"');
496
- }
497
- const apiPath = '/messaging/messages/{messageId}/logs'.replace('{messageId}', messageId);
498
- const payload = {};
499
- if (typeof queries !== 'undefined') {
500
- payload['queries'] = queries;
501
- }
502
- const uri = new URL(this.client.config.endpoint + apiPath);
503
- const apiHeaders = {
504
- 'content-type': 'application/json',
505
- };
506
- return await this.client.call('get', uri, apiHeaders, payload);
507
- }
508
- /**
509
- * List message targets
510
- *
511
- * Get a list of the targets associated with a message.
512
- *
513
- * @param {string} messageId
514
- * @param {string[]} queries
515
- * @throws {AppcondaException}
516
- * @returns {Promise<Models.TargetList>}
517
- */
518
- async listTargets(messageId, queries) {
519
- if (typeof messageId === 'undefined') {
520
- throw new AppcondaException('Missing required parameter: "messageId"');
521
- }
522
- const apiPath = '/messaging/messages/{messageId}/targets'.replace('{messageId}', messageId);
523
- const payload = {};
524
- if (typeof queries !== 'undefined') {
525
- payload['queries'] = queries;
526
- }
527
- const uri = new URL(this.client.config.endpoint + apiPath);
528
- const apiHeaders = {
529
- 'content-type': 'application/json',
530
- };
531
- return await this.client.call('get', uri, apiHeaders, payload);
532
- }
533
- /**
534
- * List providers
535
- *
536
- * Get a list of all providers from the current Appconda project.
537
- *
538
- * @param {string[]} queries
539
- * @param {string} search
540
- * @throws {AppcondaException}
541
- * @returns {Promise<Models.ProviderList>}
542
- */
543
- async listProviders(queries, search) {
544
- const apiPath = '/messaging/providers';
545
- const payload = {};
546
- if (typeof queries !== 'undefined') {
547
- payload['queries'] = queries;
548
- }
549
- if (typeof search !== 'undefined') {
550
- payload['search'] = search;
551
- }
552
- const uri = new URL(this.client.config.endpoint + apiPath);
553
- const apiHeaders = {
554
- 'content-type': 'application/json',
555
- };
556
- return await this.client.call('get', uri, apiHeaders, payload);
557
- }
558
- /**
559
- * Create APNS provider
560
- *
561
- * Create a new Apple Push Notification service provider.
562
- *
563
- * @param {string} providerId
564
- * @param {string} name
565
- * @param {string} authKey
566
- * @param {string} authKeyId
567
- * @param {string} teamId
568
- * @param {string} bundleId
569
- * @param {boolean} sandbox
570
- * @param {boolean} enabled
571
- * @throws {AppcondaException}
572
- * @returns {Promise<Models.Provider>}
573
- */
574
- async createApnsProvider(providerId, name, authKey, authKeyId, teamId, bundleId, sandbox, enabled) {
575
- if (typeof providerId === 'undefined') {
576
- throw new AppcondaException('Missing required parameter: "providerId"');
577
- }
578
- if (typeof name === 'undefined') {
579
- throw new AppcondaException('Missing required parameter: "name"');
580
- }
581
- const apiPath = '/messaging/providers/apns';
582
- const payload = {};
583
- if (typeof providerId !== 'undefined') {
584
- payload['providerId'] = providerId;
585
- }
586
- if (typeof name !== 'undefined') {
587
- payload['name'] = name;
588
- }
589
- if (typeof authKey !== 'undefined') {
590
- payload['authKey'] = authKey;
591
- }
592
- if (typeof authKeyId !== 'undefined') {
593
- payload['authKeyId'] = authKeyId;
594
- }
595
- if (typeof teamId !== 'undefined') {
596
- payload['teamId'] = teamId;
597
- }
598
- if (typeof bundleId !== 'undefined') {
599
- payload['bundleId'] = bundleId;
600
- }
601
- if (typeof sandbox !== 'undefined') {
602
- payload['sandbox'] = sandbox;
603
- }
604
- if (typeof enabled !== 'undefined') {
605
- payload['enabled'] = enabled;
606
- }
607
- const uri = new URL(this.client.config.endpoint + apiPath);
608
- const apiHeaders = {
609
- 'content-type': 'application/json',
610
- };
611
- return await this.client.call('post', uri, apiHeaders, payload);
612
- }
613
- /**
614
- * Update APNS provider
615
- *
616
- * Update a Apple Push Notification service provider by its unique ID.
617
- *
618
- * @param {string} providerId
619
- * @param {string} name
620
- * @param {boolean} enabled
621
- * @param {string} authKey
622
- * @param {string} authKeyId
623
- * @param {string} teamId
624
- * @param {string} bundleId
625
- * @param {boolean} sandbox
626
- * @throws {AppcondaException}
627
- * @returns {Promise<Models.Provider>}
628
- */
629
- async updateApnsProvider(providerId, name, enabled, authKey, authKeyId, teamId, bundleId, sandbox) {
630
- if (typeof providerId === 'undefined') {
631
- throw new AppcondaException('Missing required parameter: "providerId"');
632
- }
633
- const apiPath = '/messaging/providers/apns/{providerId}'.replace('{providerId}', providerId);
634
- const payload = {};
635
- if (typeof name !== 'undefined') {
636
- payload['name'] = name;
637
- }
638
- if (typeof enabled !== 'undefined') {
639
- payload['enabled'] = enabled;
640
- }
641
- if (typeof authKey !== 'undefined') {
642
- payload['authKey'] = authKey;
643
- }
644
- if (typeof authKeyId !== 'undefined') {
645
- payload['authKeyId'] = authKeyId;
646
- }
647
- if (typeof teamId !== 'undefined') {
648
- payload['teamId'] = teamId;
649
- }
650
- if (typeof bundleId !== 'undefined') {
651
- payload['bundleId'] = bundleId;
652
- }
653
- if (typeof sandbox !== 'undefined') {
654
- payload['sandbox'] = sandbox;
655
- }
656
- const uri = new URL(this.client.config.endpoint + apiPath);
657
- const apiHeaders = {
658
- 'content-type': 'application/json',
659
- };
660
- return await this.client.call('patch', uri, apiHeaders, payload);
661
- }
662
- /**
663
- * Create FCM provider
664
- *
665
- * Create a new Firebase Cloud Messaging provider.
666
- *
667
- * @param {string} providerId
668
- * @param {string} name
669
- * @param {object} serviceAccountJSON
670
- * @param {boolean} enabled
671
- * @throws {AppcondaException}
672
- * @returns {Promise<Models.Provider>}
673
- */
674
- async createFcmProvider(providerId, name, serviceAccountJSON, enabled) {
675
- if (typeof providerId === 'undefined') {
676
- throw new AppcondaException('Missing required parameter: "providerId"');
677
- }
678
- if (typeof name === 'undefined') {
679
- throw new AppcondaException('Missing required parameter: "name"');
680
- }
681
- const apiPath = '/messaging/providers/fcm';
682
- const payload = {};
683
- if (typeof providerId !== 'undefined') {
684
- payload['providerId'] = providerId;
685
- }
686
- if (typeof name !== 'undefined') {
687
- payload['name'] = name;
688
- }
689
- if (typeof serviceAccountJSON !== 'undefined') {
690
- payload['serviceAccountJSON'] = serviceAccountJSON;
691
- }
692
- if (typeof enabled !== 'undefined') {
693
- payload['enabled'] = enabled;
694
- }
695
- const uri = new URL(this.client.config.endpoint + apiPath);
696
- const apiHeaders = {
697
- 'content-type': 'application/json',
698
- };
699
- return await this.client.call('post', uri, apiHeaders, payload);
700
- }
701
- /**
702
- * Update FCM provider
703
- *
704
- * Update a Firebase Cloud Messaging provider by its unique ID.
705
- *
706
- * @param {string} providerId
707
- * @param {string} name
708
- * @param {boolean} enabled
709
- * @param {object} serviceAccountJSON
710
- * @throws {AppcondaException}
711
- * @returns {Promise<Models.Provider>}
712
- */
713
- async updateFcmProvider(providerId, name, enabled, serviceAccountJSON) {
714
- if (typeof providerId === 'undefined') {
715
- throw new AppcondaException('Missing required parameter: "providerId"');
716
- }
717
- const apiPath = '/messaging/providers/fcm/{providerId}'.replace('{providerId}', providerId);
718
- const payload = {};
719
- if (typeof name !== 'undefined') {
720
- payload['name'] = name;
721
- }
722
- if (typeof enabled !== 'undefined') {
723
- payload['enabled'] = enabled;
724
- }
725
- if (typeof serviceAccountJSON !== 'undefined') {
726
- payload['serviceAccountJSON'] = serviceAccountJSON;
727
- }
728
- const uri = new URL(this.client.config.endpoint + apiPath);
729
- const apiHeaders = {
730
- 'content-type': 'application/json',
731
- };
732
- return await this.client.call('patch', uri, apiHeaders, payload);
733
- }
734
- /**
735
- * Create Mailgun provider
736
- *
737
- * Create a new Mailgun provider.
738
- *
739
- * @param {string} providerId
740
- * @param {string} name
741
- * @param {string} apiKey
742
- * @param {string} domain
743
- * @param {boolean} isEuRegion
744
- * @param {string} fromName
745
- * @param {string} fromEmail
746
- * @param {string} replyToName
747
- * @param {string} replyToEmail
748
- * @param {boolean} enabled
749
- * @throws {AppcondaException}
750
- * @returns {Promise<Models.Provider>}
751
- */
752
- async createMailgunProvider(providerId, name, apiKey, domain, isEuRegion, fromName, fromEmail, replyToName, replyToEmail, enabled) {
753
- if (typeof providerId === 'undefined') {
754
- throw new AppcondaException('Missing required parameter: "providerId"');
755
- }
756
- if (typeof name === 'undefined') {
757
- throw new AppcondaException('Missing required parameter: "name"');
758
- }
759
- const apiPath = '/messaging/providers/mailgun';
760
- const payload = {};
761
- if (typeof providerId !== 'undefined') {
762
- payload['providerId'] = providerId;
763
- }
764
- if (typeof name !== 'undefined') {
765
- payload['name'] = name;
766
- }
767
- if (typeof apiKey !== 'undefined') {
768
- payload['apiKey'] = apiKey;
769
- }
770
- if (typeof domain !== 'undefined') {
771
- payload['domain'] = domain;
772
- }
773
- if (typeof isEuRegion !== 'undefined') {
774
- payload['isEuRegion'] = isEuRegion;
775
- }
776
- if (typeof fromName !== 'undefined') {
777
- payload['fromName'] = fromName;
778
- }
779
- if (typeof fromEmail !== 'undefined') {
780
- payload['fromEmail'] = fromEmail;
781
- }
782
- if (typeof replyToName !== 'undefined') {
783
- payload['replyToName'] = replyToName;
784
- }
785
- if (typeof replyToEmail !== 'undefined') {
786
- payload['replyToEmail'] = replyToEmail;
787
- }
788
- if (typeof enabled !== 'undefined') {
789
- payload['enabled'] = enabled;
790
- }
791
- const uri = new URL(this.client.config.endpoint + apiPath);
792
- const apiHeaders = {
793
- 'content-type': 'application/json',
794
- };
795
- return await this.client.call('post', uri, apiHeaders, payload);
796
- }
797
- /**
798
- * Update Mailgun provider
799
- *
800
- * Update a Mailgun provider by its unique ID.
801
- *
802
- * @param {string} providerId
803
- * @param {string} name
804
- * @param {string} apiKey
805
- * @param {string} domain
806
- * @param {boolean} isEuRegion
807
- * @param {boolean} enabled
808
- * @param {string} fromName
809
- * @param {string} fromEmail
810
- * @param {string} replyToName
811
- * @param {string} replyToEmail
812
- * @throws {AppcondaException}
813
- * @returns {Promise<Models.Provider>}
814
- */
815
- async updateMailgunProvider(providerId, name, apiKey, domain, isEuRegion, enabled, fromName, fromEmail, replyToName, replyToEmail) {
816
- if (typeof providerId === 'undefined') {
817
- throw new AppcondaException('Missing required parameter: "providerId"');
818
- }
819
- const apiPath = '/messaging/providers/mailgun/{providerId}'.replace('{providerId}', providerId);
820
- const payload = {};
821
- if (typeof name !== 'undefined') {
822
- payload['name'] = name;
823
- }
824
- if (typeof apiKey !== 'undefined') {
825
- payload['apiKey'] = apiKey;
826
- }
827
- if (typeof domain !== 'undefined') {
828
- payload['domain'] = domain;
829
- }
830
- if (typeof isEuRegion !== 'undefined') {
831
- payload['isEuRegion'] = isEuRegion;
832
- }
833
- if (typeof enabled !== 'undefined') {
834
- payload['enabled'] = enabled;
835
- }
836
- if (typeof fromName !== 'undefined') {
837
- payload['fromName'] = fromName;
838
- }
839
- if (typeof fromEmail !== 'undefined') {
840
- payload['fromEmail'] = fromEmail;
841
- }
842
- if (typeof replyToName !== 'undefined') {
843
- payload['replyToName'] = replyToName;
844
- }
845
- if (typeof replyToEmail !== 'undefined') {
846
- payload['replyToEmail'] = replyToEmail;
847
- }
848
- const uri = new URL(this.client.config.endpoint + apiPath);
849
- const apiHeaders = {
850
- 'content-type': 'application/json',
851
- };
852
- return await this.client.call('patch', uri, apiHeaders, payload);
853
- }
854
- /**
855
- * Create Msg91 provider
856
- *
857
- * Create a new MSG91 provider.
858
- *
859
- * @param {string} providerId
860
- * @param {string} name
861
- * @param {string} templateId
862
- * @param {string} senderId
863
- * @param {string} authKey
864
- * @param {boolean} enabled
865
- * @throws {AppcondaException}
866
- * @returns {Promise<Models.Provider>}
867
- */
868
- async createMsg91Provider(providerId, name, templateId, senderId, authKey, enabled) {
869
- if (typeof providerId === 'undefined') {
870
- throw new AppcondaException('Missing required parameter: "providerId"');
871
- }
872
- if (typeof name === 'undefined') {
873
- throw new AppcondaException('Missing required parameter: "name"');
874
- }
875
- const apiPath = '/messaging/providers/msg91';
876
- const payload = {};
877
- if (typeof providerId !== 'undefined') {
878
- payload['providerId'] = providerId;
879
- }
880
- if (typeof name !== 'undefined') {
881
- payload['name'] = name;
882
- }
883
- if (typeof templateId !== 'undefined') {
884
- payload['templateId'] = templateId;
885
- }
886
- if (typeof senderId !== 'undefined') {
887
- payload['senderId'] = senderId;
888
- }
889
- if (typeof authKey !== 'undefined') {
890
- payload['authKey'] = authKey;
891
- }
892
- if (typeof enabled !== 'undefined') {
893
- payload['enabled'] = enabled;
894
- }
895
- const uri = new URL(this.client.config.endpoint + apiPath);
896
- const apiHeaders = {
897
- 'content-type': 'application/json',
898
- };
899
- return await this.client.call('post', uri, apiHeaders, payload);
900
- }
901
- /**
902
- * Update Msg91 provider
903
- *
904
- * Update a MSG91 provider by its unique ID.
905
- *
906
- * @param {string} providerId
907
- * @param {string} name
908
- * @param {boolean} enabled
909
- * @param {string} templateId
910
- * @param {string} senderId
911
- * @param {string} authKey
912
- * @throws {AppcondaException}
913
- * @returns {Promise<Models.Provider>}
914
- */
915
- async updateMsg91Provider(providerId, name, enabled, templateId, senderId, authKey) {
916
- if (typeof providerId === 'undefined') {
917
- throw new AppcondaException('Missing required parameter: "providerId"');
918
- }
919
- const apiPath = '/messaging/providers/msg91/{providerId}'.replace('{providerId}', providerId);
920
- const payload = {};
921
- if (typeof name !== 'undefined') {
922
- payload['name'] = name;
923
- }
924
- if (typeof enabled !== 'undefined') {
925
- payload['enabled'] = enabled;
926
- }
927
- if (typeof templateId !== 'undefined') {
928
- payload['templateId'] = templateId;
929
- }
930
- if (typeof senderId !== 'undefined') {
931
- payload['senderId'] = senderId;
932
- }
933
- if (typeof authKey !== 'undefined') {
934
- payload['authKey'] = authKey;
935
- }
936
- const uri = new URL(this.client.config.endpoint + apiPath);
937
- const apiHeaders = {
938
- 'content-type': 'application/json',
939
- };
940
- return await this.client.call('patch', uri, apiHeaders, payload);
941
- }
942
- /**
943
- * Create Sendgrid provider
944
- *
945
- * Create a new Sendgrid provider.
946
- *
947
- * @param {string} providerId
948
- * @param {string} name
949
- * @param {string} apiKey
950
- * @param {string} fromName
951
- * @param {string} fromEmail
952
- * @param {string} replyToName
953
- * @param {string} replyToEmail
954
- * @param {boolean} enabled
955
- * @throws {AppcondaException}
956
- * @returns {Promise<Models.Provider>}
957
- */
958
- async createSendgridProvider(providerId, name, apiKey, fromName, fromEmail, replyToName, replyToEmail, enabled) {
959
- if (typeof providerId === 'undefined') {
960
- throw new AppcondaException('Missing required parameter: "providerId"');
961
- }
962
- if (typeof name === 'undefined') {
963
- throw new AppcondaException('Missing required parameter: "name"');
964
- }
965
- const apiPath = '/messaging/providers/sendgrid';
966
- const payload = {};
967
- if (typeof providerId !== 'undefined') {
968
- payload['providerId'] = providerId;
969
- }
970
- if (typeof name !== 'undefined') {
971
- payload['name'] = name;
972
- }
973
- if (typeof apiKey !== 'undefined') {
974
- payload['apiKey'] = apiKey;
975
- }
976
- if (typeof fromName !== 'undefined') {
977
- payload['fromName'] = fromName;
978
- }
979
- if (typeof fromEmail !== 'undefined') {
980
- payload['fromEmail'] = fromEmail;
981
- }
982
- if (typeof replyToName !== 'undefined') {
983
- payload['replyToName'] = replyToName;
984
- }
985
- if (typeof replyToEmail !== 'undefined') {
986
- payload['replyToEmail'] = replyToEmail;
987
- }
988
- if (typeof enabled !== 'undefined') {
989
- payload['enabled'] = enabled;
990
- }
991
- const uri = new URL(this.client.config.endpoint + apiPath);
992
- const apiHeaders = {
993
- 'content-type': 'application/json',
994
- };
995
- return await this.client.call('post', uri, apiHeaders, payload);
996
- }
997
- /**
998
- * Update Sendgrid provider
999
- *
1000
- * Update a Sendgrid provider by its unique ID.
1001
- *
1002
- * @param {string} providerId
1003
- * @param {string} name
1004
- * @param {boolean} enabled
1005
- * @param {string} apiKey
1006
- * @param {string} fromName
1007
- * @param {string} fromEmail
1008
- * @param {string} replyToName
1009
- * @param {string} replyToEmail
1010
- * @throws {AppcondaException}
1011
- * @returns {Promise<Models.Provider>}
1012
- */
1013
- async updateSendgridProvider(providerId, name, enabled, apiKey, fromName, fromEmail, replyToName, replyToEmail) {
1014
- if (typeof providerId === 'undefined') {
1015
- throw new AppcondaException('Missing required parameter: "providerId"');
1016
- }
1017
- const apiPath = '/messaging/providers/sendgrid/{providerId}'.replace('{providerId}', providerId);
1018
- const payload = {};
1019
- if (typeof name !== 'undefined') {
1020
- payload['name'] = name;
1021
- }
1022
- if (typeof enabled !== 'undefined') {
1023
- payload['enabled'] = enabled;
1024
- }
1025
- if (typeof apiKey !== 'undefined') {
1026
- payload['apiKey'] = apiKey;
1027
- }
1028
- if (typeof fromName !== 'undefined') {
1029
- payload['fromName'] = fromName;
1030
- }
1031
- if (typeof fromEmail !== 'undefined') {
1032
- payload['fromEmail'] = fromEmail;
1033
- }
1034
- if (typeof replyToName !== 'undefined') {
1035
- payload['replyToName'] = replyToName;
1036
- }
1037
- if (typeof replyToEmail !== 'undefined') {
1038
- payload['replyToEmail'] = replyToEmail;
1039
- }
1040
- const uri = new URL(this.client.config.endpoint + apiPath);
1041
- const apiHeaders = {
1042
- 'content-type': 'application/json',
1043
- };
1044
- return await this.client.call('patch', uri, apiHeaders, payload);
1045
- }
1046
- /**
1047
- * Create SMTP provider
1048
- *
1049
- * Create a new SMTP provider.
1050
- *
1051
- * @param {string} providerId
1052
- * @param {string} name
1053
- * @param {string} host
1054
- * @param {number} port
1055
- * @param {string} username
1056
- * @param {string} password
1057
- * @param {SmtpEncryption} encryption
1058
- * @param {boolean} autoTLS
1059
- * @param {string} mailer
1060
- * @param {string} fromName
1061
- * @param {string} fromEmail
1062
- * @param {string} replyToName
1063
- * @param {string} replyToEmail
1064
- * @param {boolean} enabled
1065
- * @throws {AppcondaException}
1066
- * @returns {Promise<Models.Provider>}
1067
- */
1068
- async createSmtpProvider(providerId, name, host, port, username, password, encryption, autoTLS, mailer, fromName, fromEmail, replyToName, replyToEmail, enabled) {
1069
- if (typeof providerId === 'undefined') {
1070
- throw new AppcondaException('Missing required parameter: "providerId"');
1071
- }
1072
- if (typeof name === 'undefined') {
1073
- throw new AppcondaException('Missing required parameter: "name"');
1074
- }
1075
- if (typeof host === 'undefined') {
1076
- throw new AppcondaException('Missing required parameter: "host"');
1077
- }
1078
- const apiPath = '/messaging/providers/smtp';
1079
- const payload = {};
1080
- if (typeof providerId !== 'undefined') {
1081
- payload['providerId'] = providerId;
1082
- }
1083
- if (typeof name !== 'undefined') {
1084
- payload['name'] = name;
1085
- }
1086
- if (typeof host !== 'undefined') {
1087
- payload['host'] = host;
1088
- }
1089
- if (typeof port !== 'undefined') {
1090
- payload['port'] = port;
1091
- }
1092
- if (typeof username !== 'undefined') {
1093
- payload['username'] = username;
1094
- }
1095
- if (typeof password !== 'undefined') {
1096
- payload['password'] = password;
1097
- }
1098
- if (typeof encryption !== 'undefined') {
1099
- payload['encryption'] = encryption;
1100
- }
1101
- if (typeof autoTLS !== 'undefined') {
1102
- payload['autoTLS'] = autoTLS;
1103
- }
1104
- if (typeof mailer !== 'undefined') {
1105
- payload['mailer'] = mailer;
1106
- }
1107
- if (typeof fromName !== 'undefined') {
1108
- payload['fromName'] = fromName;
1109
- }
1110
- if (typeof fromEmail !== 'undefined') {
1111
- payload['fromEmail'] = fromEmail;
1112
- }
1113
- if (typeof replyToName !== 'undefined') {
1114
- payload['replyToName'] = replyToName;
1115
- }
1116
- if (typeof replyToEmail !== 'undefined') {
1117
- payload['replyToEmail'] = replyToEmail;
1118
- }
1119
- if (typeof enabled !== 'undefined') {
1120
- payload['enabled'] = enabled;
1121
- }
1122
- const uri = new URL(this.client.config.endpoint + apiPath);
1123
- const apiHeaders = {
1124
- 'content-type': 'application/json',
1125
- };
1126
- return await this.client.call('post', uri, apiHeaders, payload);
1127
- }
1128
- /**
1129
- * Update SMTP provider
1130
- *
1131
- * Update a SMTP provider by its unique ID.
1132
- *
1133
- * @param {string} providerId
1134
- * @param {string} name
1135
- * @param {string} host
1136
- * @param {number} port
1137
- * @param {string} username
1138
- * @param {string} password
1139
- * @param {SmtpEncryption} encryption
1140
- * @param {boolean} autoTLS
1141
- * @param {string} mailer
1142
- * @param {string} fromName
1143
- * @param {string} fromEmail
1144
- * @param {string} replyToName
1145
- * @param {string} replyToEmail
1146
- * @param {boolean} enabled
1147
- * @throws {AppcondaException}
1148
- * @returns {Promise<Models.Provider>}
1149
- */
1150
- async updateSmtpProvider(providerId, name, host, port, username, password, encryption, autoTLS, mailer, fromName, fromEmail, replyToName, replyToEmail, enabled) {
1151
- if (typeof providerId === 'undefined') {
1152
- throw new AppcondaException('Missing required parameter: "providerId"');
1153
- }
1154
- const apiPath = '/messaging/providers/smtp/{providerId}'.replace('{providerId}', providerId);
1155
- const payload = {};
1156
- if (typeof name !== 'undefined') {
1157
- payload['name'] = name;
1158
- }
1159
- if (typeof host !== 'undefined') {
1160
- payload['host'] = host;
1161
- }
1162
- if (typeof port !== 'undefined') {
1163
- payload['port'] = port;
1164
- }
1165
- if (typeof username !== 'undefined') {
1166
- payload['username'] = username;
1167
- }
1168
- if (typeof password !== 'undefined') {
1169
- payload['password'] = password;
1170
- }
1171
- if (typeof encryption !== 'undefined') {
1172
- payload['encryption'] = encryption;
1173
- }
1174
- if (typeof autoTLS !== 'undefined') {
1175
- payload['autoTLS'] = autoTLS;
1176
- }
1177
- if (typeof mailer !== 'undefined') {
1178
- payload['mailer'] = mailer;
1179
- }
1180
- if (typeof fromName !== 'undefined') {
1181
- payload['fromName'] = fromName;
1182
- }
1183
- if (typeof fromEmail !== 'undefined') {
1184
- payload['fromEmail'] = fromEmail;
1185
- }
1186
- if (typeof replyToName !== 'undefined') {
1187
- payload['replyToName'] = replyToName;
1188
- }
1189
- if (typeof replyToEmail !== 'undefined') {
1190
- payload['replyToEmail'] = replyToEmail;
1191
- }
1192
- if (typeof enabled !== 'undefined') {
1193
- payload['enabled'] = enabled;
1194
- }
1195
- const uri = new URL(this.client.config.endpoint + apiPath);
1196
- const apiHeaders = {
1197
- 'content-type': 'application/json',
1198
- };
1199
- return await this.client.call('patch', uri, apiHeaders, payload);
1200
- }
1201
- /**
1202
- * Create Telesign provider
1203
- *
1204
- * Create a new Telesign provider.
1205
- *
1206
- * @param {string} providerId
1207
- * @param {string} name
1208
- * @param {string} from
1209
- * @param {string} customerId
1210
- * @param {string} apiKey
1211
- * @param {boolean} enabled
1212
- * @throws {AppcondaException}
1213
- * @returns {Promise<Models.Provider>}
1214
- */
1215
- async createTelesignProvider(providerId, name, from, customerId, apiKey, enabled) {
1216
- if (typeof providerId === 'undefined') {
1217
- throw new AppcondaException('Missing required parameter: "providerId"');
1218
- }
1219
- if (typeof name === 'undefined') {
1220
- throw new AppcondaException('Missing required parameter: "name"');
1221
- }
1222
- const apiPath = '/messaging/providers/telesign';
1223
- const payload = {};
1224
- if (typeof providerId !== 'undefined') {
1225
- payload['providerId'] = providerId;
1226
- }
1227
- if (typeof name !== 'undefined') {
1228
- payload['name'] = name;
1229
- }
1230
- if (typeof from !== 'undefined') {
1231
- payload['from'] = from;
1232
- }
1233
- if (typeof customerId !== 'undefined') {
1234
- payload['customerId'] = customerId;
1235
- }
1236
- if (typeof apiKey !== 'undefined') {
1237
- payload['apiKey'] = apiKey;
1238
- }
1239
- if (typeof enabled !== 'undefined') {
1240
- payload['enabled'] = enabled;
1241
- }
1242
- const uri = new URL(this.client.config.endpoint + apiPath);
1243
- const apiHeaders = {
1244
- 'content-type': 'application/json',
1245
- };
1246
- return await this.client.call('post', uri, apiHeaders, payload);
1247
- }
1248
- /**
1249
- * Update Telesign provider
1250
- *
1251
- * Update a Telesign provider by its unique ID.
1252
- *
1253
- * @param {string} providerId
1254
- * @param {string} name
1255
- * @param {boolean} enabled
1256
- * @param {string} customerId
1257
- * @param {string} apiKey
1258
- * @param {string} from
1259
- * @throws {AppcondaException}
1260
- * @returns {Promise<Models.Provider>}
1261
- */
1262
- async updateTelesignProvider(providerId, name, enabled, customerId, apiKey, from) {
1263
- if (typeof providerId === 'undefined') {
1264
- throw new AppcondaException('Missing required parameter: "providerId"');
1265
- }
1266
- const apiPath = '/messaging/providers/telesign/{providerId}'.replace('{providerId}', providerId);
1267
- const payload = {};
1268
- if (typeof name !== 'undefined') {
1269
- payload['name'] = name;
1270
- }
1271
- if (typeof enabled !== 'undefined') {
1272
- payload['enabled'] = enabled;
1273
- }
1274
- if (typeof customerId !== 'undefined') {
1275
- payload['customerId'] = customerId;
1276
- }
1277
- if (typeof apiKey !== 'undefined') {
1278
- payload['apiKey'] = apiKey;
1279
- }
1280
- if (typeof from !== 'undefined') {
1281
- payload['from'] = from;
1282
- }
1283
- const uri = new URL(this.client.config.endpoint + apiPath);
1284
- const apiHeaders = {
1285
- 'content-type': 'application/json',
1286
- };
1287
- return await this.client.call('patch', uri, apiHeaders, payload);
1288
- }
1289
- /**
1290
- * Create Textmagic provider
1291
- *
1292
- * Create a new Textmagic provider.
1293
- *
1294
- * @param {string} providerId
1295
- * @param {string} name
1296
- * @param {string} from
1297
- * @param {string} username
1298
- * @param {string} apiKey
1299
- * @param {boolean} enabled
1300
- * @throws {AppcondaException}
1301
- * @returns {Promise<Models.Provider>}
1302
- */
1303
- async createTextmagicProvider(providerId, name, from, username, apiKey, enabled) {
1304
- if (typeof providerId === 'undefined') {
1305
- throw new AppcondaException('Missing required parameter: "providerId"');
1306
- }
1307
- if (typeof name === 'undefined') {
1308
- throw new AppcondaException('Missing required parameter: "name"');
1309
- }
1310
- const apiPath = '/messaging/providers/textmagic';
1311
- const payload = {};
1312
- if (typeof providerId !== 'undefined') {
1313
- payload['providerId'] = providerId;
1314
- }
1315
- if (typeof name !== 'undefined') {
1316
- payload['name'] = name;
1317
- }
1318
- if (typeof from !== 'undefined') {
1319
- payload['from'] = from;
1320
- }
1321
- if (typeof username !== 'undefined') {
1322
- payload['username'] = username;
1323
- }
1324
- if (typeof apiKey !== 'undefined') {
1325
- payload['apiKey'] = apiKey;
1326
- }
1327
- if (typeof enabled !== 'undefined') {
1328
- payload['enabled'] = enabled;
1329
- }
1330
- const uri = new URL(this.client.config.endpoint + apiPath);
1331
- const apiHeaders = {
1332
- 'content-type': 'application/json',
1333
- };
1334
- return await this.client.call('post', uri, apiHeaders, payload);
1335
- }
1336
- /**
1337
- * Update Textmagic provider
1338
- *
1339
- * Update a Textmagic provider by its unique ID.
1340
- *
1341
- * @param {string} providerId
1342
- * @param {string} name
1343
- * @param {boolean} enabled
1344
- * @param {string} username
1345
- * @param {string} apiKey
1346
- * @param {string} from
1347
- * @throws {AppcondaException}
1348
- * @returns {Promise<Models.Provider>}
1349
- */
1350
- async updateTextmagicProvider(providerId, name, enabled, username, apiKey, from) {
1351
- if (typeof providerId === 'undefined') {
1352
- throw new AppcondaException('Missing required parameter: "providerId"');
1353
- }
1354
- const apiPath = '/messaging/providers/textmagic/{providerId}'.replace('{providerId}', providerId);
1355
- const payload = {};
1356
- if (typeof name !== 'undefined') {
1357
- payload['name'] = name;
1358
- }
1359
- if (typeof enabled !== 'undefined') {
1360
- payload['enabled'] = enabled;
1361
- }
1362
- if (typeof username !== 'undefined') {
1363
- payload['username'] = username;
1364
- }
1365
- if (typeof apiKey !== 'undefined') {
1366
- payload['apiKey'] = apiKey;
1367
- }
1368
- if (typeof from !== 'undefined') {
1369
- payload['from'] = from;
1370
- }
1371
- const uri = new URL(this.client.config.endpoint + apiPath);
1372
- const apiHeaders = {
1373
- 'content-type': 'application/json',
1374
- };
1375
- return await this.client.call('patch', uri, apiHeaders, payload);
1376
- }
1377
- /**
1378
- * Create Twilio provider
1379
- *
1380
- * Create a new Twilio provider.
1381
- *
1382
- * @param {string} providerId
1383
- * @param {string} name
1384
- * @param {string} from
1385
- * @param {string} accountSid
1386
- * @param {string} authToken
1387
- * @param {boolean} enabled
1388
- * @throws {AppcondaException}
1389
- * @returns {Promise<Models.Provider>}
1390
- */
1391
- async createTwilioProvider(providerId, name, from, accountSid, authToken, enabled) {
1392
- if (typeof providerId === 'undefined') {
1393
- throw new AppcondaException('Missing required parameter: "providerId"');
1394
- }
1395
- if (typeof name === 'undefined') {
1396
- throw new AppcondaException('Missing required parameter: "name"');
1397
- }
1398
- const apiPath = '/messaging/providers/twilio';
1399
- const payload = {};
1400
- if (typeof providerId !== 'undefined') {
1401
- payload['providerId'] = providerId;
1402
- }
1403
- if (typeof name !== 'undefined') {
1404
- payload['name'] = name;
1405
- }
1406
- if (typeof from !== 'undefined') {
1407
- payload['from'] = from;
1408
- }
1409
- if (typeof accountSid !== 'undefined') {
1410
- payload['accountSid'] = accountSid;
1411
- }
1412
- if (typeof authToken !== 'undefined') {
1413
- payload['authToken'] = authToken;
1414
- }
1415
- if (typeof enabled !== 'undefined') {
1416
- payload['enabled'] = enabled;
1417
- }
1418
- const uri = new URL(this.client.config.endpoint + apiPath);
1419
- const apiHeaders = {
1420
- 'content-type': 'application/json',
1421
- };
1422
- return await this.client.call('post', uri, apiHeaders, payload);
1423
- }
1424
- /**
1425
- * Update Twilio provider
1426
- *
1427
- * Update a Twilio provider by its unique ID.
1428
- *
1429
- * @param {string} providerId
1430
- * @param {string} name
1431
- * @param {boolean} enabled
1432
- * @param {string} accountSid
1433
- * @param {string} authToken
1434
- * @param {string} from
1435
- * @throws {AppcondaException}
1436
- * @returns {Promise<Models.Provider>}
1437
- */
1438
- async updateTwilioProvider(providerId, name, enabled, accountSid, authToken, from) {
1439
- if (typeof providerId === 'undefined') {
1440
- throw new AppcondaException('Missing required parameter: "providerId"');
1441
- }
1442
- const apiPath = '/messaging/providers/twilio/{providerId}'.replace('{providerId}', providerId);
1443
- const payload = {};
1444
- if (typeof name !== 'undefined') {
1445
- payload['name'] = name;
1446
- }
1447
- if (typeof enabled !== 'undefined') {
1448
- payload['enabled'] = enabled;
1449
- }
1450
- if (typeof accountSid !== 'undefined') {
1451
- payload['accountSid'] = accountSid;
1452
- }
1453
- if (typeof authToken !== 'undefined') {
1454
- payload['authToken'] = authToken;
1455
- }
1456
- if (typeof from !== 'undefined') {
1457
- payload['from'] = from;
1458
- }
1459
- const uri = new URL(this.client.config.endpoint + apiPath);
1460
- const apiHeaders = {
1461
- 'content-type': 'application/json',
1462
- };
1463
- return await this.client.call('patch', uri, apiHeaders, payload);
1464
- }
1465
- /**
1466
- * Create Vonage provider
1467
- *
1468
- * Create a new Vonage provider.
1469
- *
1470
- * @param {string} providerId
1471
- * @param {string} name
1472
- * @param {string} from
1473
- * @param {string} apiKey
1474
- * @param {string} apiSecret
1475
- * @param {boolean} enabled
1476
- * @throws {AppcondaException}
1477
- * @returns {Promise<Models.Provider>}
1478
- */
1479
- async createVonageProvider(providerId, name, from, apiKey, apiSecret, enabled) {
1480
- if (typeof providerId === 'undefined') {
1481
- throw new AppcondaException('Missing required parameter: "providerId"');
1482
- }
1483
- if (typeof name === 'undefined') {
1484
- throw new AppcondaException('Missing required parameter: "name"');
1485
- }
1486
- const apiPath = '/messaging/providers/vonage';
1487
- const payload = {};
1488
- if (typeof providerId !== 'undefined') {
1489
- payload['providerId'] = providerId;
1490
- }
1491
- if (typeof name !== 'undefined') {
1492
- payload['name'] = name;
1493
- }
1494
- if (typeof from !== 'undefined') {
1495
- payload['from'] = from;
1496
- }
1497
- if (typeof apiKey !== 'undefined') {
1498
- payload['apiKey'] = apiKey;
1499
- }
1500
- if (typeof apiSecret !== 'undefined') {
1501
- payload['apiSecret'] = apiSecret;
1502
- }
1503
- if (typeof enabled !== 'undefined') {
1504
- payload['enabled'] = enabled;
1505
- }
1506
- const uri = new URL(this.client.config.endpoint + apiPath);
1507
- const apiHeaders = {
1508
- 'content-type': 'application/json',
1509
- };
1510
- return await this.client.call('post', uri, apiHeaders, payload);
1511
- }
1512
- /**
1513
- * Update Vonage provider
1514
- *
1515
- * Update a Vonage provider by its unique ID.
1516
- *
1517
- * @param {string} providerId
1518
- * @param {string} name
1519
- * @param {boolean} enabled
1520
- * @param {string} apiKey
1521
- * @param {string} apiSecret
1522
- * @param {string} from
1523
- * @throws {AppcondaException}
1524
- * @returns {Promise<Models.Provider>}
1525
- */
1526
- async updateVonageProvider(providerId, name, enabled, apiKey, apiSecret, from) {
1527
- if (typeof providerId === 'undefined') {
1528
- throw new AppcondaException('Missing required parameter: "providerId"');
1529
- }
1530
- const apiPath = '/messaging/providers/vonage/{providerId}'.replace('{providerId}', providerId);
1531
- const payload = {};
1532
- if (typeof name !== 'undefined') {
1533
- payload['name'] = name;
1534
- }
1535
- if (typeof enabled !== 'undefined') {
1536
- payload['enabled'] = enabled;
1537
- }
1538
- if (typeof apiKey !== 'undefined') {
1539
- payload['apiKey'] = apiKey;
1540
- }
1541
- if (typeof apiSecret !== 'undefined') {
1542
- payload['apiSecret'] = apiSecret;
1543
- }
1544
- if (typeof from !== 'undefined') {
1545
- payload['from'] = from;
1546
- }
1547
- const uri = new URL(this.client.config.endpoint + apiPath);
1548
- const apiHeaders = {
1549
- 'content-type': 'application/json',
1550
- };
1551
- return await this.client.call('patch', uri, apiHeaders, payload);
1552
- }
1553
- /**
1554
- * Get provider
1555
- *
1556
- * Get a provider by its unique ID.
1557
-
1558
- *
1559
- * @param {string} providerId
1560
- * @throws {AppcondaException}
1561
- * @returns {Promise<Models.Provider>}
1562
- */
1563
- async getProvider(providerId) {
1564
- if (typeof providerId === 'undefined') {
1565
- throw new AppcondaException('Missing required parameter: "providerId"');
1566
- }
1567
- const apiPath = '/messaging/providers/{providerId}'.replace('{providerId}', providerId);
1568
- const payload = {};
1569
- const uri = new URL(this.client.config.endpoint + apiPath);
1570
- const apiHeaders = {
1571
- 'content-type': 'application/json',
1572
- };
1573
- return await this.client.call('get', uri, apiHeaders, payload);
1574
- }
1575
- /**
1576
- * Delete provider
1577
- *
1578
- * Delete a provider by its unique ID.
1579
- *
1580
- * @param {string} providerId
1581
- * @throws {AppcondaException}
1582
- * @returns {Promise<{}>}
1583
- */
1584
- async deleteProvider(providerId) {
1585
- if (typeof providerId === 'undefined') {
1586
- throw new AppcondaException('Missing required parameter: "providerId"');
1587
- }
1588
- const apiPath = '/messaging/providers/{providerId}'.replace('{providerId}', providerId);
1589
- const payload = {};
1590
- const uri = new URL(this.client.config.endpoint + apiPath);
1591
- const apiHeaders = {
1592
- 'content-type': 'application/json',
1593
- };
1594
- return await this.client.call('delete', uri, apiHeaders, payload);
1595
- }
1596
- /**
1597
- * List provider logs
1598
- *
1599
- * Get the provider activity logs listed by its unique ID.
1600
- *
1601
- * @param {string} providerId
1602
- * @param {string[]} queries
1603
- * @throws {AppcondaException}
1604
- * @returns {Promise<Models.LogList>}
1605
- */
1606
- async listProviderLogs(providerId, queries) {
1607
- if (typeof providerId === 'undefined') {
1608
- throw new AppcondaException('Missing required parameter: "providerId"');
1609
- }
1610
- const apiPath = '/messaging/providers/{providerId}/logs'.replace('{providerId}', providerId);
1611
- const payload = {};
1612
- if (typeof queries !== 'undefined') {
1613
- payload['queries'] = queries;
1614
- }
1615
- const uri = new URL(this.client.config.endpoint + apiPath);
1616
- const apiHeaders = {
1617
- 'content-type': 'application/json',
1618
- };
1619
- return await this.client.call('get', uri, apiHeaders, payload);
1620
- }
1621
- /**
1622
- * List subscriber logs
1623
- *
1624
- * Get the subscriber activity logs listed by its unique ID.
1625
- *
1626
- * @param {string} subscriberId
1627
- * @param {string[]} queries
1628
- * @throws {AppcondaException}
1629
- * @returns {Promise<Models.LogList>}
1630
- */
1631
- async listSubscriberLogs(subscriberId, queries) {
1632
- if (typeof subscriberId === 'undefined') {
1633
- throw new AppcondaException('Missing required parameter: "subscriberId"');
1634
- }
1635
- const apiPath = '/messaging/subscribers/{subscriberId}/logs'.replace('{subscriberId}', subscriberId);
1636
- const payload = {};
1637
- if (typeof queries !== 'undefined') {
1638
- payload['queries'] = queries;
1639
- }
1640
- const uri = new URL(this.client.config.endpoint + apiPath);
1641
- const apiHeaders = {
1642
- 'content-type': 'application/json',
1643
- };
1644
- return await this.client.call('get', uri, apiHeaders, payload);
1645
- }
1646
- /**
1647
- * List topics
1648
- *
1649
- * Get a list of all topics from the current Appconda project.
1650
- *
1651
- * @param {string[]} queries
1652
- * @param {string} search
1653
- * @throws {AppcondaException}
1654
- * @returns {Promise<Models.TopicList>}
1655
- */
1656
- async listTopics(queries, search) {
1657
- const apiPath = '/messaging/topics';
1658
- const payload = {};
1659
- if (typeof queries !== 'undefined') {
1660
- payload['queries'] = queries;
1661
- }
1662
- if (typeof search !== 'undefined') {
1663
- payload['search'] = search;
1664
- }
1665
- const uri = new URL(this.client.config.endpoint + apiPath);
1666
- const apiHeaders = {
1667
- 'content-type': 'application/json',
1668
- };
1669
- return await this.client.call('get', uri, apiHeaders, payload);
1670
- }
1671
- /**
1672
- * Create topic
1673
- *
1674
- * Create a new topic.
1675
- *
1676
- * @param {string} topicId
1677
- * @param {string} name
1678
- * @param {string[]} subscribe
1679
- * @throws {AppcondaException}
1680
- * @returns {Promise<Models.Topic>}
1681
- */
1682
- async createTopic(topicId, name, subscribe) {
1683
- if (typeof topicId === 'undefined') {
1684
- throw new AppcondaException('Missing required parameter: "topicId"');
1685
- }
1686
- if (typeof name === 'undefined') {
1687
- throw new AppcondaException('Missing required parameter: "name"');
1688
- }
1689
- const apiPath = '/messaging/topics';
1690
- const payload = {};
1691
- if (typeof topicId !== 'undefined') {
1692
- payload['topicId'] = topicId;
1693
- }
1694
- if (typeof name !== 'undefined') {
1695
- payload['name'] = name;
1696
- }
1697
- if (typeof subscribe !== 'undefined') {
1698
- payload['subscribe'] = subscribe;
1699
- }
1700
- const uri = new URL(this.client.config.endpoint + apiPath);
1701
- const apiHeaders = {
1702
- 'content-type': 'application/json',
1703
- };
1704
- return await this.client.call('post', uri, apiHeaders, payload);
1705
- }
1706
- /**
1707
- * Get topic
1708
- *
1709
- * Get a topic by its unique ID.
1710
-
1711
- *
1712
- * @param {string} topicId
1713
- * @throws {AppcondaException}
1714
- * @returns {Promise<Models.Topic>}
1715
- */
1716
- async getTopic(topicId) {
1717
- if (typeof topicId === 'undefined') {
1718
- throw new AppcondaException('Missing required parameter: "topicId"');
1719
- }
1720
- const apiPath = '/messaging/topics/{topicId}'.replace('{topicId}', topicId);
1721
- const payload = {};
1722
- const uri = new URL(this.client.config.endpoint + apiPath);
1723
- const apiHeaders = {
1724
- 'content-type': 'application/json',
1725
- };
1726
- return await this.client.call('get', uri, apiHeaders, payload);
1727
- }
1728
- /**
1729
- * Update topic
1730
- *
1731
- * Update a topic by its unique ID.
1732
-
1733
- *
1734
- * @param {string} topicId
1735
- * @param {string} name
1736
- * @param {string[]} subscribe
1737
- * @throws {AppcondaException}
1738
- * @returns {Promise<Models.Topic>}
1739
- */
1740
- async updateTopic(topicId, name, subscribe) {
1741
- if (typeof topicId === 'undefined') {
1742
- throw new AppcondaException('Missing required parameter: "topicId"');
1743
- }
1744
- const apiPath = '/messaging/topics/{topicId}'.replace('{topicId}', topicId);
1745
- const payload = {};
1746
- if (typeof name !== 'undefined') {
1747
- payload['name'] = name;
1748
- }
1749
- if (typeof subscribe !== 'undefined') {
1750
- payload['subscribe'] = subscribe;
1751
- }
1752
- const uri = new URL(this.client.config.endpoint + apiPath);
1753
- const apiHeaders = {
1754
- 'content-type': 'application/json',
1755
- };
1756
- return await this.client.call('patch', uri, apiHeaders, payload);
1757
- }
1758
- /**
1759
- * Delete topic
1760
- *
1761
- * Delete a topic by its unique ID.
1762
- *
1763
- * @param {string} topicId
1764
- * @throws {AppcondaException}
1765
- * @returns {Promise<{}>}
1766
- */
1767
- async deleteTopic(topicId) {
1768
- if (typeof topicId === 'undefined') {
1769
- throw new AppcondaException('Missing required parameter: "topicId"');
1770
- }
1771
- const apiPath = '/messaging/topics/{topicId}'.replace('{topicId}', topicId);
1772
- const payload = {};
1773
- const uri = new URL(this.client.config.endpoint + apiPath);
1774
- const apiHeaders = {
1775
- 'content-type': 'application/json',
1776
- };
1777
- return await this.client.call('delete', uri, apiHeaders, payload);
1778
- }
1779
- /**
1780
- * List topic logs
1781
- *
1782
- * Get the topic activity logs listed by its unique ID.
1783
- *
1784
- * @param {string} topicId
1785
- * @param {string[]} queries
1786
- * @throws {AppcondaException}
1787
- * @returns {Promise<Models.LogList>}
1788
- */
1789
- async listTopicLogs(topicId, queries) {
1790
- if (typeof topicId === 'undefined') {
1791
- throw new AppcondaException('Missing required parameter: "topicId"');
1792
- }
1793
- const apiPath = '/messaging/topics/{topicId}/logs'.replace('{topicId}', topicId);
1794
- const payload = {};
1795
- if (typeof queries !== 'undefined') {
1796
- payload['queries'] = queries;
1797
- }
1798
- const uri = new URL(this.client.config.endpoint + apiPath);
1799
- const apiHeaders = {
1800
- 'content-type': 'application/json',
1801
- };
1802
- return await this.client.call('get', uri, apiHeaders, payload);
1803
- }
1804
- /**
1805
- * List subscribers
1806
- *
1807
- * Get a list of all subscribers from the current Appconda project.
1808
- *
1809
- * @param {string} topicId
1810
- * @param {string[]} queries
1811
- * @param {string} search
1812
- * @throws {AppcondaException}
1813
- * @returns {Promise<Models.SubscriberList>}
1814
- */
1815
- async listSubscribers(topicId, queries, search) {
1816
- if (typeof topicId === 'undefined') {
1817
- throw new AppcondaException('Missing required parameter: "topicId"');
1818
- }
1819
- const apiPath = '/messaging/topics/{topicId}/subscribers'.replace('{topicId}', topicId);
1820
- const payload = {};
1821
- if (typeof queries !== 'undefined') {
1822
- payload['queries'] = queries;
1823
- }
1824
- if (typeof search !== 'undefined') {
1825
- payload['search'] = search;
1826
- }
1827
- const uri = new URL(this.client.config.endpoint + apiPath);
1828
- const apiHeaders = {
1829
- 'content-type': 'application/json',
1830
- };
1831
- return await this.client.call('get', uri, apiHeaders, payload);
1832
- }
1833
- /**
1834
- * Create subscriber
1835
- *
1836
- * Create a new subscriber.
1837
- *
1838
- * @param {string} topicId
1839
- * @param {string} subscriberId
1840
- * @param {string} targetId
1841
- * @throws {AppcondaException}
1842
- * @returns {Promise<Models.Subscriber>}
1843
- */
1844
- async createSubscriber(topicId, subscriberId, targetId) {
1845
- if (typeof topicId === 'undefined') {
1846
- throw new AppcondaException('Missing required parameter: "topicId"');
1847
- }
1848
- if (typeof subscriberId === 'undefined') {
1849
- throw new AppcondaException('Missing required parameter: "subscriberId"');
1850
- }
1851
- if (typeof targetId === 'undefined') {
1852
- throw new AppcondaException('Missing required parameter: "targetId"');
1853
- }
1854
- const apiPath = '/messaging/topics/{topicId}/subscribers'.replace('{topicId}', topicId);
1855
- const payload = {};
1856
- if (typeof subscriberId !== 'undefined') {
1857
- payload['subscriberId'] = subscriberId;
1858
- }
1859
- if (typeof targetId !== 'undefined') {
1860
- payload['targetId'] = targetId;
1861
- }
1862
- const uri = new URL(this.client.config.endpoint + apiPath);
1863
- const apiHeaders = {
1864
- 'content-type': 'application/json',
1865
- };
1866
- return await this.client.call('post', uri, apiHeaders, payload);
1867
- }
1868
- /**
1869
- * Get subscriber
1870
- *
1871
- * Get a subscriber by its unique ID.
1872
-
1873
- *
1874
- * @param {string} topicId
1875
- * @param {string} subscriberId
1876
- * @throws {AppcondaException}
1877
- * @returns {Promise<Models.Subscriber>}
1878
- */
1879
- async getSubscriber(topicId, subscriberId) {
1880
- if (typeof topicId === 'undefined') {
1881
- throw new AppcondaException('Missing required parameter: "topicId"');
1882
- }
1883
- if (typeof subscriberId === 'undefined') {
1884
- throw new AppcondaException('Missing required parameter: "subscriberId"');
1885
- }
1886
- const apiPath = '/messaging/topics/{topicId}/subscribers/{subscriberId}'.replace('{topicId}', topicId).replace('{subscriberId}', subscriberId);
1887
- const payload = {};
1888
- const uri = new URL(this.client.config.endpoint + apiPath);
1889
- const apiHeaders = {
1890
- 'content-type': 'application/json',
1891
- };
1892
- return await this.client.call('get', uri, apiHeaders, payload);
1893
- }
1894
- /**
1895
- * Delete subscriber
1896
- *
1897
- * Delete a subscriber by its unique ID.
1898
- *
1899
- * @param {string} topicId
1900
- * @param {string} subscriberId
1901
- * @throws {AppcondaException}
1902
- * @returns {Promise<{}>}
1903
- */
1904
- async deleteSubscriber(topicId, subscriberId) {
1905
- if (typeof topicId === 'undefined') {
1906
- throw new AppcondaException('Missing required parameter: "topicId"');
1907
- }
1908
- if (typeof subscriberId === 'undefined') {
1909
- throw new AppcondaException('Missing required parameter: "subscriberId"');
1910
- }
1911
- const apiPath = '/messaging/topics/{topicId}/subscribers/{subscriberId}'.replace('{topicId}', topicId).replace('{subscriberId}', subscriberId);
1912
- const payload = {};
1913
- const uri = new URL(this.client.config.endpoint + apiPath);
1914
- const apiHeaders = {
1915
- 'content-type': 'application/json',
1916
- };
1917
- return await this.client.call('delete', uri, apiHeaders, payload);
1918
- }
1919
- }
1920
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL21lc3NhZ2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQXdDLE1BQU0sV0FBVyxDQUFDO0FBSXBGLE1BQU0sT0FBTyxTQUFTO0lBR2xCLFlBQVksTUFBYztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFrQixFQUFFLE1BQWU7UUFDbEQsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQzVCLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQy9CLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsS0FBSyxFQUNMLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0lBQ0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQWlCLEVBQUUsT0FBZSxFQUFFLE9BQWUsRUFBRSxNQUFpQixFQUFFLEtB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QUM7WUFDdEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLHdEQUF3RCxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQy9JLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsUUFBUSxFQUNSLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBjb25kYUV4Y2VwdGlvbiwgQ2xpZW50LCB0eXBlIFBheWxvYWQsIFVwbG9hZFByb2dyZXNzIH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB0eXBlIHsgTW9kZWxzIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IFNtdHBFbmNyeXB0aW9uIH0gZnJvbSAnLi4vZW51bXMvc210cC1lbmNyeXB0aW9uJztcblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2luZyB7XG4gICAgY2xpZW50OiBDbGllbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG1lc3NhZ2VzXG4gICAgICpcbiAgICAgKiBHZXQgYSBsaXN0IG9mIGFsbCBtZXNzYWdlcyBmcm9tIHRoZSBjdXJyZW50IEFwcGNvbmRhIHByb2plY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBxdWVyaWVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5NZXNzYWdlTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdE1lc3NhZ2VzKHF1ZXJpZXM/OiBzdHJpbmdbXSwgc2VhcmNoPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuTWVzc2FnZUxpc3Q+IHtcbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL21lc3NhZ2VzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VhcmNoJ10gPSBzZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGVtYWlsXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgZW1haWwgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ViamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9waWNzXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdXNlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0YXJnZXRzXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gY2NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBiY2NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhdHRhY2htZW50c1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZHJhZnRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGh0bWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVkQXRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuTWVzc2FnZT59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlRW1haWwobWVzc2FnZUlkOiBzdHJpbmcsIHN1YmplY3Q6IHN0cmluZywgY29udGVudDogc3RyaW5nLCB0b3BpY3M/OiBzdHJpbmdbXSwgdXNlcnM/OiBzdHJpbmdbXSwgdGFyZ2V0cz86IHN0cmluZ1tdLCBjYz86IHN0cmluZ1tdLCBiY2M/OiBzdHJpbmdbXSwgYXR0YWNobWVudHM/OiBzdHJpbmdbXSwgZHJhZnQ/OiBib29sZWFuLCBodG1sPzogYm9vbGVhbiwgc2NoZWR1bGVkQXQ/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5NZXNzYWdlPiB7XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJtZXNzYWdlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3ViamVjdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic3ViamVjdFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb250ZW50XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvbWVzc2FnZXMvZW1haWwnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZUlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWVzc2FnZUlkJ10gPSBtZXNzYWdlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdWJqZWN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3ViamVjdCddID0gc3ViamVjdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydjb250ZW50J10gPSBjb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdG9waWNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndG9waWNzJ10gPSB0b3BpY3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1c2VycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3VzZXJzJ10gPSB1c2VycztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0YXJnZXRzJ10gPSB0YXJnZXRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY2MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydjYyddID0gY2M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBiY2MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydiY2MnXSA9IGJjYztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF0dGFjaG1lbnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXR0YWNobWVudHMnXSA9IGF0dGFjaG1lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHJhZnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkcmFmdCddID0gZHJhZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBodG1sICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaHRtbCddID0gaHRtbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNjaGVkdWxlZEF0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2NoZWR1bGVkQXQnXSA9IHNjaGVkdWxlZEF0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZW1haWxcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhbiBlbWFpbCBtZXNzYWdlIGJ5IGl0cyB1bmlxdWUgSUQuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b3BpY3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB1c2Vyc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHRhcmdldHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3ViamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBkcmFmdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaHRtbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGNjXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gYmNjXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVkdWxlZEF0XG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXR0YWNobWVudHNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuTWVzc2FnZT59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlRW1haWwobWVzc2FnZUlkOiBzdHJpbmcsIHRvcGljcz86IHN0cmluZ1tdLCB1c2Vycz86IHN0cmluZ1tdLCB0YXJnZXRzPzogc3RyaW5nW10sIHN1YmplY3Q/OiBzdHJpbmcsIGNvbnRlbnQ/OiBzdHJpbmcsIGRyYWZ0PzogYm9vbGVhbiwgaHRtbD86IGJvb2xlYW4sIGNjPzogc3RyaW5nW10sIGJjYz86IHN0cmluZ1tdLCBzY2hlZHVsZWRBdD86IHN0cmluZywgYXR0YWNobWVudHM/OiBzdHJpbmdbXSk6IFByb21pc2U8TW9kZWxzLk1lc3NhZ2U+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm1lc3NhZ2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL21lc3NhZ2VzL2VtYWlsL3ttZXNzYWdlSWR9Jy5yZXBsYWNlKCd7bWVzc2FnZUlkfScsIG1lc3NhZ2VJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0b3BpY3MnXSA9IHRvcGljcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHVzZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcnMnXSA9IHVzZXJzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RhcmdldHMnXSA9IHRhcmdldHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdWJqZWN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3ViamVjdCddID0gc3ViamVjdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydjb250ZW50J10gPSBjb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHJhZnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkcmFmdCddID0gZHJhZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBodG1sICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaHRtbCddID0gaHRtbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNjICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnY2MnXSA9IGNjO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYmNjICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYmNjJ10gPSBiY2M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlZHVsZWRBdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NjaGVkdWxlZEF0J10gPSBzY2hlZHVsZWRBdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF0dGFjaG1lbnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXR0YWNobWVudHMnXSA9IGF0dGFjaG1lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHB1c2ggbm90aWZpY2F0aW9uXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgcHVzaCBub3RpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJvZHlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b3BpY3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB1c2Vyc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHRhcmdldHNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW1hZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWNvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VuZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFkZ2VcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRyYWZ0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVkdWxlZEF0XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLk1lc3NhZ2U+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVB1c2gobWVzc2FnZUlkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGJvZHk6IHN0cmluZywgdG9waWNzPzogc3RyaW5nW10sIHVzZXJzPzogc3RyaW5nW10sIHRhcmdldHM/OiBzdHJpbmdbXSwgZGF0YT86IG9iamVjdCwgYWN0aW9uPzogc3RyaW5nLCBpbWFnZT86IHN0cmluZywgaWNvbj86IHN0cmluZywgc291bmQ/OiBzdHJpbmcsIGNvbG9yPzogc3RyaW5nLCB0YWc/OiBzdHJpbmcsIGJhZGdlPzogc3RyaW5nLCBkcmFmdD86IGJvb2xlYW4sIHNjaGVkdWxlZEF0Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuTWVzc2FnZT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWVzc2FnZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRpdGxlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0aXRsZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJib2R5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvbWVzc2FnZXMvcHVzaCc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlSWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydtZXNzYWdlSWQnXSA9IG1lc3NhZ2VJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRpdGxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndGl0bGUnXSA9IHRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYm9keSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2JvZHknXSA9IGJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0b3BpY3MnXSA9IHRvcGljcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHVzZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcnMnXSA9IHVzZXJzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RhcmdldHMnXSA9IHRhcmdldHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZGF0YSddID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FjdGlvbiddID0gYWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaW1hZ2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydpbWFnZSddID0gaW1hZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpY29uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaWNvbiddID0gaWNvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNvdW5kICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc291bmQnXSA9IHNvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sb3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydjb2xvciddID0gY29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YWcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0YWcnXSA9IHRhZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGJhZGdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYmFkZ2UnXSA9IGJhZGdlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHJhZnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkcmFmdCddID0gZHJhZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlZHVsZWRBdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NjaGVkdWxlZEF0J10gPSBzY2hlZHVsZWRBdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHB1c2ggbm90aWZpY2F0aW9uXG4gICAgICpcbiAgICAgKiBVcGRhdGUgYSBwdXNoIG5vdGlmaWNhdGlvbiBieSBpdHMgdW5pcXVlIElELlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9waWNzXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdXNlcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0YXJnZXRzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJvZHlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaW1hZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWNvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VuZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmFkZ2VcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRyYWZ0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVkdWxlZEF0XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLk1lc3NhZ2U+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVB1c2gobWVzc2FnZUlkOiBzdHJpbmcsIHRvcGljcz86IHN0cmluZ1tdLCB1c2Vycz86IHN0cmluZ1tdLCB0YXJnZXRzPzogc3RyaW5nW10sIHRpdGxlPzogc3RyaW5nLCBib2R5Pzogc3RyaW5nLCBkYXRhPzogb2JqZWN0LCBhY3Rpb24/OiBzdHJpbmcsIGltYWdlPzogc3RyaW5nLCBpY29uPzogc3RyaW5nLCBzb3VuZD86IHN0cmluZywgY29sb3I/OiBzdHJpbmcsIHRhZz86IHN0cmluZywgYmFkZ2U/OiBudW1iZXIsIGRyYWZ0PzogYm9vbGVhbiwgc2NoZWR1bGVkQXQ/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5NZXNzYWdlPiB7XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJtZXNzYWdlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9tZXNzYWdlcy9wdXNoL3ttZXNzYWdlSWR9Jy5yZXBsYWNlKCd7bWVzc2FnZUlkfScsIG1lc3NhZ2VJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0b3BpY3MnXSA9IHRvcGljcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHVzZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcnMnXSA9IHVzZXJzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RhcmdldHMnXSA9IHRhcmdldHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aXRsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RpdGxlJ10gPSB0aXRsZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGJvZHkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydib2R5J10gPSBib2R5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2RhdGEnXSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhY3Rpb24nXSA9IGFjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGltYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaW1hZ2UnXSA9IGltYWdlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaWNvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2ljb24nXSA9IGljb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzb3VuZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NvdW5kJ10gPSBzb3VuZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnY29sb3InXSA9IGNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndGFnJ10gPSB0YWc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBiYWRnZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2JhZGdlJ10gPSBiYWRnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRyYWZ0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZHJhZnQnXSA9IGRyYWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZWR1bGVkQXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzY2hlZHVsZWRBdCddID0gc2NoZWR1bGVkQXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgU01TXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgU01TIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b3BpY3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB1c2Vyc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHRhcmdldHNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRyYWZ0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVkdWxlZEF0XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLk1lc3NhZ2U+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVNtcyhtZXNzYWdlSWQ6IHN0cmluZywgY29udGVudDogc3RyaW5nLCB0b3BpY3M/OiBzdHJpbmdbXSwgdXNlcnM/OiBzdHJpbmdbXSwgdGFyZ2V0cz86IHN0cmluZ1tdLCBkcmFmdD86IGJvb2xlYW4sIHNjaGVkdWxlZEF0Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuTWVzc2FnZT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWVzc2FnZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvbnRlbnRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9tZXNzYWdlcy9zbXMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZUlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWVzc2FnZUlkJ10gPSBtZXNzYWdlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnY29udGVudCddID0gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRvcGljcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RvcGljcyddID0gdG9waWNzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VycyddID0gdXNlcnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndGFyZ2V0cyddID0gdGFyZ2V0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRyYWZ0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZHJhZnQnXSA9IGRyYWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZWR1bGVkQXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzY2hlZHVsZWRBdCddID0gc2NoZWR1bGVkQXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBTTVNcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhbiBlbWFpbCBtZXNzYWdlIGJ5IGl0cyB1bmlxdWUgSUQuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b3BpY3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB1c2Vyc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHRhcmdldHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZHJhZnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVkQXRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuTWVzc2FnZT59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlU21zKG1lc3NhZ2VJZDogc3RyaW5nLCB0b3BpY3M/OiBzdHJpbmdbXSwgdXNlcnM/OiBzdHJpbmdbXSwgdGFyZ2V0cz86IHN0cmluZ1tdLCBjb250ZW50Pzogc3RyaW5nLCBkcmFmdD86IGJvb2xlYW4sIHNjaGVkdWxlZEF0Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuTWVzc2FnZT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWVzc2FnZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvbWVzc2FnZXMvc21zL3ttZXNzYWdlSWR9Jy5yZXBsYWNlKCd7bWVzc2FnZUlkfScsIG1lc3NhZ2VJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0b3BpY3MnXSA9IHRvcGljcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHVzZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcnMnXSA9IHVzZXJzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RhcmdldHMnXSA9IHRhcmdldHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnY29udGVudCddID0gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRyYWZ0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZHJhZnQnXSA9IGRyYWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZWR1bGVkQXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzY2hlZHVsZWRBdCddID0gc2NoZWR1bGVkQXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgbWVzc2FnZVxuICAgICAqXG4gICAgICogR2V0IGEgbWVzc2FnZSBieSBpdHMgdW5pcXVlIElELlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZUlkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLk1lc3NhZ2U+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldE1lc3NhZ2UobWVzc2FnZUlkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5NZXNzYWdlPiB7XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJtZXNzYWdlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9tZXNzYWdlcy97bWVzc2FnZUlkfScucmVwbGFjZSgne21lc3NhZ2VJZH0nLCBtZXNzYWdlSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBtZXNzYWdlXG4gICAgICpcbiAgICAgKiBEZWxldGUgYSBtZXNzYWdlLiBJZiB0aGUgbWVzc2FnZSBpcyBub3QgYSBkcmFmdCBvciBzY2hlZHVsZWQsIGJ1dCBoYXMgYmVlbiBzZW50LCB0aGlzIHdpbGwgbm90IHJlY2FsbCB0aGUgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlKG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWVzc2FnZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvbWVzc2FnZXMve21lc3NhZ2VJZH0nLnJlcGxhY2UoJ3ttZXNzYWdlSWR9JywgbWVzc2FnZUlkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IG1lc3NhZ2UgbG9nc1xuICAgICAqXG4gICAgICogR2V0IHRoZSBtZXNzYWdlIGFjdGl2aXR5IGxvZ3MgbGlzdGVkIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcXVlcmllc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Mb2dMaXN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0TWVzc2FnZUxvZ3MobWVzc2FnZUlkOiBzdHJpbmcsIHF1ZXJpZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8TW9kZWxzLkxvZ0xpc3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm1lc3NhZ2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL21lc3NhZ2VzL3ttZXNzYWdlSWR9L2xvZ3MnLnJlcGxhY2UoJ3ttZXNzYWdlSWR9JywgbWVzc2FnZUlkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgbWVzc2FnZSB0YXJnZXRzXG4gICAgICpcbiAgICAgKiBHZXQgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGFzc29jaWF0ZWQgd2l0aCBhIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcXVlcmllc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5UYXJnZXRMaXN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0VGFyZ2V0cyhtZXNzYWdlSWQ6IHN0cmluZywgcXVlcmllcz86IHN0cmluZ1tdKTogUHJvbWlzZTxNb2RlbHMuVGFyZ2V0TGlzdD4ge1xuICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWVzc2FnZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvbWVzc2FnZXMve21lc3NhZ2VJZH0vdGFyZ2V0cycucmVwbGFjZSgne21lc3NhZ2VJZH0nLCBtZXNzYWdlSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcXVlcmllcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3F1ZXJpZXMnXSA9IHF1ZXJpZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCBwcm92aWRlcnNcbiAgICAgKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgYWxsIHByb3ZpZGVycyBmcm9tIHRoZSBjdXJyZW50IEFwcGNvbmRhIHByb2plY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBxdWVyaWVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlckxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RQcm92aWRlcnMocXVlcmllcz86IHN0cmluZ1tdLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5Qcm92aWRlckxpc3Q+IHtcbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3Byb3ZpZGVycyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncXVlcmllcyddID0gcXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlYXJjaCddID0gc2VhcmNoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBBUE5TIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgQXBwbGUgUHVzaCBOb3RpZmljYXRpb24gc2VydmljZSBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0aEtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRoS2V5SWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVhbUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1bmRsZUlkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzYW5kYm94XG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVBcG5zUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGF1dGhLZXk/OiBzdHJpbmcsIGF1dGhLZXlJZD86IHN0cmluZywgdGVhbUlkPzogc3RyaW5nLCBidW5kbGVJZD86IHN0cmluZywgc2FuZGJveD86IGJvb2xlYW4sIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvYXBucyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJJZCddID0gcHJvdmlkZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXV0aEtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2F1dGhLZXknXSA9IGF1dGhLZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhdXRoS2V5SWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhdXRoS2V5SWQnXSA9IGF1dGhLZXlJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRlYW1JZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlYW1JZCddID0gdGVhbUlkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYnVuZGxlSWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydidW5kbGVJZCddID0gYnVuZGxlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzYW5kYm94ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2FuZGJveCddID0gc2FuZGJveDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgQVBOUyBwcm92aWRlclxuICAgICAqXG4gICAgICogVXBkYXRlIGEgQXBwbGUgUHVzaCBOb3RpZmljYXRpb24gc2VydmljZSBwcm92aWRlciBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRoS2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF1dGhLZXlJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZWFtSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVuZGxlSWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNhbmRib3hcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZUFwbnNQcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuLCBhdXRoS2V5Pzogc3RyaW5nLCBhdXRoS2V5SWQ/OiBzdHJpbmcsIHRlYW1JZD86IHN0cmluZywgYnVuZGxlSWQ/OiBzdHJpbmcsIHNhbmRib3g/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL2FwbnMve3Byb3ZpZGVySWR9Jy5yZXBsYWNlKCd7cHJvdmlkZXJJZH0nLCBwcm92aWRlcklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhdXRoS2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXV0aEtleSddID0gYXV0aEtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF1dGhLZXlJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2F1dGhLZXlJZCddID0gYXV0aEtleUlkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGVhbUlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndGVhbUlkJ10gPSB0ZWFtSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBidW5kbGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2J1bmRsZUlkJ10gPSBidW5kbGVJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNhbmRib3ggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzYW5kYm94J10gPSBzYW5kYm94O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIEZDTSBwcm92aWRlclxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgbmV3IEZpcmViYXNlIENsb3VkIE1lc3NhZ2luZyBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gc2VydmljZUFjY291bnRKU09OXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVGY21Qcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc2VydmljZUFjY291bnRKU09OPzogb2JqZWN0LCBlbmFibGVkPzogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJuYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL2ZjbSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJJZCddID0gcHJvdmlkZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VydmljZUFjY291bnRKU09OICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VydmljZUFjY291bnRKU09OJ10gPSBzZXJ2aWNlQWNjb3VudEpTT047XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIEZDTSBwcm92aWRlclxuICAgICAqXG4gICAgICogVXBkYXRlIGEgRmlyZWJhc2UgQ2xvdWQgTWVzc2FnaW5nIHByb3ZpZGVyIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHNlcnZpY2VBY2NvdW50SlNPTlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlcj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlRmNtUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbiwgc2VydmljZUFjY291bnRKU09OPzogb2JqZWN0KTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL2ZjbS97cHJvdmlkZXJJZH0nLnJlcGxhY2UoJ3twcm92aWRlcklkfScsIHByb3ZpZGVySWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlcnZpY2VBY2NvdW50SlNPTiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlcnZpY2VBY2NvdW50SlNPTiddID0gc2VydmljZUFjY291bnRKU09OO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIE1haWxndW4gcHJvdmlkZXJcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIG5ldyBNYWlsZ3VuIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlLZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZG9tYWluXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0V1UmVnaW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb21OYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb21FbWFpbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZXBseVRvTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZXBseVRvRW1haWxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZU1haWxndW5Qcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgYXBpS2V5Pzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcsIGlzRXVSZWdpb24/OiBib29sZWFuLCBmcm9tTmFtZT86IHN0cmluZywgZnJvbUVtYWlsPzogc3RyaW5nLCByZXBseVRvTmFtZT86IHN0cmluZywgcmVwbHlUb0VtYWlsPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJuYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL21haWxndW4nO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVySWQnXSA9IHByb3ZpZGVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaUtleSddID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZG9tYWluICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZG9tYWluJ10gPSBkb21haW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpc0V1UmVnaW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaXNFdVJlZ2lvbiddID0gaXNFdVJlZ2lvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb21OYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbU5hbWUnXSA9IGZyb21OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbUVtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbUVtYWlsJ10gPSBmcm9tRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXBseVRvTmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcGx5VG9OYW1lJ10gPSByZXBseVRvTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcGx5VG9FbWFpbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcGx5VG9FbWFpbCddID0gcmVwbHlUb0VtYWlsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBNYWlsZ3VuIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBVcGRhdGUgYSBNYWlsZ3VuIHByb3ZpZGVyIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFwaUtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkb21haW5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRXVSZWdpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbU5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbUVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGx5VG9OYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGx5VG9FbWFpbFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlcj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlTWFpbGd1blByb3ZpZGVyKHByb3ZpZGVySWQ6IHN0cmluZywgbmFtZT86IHN0cmluZywgYXBpS2V5Pzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcsIGlzRXVSZWdpb24/OiBib29sZWFuLCBlbmFibGVkPzogYm9vbGVhbiwgZnJvbU5hbWU/OiBzdHJpbmcsIGZyb21FbWFpbD86IHN0cmluZywgcmVwbHlUb05hbWU/OiBzdHJpbmcsIHJlcGx5VG9FbWFpbD86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3Byb3ZpZGVycy9tYWlsZ3VuL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaUtleSddID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZG9tYWluICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZG9tYWluJ10gPSBkb21haW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpc0V1UmVnaW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaXNFdVJlZ2lvbiddID0gaXNFdVJlZ2lvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbU5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tTmFtZSddID0gZnJvbU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tRW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tRW1haWwnXSA9IGZyb21FbWFpbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcGx5VG9OYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUb05hbWUnXSA9IHJlcGx5VG9OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbHlUb0VtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUb0VtYWlsJ10gPSByZXBseVRvRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgTXNnOTEgcHJvdmlkZXJcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIG5ldyBNU0c5MSBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGVJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZW5kZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRoS2V5XG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVNc2c5MVByb3ZpZGVyKHByb3ZpZGVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCB0ZW1wbGF0ZUlkPzogc3RyaW5nLCBzZW5kZXJJZD86IHN0cmluZywgYXV0aEtleT86IHN0cmluZywgZW5hYmxlZD86IGJvb2xlYW4pOiBQcm9taXNlPE1vZGVscy5Qcm92aWRlcj4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb3ZpZGVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibmFtZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3Byb3ZpZGVycy9tc2c5MSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJJZCddID0gcHJvdmlkZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlbXBsYXRlSWQnXSA9IHRlbXBsYXRlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZW5kZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlbmRlcklkJ10gPSBzZW5kZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF1dGhLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhdXRoS2V5J10gPSBhdXRoS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBNc2c5MSBwcm92aWRlclxuICAgICAqXG4gICAgICogVXBkYXRlIGEgTVNHOTEgcHJvdmlkZXIgYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGVJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZW5kZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRoS2V5XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVNc2c5MVByb3ZpZGVyKHByb3ZpZGVySWQ6IHN0cmluZywgbmFtZT86IHN0cmluZywgZW5hYmxlZD86IGJvb2xlYW4sIHRlbXBsYXRlSWQ/OiBzdHJpbmcsIHNlbmRlcklkPzogc3RyaW5nLCBhdXRoS2V5Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL21zZzkxL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlbXBsYXRlSWQnXSA9IHRlbXBsYXRlSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZW5kZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlbmRlcklkJ10gPSBzZW5kZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF1dGhLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhdXRoS2V5J10gPSBhdXRoS2V5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFNlbmRncmlkIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgU2VuZGdyaWQgcHJvdmlkZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFwaUtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tRW1haWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVwbHlUb05hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVwbHlUb0VtYWlsXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTZW5kZ3JpZFByb3ZpZGVyKHByb3ZpZGVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBhcGlLZXk/OiBzdHJpbmcsIGZyb21OYW1lPzogc3RyaW5nLCBmcm9tRW1haWw/OiBzdHJpbmcsIHJlcGx5VG9OYW1lPzogc3RyaW5nLCByZXBseVRvRW1haWw/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvc2VuZGdyaWQnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVySWQnXSA9IHByb3ZpZGVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaUtleSddID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbU5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tTmFtZSddID0gZnJvbU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tRW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tRW1haWwnXSA9IGZyb21FbWFpbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcGx5VG9OYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUb05hbWUnXSA9IHJlcGx5VG9OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbHlUb0VtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUb0VtYWlsJ10gPSByZXBseVRvRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIFNlbmRncmlkIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBVcGRhdGUgYSBTZW5kZ3JpZCBwcm92aWRlciBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlLZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbU5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbUVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGx5VG9OYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGx5VG9FbWFpbFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlcj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlU2VuZGdyaWRQcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuLCBhcGlLZXk/OiBzdHJpbmcsIGZyb21OYW1lPzogc3RyaW5nLCBmcm9tRW1haWw/OiBzdHJpbmcsIHJlcGx5VG9OYW1lPzogc3RyaW5nLCByZXBseVRvRW1haWw/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5Qcm92aWRlcj4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb3ZpZGVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvc2VuZGdyaWQve3Byb3ZpZGVySWR9Jy5yZXBsYWNlKCd7cHJvdmlkZXJJZH0nLCBwcm92aWRlcklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcGlLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhcGlLZXknXSA9IGFwaUtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb21OYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbU5hbWUnXSA9IGZyb21OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbUVtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbUVtYWlsJ10gPSBmcm9tRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXBseVRvTmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcGx5VG9OYW1lJ10gPSByZXBseVRvTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcGx5VG9FbWFpbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcGx5VG9FbWFpbCddID0gcmVwbHlUb0VtYWlsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFNNVFAgcHJvdmlkZXJcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIG5ldyBTTVRQIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBob3N0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvcnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmRcbiAgICAgKiBAcGFyYW0ge1NtdHBFbmNyeXB0aW9ufSBlbmNyeXB0aW9uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhdXRvVExTXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1haWxlclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tRW1haWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVwbHlUb05hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVwbHlUb0VtYWlsXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTbXRwUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGhvc3Q6IHN0cmluZywgcG9ydD86IG51bWJlciwgdXNlcm5hbWU/OiBzdHJpbmcsIHBhc3N3b3JkPzogc3RyaW5nLCBlbmNyeXB0aW9uPzogU210cEVuY3J5cHRpb24sIGF1dG9UTFM/OiBib29sZWFuLCBtYWlsZXI/OiBzdHJpbmcsIGZyb21OYW1lPzogc3RyaW5nLCBmcm9tRW1haWw/OiBzdHJpbmcsIHJlcGx5VG9OYW1lPzogc3RyaW5nLCByZXBseVRvRW1haWw/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaG9zdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiaG9zdFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3Byb3ZpZGVycy9zbXRwJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwcm92aWRlcklkJ10gPSBwcm92aWRlcklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBob3N0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnaG9zdCddID0gaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwb3J0J10gPSBwb3J0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcm5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VybmFtZSddID0gdXNlcm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Bhc3N3b3JkJ10gPSBwYXNzd29yZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuY3J5cHRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmNyeXB0aW9uJ10gPSBlbmNyeXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXV0b1RMUyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2F1dG9UTFMnXSA9IGF1dG9UTFM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtYWlsZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydtYWlsZXInXSA9IG1haWxlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb21OYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbU5hbWUnXSA9IGZyb21OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbUVtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbUVtYWlsJ10gPSBmcm9tRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXBseVRvTmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcGx5VG9OYW1lJ10gPSByZXBseVRvTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcGx5VG9FbWFpbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcGx5VG9FbWFpbCddID0gcmVwbHlUb0VtYWlsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBTTVRQIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBVcGRhdGUgYSBTTVRQIHByb3ZpZGVyIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGhvc3RcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcG9ydFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZFxuICAgICAqIEBwYXJhbSB7U210cEVuY3J5cHRpb259IGVuY3J5cHRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGF1dG9UTFNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWFpbGVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb21OYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb21FbWFpbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZXBseVRvTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZXBseVRvRW1haWxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVNtdHBQcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIGhvc3Q/OiBzdHJpbmcsIHBvcnQ/OiBudW1iZXIsIHVzZXJuYW1lPzogc3RyaW5nLCBwYXNzd29yZD86IHN0cmluZywgZW5jcnlwdGlvbj86IFNtdHBFbmNyeXB0aW9uLCBhdXRvVExTPzogYm9vbGVhbiwgbWFpbGVyPzogc3RyaW5nLCBmcm9tTmFtZT86IHN0cmluZywgZnJvbUVtYWlsPzogc3RyaW5nLCByZXBseVRvTmFtZT86IHN0cmluZywgcmVwbHlUb0VtYWlsPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3Byb3ZpZGVycy9zbXRwL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGhvc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydob3N0J10gPSBob3N0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3BvcnQnXSA9IHBvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3VzZXJuYW1lJ10gPSB1c2VybmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncGFzc3dvcmQnXSA9IHBhc3N3b3JkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5jcnlwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuY3J5cHRpb24nXSA9IGVuY3J5cHRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhdXRvVExTICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXV0b1RMUyddID0gYXV0b1RMUztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG1haWxlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ21haWxlciddID0gbWFpbGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbU5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tTmFtZSddID0gZnJvbU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tRW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tRW1haWwnXSA9IGZyb21FbWFpbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcGx5VG9OYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUb05hbWUnXSA9IHJlcGx5VG9OYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVwbHlUb0VtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUb0VtYWlsJ10gPSByZXBseVRvRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBUZWxlc2lnbiBwcm92aWRlclxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgbmV3IFRlbGVzaWduIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGN1c3RvbWVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpS2V5XG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVUZWxlc2lnblByb3ZpZGVyKHByb3ZpZGVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBmcm9tPzogc3RyaW5nLCBjdXN0b21lcklkPzogc3RyaW5nLCBhcGlLZXk/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvdGVsZXNpZ24nO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVySWQnXSA9IHByb3ZpZGVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tJ10gPSBmcm9tO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2N1c3RvbWVySWQnXSA9IGN1c3RvbWVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcGlLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhcGlLZXknXSA9IGFwaUtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgVGVsZXNpZ24gcHJvdmlkZXJcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhIFRlbGVzaWduIHByb3ZpZGVyIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGN1c3RvbWVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpS2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb21cbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVRlbGVzaWduUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbiwgY3VzdG9tZXJJZD86IHN0cmluZywgYXBpS2V5Pzogc3RyaW5nLCBmcm9tPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL3RlbGVzaWduL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY3VzdG9tZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2N1c3RvbWVySWQnXSA9IGN1c3RvbWVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcGlLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhcGlLZXknXSA9IGFwaUtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tJ10gPSBmcm9tO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFRleHRtYWdpYyBwcm92aWRlclxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgbmV3IFRleHRtYWdpYyBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlLZXlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVRleHRtYWdpY1Byb3ZpZGVyKHByb3ZpZGVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBmcm9tPzogc3RyaW5nLCB1c2VybmFtZT86IHN0cmluZywgYXBpS2V5Pzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJuYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL3RleHRtYWdpYyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJJZCddID0gcHJvdmlkZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2Zyb20nXSA9IGZyb207XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3VzZXJuYW1lJ10gPSB1c2VybmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaUtleSddID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBUZXh0bWFnaWMgcHJvdmlkZXJcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhIFRleHRtYWdpYyBwcm92aWRlciBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlLZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlcj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlVGV4dG1hZ2ljUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbiwgdXNlcm5hbWU/OiBzdHJpbmcsIGFwaUtleT86IHN0cmluZywgZnJvbT86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3Byb3ZpZGVycy90ZXh0bWFnaWMve3Byb3ZpZGVySWR9Jy5yZXBsYWNlKCd7cHJvdmlkZXJJZH0nLCBwcm92aWRlcklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3VzZXJuYW1lJ10gPSB1c2VybmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaUtleSddID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2Zyb20nXSA9IGZyb207XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgVHdpbGlvIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgVHdpbGlvIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFjY291bnRTaWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0aFRva2VuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVUd2lsaW9Qcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZnJvbT86IHN0cmluZywgYWNjb3VudFNpZD86IHN0cmluZywgYXV0aFRva2VuPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb3ZpZGVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJuYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL3R3aWxpbyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvdmlkZXJJZCddID0gcHJvdmlkZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2Zyb20nXSA9IGZyb207XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhY2NvdW50U2lkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYWNjb3VudFNpZCddID0gYWNjb3VudFNpZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGF1dGhUb2tlbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2F1dGhUb2tlbiddID0gYXV0aFRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBUd2lsaW8gcHJvdmlkZXJcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhIFR3aWxpbyBwcm92aWRlciBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhY2NvdW50U2lkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF1dGhUb2tlblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVUd2lsaW9Qcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuLCBhY2NvdW50U2lkPzogc3RyaW5nLCBhdXRoVG9rZW4/OiBzdHJpbmcsIGZyb20/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5Qcm92aWRlcj4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb3ZpZGVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvdHdpbGlvL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYWNjb3VudFNpZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FjY291bnRTaWQnXSA9IGFjY291bnRTaWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhdXRoVG9rZW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhdXRoVG9rZW4nXSA9IGF1dGhUb2tlbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tJ10gPSBmcm9tO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFZvbmFnZSBwcm92aWRlclxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgbmV3IFZvbmFnZSBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlLZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpU2VjcmV0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb3ZpZGVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVWb25hZ2VQcm92aWRlcihwcm92aWRlcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZnJvbT86IHN0cmluZywgYXBpS2V5Pzogc3RyaW5nLCBhcGlTZWNyZXQ/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvdm9uYWdlJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwcm92aWRlcklkJ10gPSBwcm92aWRlcklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZnJvbSddID0gZnJvbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaUtleSddID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXBpU2VjcmV0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXBpU2VjcmV0J10gPSBhcGlTZWNyZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIFZvbmFnZSBwcm92aWRlclxuICAgICAqXG4gICAgICogVXBkYXRlIGEgVm9uYWdlIHByb3ZpZGVyIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFwaUtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlTZWNyZXRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlcj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlVm9uYWdlUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbiwgYXBpS2V5Pzogc3RyaW5nLCBhcGlTZWNyZXQ/OiBzdHJpbmcsIGZyb20/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5Qcm92aWRlcj4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb3ZpZGVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMvdm9uYWdlL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXBpS2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXBpS2V5J10gPSBhcGlLZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcGlTZWNyZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhcGlTZWNyZXQnXSA9IGFwaVNlY3JldDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZyb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmcm9tJ10gPSBmcm9tO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBHZXQgYSBwcm92aWRlciBieSBpdHMgdW5pcXVlIElELlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm92aWRlcj59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0UHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuUHJvdmlkZXI+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvcHJvdmlkZXJzL3twcm92aWRlcklkfScucmVwbGFjZSgne3Byb3ZpZGVySWR9JywgcHJvdmlkZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIHByb3ZpZGVyXG4gICAgICpcbiAgICAgKiBEZWxldGUgYSBwcm92aWRlciBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVySWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlUHJvdmlkZXIocHJvdmlkZXJJZDogc3RyaW5nKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb3ZpZGVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMve3Byb3ZpZGVySWR9Jy5yZXBsYWNlKCd7cHJvdmlkZXJJZH0nLCBwcm92aWRlcklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IHByb3ZpZGVyIGxvZ3NcbiAgICAgKlxuICAgICAqIEdldCB0aGUgcHJvdmlkZXIgYWN0aXZpdHkgbG9ncyBsaXN0ZWQgYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcXVlcmllc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Mb2dMaXN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0UHJvdmlkZXJMb2dzKHByb3ZpZGVySWQ6IHN0cmluZywgcXVlcmllcz86IHN0cmluZ1tdKTogUHJvbWlzZTxNb2RlbHMuTG9nTGlzdD4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb3ZpZGVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9wcm92aWRlcnMve3Byb3ZpZGVySWR9L2xvZ3MnLnJlcGxhY2UoJ3twcm92aWRlcklkfScsIHByb3ZpZGVySWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcXVlcmllcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3F1ZXJpZXMnXSA9IHF1ZXJpZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCBzdWJzY3JpYmVyIGxvZ3NcbiAgICAgKlxuICAgICAqIEdldCB0aGUgc3Vic2NyaWJlciBhY3Rpdml0eSBsb2dzIGxpc3RlZCBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnNjcmliZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuTG9nTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFN1YnNjcmliZXJMb2dzKHN1YnNjcmliZXJJZDogc3RyaW5nLCBxdWVyaWVzPzogc3RyaW5nW10pOiBQcm9taXNlPE1vZGVscy5Mb2dMaXN0PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3Vic2NyaWJlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzdWJzY3JpYmVySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy9zdWJzY3JpYmVycy97c3Vic2NyaWJlcklkfS9sb2dzJy5yZXBsYWNlKCd7c3Vic2NyaWJlcklkfScsIHN1YnNjcmliZXJJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncXVlcmllcyddID0gcXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IHRvcGljc1xuICAgICAqXG4gICAgICogR2V0IGEgbGlzdCBvZiBhbGwgdG9waWNzIGZyb20gdGhlIGN1cnJlbnQgQXBwY29uZGEgcHJvamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VhcmNoXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlRvcGljTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFRvcGljcyhxdWVyaWVzPzogc3RyaW5nW10sIHNlYXJjaD86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLlRvcGljTGlzdD4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvdG9waWNzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VhcmNoJ10gPSBzZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRvcGljXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgdG9waWMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gc3Vic2NyaWJlXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlRvcGljPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVUb3BpYyh0b3BpY0lkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3Vic2NyaWJlPzogc3RyaW5nW10pOiBQcm9taXNlPE1vZGVscy5Ub3BpYz4ge1xuICAgICAgICBpZiAodHlwZW9mIHRvcGljSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInRvcGljSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibmFtZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3RvcGljcyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY0lkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndG9waWNJZCddID0gdG9waWNJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduYW1lJ10gPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3Vic2NyaWJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3Vic2NyaWJlJ10gPSBzdWJzY3JpYmU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0b3BpY1xuICAgICAqXG4gICAgICogR2V0IGEgdG9waWMgYnkgaXRzIHVuaXF1ZSBJRC5cblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRvcGljSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuVG9waWM+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldFRvcGljKHRvcGljSWQ6IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLlRvcGljPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdG9waWNJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidG9waWNJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3RvcGljcy97dG9waWNJZH0nLnJlcGxhY2UoJ3t0b3BpY0lkfScsIHRvcGljSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0b3BpY1xuICAgICAqXG4gICAgICogVXBkYXRlIGEgdG9waWMgYnkgaXRzIHVuaXF1ZSBJRC5cblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRvcGljSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHN1YnNjcmliZVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Ub3BpYz59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlVG9waWModG9waWNJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBzdWJzY3JpYmU/OiBzdHJpbmdbXSk6IFByb21pc2U8TW9kZWxzLlRvcGljPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdG9waWNJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidG9waWNJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3RvcGljcy97dG9waWNJZH0nLnJlcGxhY2UoJ3t0b3BpY0lkfScsIHRvcGljSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpYmUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzdWJzY3JpYmUnXSA9IHN1YnNjcmliZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSB0b3BpY1xuICAgICAqXG4gICAgICogRGVsZXRlIGEgdG9waWMgYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY0lkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZVRvcGljKHRvcGljSWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY0lkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0b3BpY0lkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvdG9waWNzL3t0b3BpY0lkfScucmVwbGFjZSgne3RvcGljSWR9JywgdG9waWNJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCB0b3BpYyBsb2dzXG4gICAgICpcbiAgICAgKiBHZXQgdGhlIHRvcGljIGFjdGl2aXR5IGxvZ3MgbGlzdGVkIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuTG9nTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFRvcGljTG9ncyh0b3BpY0lkOiBzdHJpbmcsIHF1ZXJpZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8TW9kZWxzLkxvZ0xpc3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY0lkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0b3BpY0lkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvdG9waWNzL3t0b3BpY0lkfS9sb2dzJy5yZXBsYWNlKCd7dG9waWNJZH0nLCB0b3BpY0lkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3Qgc3Vic2NyaWJlcnNcbiAgICAgKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgYWxsIHN1YnNjcmliZXJzIGZyb20gdGhlIGN1cnJlbnQgQXBwY29uZGEgcHJvamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY0lkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcXVlcmllc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWFyY2hcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuU3Vic2NyaWJlckxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RTdWJzY3JpYmVycyh0b3BpY0lkOiBzdHJpbmcsIHF1ZXJpZXM/OiBzdHJpbmdbXSwgc2VhcmNoPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuU3Vic2NyaWJlckxpc3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY0lkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0b3BpY0lkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvdG9waWNzL3t0b3BpY0lkfS9zdWJzY3JpYmVycycucmVwbGFjZSgne3RvcGljSWR9JywgdG9waWNJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncXVlcmllcyddID0gcXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlYXJjaCddID0gc2VhcmNoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBzdWJzY3JpYmVyXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgc3Vic2NyaWJlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY0lkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnNjcmliZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXRJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5TdWJzY3JpYmVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTdWJzY3JpYmVyKHRvcGljSWQ6IHN0cmluZywgc3Vic2NyaWJlcklkOiBzdHJpbmcsIHRhcmdldElkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5TdWJzY3JpYmVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdG9waWNJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidG9waWNJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInN1YnNjcmliZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidGFyZ2V0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL21lc3NhZ2luZy90b3BpY3Mve3RvcGljSWR9L3N1YnNjcmliZXJzJy5yZXBsYWNlKCd7dG9waWNJZH0nLCB0b3BpY0lkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHN1YnNjcmliZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3N1YnNjcmliZXJJZCddID0gc3Vic2NyaWJlcklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0SWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0YXJnZXRJZCddID0gdGFyZ2V0SWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBzdWJzY3JpYmVyXG4gICAgICpcbiAgICAgKiBHZXQgYSBzdWJzY3JpYmVyIGJ5IGl0cyB1bmlxdWUgSUQuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY0lkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnNjcmliZXJJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5TdWJzY3JpYmVyPn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXRTdWJzY3JpYmVyKHRvcGljSWQ6IHN0cmluZywgc3Vic2NyaWJlcklkOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5TdWJzY3JpYmVyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdG9waWNJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidG9waWNJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInN1YnNjcmliZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvbWVzc2FnaW5nL3RvcGljcy97dG9waWNJZH0vc3Vic2NyaWJlcnMve3N1YnNjcmliZXJJZH0nLnJlcGxhY2UoJ3t0b3BpY0lkfScsIHRvcGljSWQpLnJlcGxhY2UoJ3tzdWJzY3JpYmVySWR9Jywgc3Vic2NyaWJlcklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgc3Vic2NyaWJlclxuICAgICAqXG4gICAgICogRGVsZXRlIGEgc3Vic2NyaWJlciBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRvcGljSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3Vic2NyaWJlcklkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZVN1YnNjcmliZXIodG9waWNJZDogc3RyaW5nLCBzdWJzY3JpYmVySWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b3BpY0lkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0b3BpY0lkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHN1YnNjcmliZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic3Vic2NyaWJlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9tZXNzYWdpbmcvdG9waWNzL3t0b3BpY0lkfS9zdWJzY3JpYmVycy97c3Vic2NyaWJlcklkfScucmVwbGFjZSgne3RvcGljSWR9JywgdG9waWNJZCkucmVwbGFjZSgne3N1YnNjcmliZXJJZH0nLCBzdWJzY3JpYmVySWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19