@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,1526 +0,0 @@
1
- import { AppcondaException } from "../client";
2
- export class Projects {
3
- constructor(client) {
4
- this.client = client;
5
- }
6
- /**
7
- * List projects
8
- *
9
- *
10
- * @param {string[]} queries
11
- * @param {string} search
12
- * @throws {AppcondaException}
13
- * @returns {Promise<Models.ProjectList>}
14
- */
15
- async list(queries, search) {
16
- const apiPath = '/projects';
17
- const payload = {};
18
- if (typeof queries !== 'undefined') {
19
- payload['queries'] = queries;
20
- }
21
- if (typeof search !== 'undefined') {
22
- payload['search'] = search;
23
- }
24
- const uri = new URL(this.client.config.endpoint + apiPath);
25
- const apiHeaders = {
26
- 'content-type': 'application/json',
27
- };
28
- return await this.client.call('get', uri, apiHeaders, payload);
29
- }
30
- /**
31
- * Create project
32
- *
33
- *
34
- * @param {string} projectId
35
- * @param {string} name
36
- * @param {string} teamId
37
- * @param {Region} region
38
- * @param {string} description
39
- * @param {string} logo
40
- * @param {string} url
41
- * @param {string} legalName
42
- * @param {string} legalCountry
43
- * @param {string} legalState
44
- * @param {string} legalCity
45
- * @param {string} legalAddress
46
- * @param {string} legalTaxId
47
- * @throws {AppcondaException}
48
- * @returns {Promise<Models.Project>}
49
- */
50
- async create(projectId, name, teamId, region, description, logo, url, legalName, legalCountry, legalState, legalCity, legalAddress, legalTaxId) {
51
- if (typeof projectId === 'undefined') {
52
- throw new AppcondaException('Missing required parameter: "projectId"');
53
- }
54
- if (typeof name === 'undefined') {
55
- throw new AppcondaException('Missing required parameter: "name"');
56
- }
57
- if (typeof teamId === 'undefined') {
58
- throw new AppcondaException('Missing required parameter: "teamId"');
59
- }
60
- const apiPath = '/projects';
61
- const payload = {};
62
- if (typeof projectId !== 'undefined') {
63
- payload['projectId'] = projectId;
64
- }
65
- if (typeof name !== 'undefined') {
66
- payload['name'] = name;
67
- }
68
- if (typeof teamId !== 'undefined') {
69
- payload['teamId'] = teamId;
70
- }
71
- if (typeof region !== 'undefined') {
72
- payload['region'] = region;
73
- }
74
- if (typeof description !== 'undefined') {
75
- payload['description'] = description;
76
- }
77
- if (typeof logo !== 'undefined') {
78
- payload['logo'] = logo;
79
- }
80
- if (typeof url !== 'undefined') {
81
- payload['url'] = url;
82
- }
83
- if (typeof legalName !== 'undefined') {
84
- payload['legalName'] = legalName;
85
- }
86
- if (typeof legalCountry !== 'undefined') {
87
- payload['legalCountry'] = legalCountry;
88
- }
89
- if (typeof legalState !== 'undefined') {
90
- payload['legalState'] = legalState;
91
- }
92
- if (typeof legalCity !== 'undefined') {
93
- payload['legalCity'] = legalCity;
94
- }
95
- if (typeof legalAddress !== 'undefined') {
96
- payload['legalAddress'] = legalAddress;
97
- }
98
- if (typeof legalTaxId !== 'undefined') {
99
- payload['legalTaxId'] = legalTaxId;
100
- }
101
- const uri = new URL(this.client.config.endpoint + apiPath);
102
- const apiHeaders = {
103
- 'content-type': 'application/json',
104
- };
105
- return await this.client.call('post', uri, apiHeaders, payload);
106
- }
107
- /**
108
- * Get project
109
- *
110
- *
111
- * @param {string} projectId
112
- * @throws {AppcondaException}
113
- * @returns {Promise<Models.Project>}
114
- */
115
- async get(projectId) {
116
- if (typeof projectId === 'undefined') {
117
- throw new AppcondaException('Missing required parameter: "projectId"');
118
- }
119
- const apiPath = '/projects/{projectId}'.replace('{projectId}', projectId);
120
- const payload = {};
121
- const uri = new URL(this.client.config.endpoint + apiPath);
122
- const apiHeaders = {
123
- 'content-type': 'application/json',
124
- };
125
- return await this.client.call('get', uri, apiHeaders, payload);
126
- }
127
- /**
128
- * Update project
129
- *
130
- *
131
- * @param {string} projectId
132
- * @param {string} name
133
- * @param {string} description
134
- * @param {string} logo
135
- * @param {string} url
136
- * @param {string} legalName
137
- * @param {string} legalCountry
138
- * @param {string} legalState
139
- * @param {string} legalCity
140
- * @param {string} legalAddress
141
- * @param {string} legalTaxId
142
- * @throws {AppcondaException}
143
- * @returns {Promise<Models.Project>}
144
- */
145
- async update(projectId, name, description, logo, url, legalName, legalCountry, legalState, legalCity, legalAddress, legalTaxId) {
146
- if (typeof projectId === 'undefined') {
147
- throw new AppcondaException('Missing required parameter: "projectId"');
148
- }
149
- if (typeof name === 'undefined') {
150
- throw new AppcondaException('Missing required parameter: "name"');
151
- }
152
- const apiPath = '/projects/{projectId}'.replace('{projectId}', projectId);
153
- const payload = {};
154
- if (typeof name !== 'undefined') {
155
- payload['name'] = name;
156
- }
157
- if (typeof description !== 'undefined') {
158
- payload['description'] = description;
159
- }
160
- if (typeof logo !== 'undefined') {
161
- payload['logo'] = logo;
162
- }
163
- if (typeof url !== 'undefined') {
164
- payload['url'] = url;
165
- }
166
- if (typeof legalName !== 'undefined') {
167
- payload['legalName'] = legalName;
168
- }
169
- if (typeof legalCountry !== 'undefined') {
170
- payload['legalCountry'] = legalCountry;
171
- }
172
- if (typeof legalState !== 'undefined') {
173
- payload['legalState'] = legalState;
174
- }
175
- if (typeof legalCity !== 'undefined') {
176
- payload['legalCity'] = legalCity;
177
- }
178
- if (typeof legalAddress !== 'undefined') {
179
- payload['legalAddress'] = legalAddress;
180
- }
181
- if (typeof legalTaxId !== 'undefined') {
182
- payload['legalTaxId'] = legalTaxId;
183
- }
184
- const uri = new URL(this.client.config.endpoint + apiPath);
185
- const apiHeaders = {
186
- 'content-type': 'application/json',
187
- };
188
- return await this.client.call('patch', uri, apiHeaders, payload);
189
- }
190
- /**
191
- * Delete project
192
- *
193
- *
194
- * @param {string} projectId
195
- * @throws {AppcondaException}
196
- * @returns {Promise<{}>}
197
- */
198
- async delete(projectId) {
199
- if (typeof projectId === 'undefined') {
200
- throw new AppcondaException('Missing required parameter: "projectId"');
201
- }
202
- const apiPath = '/projects/{projectId}'.replace('{projectId}', projectId);
203
- const payload = {};
204
- const uri = new URL(this.client.config.endpoint + apiPath);
205
- const apiHeaders = {
206
- 'content-type': 'application/json',
207
- };
208
- return await this.client.call('delete', uri, apiHeaders, payload);
209
- }
210
- /**
211
- * Update API status
212
- *
213
- *
214
- * @param {string} projectId
215
- * @param {Api} api
216
- * @param {boolean} status
217
- * @throws {AppcondaException}
218
- * @returns {Promise<Models.Project>}
219
- */
220
- async updateApiStatus(projectId, api, status) {
221
- if (typeof projectId === 'undefined') {
222
- throw new AppcondaException('Missing required parameter: "projectId"');
223
- }
224
- if (typeof api === 'undefined') {
225
- throw new AppcondaException('Missing required parameter: "api"');
226
- }
227
- if (typeof status === 'undefined') {
228
- throw new AppcondaException('Missing required parameter: "status"');
229
- }
230
- const apiPath = '/projects/{projectId}/api'.replace('{projectId}', projectId);
231
- const payload = {};
232
- if (typeof api !== 'undefined') {
233
- payload['api'] = api;
234
- }
235
- if (typeof status !== 'undefined') {
236
- payload['status'] = status;
237
- }
238
- const uri = new URL(this.client.config.endpoint + apiPath);
239
- const apiHeaders = {
240
- 'content-type': 'application/json',
241
- };
242
- return await this.client.call('patch', uri, apiHeaders, payload);
243
- }
244
- /**
245
- * Update all API status
246
- *
247
- *
248
- * @param {string} projectId
249
- * @param {boolean} status
250
- * @throws {AppcondaException}
251
- * @returns {Promise<Models.Project>}
252
- */
253
- async updateApiStatusAll(projectId, status) {
254
- if (typeof projectId === 'undefined') {
255
- throw new AppcondaException('Missing required parameter: "projectId"');
256
- }
257
- if (typeof status === 'undefined') {
258
- throw new AppcondaException('Missing required parameter: "status"');
259
- }
260
- const apiPath = '/projects/{projectId}/api/all'.replace('{projectId}', projectId);
261
- const payload = {};
262
- if (typeof status !== 'undefined') {
263
- payload['status'] = status;
264
- }
265
- const uri = new URL(this.client.config.endpoint + apiPath);
266
- const apiHeaders = {
267
- 'content-type': 'application/json',
268
- };
269
- return await this.client.call('patch', uri, apiHeaders, payload);
270
- }
271
- /**
272
- * Update project authentication duration
273
- *
274
- *
275
- * @param {string} projectId
276
- * @param {number} duration
277
- * @throws {AppcondaException}
278
- * @returns {Promise<Models.Project>}
279
- */
280
- async updateAuthDuration(projectId, duration) {
281
- if (typeof projectId === 'undefined') {
282
- throw new AppcondaException('Missing required parameter: "projectId"');
283
- }
284
- if (typeof duration === 'undefined') {
285
- throw new AppcondaException('Missing required parameter: "duration"');
286
- }
287
- const apiPath = '/projects/{projectId}/auth/duration'.replace('{projectId}', projectId);
288
- const payload = {};
289
- if (typeof duration !== 'undefined') {
290
- payload['duration'] = duration;
291
- }
292
- const uri = new URL(this.client.config.endpoint + apiPath);
293
- const apiHeaders = {
294
- 'content-type': 'application/json',
295
- };
296
- return await this.client.call('patch', uri, apiHeaders, payload);
297
- }
298
- /**
299
- * Update project users limit
300
- *
301
- *
302
- * @param {string} projectId
303
- * @param {number} limit
304
- * @throws {AppcondaException}
305
- * @returns {Promise<Models.Project>}
306
- */
307
- async updateAuthLimit(projectId, limit) {
308
- if (typeof projectId === 'undefined') {
309
- throw new AppcondaException('Missing required parameter: "projectId"');
310
- }
311
- if (typeof limit === 'undefined') {
312
- throw new AppcondaException('Missing required parameter: "limit"');
313
- }
314
- const apiPath = '/projects/{projectId}/auth/limit'.replace('{projectId}', projectId);
315
- const payload = {};
316
- if (typeof limit !== 'undefined') {
317
- payload['limit'] = limit;
318
- }
319
- const uri = new URL(this.client.config.endpoint + apiPath);
320
- const apiHeaders = {
321
- 'content-type': 'application/json',
322
- };
323
- return await this.client.call('patch', uri, apiHeaders, payload);
324
- }
325
- /**
326
- * Update project user sessions limit
327
- *
328
- *
329
- * @param {string} projectId
330
- * @param {number} limit
331
- * @throws {AppcondaException}
332
- * @returns {Promise<Models.Project>}
333
- */
334
- async updateAuthSessionsLimit(projectId, limit) {
335
- if (typeof projectId === 'undefined') {
336
- throw new AppcondaException('Missing required parameter: "projectId"');
337
- }
338
- if (typeof limit === 'undefined') {
339
- throw new AppcondaException('Missing required parameter: "limit"');
340
- }
341
- const apiPath = '/projects/{projectId}/auth/max-sessions'.replace('{projectId}', projectId);
342
- const payload = {};
343
- if (typeof limit !== 'undefined') {
344
- payload['limit'] = limit;
345
- }
346
- const uri = new URL(this.client.config.endpoint + apiPath);
347
- const apiHeaders = {
348
- 'content-type': 'application/json',
349
- };
350
- return await this.client.call('patch', uri, apiHeaders, payload);
351
- }
352
- /**
353
- * Update the mock numbers for the project
354
- *
355
- *
356
- * @param {string} projectId
357
- * @param {object[]} numbers
358
- * @throws {AppcondaException}
359
- * @returns {Promise<Models.Project>}
360
- */
361
- async updateMockNumbers(projectId, numbers) {
362
- if (typeof projectId === 'undefined') {
363
- throw new AppcondaException('Missing required parameter: "projectId"');
364
- }
365
- if (typeof numbers === 'undefined') {
366
- throw new AppcondaException('Missing required parameter: "numbers"');
367
- }
368
- const apiPath = '/projects/{projectId}/auth/mock-numbers'.replace('{projectId}', projectId);
369
- const payload = {};
370
- if (typeof numbers !== 'undefined') {
371
- payload['numbers'] = numbers;
372
- }
373
- const uri = new URL(this.client.config.endpoint + apiPath);
374
- const apiHeaders = {
375
- 'content-type': 'application/json',
376
- };
377
- return await this.client.call('patch', uri, apiHeaders, payload);
378
- }
379
- /**
380
- * Update authentication password dictionary status. Use this endpoint to enable or disable the dicitonary check for user password
381
- *
382
- *
383
- * @param {string} projectId
384
- * @param {boolean} enabled
385
- * @throws {AppcondaException}
386
- * @returns {Promise<Models.Project>}
387
- */
388
- async updateAuthPasswordDictionary(projectId, enabled) {
389
- if (typeof projectId === 'undefined') {
390
- throw new AppcondaException('Missing required parameter: "projectId"');
391
- }
392
- if (typeof enabled === 'undefined') {
393
- throw new AppcondaException('Missing required parameter: "enabled"');
394
- }
395
- const apiPath = '/projects/{projectId}/auth/password-dictionary'.replace('{projectId}', projectId);
396
- const payload = {};
397
- if (typeof enabled !== 'undefined') {
398
- payload['enabled'] = enabled;
399
- }
400
- const uri = new URL(this.client.config.endpoint + apiPath);
401
- const apiHeaders = {
402
- 'content-type': 'application/json',
403
- };
404
- return await this.client.call('patch', uri, apiHeaders, payload);
405
- }
406
- /**
407
- * Update authentication password history. Use this endpoint to set the number of password history to save and 0 to disable password history.
408
- *
409
- *
410
- * @param {string} projectId
411
- * @param {number} limit
412
- * @throws {AppcondaException}
413
- * @returns {Promise<Models.Project>}
414
- */
415
- async updateAuthPasswordHistory(projectId, limit) {
416
- if (typeof projectId === 'undefined') {
417
- throw new AppcondaException('Missing required parameter: "projectId"');
418
- }
419
- if (typeof limit === 'undefined') {
420
- throw new AppcondaException('Missing required parameter: "limit"');
421
- }
422
- const apiPath = '/projects/{projectId}/auth/password-history'.replace('{projectId}', projectId);
423
- const payload = {};
424
- if (typeof limit !== 'undefined') {
425
- payload['limit'] = limit;
426
- }
427
- const uri = new URL(this.client.config.endpoint + apiPath);
428
- const apiHeaders = {
429
- 'content-type': 'application/json',
430
- };
431
- return await this.client.call('patch', uri, apiHeaders, payload);
432
- }
433
- /**
434
- * Enable or disable checking user passwords for similarity with their personal data.
435
- *
436
- *
437
- * @param {string} projectId
438
- * @param {boolean} enabled
439
- * @throws {AppcondaException}
440
- * @returns {Promise<Models.Project>}
441
- */
442
- async updatePersonalDataCheck(projectId, enabled) {
443
- if (typeof projectId === 'undefined') {
444
- throw new AppcondaException('Missing required parameter: "projectId"');
445
- }
446
- if (typeof enabled === 'undefined') {
447
- throw new AppcondaException('Missing required parameter: "enabled"');
448
- }
449
- const apiPath = '/projects/{projectId}/auth/personal-data'.replace('{projectId}', projectId);
450
- const payload = {};
451
- if (typeof enabled !== 'undefined') {
452
- payload['enabled'] = enabled;
453
- }
454
- const uri = new URL(this.client.config.endpoint + apiPath);
455
- const apiHeaders = {
456
- 'content-type': 'application/json',
457
- };
458
- return await this.client.call('patch', uri, apiHeaders, payload);
459
- }
460
- /**
461
- * Update project sessions emails
462
- *
463
- *
464
- * @param {string} projectId
465
- * @param {boolean} alerts
466
- * @throws {AppcondaException}
467
- * @returns {Promise<Models.Project>}
468
- */
469
- async updateSessionAlerts(projectId, alerts) {
470
- if (typeof projectId === 'undefined') {
471
- throw new AppcondaException('Missing required parameter: "projectId"');
472
- }
473
- if (typeof alerts === 'undefined') {
474
- throw new AppcondaException('Missing required parameter: "alerts"');
475
- }
476
- const apiPath = '/projects/{projectId}/auth/session-alerts'.replace('{projectId}', projectId);
477
- const payload = {};
478
- if (typeof alerts !== 'undefined') {
479
- payload['alerts'] = alerts;
480
- }
481
- const uri = new URL(this.client.config.endpoint + apiPath);
482
- const apiHeaders = {
483
- 'content-type': 'application/json',
484
- };
485
- return await this.client.call('patch', uri, apiHeaders, payload);
486
- }
487
- /**
488
- * Update project auth method status. Use this endpoint to enable or disable a given auth method for this project.
489
- *
490
- *
491
- * @param {string} projectId
492
- * @param {AuthMethod} method
493
- * @param {boolean} status
494
- * @throws {AppcondaException}
495
- * @returns {Promise<Models.Project>}
496
- */
497
- async updateAuthStatus(projectId, method, status) {
498
- if (typeof projectId === 'undefined') {
499
- throw new AppcondaException('Missing required parameter: "projectId"');
500
- }
501
- if (typeof method === 'undefined') {
502
- throw new AppcondaException('Missing required parameter: "method"');
503
- }
504
- if (typeof status === 'undefined') {
505
- throw new AppcondaException('Missing required parameter: "status"');
506
- }
507
- const apiPath = '/projects/{projectId}/auth/{method}'.replace('{projectId}', projectId).replace('{method}', method);
508
- const payload = {};
509
- if (typeof status !== 'undefined') {
510
- payload['status'] = status;
511
- }
512
- const uri = new URL(this.client.config.endpoint + apiPath);
513
- const apiHeaders = {
514
- 'content-type': 'application/json',
515
- };
516
- return await this.client.call('patch', uri, apiHeaders, payload);
517
- }
518
- /**
519
- * Create JWT
520
- *
521
- *
522
- * @param {string} projectId
523
- * @param {string[]} scopes
524
- * @param {number} duration
525
- * @throws {AppcondaException}
526
- * @returns {Promise<Models.Jwt>}
527
- */
528
- async createJWT(projectId, scopes, duration) {
529
- if (typeof projectId === 'undefined') {
530
- throw new AppcondaException('Missing required parameter: "projectId"');
531
- }
532
- if (typeof scopes === 'undefined') {
533
- throw new AppcondaException('Missing required parameter: "scopes"');
534
- }
535
- const apiPath = '/projects/{projectId}/jwts'.replace('{projectId}', projectId);
536
- const payload = {};
537
- if (typeof scopes !== 'undefined') {
538
- payload['scopes'] = scopes;
539
- }
540
- if (typeof duration !== 'undefined') {
541
- payload['duration'] = duration;
542
- }
543
- const uri = new URL(this.client.config.endpoint + apiPath);
544
- const apiHeaders = {
545
- 'content-type': 'application/json',
546
- };
547
- return await this.client.call('post', uri, apiHeaders, payload);
548
- }
549
- /**
550
- * List keys
551
- *
552
- *
553
- * @param {string} projectId
554
- * @throws {AppcondaException}
555
- * @returns {Promise<Models.KeyList>}
556
- */
557
- async listKeys(projectId) {
558
- if (typeof projectId === 'undefined') {
559
- throw new AppcondaException('Missing required parameter: "projectId"');
560
- }
561
- const apiPath = '/projects/{projectId}/keys'.replace('{projectId}', projectId);
562
- const payload = {};
563
- const uri = new URL(this.client.config.endpoint + apiPath);
564
- const apiHeaders = {
565
- 'content-type': 'application/json',
566
- };
567
- return await this.client.call('get', uri, apiHeaders, payload);
568
- }
569
- /**
570
- * Create key
571
- *
572
- *
573
- * @param {string} projectId
574
- * @param {string} name
575
- * @param {string[]} scopes
576
- * @param {string} expire
577
- * @throws {AppcondaException}
578
- * @returns {Promise<Models.Key>}
579
- */
580
- async createKey(projectId, name, scopes, expire) {
581
- if (typeof projectId === 'undefined') {
582
- throw new AppcondaException('Missing required parameter: "projectId"');
583
- }
584
- if (typeof name === 'undefined') {
585
- throw new AppcondaException('Missing required parameter: "name"');
586
- }
587
- if (typeof scopes === 'undefined') {
588
- throw new AppcondaException('Missing required parameter: "scopes"');
589
- }
590
- const apiPath = '/projects/{projectId}/keys'.replace('{projectId}', projectId);
591
- const payload = {};
592
- if (typeof name !== 'undefined') {
593
- payload['name'] = name;
594
- }
595
- if (typeof scopes !== 'undefined') {
596
- payload['scopes'] = scopes;
597
- }
598
- if (typeof expire !== 'undefined') {
599
- payload['expire'] = expire;
600
- }
601
- const uri = new URL(this.client.config.endpoint + apiPath);
602
- const apiHeaders = {
603
- 'content-type': 'application/json',
604
- };
605
- return await this.client.call('post', uri, apiHeaders, payload);
606
- }
607
- /**
608
- * Get key
609
- *
610
- *
611
- * @param {string} projectId
612
- * @param {string} keyId
613
- * @throws {AppcondaException}
614
- * @returns {Promise<Models.Key>}
615
- */
616
- async getKey(projectId, keyId) {
617
- if (typeof projectId === 'undefined') {
618
- throw new AppcondaException('Missing required parameter: "projectId"');
619
- }
620
- if (typeof keyId === 'undefined') {
621
- throw new AppcondaException('Missing required parameter: "keyId"');
622
- }
623
- const apiPath = '/projects/{projectId}/keys/{keyId}'.replace('{projectId}', projectId).replace('{keyId}', keyId);
624
- const payload = {};
625
- const uri = new URL(this.client.config.endpoint + apiPath);
626
- const apiHeaders = {
627
- 'content-type': 'application/json',
628
- };
629
- return await this.client.call('get', uri, apiHeaders, payload);
630
- }
631
- /**
632
- * Update key
633
- *
634
- *
635
- * @param {string} projectId
636
- * @param {string} keyId
637
- * @param {string} name
638
- * @param {string[]} scopes
639
- * @param {string} expire
640
- * @throws {AppcondaException}
641
- * @returns {Promise<Models.Key>}
642
- */
643
- async updateKey(projectId, keyId, name, scopes, expire) {
644
- if (typeof projectId === 'undefined') {
645
- throw new AppcondaException('Missing required parameter: "projectId"');
646
- }
647
- if (typeof keyId === 'undefined') {
648
- throw new AppcondaException('Missing required parameter: "keyId"');
649
- }
650
- if (typeof name === 'undefined') {
651
- throw new AppcondaException('Missing required parameter: "name"');
652
- }
653
- if (typeof scopes === 'undefined') {
654
- throw new AppcondaException('Missing required parameter: "scopes"');
655
- }
656
- const apiPath = '/projects/{projectId}/keys/{keyId}'.replace('{projectId}', projectId).replace('{keyId}', keyId);
657
- const payload = {};
658
- if (typeof name !== 'undefined') {
659
- payload['name'] = name;
660
- }
661
- if (typeof scopes !== 'undefined') {
662
- payload['scopes'] = scopes;
663
- }
664
- if (typeof expire !== 'undefined') {
665
- payload['expire'] = expire;
666
- }
667
- const uri = new URL(this.client.config.endpoint + apiPath);
668
- const apiHeaders = {
669
- 'content-type': 'application/json',
670
- };
671
- return await this.client.call('put', uri, apiHeaders, payload);
672
- }
673
- /**
674
- * Delete key
675
- *
676
- *
677
- * @param {string} projectId
678
- * @param {string} keyId
679
- * @throws {AppcondaException}
680
- * @returns {Promise<{}>}
681
- */
682
- async deleteKey(projectId, keyId) {
683
- if (typeof projectId === 'undefined') {
684
- throw new AppcondaException('Missing required parameter: "projectId"');
685
- }
686
- if (typeof keyId === 'undefined') {
687
- throw new AppcondaException('Missing required parameter: "keyId"');
688
- }
689
- const apiPath = '/projects/{projectId}/keys/{keyId}'.replace('{projectId}', projectId).replace('{keyId}', keyId);
690
- const payload = {};
691
- const uri = new URL(this.client.config.endpoint + apiPath);
692
- const apiHeaders = {
693
- 'content-type': 'application/json',
694
- };
695
- return await this.client.call('delete', uri, apiHeaders, payload);
696
- }
697
- /**
698
- * Update project OAuth2
699
- *
700
- *
701
- * @param {string} projectId
702
- * @param {OAuthProvider} provider
703
- * @param {string} appId
704
- * @param {string} secret
705
- * @param {boolean} enabled
706
- * @throws {AppcondaException}
707
- * @returns {Promise<Models.Project>}
708
- */
709
- async updateOAuth2(projectId, provider, appId, secret, enabled) {
710
- if (typeof projectId === 'undefined') {
711
- throw new AppcondaException('Missing required parameter: "projectId"');
712
- }
713
- if (typeof provider === 'undefined') {
714
- throw new AppcondaException('Missing required parameter: "provider"');
715
- }
716
- const apiPath = '/projects/{projectId}/oauth2'.replace('{projectId}', projectId);
717
- const payload = {};
718
- if (typeof provider !== 'undefined') {
719
- payload['provider'] = provider;
720
- }
721
- if (typeof appId !== 'undefined') {
722
- payload['appId'] = appId;
723
- }
724
- if (typeof secret !== 'undefined') {
725
- payload['secret'] = secret;
726
- }
727
- if (typeof enabled !== 'undefined') {
728
- payload['enabled'] = enabled;
729
- }
730
- const uri = new URL(this.client.config.endpoint + apiPath);
731
- const apiHeaders = {
732
- 'content-type': 'application/json',
733
- };
734
- return await this.client.call('patch', uri, apiHeaders, payload);
735
- }
736
- /**
737
- * List platforms
738
- *
739
- *
740
- * @param {string} projectId
741
- * @throws {AppcondaException}
742
- * @returns {Promise<Models.PlatformList>}
743
- */
744
- async listPlatforms(projectId) {
745
- if (typeof projectId === 'undefined') {
746
- throw new AppcondaException('Missing required parameter: "projectId"');
747
- }
748
- const apiPath = '/projects/{projectId}/platforms'.replace('{projectId}', projectId);
749
- const payload = {};
750
- const uri = new URL(this.client.config.endpoint + apiPath);
751
- const apiHeaders = {
752
- 'content-type': 'application/json',
753
- };
754
- return await this.client.call('get', uri, apiHeaders, payload);
755
- }
756
- /**
757
- * Create platform
758
- *
759
- *
760
- * @param {string} projectId
761
- * @param {PlatformType} type
762
- * @param {string} name
763
- * @param {string} key
764
- * @param {string} store
765
- * @param {string} hostname
766
- * @throws {AppcondaException}
767
- * @returns {Promise<Models.Platform>}
768
- */
769
- async createPlatform(projectId, type, name, key, store, hostname) {
770
- if (typeof projectId === 'undefined') {
771
- throw new AppcondaException('Missing required parameter: "projectId"');
772
- }
773
- if (typeof type === 'undefined') {
774
- throw new AppcondaException('Missing required parameter: "type"');
775
- }
776
- if (typeof name === 'undefined') {
777
- throw new AppcondaException('Missing required parameter: "name"');
778
- }
779
- const apiPath = '/projects/{projectId}/platforms'.replace('{projectId}', projectId);
780
- const payload = {};
781
- if (typeof type !== 'undefined') {
782
- payload['type'] = type;
783
- }
784
- if (typeof name !== 'undefined') {
785
- payload['name'] = name;
786
- }
787
- if (typeof key !== 'undefined') {
788
- payload['key'] = key;
789
- }
790
- if (typeof store !== 'undefined') {
791
- payload['store'] = store;
792
- }
793
- if (typeof hostname !== 'undefined') {
794
- payload['hostname'] = hostname;
795
- }
796
- const uri = new URL(this.client.config.endpoint + apiPath);
797
- const apiHeaders = {
798
- 'content-type': 'application/json',
799
- };
800
- return await this.client.call('post', uri, apiHeaders, payload);
801
- }
802
- /**
803
- * Get platform
804
- *
805
- *
806
- * @param {string} projectId
807
- * @param {string} platformId
808
- * @throws {AppcondaException}
809
- * @returns {Promise<Models.Platform>}
810
- */
811
- async getPlatform(projectId, platformId) {
812
- if (typeof projectId === 'undefined') {
813
- throw new AppcondaException('Missing required parameter: "projectId"');
814
- }
815
- if (typeof platformId === 'undefined') {
816
- throw new AppcondaException('Missing required parameter: "platformId"');
817
- }
818
- const apiPath = '/projects/{projectId}/platforms/{platformId}'.replace('{projectId}', projectId).replace('{platformId}', platformId);
819
- const payload = {};
820
- const uri = new URL(this.client.config.endpoint + apiPath);
821
- const apiHeaders = {
822
- 'content-type': 'application/json',
823
- };
824
- return await this.client.call('get', uri, apiHeaders, payload);
825
- }
826
- /**
827
- * Update platform
828
- *
829
- *
830
- * @param {string} projectId
831
- * @param {string} platformId
832
- * @param {string} name
833
- * @param {string} key
834
- * @param {string} store
835
- * @param {string} hostname
836
- * @throws {AppcondaException}
837
- * @returns {Promise<Models.Platform>}
838
- */
839
- async updatePlatform(projectId, platformId, name, key, store, hostname) {
840
- if (typeof projectId === 'undefined') {
841
- throw new AppcondaException('Missing required parameter: "projectId"');
842
- }
843
- if (typeof platformId === 'undefined') {
844
- throw new AppcondaException('Missing required parameter: "platformId"');
845
- }
846
- if (typeof name === 'undefined') {
847
- throw new AppcondaException('Missing required parameter: "name"');
848
- }
849
- const apiPath = '/projects/{projectId}/platforms/{platformId}'.replace('{projectId}', projectId).replace('{platformId}', platformId);
850
- const payload = {};
851
- if (typeof name !== 'undefined') {
852
- payload['name'] = name;
853
- }
854
- if (typeof key !== 'undefined') {
855
- payload['key'] = key;
856
- }
857
- if (typeof store !== 'undefined') {
858
- payload['store'] = store;
859
- }
860
- if (typeof hostname !== 'undefined') {
861
- payload['hostname'] = hostname;
862
- }
863
- const uri = new URL(this.client.config.endpoint + apiPath);
864
- const apiHeaders = {
865
- 'content-type': 'application/json',
866
- };
867
- return await this.client.call('put', uri, apiHeaders, payload);
868
- }
869
- /**
870
- * Delete platform
871
- *
872
- *
873
- * @param {string} projectId
874
- * @param {string} platformId
875
- * @throws {AppcondaException}
876
- * @returns {Promise<{}>}
877
- */
878
- async deletePlatform(projectId, platformId) {
879
- if (typeof projectId === 'undefined') {
880
- throw new AppcondaException('Missing required parameter: "projectId"');
881
- }
882
- if (typeof platformId === 'undefined') {
883
- throw new AppcondaException('Missing required parameter: "platformId"');
884
- }
885
- const apiPath = '/projects/{projectId}/platforms/{platformId}'.replace('{projectId}', projectId).replace('{platformId}', platformId);
886
- const payload = {};
887
- const uri = new URL(this.client.config.endpoint + apiPath);
888
- const apiHeaders = {
889
- 'content-type': 'application/json',
890
- };
891
- return await this.client.call('delete', uri, apiHeaders, payload);
892
- }
893
- /**
894
- * Update service status
895
- *
896
- *
897
- * @param {string} projectId
898
- * @param {ApiService} service
899
- * @param {boolean} status
900
- * @throws {AppcondaException}
901
- * @returns {Promise<Models.Project>}
902
- */
903
- async updateServiceStatus(projectId, service, status) {
904
- if (typeof projectId === 'undefined') {
905
- throw new AppcondaException('Missing required parameter: "projectId"');
906
- }
907
- if (typeof service === 'undefined') {
908
- throw new AppcondaException('Missing required parameter: "service"');
909
- }
910
- if (typeof status === 'undefined') {
911
- throw new AppcondaException('Missing required parameter: "status"');
912
- }
913
- const apiPath = '/projects/{projectId}/service'.replace('{projectId}', projectId);
914
- const payload = {};
915
- if (typeof service !== 'undefined') {
916
- payload['service'] = service;
917
- }
918
- if (typeof status !== 'undefined') {
919
- payload['status'] = status;
920
- }
921
- const uri = new URL(this.client.config.endpoint + apiPath);
922
- const apiHeaders = {
923
- 'content-type': 'application/json',
924
- };
925
- return await this.client.call('patch', uri, apiHeaders, payload);
926
- }
927
- /**
928
- * Update all service status
929
- *
930
- *
931
- * @param {string} projectId
932
- * @param {boolean} status
933
- * @throws {AppcondaException}
934
- * @returns {Promise<Models.Project>}
935
- */
936
- async updateServiceStatusAll(projectId, status) {
937
- if (typeof projectId === 'undefined') {
938
- throw new AppcondaException('Missing required parameter: "projectId"');
939
- }
940
- if (typeof status === 'undefined') {
941
- throw new AppcondaException('Missing required parameter: "status"');
942
- }
943
- const apiPath = '/projects/{projectId}/service/all'.replace('{projectId}', projectId);
944
- const payload = {};
945
- if (typeof status !== 'undefined') {
946
- payload['status'] = status;
947
- }
948
- const uri = new URL(this.client.config.endpoint + apiPath);
949
- const apiHeaders = {
950
- 'content-type': 'application/json',
951
- };
952
- return await this.client.call('patch', uri, apiHeaders, payload);
953
- }
954
- /**
955
- * Update SMTP
956
- *
957
- *
958
- * @param {string} projectId
959
- * @param {boolean} enabled
960
- * @param {string} senderName
961
- * @param {string} senderEmail
962
- * @param {string} replyTo
963
- * @param {string} host
964
- * @param {number} port
965
- * @param {string} username
966
- * @param {string} password
967
- * @param {SMTPSecure} secure
968
- * @throws {AppcondaException}
969
- * @returns {Promise<Models.Project>}
970
- */
971
- async updateSmtp(projectId, enabled, senderName, senderEmail, replyTo, host, port, username, password, secure) {
972
- if (typeof projectId === 'undefined') {
973
- throw new AppcondaException('Missing required parameter: "projectId"');
974
- }
975
- if (typeof enabled === 'undefined') {
976
- throw new AppcondaException('Missing required parameter: "enabled"');
977
- }
978
- const apiPath = '/projects/{projectId}/smtp'.replace('{projectId}', projectId);
979
- const payload = {};
980
- if (typeof enabled !== 'undefined') {
981
- payload['enabled'] = enabled;
982
- }
983
- if (typeof senderName !== 'undefined') {
984
- payload['senderName'] = senderName;
985
- }
986
- if (typeof senderEmail !== 'undefined') {
987
- payload['senderEmail'] = senderEmail;
988
- }
989
- if (typeof replyTo !== 'undefined') {
990
- payload['replyTo'] = replyTo;
991
- }
992
- if (typeof host !== 'undefined') {
993
- payload['host'] = host;
994
- }
995
- if (typeof port !== 'undefined') {
996
- payload['port'] = port;
997
- }
998
- if (typeof username !== 'undefined') {
999
- payload['username'] = username;
1000
- }
1001
- if (typeof password !== 'undefined') {
1002
- payload['password'] = password;
1003
- }
1004
- if (typeof secure !== 'undefined') {
1005
- payload['secure'] = secure;
1006
- }
1007
- const uri = new URL(this.client.config.endpoint + apiPath);
1008
- const apiHeaders = {
1009
- 'content-type': 'application/json',
1010
- };
1011
- return await this.client.call('patch', uri, apiHeaders, payload);
1012
- }
1013
- /**
1014
- * Create SMTP test
1015
- *
1016
- *
1017
- * @param {string} projectId
1018
- * @param {string[]} emails
1019
- * @param {string} senderName
1020
- * @param {string} senderEmail
1021
- * @param {string} host
1022
- * @param {string} replyTo
1023
- * @param {number} port
1024
- * @param {string} username
1025
- * @param {string} password
1026
- * @param {SMTPSecure} secure
1027
- * @throws {AppcondaException}
1028
- * @returns {Promise<{}>}
1029
- */
1030
- async createSmtpTest(projectId, emails, senderName, senderEmail, host, replyTo, port, username, password, secure) {
1031
- if (typeof projectId === 'undefined') {
1032
- throw new AppcondaException('Missing required parameter: "projectId"');
1033
- }
1034
- if (typeof emails === 'undefined') {
1035
- throw new AppcondaException('Missing required parameter: "emails"');
1036
- }
1037
- if (typeof senderName === 'undefined') {
1038
- throw new AppcondaException('Missing required parameter: "senderName"');
1039
- }
1040
- if (typeof senderEmail === 'undefined') {
1041
- throw new AppcondaException('Missing required parameter: "senderEmail"');
1042
- }
1043
- if (typeof host === 'undefined') {
1044
- throw new AppcondaException('Missing required parameter: "host"');
1045
- }
1046
- const apiPath = '/projects/{projectId}/smtp/tests'.replace('{projectId}', projectId);
1047
- const payload = {};
1048
- if (typeof emails !== 'undefined') {
1049
- payload['emails'] = emails;
1050
- }
1051
- if (typeof senderName !== 'undefined') {
1052
- payload['senderName'] = senderName;
1053
- }
1054
- if (typeof senderEmail !== 'undefined') {
1055
- payload['senderEmail'] = senderEmail;
1056
- }
1057
- if (typeof replyTo !== 'undefined') {
1058
- payload['replyTo'] = replyTo;
1059
- }
1060
- if (typeof host !== 'undefined') {
1061
- payload['host'] = host;
1062
- }
1063
- if (typeof port !== 'undefined') {
1064
- payload['port'] = port;
1065
- }
1066
- if (typeof username !== 'undefined') {
1067
- payload['username'] = username;
1068
- }
1069
- if (typeof password !== 'undefined') {
1070
- payload['password'] = password;
1071
- }
1072
- if (typeof secure !== 'undefined') {
1073
- payload['secure'] = secure;
1074
- }
1075
- const uri = new URL(this.client.config.endpoint + apiPath);
1076
- const apiHeaders = {
1077
- 'content-type': 'application/json',
1078
- };
1079
- return await this.client.call('post', uri, apiHeaders, payload);
1080
- }
1081
- /**
1082
- * Update project team
1083
- *
1084
- *
1085
- * @param {string} projectId
1086
- * @param {string} teamId
1087
- * @throws {AppcondaException}
1088
- * @returns {Promise<Models.Project>}
1089
- */
1090
- async updateTeam(projectId, teamId) {
1091
- if (typeof projectId === 'undefined') {
1092
- throw new AppcondaException('Missing required parameter: "projectId"');
1093
- }
1094
- if (typeof teamId === 'undefined') {
1095
- throw new AppcondaException('Missing required parameter: "teamId"');
1096
- }
1097
- const apiPath = '/projects/{projectId}/team'.replace('{projectId}', projectId);
1098
- const payload = {};
1099
- if (typeof teamId !== 'undefined') {
1100
- payload['teamId'] = teamId;
1101
- }
1102
- const uri = new URL(this.client.config.endpoint + apiPath);
1103
- const apiHeaders = {
1104
- 'content-type': 'application/json',
1105
- };
1106
- return await this.client.call('patch', uri, apiHeaders, payload);
1107
- }
1108
- /**
1109
- * Get custom email template
1110
- *
1111
- *
1112
- * @param {string} projectId
1113
- * @param {EmailTemplateType} type
1114
- * @param {EmailTemplateLocale} locale
1115
- * @throws {AppcondaException}
1116
- * @returns {Promise<Models.EmailTemplate>}
1117
- */
1118
- async getEmailTemplate(projectId, type, locale) {
1119
- if (typeof projectId === 'undefined') {
1120
- throw new AppcondaException('Missing required parameter: "projectId"');
1121
- }
1122
- if (typeof type === 'undefined') {
1123
- throw new AppcondaException('Missing required parameter: "type"');
1124
- }
1125
- if (typeof locale === 'undefined') {
1126
- throw new AppcondaException('Missing required parameter: "locale"');
1127
- }
1128
- const apiPath = '/projects/{projectId}/templates/email/{type}/{locale}'.replace('{projectId}', projectId).replace('{type}', type).replace('{locale}', locale);
1129
- const payload = {};
1130
- const uri = new URL(this.client.config.endpoint + apiPath);
1131
- const apiHeaders = {
1132
- 'content-type': 'application/json',
1133
- };
1134
- return await this.client.call('get', uri, apiHeaders, payload);
1135
- }
1136
- /**
1137
- * Update custom email templates
1138
- *
1139
- *
1140
- * @param {string} projectId
1141
- * @param {EmailTemplateType} type
1142
- * @param {EmailTemplateLocale} locale
1143
- * @param {string} subject
1144
- * @param {string} message
1145
- * @param {string} senderName
1146
- * @param {string} senderEmail
1147
- * @param {string} replyTo
1148
- * @throws {AppcondaException}
1149
- * @returns {Promise<Models.Project>}
1150
- */
1151
- async updateEmailTemplate(projectId, type, locale, subject, message, senderName, senderEmail, replyTo) {
1152
- if (typeof projectId === 'undefined') {
1153
- throw new AppcondaException('Missing required parameter: "projectId"');
1154
- }
1155
- if (typeof type === 'undefined') {
1156
- throw new AppcondaException('Missing required parameter: "type"');
1157
- }
1158
- if (typeof locale === 'undefined') {
1159
- throw new AppcondaException('Missing required parameter: "locale"');
1160
- }
1161
- if (typeof subject === 'undefined') {
1162
- throw new AppcondaException('Missing required parameter: "subject"');
1163
- }
1164
- if (typeof message === 'undefined') {
1165
- throw new AppcondaException('Missing required parameter: "message"');
1166
- }
1167
- const apiPath = '/projects/{projectId}/templates/email/{type}/{locale}'.replace('{projectId}', projectId).replace('{type}', type).replace('{locale}', locale);
1168
- const payload = {};
1169
- if (typeof subject !== 'undefined') {
1170
- payload['subject'] = subject;
1171
- }
1172
- if (typeof message !== 'undefined') {
1173
- payload['message'] = message;
1174
- }
1175
- if (typeof senderName !== 'undefined') {
1176
- payload['senderName'] = senderName;
1177
- }
1178
- if (typeof senderEmail !== 'undefined') {
1179
- payload['senderEmail'] = senderEmail;
1180
- }
1181
- if (typeof replyTo !== 'undefined') {
1182
- payload['replyTo'] = replyTo;
1183
- }
1184
- const uri = new URL(this.client.config.endpoint + apiPath);
1185
- const apiHeaders = {
1186
- 'content-type': 'application/json',
1187
- };
1188
- return await this.client.call('patch', uri, apiHeaders, payload);
1189
- }
1190
- /**
1191
- * Reset custom email template
1192
- *
1193
- *
1194
- * @param {string} projectId
1195
- * @param {EmailTemplateType} type
1196
- * @param {EmailTemplateLocale} locale
1197
- * @throws {AppcondaException}
1198
- * @returns {Promise<Models.EmailTemplate>}
1199
- */
1200
- async deleteEmailTemplate(projectId, type, locale) {
1201
- if (typeof projectId === 'undefined') {
1202
- throw new AppcondaException('Missing required parameter: "projectId"');
1203
- }
1204
- if (typeof type === 'undefined') {
1205
- throw new AppcondaException('Missing required parameter: "type"');
1206
- }
1207
- if (typeof locale === 'undefined') {
1208
- throw new AppcondaException('Missing required parameter: "locale"');
1209
- }
1210
- const apiPath = '/projects/{projectId}/templates/email/{type}/{locale}'.replace('{projectId}', projectId).replace('{type}', type).replace('{locale}', locale);
1211
- const payload = {};
1212
- const uri = new URL(this.client.config.endpoint + apiPath);
1213
- const apiHeaders = {
1214
- 'content-type': 'application/json',
1215
- };
1216
- return await this.client.call('delete', uri, apiHeaders, payload);
1217
- }
1218
- /**
1219
- * Get custom SMS template
1220
- *
1221
- *
1222
- * @param {string} projectId
1223
- * @param {SmsTemplateType} type
1224
- * @param {SmsTemplateLocale} locale
1225
- * @throws {AppcondaException}
1226
- * @returns {Promise<Models.SmsTemplate>}
1227
- */
1228
- async getSmsTemplate(projectId, type, locale) {
1229
- if (typeof projectId === 'undefined') {
1230
- throw new AppcondaException('Missing required parameter: "projectId"');
1231
- }
1232
- if (typeof type === 'undefined') {
1233
- throw new AppcondaException('Missing required parameter: "type"');
1234
- }
1235
- if (typeof locale === 'undefined') {
1236
- throw new AppcondaException('Missing required parameter: "locale"');
1237
- }
1238
- const apiPath = '/projects/{projectId}/templates/sms/{type}/{locale}'.replace('{projectId}', projectId).replace('{type}', type).replace('{locale}', locale);
1239
- const payload = {};
1240
- const uri = new URL(this.client.config.endpoint + apiPath);
1241
- const apiHeaders = {
1242
- 'content-type': 'application/json',
1243
- };
1244
- return await this.client.call('get', uri, apiHeaders, payload);
1245
- }
1246
- /**
1247
- * Update custom SMS template
1248
- *
1249
- *
1250
- * @param {string} projectId
1251
- * @param {SmsTemplateType} type
1252
- * @param {SmsTemplateLocale} locale
1253
- * @param {string} message
1254
- * @throws {AppcondaException}
1255
- * @returns {Promise<Models.SmsTemplate>}
1256
- */
1257
- async updateSmsTemplate(projectId, type, locale, message) {
1258
- if (typeof projectId === 'undefined') {
1259
- throw new AppcondaException('Missing required parameter: "projectId"');
1260
- }
1261
- if (typeof type === 'undefined') {
1262
- throw new AppcondaException('Missing required parameter: "type"');
1263
- }
1264
- if (typeof locale === 'undefined') {
1265
- throw new AppcondaException('Missing required parameter: "locale"');
1266
- }
1267
- if (typeof message === 'undefined') {
1268
- throw new AppcondaException('Missing required parameter: "message"');
1269
- }
1270
- const apiPath = '/projects/{projectId}/templates/sms/{type}/{locale}'.replace('{projectId}', projectId).replace('{type}', type).replace('{locale}', locale);
1271
- const payload = {};
1272
- if (typeof message !== 'undefined') {
1273
- payload['message'] = message;
1274
- }
1275
- const uri = new URL(this.client.config.endpoint + apiPath);
1276
- const apiHeaders = {
1277
- 'content-type': 'application/json',
1278
- };
1279
- return await this.client.call('patch', uri, apiHeaders, payload);
1280
- }
1281
- /**
1282
- * Reset custom SMS template
1283
- *
1284
- *
1285
- * @param {string} projectId
1286
- * @param {SmsTemplateType} type
1287
- * @param {SmsTemplateLocale} locale
1288
- * @throws {AppcondaException}
1289
- * @returns {Promise<Models.SmsTemplate>}
1290
- */
1291
- async deleteSmsTemplate(projectId, type, locale) {
1292
- if (typeof projectId === 'undefined') {
1293
- throw new AppcondaException('Missing required parameter: "projectId"');
1294
- }
1295
- if (typeof type === 'undefined') {
1296
- throw new AppcondaException('Missing required parameter: "type"');
1297
- }
1298
- if (typeof locale === 'undefined') {
1299
- throw new AppcondaException('Missing required parameter: "locale"');
1300
- }
1301
- const apiPath = '/projects/{projectId}/templates/sms/{type}/{locale}'.replace('{projectId}', projectId).replace('{type}', type).replace('{locale}', locale);
1302
- const payload = {};
1303
- const uri = new URL(this.client.config.endpoint + apiPath);
1304
- const apiHeaders = {
1305
- 'content-type': 'application/json',
1306
- };
1307
- return await this.client.call('delete', uri, apiHeaders, payload);
1308
- }
1309
- /**
1310
- * List webhooks
1311
- *
1312
- *
1313
- * @param {string} projectId
1314
- * @throws {AppcondaException}
1315
- * @returns {Promise<Models.WebhookList>}
1316
- */
1317
- async listWebhooks(projectId) {
1318
- if (typeof projectId === 'undefined') {
1319
- throw new AppcondaException('Missing required parameter: "projectId"');
1320
- }
1321
- const apiPath = '/projects/{projectId}/webhooks'.replace('{projectId}', projectId);
1322
- const payload = {};
1323
- const uri = new URL(this.client.config.endpoint + apiPath);
1324
- const apiHeaders = {
1325
- 'content-type': 'application/json',
1326
- };
1327
- return await this.client.call('get', uri, apiHeaders, payload);
1328
- }
1329
- /**
1330
- * Create webhook
1331
- *
1332
- *
1333
- * @param {string} projectId
1334
- * @param {string} name
1335
- * @param {string[]} events
1336
- * @param {string} url
1337
- * @param {boolean} security
1338
- * @param {boolean} enabled
1339
- * @param {string} httpUser
1340
- * @param {string} httpPass
1341
- * @throws {AppcondaException}
1342
- * @returns {Promise<Models.Webhook>}
1343
- */
1344
- async createWebhook(projectId, name, events, url, security, enabled, httpUser, httpPass) {
1345
- if (typeof projectId === 'undefined') {
1346
- throw new AppcondaException('Missing required parameter: "projectId"');
1347
- }
1348
- if (typeof name === 'undefined') {
1349
- throw new AppcondaException('Missing required parameter: "name"');
1350
- }
1351
- if (typeof events === 'undefined') {
1352
- throw new AppcondaException('Missing required parameter: "events"');
1353
- }
1354
- if (typeof url === 'undefined') {
1355
- throw new AppcondaException('Missing required parameter: "url"');
1356
- }
1357
- if (typeof security === 'undefined') {
1358
- throw new AppcondaException('Missing required parameter: "security"');
1359
- }
1360
- const apiPath = '/projects/{projectId}/webhooks'.replace('{projectId}', projectId);
1361
- const payload = {};
1362
- if (typeof name !== 'undefined') {
1363
- payload['name'] = name;
1364
- }
1365
- if (typeof enabled !== 'undefined') {
1366
- payload['enabled'] = enabled;
1367
- }
1368
- if (typeof events !== 'undefined') {
1369
- payload['events'] = events;
1370
- }
1371
- if (typeof url !== 'undefined') {
1372
- payload['url'] = url;
1373
- }
1374
- if (typeof security !== 'undefined') {
1375
- payload['security'] = security;
1376
- }
1377
- if (typeof httpUser !== 'undefined') {
1378
- payload['httpUser'] = httpUser;
1379
- }
1380
- if (typeof httpPass !== 'undefined') {
1381
- payload['httpPass'] = httpPass;
1382
- }
1383
- const uri = new URL(this.client.config.endpoint + apiPath);
1384
- const apiHeaders = {
1385
- 'content-type': 'application/json',
1386
- };
1387
- return await this.client.call('post', uri, apiHeaders, payload);
1388
- }
1389
- /**
1390
- * Get webhook
1391
- *
1392
- *
1393
- * @param {string} projectId
1394
- * @param {string} webhookId
1395
- * @throws {AppcondaException}
1396
- * @returns {Promise<Models.Webhook>}
1397
- */
1398
- async getWebhook(projectId, webhookId) {
1399
- if (typeof projectId === 'undefined') {
1400
- throw new AppcondaException('Missing required parameter: "projectId"');
1401
- }
1402
- if (typeof webhookId === 'undefined') {
1403
- throw new AppcondaException('Missing required parameter: "webhookId"');
1404
- }
1405
- const apiPath = '/projects/{projectId}/webhooks/{webhookId}'.replace('{projectId}', projectId).replace('{webhookId}', webhookId);
1406
- const payload = {};
1407
- const uri = new URL(this.client.config.endpoint + apiPath);
1408
- const apiHeaders = {
1409
- 'content-type': 'application/json',
1410
- };
1411
- return await this.client.call('get', uri, apiHeaders, payload);
1412
- }
1413
- /**
1414
- * Update webhook
1415
- *
1416
- *
1417
- * @param {string} projectId
1418
- * @param {string} webhookId
1419
- * @param {string} name
1420
- * @param {string[]} events
1421
- * @param {string} url
1422
- * @param {boolean} security
1423
- * @param {boolean} enabled
1424
- * @param {string} httpUser
1425
- * @param {string} httpPass
1426
- * @throws {AppcondaException}
1427
- * @returns {Promise<Models.Webhook>}
1428
- */
1429
- async updateWebhook(projectId, webhookId, name, events, url, security, enabled, httpUser, httpPass) {
1430
- if (typeof projectId === 'undefined') {
1431
- throw new AppcondaException('Missing required parameter: "projectId"');
1432
- }
1433
- if (typeof webhookId === 'undefined') {
1434
- throw new AppcondaException('Missing required parameter: "webhookId"');
1435
- }
1436
- if (typeof name === 'undefined') {
1437
- throw new AppcondaException('Missing required parameter: "name"');
1438
- }
1439
- if (typeof events === 'undefined') {
1440
- throw new AppcondaException('Missing required parameter: "events"');
1441
- }
1442
- if (typeof url === 'undefined') {
1443
- throw new AppcondaException('Missing required parameter: "url"');
1444
- }
1445
- if (typeof security === 'undefined') {
1446
- throw new AppcondaException('Missing required parameter: "security"');
1447
- }
1448
- const apiPath = '/projects/{projectId}/webhooks/{webhookId}'.replace('{projectId}', projectId).replace('{webhookId}', webhookId);
1449
- const payload = {};
1450
- if (typeof name !== 'undefined') {
1451
- payload['name'] = name;
1452
- }
1453
- if (typeof enabled !== 'undefined') {
1454
- payload['enabled'] = enabled;
1455
- }
1456
- if (typeof events !== 'undefined') {
1457
- payload['events'] = events;
1458
- }
1459
- if (typeof url !== 'undefined') {
1460
- payload['url'] = url;
1461
- }
1462
- if (typeof security !== 'undefined') {
1463
- payload['security'] = security;
1464
- }
1465
- if (typeof httpUser !== 'undefined') {
1466
- payload['httpUser'] = httpUser;
1467
- }
1468
- if (typeof httpPass !== 'undefined') {
1469
- payload['httpPass'] = httpPass;
1470
- }
1471
- const uri = new URL(this.client.config.endpoint + apiPath);
1472
- const apiHeaders = {
1473
- 'content-type': 'application/json',
1474
- };
1475
- return await this.client.call('put', uri, apiHeaders, payload);
1476
- }
1477
- /**
1478
- * Delete webhook
1479
- *
1480
- *
1481
- * @param {string} projectId
1482
- * @param {string} webhookId
1483
- * @throws {AppcondaException}
1484
- * @returns {Promise<{}>}
1485
- */
1486
- async deleteWebhook(projectId, webhookId) {
1487
- if (typeof projectId === 'undefined') {
1488
- throw new AppcondaException('Missing required parameter: "projectId"');
1489
- }
1490
- if (typeof webhookId === 'undefined') {
1491
- throw new AppcondaException('Missing required parameter: "webhookId"');
1492
- }
1493
- const apiPath = '/projects/{projectId}/webhooks/{webhookId}'.replace('{projectId}', projectId).replace('{webhookId}', webhookId);
1494
- const payload = {};
1495
- const uri = new URL(this.client.config.endpoint + apiPath);
1496
- const apiHeaders = {
1497
- 'content-type': 'application/json',
1498
- };
1499
- return await this.client.call('delete', uri, apiHeaders, payload);
1500
- }
1501
- /**
1502
- * Update webhook signature key
1503
- *
1504
- *
1505
- * @param {string} projectId
1506
- * @param {string} webhookId
1507
- * @throws {AppcondaException}
1508
- * @returns {Promise<Models.Webhook>}
1509
- */
1510
- async updateWebhookSignature(projectId, webhookId) {
1511
- if (typeof projectId === 'undefined') {
1512
- throw new AppcondaException('Missing required parameter: "projectId"');
1513
- }
1514
- if (typeof webhookId === 'undefined') {
1515
- throw new AppcondaException('Missing required parameter: "webhookId"');
1516
- }
1517
- const apiPath = '/projects/{projectId}/webhooks/{webhookId}/signature'.replace('{projectId}', projectId).replace('{webhookId}', webhookId);
1518
- const payload = {};
1519
- const uri = new URL(this.client.config.endpoint + apiPath);
1520
- const apiHeaders = {
1521
- 'content-type': 'application/json',
1522
- };
1523
- return await this.client.call('patch', uri, apiHeaders, payload);
1524
- }
1525
- }
1526
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcHJvamVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUEyQixNQUFNLFdBQVcsQ0FBQztBQWN2RSxNQUFNLE9BQU8sUUFBUTtJQUdqQixZQUFZLE1BQWM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFrQixFQUFFLE1BQWU7UUFDMUMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFHRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFpQixFQUFFLElBQVksRUFBRSxNQUFjLEVBQUUsTUFBZSxFQUFFLFdBQW9CLEVB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QXlDLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsc0RBQXNELENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNJLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFM0QsTUFBTSxVQUFVLEdBQWlDO1lBQzdDLGNBQWMsRUFBRSxrQkFBa0I7U0FDckMsQ0FBQTtRQUdELE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekIsT0FBTyxFQUNQLEdBQUcsRUFDSCxVQUFVLEVBQ1YsT0FBTyxDQUNWLENBQUM7SUFDTixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBjb25kYUV4Y2VwdGlvbiwgQ2xpZW50LCBNb2RlbHMsIFBheWxvYWQgfSBmcm9tIFwiLi4vY2xpZW50XCI7XG5pbXBvcnQgeyBBcGkgfSBmcm9tIFwiLi4vZW51bXMvYXBpXCI7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlIH0gZnJvbSBcIi4uL2VudW1zL2FwaS1zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBdXRoTWV0aG9kIH0gZnJvbSBcIi4uL2VudW1zL2F1dGgtbWV0aG9kXCI7XG5pbXBvcnQgeyBFbWFpbFRlbXBsYXRlTG9jYWxlIH0gZnJvbSBcIi4uL2VudW1zL2VtYWlsLXRlbXBsYXRlLWxvY2FsZVwiO1xuaW1wb3J0IHsgRW1haWxUZW1wbGF0ZVR5cGUgfSBmcm9tIFwiLi4vZW51bXMvZW1haWwtdGVtcGxhdGUtdHlwZVwiO1xuaW1wb3J0IHsgT0F1dGhQcm92aWRlciB9IGZyb20gXCIuLi9tb2R1bGVzL2FjY291bnQvZW51bXMvby1hdXRoLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBQbGF0Zm9ybVR5cGUgfSBmcm9tIFwiLi4vZW51bXMvcGxhdGZvcm0tdHlwZVwiO1xuaW1wb3J0IHsgUmVnaW9uIH0gZnJvbSBcIi4uL2VudW1zL3JlZ2lvblwiO1xuaW1wb3J0IHsgU01UUFNlY3VyZSB9IGZyb20gXCIuLi9lbnVtcy9zLW0tdC1wLXNlY3VyZVwiO1xuaW1wb3J0IHsgU21zVGVtcGxhdGVMb2NhbGUgfSBmcm9tIFwiLi4vZW51bXMvc21zLXRlbXBsYXRlLWxvY2FsZVwiO1xuaW1wb3J0IHsgU21zVGVtcGxhdGVUeXBlIH0gZnJvbSBcIi4uL2VudW1zL3Ntcy10ZW1wbGF0ZS10eXBlXCI7XG5cblxuZXhwb3J0IGNsYXNzIFByb2plY3RzIHtcbiAgICBjbGllbnQ6IENsaWVudDtcblxuICAgIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50KSB7XG4gICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgcHJvamVjdHNcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcXVlcmllc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWFyY2hcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvamVjdExpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3QocXVlcmllcz86IHN0cmluZ1tdLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5Qcm9qZWN0TGlzdD4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncXVlcmllcyddID0gcXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlYXJjaCddID0gc2VhcmNoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgcHJvamVjdFxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVhbUlkXG4gICAgICogQHBhcmFtIHtSZWdpb259IHJlZ2lvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dvXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZWdhbE5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGVnYWxDb3VudHJ5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxlZ2FsU3RhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGVnYWxDaXR5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxlZ2FsQWRkcmVzc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZWdhbFRheElkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb2plY3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZShwcm9qZWN0SWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCB0ZWFtSWQ6IHN0cmluZywgcmVnaW9uPzogUmVnaW9uLCBkZXNjcmlwdGlvbj86IHN0cmluZywgbG9nbz86IHN0cmluZywgdXJsPzogc3RyaW5nLCBsZWdhbE5hbWU/OiBzdHJpbmcsIGxlZ2FsQ291bnRyeT86IHN0cmluZywgbGVnYWxTdGF0ZT86IHN0cmluZywgbGVnYWxDaXR5Pzogc3RyaW5nLCBsZWdhbEFkZHJlc3M/OiBzdHJpbmcsIGxlZ2FsVGF4SWQ/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5Qcm9qZWN0PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibmFtZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0ZWFtSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInRlYW1JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvcHJvamVjdHMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJvamVjdElkJ10gPSBwcm9qZWN0SWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRlYW1JZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RlYW1JZCddID0gdGVhbUlkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVnaW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVnaW9uJ10gPSByZWdpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2Rlc2NyaXB0aW9uJ10gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxvZ28gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydsb2dvJ10gPSBsb2dvO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdXJsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXJsJ10gPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsZWdhbE5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydsZWdhbE5hbWUnXSA9IGxlZ2FsTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxlZ2FsQ291bnRyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2xlZ2FsQ291bnRyeSddID0gbGVnYWxDb3VudHJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGVnYWxTdGF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2xlZ2FsU3RhdGUnXSA9IGxlZ2FsU3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsZWdhbENpdHkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydsZWdhbENpdHknXSA9IGxlZ2FsQ2l0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxlZ2FsQWRkcmVzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2xlZ2FsQWRkcmVzcyddID0gbGVnYWxBZGRyZXNzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGVnYWxUYXhJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2xlZ2FsVGF4SWQnXSA9IGxlZ2FsVGF4SWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgcHJvamVjdFxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb2plY3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldChwcm9qZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLlByb2plY3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvcHJvamVjdHMve3Byb2plY3RJZH0nLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHByb2plY3RcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ29cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxlZ2FsTmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZWdhbENvdW50cnlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGVnYWxTdGF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZWdhbENpdHlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGVnYWxBZGRyZXNzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxlZ2FsVGF4SWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvamVjdD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlKHByb2plY3RJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nLCBsb2dvPzogc3RyaW5nLCB1cmw/OiBzdHJpbmcsIGxlZ2FsTmFtZT86IHN0cmluZywgbGVnYWxDb3VudHJ5Pzogc3RyaW5nLCBsZWdhbFN0YXRlPzogc3RyaW5nLCBsZWdhbENpdHk/OiBzdHJpbmcsIGxlZ2FsQWRkcmVzcz86IHN0cmluZywgbGVnYWxUYXhJZD86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLlByb2plY3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJuYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfScucmVwbGFjZSgne3Byb2plY3RJZH0nLCBwcm9qZWN0SWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjcmlwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2Rlc2NyaXB0aW9uJ10gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxvZ28gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydsb2dvJ10gPSBsb2dvO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdXJsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXJsJ10gPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsZWdhbE5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydsZWdhbE5hbWUnXSA9IGxlZ2FsTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxlZ2FsQ291bnRyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2xlZ2FsQ291bnRyeSddID0gbGVnYWxDb3VudHJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGVnYWxTdGF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2xlZ2FsU3RhdGUnXSA9IGxlZ2FsU3RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsZWdhbENpdHkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydsZWdhbENpdHknXSA9IGxlZ2FsQ2l0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxlZ2FsQWRkcmVzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2xlZ2FsQWRkcmVzcyddID0gbGVnYWxBZGRyZXNzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGVnYWxUYXhJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2xlZ2FsVGF4SWQnXSA9IGxlZ2FsVGF4SWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIHByb2plY3RcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHt9Pn1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUocHJvamVjdElkOiBzdHJpbmcpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL3Byb2plY3RzL3twcm9qZWN0SWR9Jy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBBUEkgc3RhdHVzXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge0FwaX0gYXBpXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzdGF0dXNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvamVjdD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlQXBpU3RhdHVzKHByb2plY3RJZDogc3RyaW5nLCBhcGk6IEFwaSwgc3RhdHVzOiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvamVjdD4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwaSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiYXBpXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic3RhdHVzXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9hcGknLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGFwaSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FwaSddID0gYXBpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdHVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3RhdHVzJ10gPSBzdGF0dXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFsbCBBUEkgc3RhdHVzXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHN0YXR1c1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm9qZWN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVBcGlTdGF0dXNBbGwocHJvamVjdElkOiBzdHJpbmcsIHN0YXR1czogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb2plY3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInN0YXR1c1wiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvcHJvamVjdHMve3Byb2plY3RJZH0vYXBpL2FsbCcucmVwbGFjZSgne3Byb2plY3RJZH0nLCBwcm9qZWN0SWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdHVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3RhdHVzJ10gPSBzdGF0dXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHByb2plY3QgYXV0aGVudGljYXRpb24gZHVyYXRpb25cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvblxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm9qZWN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVBdXRoRHVyYXRpb24ocHJvamVjdElkOiBzdHJpbmcsIGR1cmF0aW9uOiBudW1iZXIpOiBQcm9taXNlPE1vZGVscy5Qcm9qZWN0PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHVyYXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImR1cmF0aW9uXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9hdXRoL2R1cmF0aW9uJy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBkdXJhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2R1cmF0aW9uJ10gPSBkdXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgcHJvamVjdCB1c2VycyBsaW1pdFxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb2plY3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZUF1dGhMaW1pdChwcm9qZWN0SWQ6IHN0cmluZywgbGltaXQ6IG51bWJlcik6IFByb21pc2U8TW9kZWxzLlByb2plY3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibGltaXRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL3Byb2plY3RzL3twcm9qZWN0SWR9L2F1dGgvbGltaXQnLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGxpbWl0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbGltaXQnXSA9IGxpbWl0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBwcm9qZWN0IHVzZXIgc2Vzc2lvbnMgbGltaXRcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm9qZWN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVBdXRoU2Vzc2lvbnNMaW1pdChwcm9qZWN0SWQ6IHN0cmluZywgbGltaXQ6IG51bWJlcik6IFByb21pc2U8TW9kZWxzLlByb2plY3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibGltaXRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL3Byb2plY3RzL3twcm9qZWN0SWR9L2F1dGgvbWF4LXNlc3Npb25zJy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBsaW1pdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2xpbWl0J10gPSBsaW1pdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIG1vY2sgbnVtYmVycyBmb3IgdGhlIHByb2plY3RcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0W119IG51bWJlcnNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvamVjdD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlTW9ja051bWJlcnMocHJvamVjdElkOiBzdHJpbmcsIG51bWJlcnM6IG9iamVjdFtdKTogUHJvbWlzZTxNb2RlbHMuUHJvamVjdD4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG51bWJlcnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm51bWJlcnNcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL3Byb2plY3RzL3twcm9qZWN0SWR9L2F1dGgvbW9jay1udW1iZXJzJy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBudW1iZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbnVtYmVycyddID0gbnVtYmVycztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYXV0aGVudGljYXRpb24gcGFzc3dvcmQgZGljdGlvbmFyeSBzdGF0dXMuIFVzZSB0aGlzIGVuZHBvaW50IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBkaWNpdG9uYXJ5IGNoZWNrIGZvciB1c2VyIHBhc3N3b3JkXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvamVjdD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlQXV0aFBhc3N3b3JkRGljdGlvbmFyeShwcm9qZWN0SWQ6IHN0cmluZywgZW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb2plY3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJlbmFibGVkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9hdXRoL3Bhc3N3b3JkLWRpY3Rpb25hcnknLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhdXRoZW50aWNhdGlvbiBwYXNzd29yZCBoaXN0b3J5LiBVc2UgdGhpcyBlbmRwb2ludCB0byBzZXQgdGhlIG51bWJlciBvZiBwYXNzd29yZCBoaXN0b3J5IHRvIHNhdmUgYW5kIDAgdG8gZGlzYWJsZSBwYXNzd29yZCBoaXN0b3J5LlxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb2plY3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZUF1dGhQYXNzd29yZEhpc3RvcnkocHJvamVjdElkOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPE1vZGVscy5Qcm9qZWN0PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGltaXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImxpbWl0XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9hdXRoL3Bhc3N3b3JkLWhpc3RvcnknLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGxpbWl0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbGltaXQnXSA9IGxpbWl0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGNoZWNraW5nIHVzZXIgcGFzc3dvcmRzIGZvciBzaW1pbGFyaXR5IHdpdGggdGhlaXIgcGVyc29uYWwgZGF0YS5cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Qcm9qZWN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVQZXJzb25hbERhdGFDaGVjayhwcm9qZWN0SWQ6IHN0cmluZywgZW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLlByb2plY3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJlbmFibGVkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9hdXRoL3BlcnNvbmFsLWRhdGEnLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBwcm9qZWN0IHNlc3Npb25zIGVtYWlsc1xuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBhbGVydHNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvamVjdD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlU2Vzc2lvbkFsZXJ0cyhwcm9qZWN0SWQ6IHN0cmluZywgYWxlcnRzOiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvamVjdD4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFsZXJ0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiYWxlcnRzXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9hdXRoL3Nlc3Npb24tYWxlcnRzJy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBhbGVydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhbGVydHMnXSA9IGFsZXJ0cztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgcHJvamVjdCBhdXRoIG1ldGhvZCBzdGF0dXMuIFVzZSB0aGlzIGVuZHBvaW50IHRvIGVuYWJsZSBvciBkaXNhYmxlIGEgZ2l2ZW4gYXV0aCBtZXRob2QgZm9yIHRoaXMgcHJvamVjdC5cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7QXV0aE1ldGhvZH0gbWV0aG9kXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzdGF0dXNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvamVjdD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlQXV0aFN0YXR1cyhwcm9qZWN0SWQ6IHN0cmluZywgbWV0aG9kOiBBdXRoTWV0aG9kLCBzdGF0dXM6IGJvb2xlYW4pOiBQcm9taXNlPE1vZGVscy5Qcm9qZWN0PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJtZXRob2RcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzdGF0dXNcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL3Byb2plY3RzL3twcm9qZWN0SWR9L2F1dGgve21ldGhvZH0nLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKS5yZXBsYWNlKCd7bWV0aG9kfScsIG1ldGhvZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBzdGF0dXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzdGF0dXMnXSA9IHN0YXR1cztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgSldUXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBzY29wZXNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb25cbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuSnd0Pn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVKV1QocHJvamVjdElkOiBzdHJpbmcsIHNjb3Blczogc3RyaW5nW10sIGR1cmF0aW9uPzogbnVtYmVyKTogUHJvbWlzZTxNb2RlbHMuSnd0PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzY29wZXNcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL3Byb2plY3RzL3twcm9qZWN0SWR9L2p3dHMnLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Njb3BlcyddID0gc2NvcGVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHVyYXRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkdXJhdGlvbiddID0gZHVyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IGtleXNcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5LZXlMaXN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0S2V5cyhwcm9qZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLktleUxpc3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvcHJvamVjdHMve3Byb2plY3RJZH0va2V5cycucmVwbGFjZSgne3Byb2plY3RJZH0nLCBwcm9qZWN0SWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUga2V5XG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHNjb3Blc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHBpcmVcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuS2V5Pn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVLZXkocHJvamVjdElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc2NvcGVzOiBzdHJpbmdbXSwgZXhwaXJlPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuS2V5PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibmFtZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInNjb3Blc1wiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvcHJvamVjdHMve3Byb2plY3RJZH0va2V5cycucmVwbGFjZSgne3Byb2plY3RJZH0nLCBwcm9qZWN0SWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzY29wZXMnXSA9IHNjb3BlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGV4cGlyZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2V4cGlyZSddID0gZXhwaXJlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGtleVxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleUlkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLktleT59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0S2V5KHByb2plY3RJZDogc3RyaW5nLCBrZXlJZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuS2V5PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImtleUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9rZXlzL3trZXlJZH0nLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKS5yZXBsYWNlKCd7a2V5SWR9Jywga2V5SWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUga2V5XG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5SWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHNjb3Blc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHBpcmVcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuS2V5Pn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVLZXkocHJvamVjdElkOiBzdHJpbmcsIGtleUlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc2NvcGVzOiBzdHJpbmdbXSwgZXhwaXJlPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuS2V5PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImtleUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzY29wZXNcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL3Byb2plY3RzL3twcm9qZWN0SWR9L2tleXMve2tleUlkfScucmVwbGFjZSgne3Byb2plY3RJZH0nLCBwcm9qZWN0SWQpLnJlcGxhY2UoJ3trZXlJZH0nLCBrZXlJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNjb3BlcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Njb3BlcyddID0gc2NvcGVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZXhwaXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZXhwaXJlJ10gPSBleHBpcmU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncHV0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBrZXlcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHt9Pn1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVLZXkocHJvamVjdElkOiBzdHJpbmcsIGtleUlkOiBzdHJpbmcpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImtleUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9rZXlzL3trZXlJZH0nLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKS5yZXBsYWNlKCd7a2V5SWR9Jywga2V5SWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgcHJvamVjdCBPQXV0aDJcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7T0F1dGhQcm92aWRlcn0gcHJvdmlkZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXBwSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VjcmV0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb2plY3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZU9BdXRoMihwcm9qZWN0SWQ6IHN0cmluZywgcHJvdmlkZXI6IE9BdXRoUHJvdmlkZXIsIGFwcElkPzogc3RyaW5nLCBzZWNyZXQ/OiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvamVjdD4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlclwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvcHJvamVjdHMve3Byb2plY3RJZH0vb2F1dGgyJy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVyJ10gPSBwcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFwcElkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXBwSWQnXSA9IGFwcElkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VjcmV0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VjcmV0J10gPSBzZWNyZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IHBsYXRmb3Jtc1xuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlBsYXRmb3JtTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFBsYXRmb3Jtcyhwcm9qZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLlBsYXRmb3JtTGlzdD4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9wbGF0Zm9ybXMnLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHBsYXRmb3JtXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge1BsYXRmb3JtVHlwZX0gdHlwZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdG9yZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBob3N0bmFtZVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5QbGF0Zm9ybT59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlUGxhdGZvcm0ocHJvamVjdElkOiBzdHJpbmcsIHR5cGU6IFBsYXRmb3JtVHlwZSwgbmFtZTogc3RyaW5nLCBrZXk/OiBzdHJpbmcsIHN0b3JlPzogc3RyaW5nLCBob3N0bmFtZT86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLlBsYXRmb3JtPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidHlwZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJuYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9wbGF0Zm9ybXMnLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0eXBlJ10gPSB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydrZXknXSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHN0b3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3RvcmUnXSA9IHN0b3JlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaG9zdG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydob3N0bmFtZSddID0gaG9zdG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgcGxhdGZvcm1cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwbGF0Zm9ybUlkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlBsYXRmb3JtPn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXRQbGF0Zm9ybShwcm9qZWN0SWQ6IHN0cmluZywgcGxhdGZvcm1JZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuUGxhdGZvcm0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwbGF0Zm9ybUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwbGF0Zm9ybUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9wbGF0Zm9ybXMve3BsYXRmb3JtSWR9Jy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCkucmVwbGFjZSgne3BsYXRmb3JtSWR9JywgcGxhdGZvcm1JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBwbGF0Zm9ybVxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RvcmVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaG9zdG5hbWVcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUGxhdGZvcm0+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVBsYXRmb3JtKHByb2plY3RJZDogc3RyaW5nLCBwbGF0Zm9ybUlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywga2V5Pzogc3RyaW5nLCBzdG9yZT86IHN0cmluZywgaG9zdG5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5QbGF0Zm9ybT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBsYXRmb3JtSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInBsYXRmb3JtSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibmFtZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvcHJvamVjdHMve3Byb2plY3RJZH0vcGxhdGZvcm1zL3twbGF0Zm9ybUlkfScucmVwbGFjZSgne3Byb2plY3RJZH0nLCBwcm9qZWN0SWQpLnJlcGxhY2UoJ3twbGF0Zm9ybUlkfScsIHBsYXRmb3JtSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydrZXknXSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHN0b3JlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3RvcmUnXSA9IHN0b3JlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaG9zdG5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydob3N0bmFtZSddID0gaG9zdG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncHV0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBwbGF0Zm9ybVxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlUGxhdGZvcm0ocHJvamVjdElkOiBzdHJpbmcsIHBsYXRmb3JtSWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwbGF0Zm9ybUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwbGF0Zm9ybUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9wbGF0Zm9ybXMve3BsYXRmb3JtSWR9Jy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCkucmVwbGFjZSgne3BsYXRmb3JtSWR9JywgcGxhdGZvcm1JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBzZXJ2aWNlIHN0YXR1c1xuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHBhcmFtIHtBcGlTZXJ2aWNlfSBzZXJ2aWNlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzdGF0dXNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvamVjdD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlU2VydmljZVN0YXR1cyhwcm9qZWN0SWQ6IHN0cmluZywgc2VydmljZTogQXBpU2VydmljZSwgc3RhdHVzOiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvamVjdD4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlcnZpY2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInNlcnZpY2VcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzdGF0dXNcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL3Byb2plY3RzL3twcm9qZWN0SWR9L3NlcnZpY2UnLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHNlcnZpY2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZXJ2aWNlJ10gPSBzZXJ2aWNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdHVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3RhdHVzJ10gPSBzdGF0dXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFsbCBzZXJ2aWNlIHN0YXR1c1xuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzdGF0dXNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvamVjdD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlU2VydmljZVN0YXR1c0FsbChwcm9qZWN0SWQ6IHN0cmluZywgc3RhdHVzOiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuUHJvamVjdD4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic3RhdHVzXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9zZXJ2aWNlL2FsbCcucmVwbGFjZSgne3Byb2plY3RJZH0nLCBwcm9qZWN0SWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdHVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3RhdHVzJ10gPSBzdGF0dXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIFNNVFBcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZW5kZXJOYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbmRlckVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGx5VG9cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaG9zdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkXG4gICAgICogQHBhcmFtIHtTTVRQU2VjdXJlfSBzZWN1cmVcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvamVjdD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlU210cChwcm9qZWN0SWQ6IHN0cmluZywgZW5hYmxlZDogYm9vbGVhbiwgc2VuZGVyTmFtZT86IHN0cmluZywgc2VuZGVyRW1haWw/OiBzdHJpbmcsIHJlcGx5VG8/OiBzdHJpbmcsIGhvc3Q/OiBzdHJpbmcsIHBvcnQ/OiBudW1iZXIsIHVzZXJuYW1lPzogc3RyaW5nLCBwYXNzd29yZD86IHN0cmluZywgc2VjdXJlPzogU01UUFNlY3VyZSk6IFByb21pc2U8TW9kZWxzLlByb2plY3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJlbmFibGVkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9zbXRwJy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlbmRlck5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZW5kZXJOYW1lJ10gPSBzZW5kZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VuZGVyRW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZW5kZXJFbWFpbCddID0gc2VuZGVyRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXBseVRvICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUbyddID0gcmVwbHlUbztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGhvc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydob3N0J10gPSBob3N0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3BvcnQnXSA9IHBvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3VzZXJuYW1lJ10gPSB1c2VybmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncGFzc3dvcmQnXSA9IHBhc3N3b3JkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VjdXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VjdXJlJ10gPSBzZWN1cmU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFNNVFAgdGVzdFxuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gZW1haWxzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbmRlck5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VuZGVyRW1haWxcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaG9zdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZXBseVRvXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvcnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzc3dvcmRcbiAgICAgKiBAcGFyYW0ge1NNVFBTZWN1cmV9IHNlY3VyZVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHt9Pn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTbXRwVGVzdChwcm9qZWN0SWQ6IHN0cmluZywgZW1haWxzOiBzdHJpbmdbXSwgc2VuZGVyTmFtZTogc3RyaW5nLCBzZW5kZXJFbWFpbDogc3RyaW5nLCBob3N0OiBzdHJpbmcsIHJlcGx5VG8/OiBzdHJpbmcsIHBvcnQ/OiBudW1iZXIsIHVzZXJuYW1lPzogc3RyaW5nLCBwYXNzd29yZD86IHN0cmluZywgc2VjdXJlPzogU01UUFNlY3VyZSk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbWFpbHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImVtYWlsc1wiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZW5kZXJOYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzZW5kZXJOYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlbmRlckVtYWlsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzZW5kZXJFbWFpbFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBob3N0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJob3N0XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS9zbXRwL3Rlc3RzJy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBlbWFpbHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbWFpbHMnXSA9IGVtYWlscztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlbmRlck5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZW5kZXJOYW1lJ10gPSBzZW5kZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VuZGVyRW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZW5kZXJFbWFpbCddID0gc2VuZGVyRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXBseVRvICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUbyddID0gcmVwbHlUbztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGhvc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydob3N0J10gPSBob3N0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3BvcnQnXSA9IHBvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1c2VybmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3VzZXJuYW1lJ10gPSB1c2VybmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncGFzc3dvcmQnXSA9IHBhc3N3b3JkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VjdXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VjdXJlJ10gPSBzZWN1cmU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgcHJvamVjdCB0ZWFtXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGVhbUlkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlByb2plY3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVRlYW0ocHJvamVjdElkOiBzdHJpbmcsIHRlYW1JZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuUHJvamVjdD4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRlYW1JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidGVhbUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS90ZWFtJy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZWFtSWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0ZWFtSWQnXSA9IHRlYW1JZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgY3VzdG9tIGVtYWlsIHRlbXBsYXRlXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge0VtYWlsVGVtcGxhdGVUeXBlfSB0eXBlXG4gICAgICogQHBhcmFtIHtFbWFpbFRlbXBsYXRlTG9jYWxlfSBsb2NhbGVcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuRW1haWxUZW1wbGF0ZT59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0RW1haWxUZW1wbGF0ZShwcm9qZWN0SWQ6IHN0cmluZywgdHlwZTogRW1haWxUZW1wbGF0ZVR5cGUsIGxvY2FsZTogRW1haWxUZW1wbGF0ZUxvY2FsZSk6IFByb21pc2U8TW9kZWxzLkVtYWlsVGVtcGxhdGU+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0eXBlXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGxvY2FsZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibG9jYWxlXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS90ZW1wbGF0ZXMvZW1haWwve3R5cGV9L3tsb2NhbGV9Jy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCkucmVwbGFjZSgne3R5cGV9JywgdHlwZSkucmVwbGFjZSgne2xvY2FsZX0nLCBsb2NhbGUpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgY3VzdG9tIGVtYWlsIHRlbXBsYXRlc1xuICAgICAqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdElkXG4gICAgICogQHBhcmFtIHtFbWFpbFRlbXBsYXRlVHlwZX0gdHlwZVxuICAgICAqIEBwYXJhbSB7RW1haWxUZW1wbGF0ZUxvY2FsZX0gbG9jYWxlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1YmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZW5kZXJOYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbmRlckVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGx5VG9cbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuUHJvamVjdD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlRW1haWxUZW1wbGF0ZShwcm9qZWN0SWQ6IHN0cmluZywgdHlwZTogRW1haWxUZW1wbGF0ZVR5cGUsIGxvY2FsZTogRW1haWxUZW1wbGF0ZUxvY2FsZSwgc3ViamVjdDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIHNlbmRlck5hbWU/OiBzdHJpbmcsIHNlbmRlckVtYWlsPzogc3RyaW5nLCByZXBseVRvPzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuUHJvamVjdD4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInR5cGVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYWxlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJsb2NhbGVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3ViamVjdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic3ViamVjdFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJtZXNzYWdlXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS90ZW1wbGF0ZXMvZW1haWwve3R5cGV9L3tsb2NhbGV9Jy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCkucmVwbGFjZSgne3R5cGV9JywgdHlwZSkucmVwbGFjZSgne2xvY2FsZX0nLCBsb2NhbGUpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2Ygc3ViamVjdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3N1YmplY3QnXSA9IHN1YmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWVzc2FnZSddID0gbWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlbmRlck5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZW5kZXJOYW1lJ10gPSBzZW5kZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VuZGVyRW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZW5kZXJFbWFpbCddID0gc2VuZGVyRW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXBseVRvICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVwbHlUbyddID0gcmVwbHlUbztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldCBjdXN0b20gZW1haWwgdGVtcGxhdGVcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7RW1haWxUZW1wbGF0ZVR5cGV9IHR5cGVcbiAgICAgKiBAcGFyYW0ge0VtYWlsVGVtcGxhdGVMb2NhbGV9IGxvY2FsZVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5FbWFpbFRlbXBsYXRlPn1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVFbWFpbFRlbXBsYXRlKHByb2plY3RJZDogc3RyaW5nLCB0eXBlOiBFbWFpbFRlbXBsYXRlVHlwZSwgbG9jYWxlOiBFbWFpbFRlbXBsYXRlTG9jYWxlKTogUHJvbWlzZTxNb2RlbHMuRW1haWxUZW1wbGF0ZT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInR5cGVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYWxlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJsb2NhbGVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL3Byb2plY3RzL3twcm9qZWN0SWR9L3RlbXBsYXRlcy9lbWFpbC97dHlwZX0ve2xvY2FsZX0nLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKS5yZXBsYWNlKCd7dHlwZX0nLCB0eXBlKS5yZXBsYWNlKCd7bG9jYWxlfScsIGxvY2FsZSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBjdXN0b20gU01TIHRlbXBsYXRlXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge1Ntc1RlbXBsYXRlVHlwZX0gdHlwZVxuICAgICAqIEBwYXJhbSB7U21zVGVtcGxhdGVMb2NhbGV9IGxvY2FsZVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5TbXNUZW1wbGF0ZT59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0U21zVGVtcGxhdGUocHJvamVjdElkOiBzdHJpbmcsIHR5cGU6IFNtc1RlbXBsYXRlVHlwZSwgbG9jYWxlOiBTbXNUZW1wbGF0ZUxvY2FsZSk6IFByb21pc2U8TW9kZWxzLlNtc1RlbXBsYXRlPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidHlwZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImxvY2FsZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvcHJvamVjdHMve3Byb2plY3RJZH0vdGVtcGxhdGVzL3Ntcy97dHlwZX0ve2xvY2FsZX0nLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKS5yZXBsYWNlKCd7dHlwZX0nLCB0eXBlKS5yZXBsYWNlKCd7bG9jYWxlfScsIGxvY2FsZSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBjdXN0b20gU01TIHRlbXBsYXRlXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge1Ntc1RlbXBsYXRlVHlwZX0gdHlwZVxuICAgICAqIEBwYXJhbSB7U21zVGVtcGxhdGVMb2NhbGV9IGxvY2FsZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlNtc1RlbXBsYXRlPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVTbXNUZW1wbGF0ZShwcm9qZWN0SWQ6IHN0cmluZywgdHlwZTogU21zVGVtcGxhdGVUeXBlLCBsb2NhbGU6IFNtc1RlbXBsYXRlTG9jYWxlLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5TbXNUZW1wbGF0ZT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInR5cGVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbG9jYWxlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJsb2NhbGVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWVzc2FnZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvcHJvamVjdHMve3Byb2plY3RJZH0vdGVtcGxhdGVzL3Ntcy97dHlwZX0ve2xvY2FsZX0nLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKS5yZXBsYWNlKCd7dHlwZX0nLCB0eXBlKS5yZXBsYWNlKCd7bG9jYWxlfScsIGxvY2FsZSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWVzc2FnZSddID0gbWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldCBjdXN0b20gU01TIHRlbXBsYXRlXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge1Ntc1RlbXBsYXRlVHlwZX0gdHlwZVxuICAgICAqIEBwYXJhbSB7U21zVGVtcGxhdGVMb2NhbGV9IGxvY2FsZVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5TbXNUZW1wbGF0ZT59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlU21zVGVtcGxhdGUocHJvamVjdElkOiBzdHJpbmcsIHR5cGU6IFNtc1RlbXBsYXRlVHlwZSwgbG9jYWxlOiBTbXNUZW1wbGF0ZUxvY2FsZSk6IFByb21pc2U8TW9kZWxzLlNtc1RlbXBsYXRlPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidHlwZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImxvY2FsZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvcHJvamVjdHMve3Byb2plY3RJZH0vdGVtcGxhdGVzL3Ntcy97dHlwZX0ve2xvY2FsZX0nLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKS5yZXBsYWNlKCd7dHlwZX0nLCB0eXBlKS5yZXBsYWNlKCd7bG9jYWxlfScsIGxvY2FsZSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3Qgd2ViaG9va3NcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5XZWJob29rTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFdlYmhvb2tzKHByb2plY3RJZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuV2ViaG9va0xpc3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvcHJvamVjdHMve3Byb2plY3RJZH0vd2ViaG9va3MnLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHdlYmhvb2tcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gZXZlbnRzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VjdXJpdHlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHR0cFVzZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHR0cFBhc3NcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuV2ViaG9vaz59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlV2ViaG9vayhwcm9qZWN0SWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBldmVudHM6IHN0cmluZ1tdLCB1cmw6IHN0cmluZywgc2VjdXJpdHk6IGJvb2xlYW4sIGVuYWJsZWQ/OiBib29sZWFuLCBodHRwVXNlcj86IHN0cmluZywgaHR0cFBhc3M/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5XZWJob29rPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibmFtZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBldmVudHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImV2ZW50c1wiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInVybFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWN1cml0eSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic2VjdXJpdHlcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL3Byb2plY3RzL3twcm9qZWN0SWR9L3dlYmhvb2tzJy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZXZlbnRzJ10gPSBldmVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1cmwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1cmwnXSA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3VyaXR5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VjdXJpdHknXSA9IHNlY3VyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaHR0cFVzZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydodHRwVXNlciddID0gaHR0cFVzZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBodHRwUGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2h0dHBQYXNzJ10gPSBodHRwUGFzcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB3ZWJob29rXG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gd2ViaG9va0lkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLldlYmhvb2s+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldFdlYmhvb2socHJvamVjdElkOiBzdHJpbmcsIHdlYmhvb2tJZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuV2ViaG9vaz4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHdlYmhvb2tJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwid2ViaG9va0lkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS93ZWJob29rcy97d2ViaG9va0lkfScucmVwbGFjZSgne3Byb2plY3RJZH0nLCBwcm9qZWN0SWQpLnJlcGxhY2UoJ3t3ZWJob29rSWR9Jywgd2ViaG9va0lkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHdlYmhvb2tcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB3ZWJob29rSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IGV2ZW50c1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNlY3VyaXR5XG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGh0dHBVc2VyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGh0dHBQYXNzXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLldlYmhvb2s+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVdlYmhvb2socHJvamVjdElkOiBzdHJpbmcsIHdlYmhvb2tJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV2ZW50czogc3RyaW5nW10sIHVybDogc3RyaW5nLCBzZWN1cml0eTogYm9vbGVhbiwgZW5hYmxlZD86IGJvb2xlYW4sIGh0dHBVc2VyPzogc3RyaW5nLCBodHRwUGFzcz86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLldlYmhvb2s+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9qZWN0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByb2plY3RJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB3ZWJob29rSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIndlYmhvb2tJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJuYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50cyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZXZlbnRzXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidXJsXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3VyaXR5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzZWN1cml0eVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvcHJvamVjdHMve3Byb2plY3RJZH0vd2ViaG9va3Mve3dlYmhvb2tJZH0nLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKS5yZXBsYWNlKCd7d2ViaG9va0lkfScsIHdlYmhvb2tJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbmFibGVkJ10gPSBlbmFibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZXZlbnRzJ10gPSBldmVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1cmwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1cmwnXSA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3VyaXR5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VjdXJpdHknXSA9IHNlY3VyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaHR0cFVzZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydodHRwVXNlciddID0gaHR0cFVzZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBodHRwUGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2h0dHBQYXNzJ10gPSBodHRwUGFzcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwdXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIHdlYmhvb2tcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHByb2plY3RJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB3ZWJob29rSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlV2ViaG9vayhwcm9qZWN0SWQ6IHN0cmluZywgd2ViaG9va0lkOiBzdHJpbmcpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm9qZWN0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygd2ViaG9va0lkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ3ZWJob29rSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL3Byb2plY3RzL3twcm9qZWN0SWR9L3dlYmhvb2tzL3t3ZWJob29rSWR9Jy5yZXBsYWNlKCd7cHJvamVjdElkfScsIHByb2plY3RJZCkucmVwbGFjZSgne3dlYmhvb2tJZH0nLCB3ZWJob29rSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgd2ViaG9vayBzaWduYXR1cmUga2V5XG4gICAgICpcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9qZWN0SWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gd2ViaG9va0lkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLldlYmhvb2s+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVdlYmhvb2tTaWduYXR1cmUocHJvamVjdElkOiBzdHJpbmcsIHdlYmhvb2tJZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuV2ViaG9vaz4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb2plY3RJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvamVjdElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHdlYmhvb2tJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwid2ViaG9va0lkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9wcm9qZWN0cy97cHJvamVjdElkfS93ZWJob29rcy97d2ViaG9va0lkfS9zaWduYXR1cmUnLnJlcGxhY2UoJ3twcm9qZWN0SWR9JywgcHJvamVjdElkKS5yZXBsYWNlKCd7d2ViaG9va0lkfScsIHdlYmhvb2tJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=