@appconda/nextjs 1.0.114 → 1.0.116

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/dist/actions/actionClient.d.ts +10 -0
  2. package/dist/actions/actionClient.js +41 -0
  3. package/dist/actions/auth.d.ts +1 -0
  4. package/dist/actions/auth.js +7 -0
  5. package/dist/actions/authOptions.d.ts +5 -0
  6. package/dist/actions/authOptions.js +235 -0
  7. package/dist/actions/index.d.ts +3 -0
  8. package/dist/actions/index.js +4 -0
  9. package/dist/actions/nextAuthHandler.d.ts +1 -0
  10. package/dist/actions/nextAuthHandler.js +6 -0
  11. package/dist/client.d.ts +141 -0
  12. package/dist/client.js +335 -0
  13. package/dist/decorators/Cache.d.ts +1 -0
  14. package/dist/decorators/Cache.js +79 -0
  15. package/dist/decorators/CacheKey.d.ts +1 -0
  16. package/dist/decorators/CacheKey.js +9 -0
  17. package/dist/decorators/Invalidate.d.ts +1 -0
  18. package/dist/decorators/Invalidate.js +47 -0
  19. package/dist/enums/api-service.d.ts +13 -0
  20. package/dist/enums/api-service.js +15 -0
  21. package/dist/enums/api.d.ts +5 -0
  22. package/dist/enums/api.js +7 -0
  23. package/dist/enums/auth-method.d.ts +9 -0
  24. package/dist/enums/auth-method.js +11 -0
  25. package/dist/enums/browser.d.ts +16 -0
  26. package/dist/enums/browser.js +18 -0
  27. package/dist/enums/compression.d.ts +5 -0
  28. package/dist/enums/compression.js +7 -0
  29. package/dist/enums/credit-card.d.ts +18 -0
  30. package/dist/enums/credit-card.js +20 -0
  31. package/dist/enums/database-usage-range.d.ts +5 -0
  32. package/dist/enums/database-usage-range.js +7 -0
  33. package/dist/enums/email-template-locale.d.ts +133 -0
  34. package/dist/enums/email-template-locale.js +135 -0
  35. package/dist/enums/email-template-type.d.ts +9 -0
  36. package/dist/enums/email-template-type.js +11 -0
  37. package/dist/enums/entities/EntityLimitType.d.ts +4 -0
  38. package/dist/enums/entities/EntityLimitType.js +6 -0
  39. package/dist/enums/entities/PropertyAttributeName.d.ts +27 -0
  40. package/dist/enums/entities/PropertyAttributeName.js +29 -0
  41. package/dist/enums/entities/PropertyCondition.d.ts +7 -0
  42. package/dist/enums/entities/PropertyCondition.js +10 -0
  43. package/dist/enums/entities/PropertyType.d.ts +12 -0
  44. package/dist/enums/entities/PropertyType.js +18 -0
  45. package/dist/enums/entities/PropertyValueType.d.ts +6 -0
  46. package/dist/enums/entities/PropertyValueType.js +8 -0
  47. package/dist/enums/entities/RowAccess.d.ts +2 -0
  48. package/dist/enums/entities/RowAccess.js +2 -0
  49. package/dist/enums/entities/ViewFilterCondition.d.ts +12 -0
  50. package/dist/enums/entities/ViewFilterCondition.js +14 -0
  51. package/dist/enums/execution-method.d.ts +8 -0
  52. package/dist/enums/execution-method.js +10 -0
  53. package/dist/enums/flag.d.ts +197 -0
  54. package/dist/enums/flag.js +199 -0
  55. package/dist/enums/function-usage-range.d.ts +5 -0
  56. package/dist/enums/function-usage-range.js +7 -0
  57. package/dist/enums/image-format.d.ts +7 -0
  58. package/dist/enums/image-format.js +9 -0
  59. package/dist/enums/image-gravity.d.ts +11 -0
  60. package/dist/enums/image-gravity.js +13 -0
  61. package/dist/enums/index-type.d.ts +5 -0
  62. package/dist/enums/index-type.js +7 -0
  63. package/dist/enums/messaging-provider-type.d.ts +5 -0
  64. package/dist/enums/messaging-provider-type.js +7 -0
  65. package/dist/enums/name.d.ts +14 -0
  66. package/dist/enums/name.js +16 -0
  67. package/dist/enums/o-auth-provider copy.d.ts +41 -0
  68. package/dist/enums/o-auth-provider copy.js +43 -0
  69. package/dist/enums/password-hash.d.ts +13 -0
  70. package/dist/enums/password-hash.js +15 -0
  71. package/dist/enums/platform-type.d.ts +17 -0
  72. package/dist/enums/platform-type.js +19 -0
  73. package/dist/enums/project-usage-range.d.ts +4 -0
  74. package/dist/enums/project-usage-range.js +6 -0
  75. package/dist/enums/region.d.ts +4 -0
  76. package/dist/enums/region.js +6 -0
  77. package/dist/enums/relation-mutate.d.ts +5 -0
  78. package/dist/enums/relation-mutate.js +7 -0
  79. package/dist/enums/relationship-type.d.ts +6 -0
  80. package/dist/enums/relationship-type.js +8 -0
  81. package/dist/enums/resource-type.d.ts +4 -0
  82. package/dist/enums/resource-type.js +6 -0
  83. package/dist/enums/runtime.d.ts +48 -0
  84. package/dist/enums/runtime.js +50 -0
  85. package/dist/enums/s-m-t-p-secure.d.ts +3 -0
  86. package/dist/enums/s-m-t-p-secure.js +5 -0
  87. package/dist/enums/shared/ApplicationLayout.d.ts +4 -0
  88. package/dist/enums/shared/ApplicationLayout.js +6 -0
  89. package/dist/enums/shared/Colors.d.ts +24 -0
  90. package/dist/enums/shared/Colors.js +26 -0
  91. package/dist/enums/shared/InputType.d.ts +6 -0
  92. package/dist/enums/shared/InputType.js +8 -0
  93. package/dist/enums/shared/Periodicity.d.ts +7 -0
  94. package/dist/enums/shared/Periodicity.js +9 -0
  95. package/dist/enums/shared/SvgIcon.d.ts +37 -0
  96. package/dist/enums/shared/SvgIcon.js +39 -0
  97. package/dist/enums/shared/Theme.d.ts +4 -0
  98. package/dist/enums/shared/Theme.js +6 -0
  99. package/dist/enums/sms-template-locale.d.ts +133 -0
  100. package/dist/enums/sms-template-locale.js +135 -0
  101. package/dist/enums/sms-template-type.d.ts +6 -0
  102. package/dist/enums/sms-template-type.js +8 -0
  103. package/dist/enums/smtp-encryption.d.ts +5 -0
  104. package/dist/enums/smtp-encryption.js +7 -0
  105. package/dist/enums/storage-usage-range.d.ts +5 -0
  106. package/dist/enums/storage-usage-range.js +7 -0
  107. package/dist/enums/subscriptions/PricingModel.d.ts +11 -0
  108. package/dist/enums/subscriptions/PricingModel.js +12 -0
  109. package/dist/enums/subscriptions/SubscriptionBillingPeriod.d.ts +10 -0
  110. package/dist/enums/subscriptions/SubscriptionBillingPeriod.js +11 -0
  111. package/dist/enums/subscriptions/SubscriptionFeatureLimitType.d.ts +10 -0
  112. package/dist/enums/subscriptions/SubscriptionFeatureLimitType.js +13 -0
  113. package/dist/enums/subscriptions/SubscriptionPriceType.d.ts +7 -0
  114. package/dist/enums/subscriptions/SubscriptionPriceType.js +8 -0
  115. package/dist/enums/tenants/LinkedAccountStatus.d.ts +5 -0
  116. package/dist/enums/tenants/LinkedAccountStatus.js +7 -0
  117. package/dist/enums/tenants/TenantUserJoined.d.ts +6 -0
  118. package/dist/enums/tenants/TenantUserJoined.js +8 -0
  119. package/dist/enums/tenants/TenantUserStatus.d.ts +6 -0
  120. package/dist/enums/tenants/TenantUserStatus.js +8 -0
  121. package/dist/enums/tenants/TenantUserType.d.ts +5 -0
  122. package/dist/enums/tenants/TenantUserType.js +7 -0
  123. package/dist/enums/user-usage-range.d.ts +5 -0
  124. package/dist/enums/user-usage-range.js +7 -0
  125. package/dist/getAppcondaClient.d.ts +2 -0
  126. package/dist/getAppcondaClient.js +44 -0
  127. package/dist/getSDKForCurrentUser.d.ts +43 -0
  128. package/dist/getSDKForCurrentUser.js +76 -0
  129. package/dist/getSDKForService.d.ts +6 -0
  130. package/dist/getSDKForService.js +51 -0
  131. package/dist/getSDKForTenant.d.ts +20 -0
  132. package/dist/getSDKForTenant.js +44 -0
  133. package/dist/id.d.ts +20 -0
  134. package/dist/id.js +45 -0
  135. package/dist/index.d.ts +44 -0
  136. package/dist/index.js +42 -0
  137. package/dist/inputFile.d.ts +6 -0
  138. package/dist/inputFile.js +17 -0
  139. package/dist/lib/Cache/Adapter.d.ts +10 -0
  140. package/dist/lib/Cache/Adapter.js +2 -0
  141. package/dist/lib/Cache/Adapters/Filesystem.d.ts +16 -0
  142. package/dist/lib/Cache/Adapters/Filesystem.js +103 -0
  143. package/dist/lib/Cache/Adapters/Memory.d.ts +18 -0
  144. package/dist/lib/Cache/Adapters/Memory.js +47 -0
  145. package/dist/lib/Cache/Adapters/None.d.ts +12 -0
  146. package/dist/lib/Cache/Adapters/None.js +28 -0
  147. package/dist/lib/Cache/Adapters/Sharding.d.ts +17 -0
  148. package/dist/lib/Cache/Adapters/Sharding.js +73 -0
  149. package/dist/lib/Cache/Cache.d.ts +16 -0
  150. package/dist/lib/Cache/Cache.js +52 -0
  151. package/dist/lib/Cache/index.d.ts +4 -0
  152. package/dist/lib/Cache/index.js +5 -0
  153. package/dist/lib/Cache/test.d.ts +0 -0
  154. package/dist/lib/Cache/test.js +1 -0
  155. package/dist/lib/Registry/Registry.d.ts +38 -0
  156. package/dist/lib/Registry/Registry.js +56 -0
  157. package/dist/lib/Registry/index.d.ts +1 -0
  158. package/dist/lib/Registry/index.js +2 -0
  159. package/dist/lib/Services.d.ts +6 -0
  160. package/dist/lib/Services.js +14 -0
  161. package/dist/lib/crypto.d.ts +23 -0
  162. package/dist/lib/crypto.js +78 -0
  163. package/dist/lib/env.d.ts +1 -0
  164. package/dist/lib/env.js +137 -0
  165. package/dist/lib/errors.d.ts +70 -0
  166. package/dist/lib/errors.js +76 -0
  167. package/dist/lib/index.d.ts +2 -0
  168. package/dist/lib/index.js +3 -0
  169. package/dist/lib/jwt.d.ts +12 -0
  170. package/dist/lib/jwt.js +103 -0
  171. package/dist/models.d.ts +3272 -0
  172. package/dist/models.js +2 -0
  173. package/dist/modules/account/actions.d.ts +31 -0
  174. package/dist/modules/account/actions.js +18 -0
  175. package/dist/modules/account/enums/authentication-factor.d.ts +6 -0
  176. package/dist/modules/account/enums/authentication-factor.js +8 -0
  177. package/dist/modules/account/enums/authenticator-type.d.ts +3 -0
  178. package/dist/modules/account/enums/authenticator-type.js +5 -0
  179. package/dist/modules/account/enums/o-auth-provider.d.ts +41 -0
  180. package/dist/modules/account/enums/o-auth-provider.js +43 -0
  181. package/dist/modules/account/index.d.ts +3 -0
  182. package/dist/modules/account/index.js +4 -0
  183. package/dist/modules/account/schema.d.ts +17 -0
  184. package/dist/modules/account/schema.js +8 -0
  185. package/dist/modules/account/service.d.ts +530 -0
  186. package/dist/modules/account/service.js +1260 -0
  187. package/dist/modules/account/types.d.ts +411 -0
  188. package/dist/modules/account/types.js +2 -0
  189. package/dist/modules/acl/service.d.ts +26 -0
  190. package/dist/modules/acl/service.js +27 -0
  191. package/dist/modules/agent/action.d.ts +57 -0
  192. package/dist/modules/agent/action.js +64 -0
  193. package/dist/modules/agent/index.d.ts +4 -0
  194. package/dist/modules/agent/index.js +5 -0
  195. package/dist/modules/agent/schema.d.ts +48 -0
  196. package/dist/modules/agent/schema.js +21 -0
  197. package/dist/modules/agent/service.d.ts +12 -0
  198. package/dist/modules/agent/service.js +22 -0
  199. package/dist/modules/agent/types.d.ts +11 -0
  200. package/dist/modules/agent/types.js +2 -0
  201. package/dist/modules/ai/index.d.ts +1 -0
  202. package/dist/modules/ai/index.js +2 -0
  203. package/dist/modules/ai/node/actions.d.ts +4 -0
  204. package/dist/modules/ai/node/actions.js +16 -0
  205. package/dist/modules/ai/node/index.d.ts +2 -0
  206. package/dist/modules/ai/node/index.js +3 -0
  207. package/dist/modules/ai/node/service.d.ts +5 -0
  208. package/dist/modules/ai/node/service.js +12 -0
  209. package/dist/modules/index.d.ts +6 -0
  210. package/dist/modules/index.js +7 -0
  211. package/dist/modules/task/action.d.ts +201 -0
  212. package/dist/modules/task/action.js +147 -0
  213. package/dist/modules/task/index.d.ts +4 -0
  214. package/dist/modules/task/index.js +5 -0
  215. package/dist/modules/task/schema.d.ts +107 -0
  216. package/dist/modules/task/schema.js +44 -0
  217. package/dist/modules/task/service.d.ts +19 -0
  218. package/dist/modules/task/service.js +43 -0
  219. package/dist/modules/task/types.d.ts +84 -0
  220. package/dist/modules/task/types.js +2 -0
  221. package/dist/modules/tenant/actions.d.ts +49 -0
  222. package/dist/modules/tenant/actions.js +38 -0
  223. package/dist/modules/tenant/index.d.ts +3 -0
  224. package/dist/modules/tenant/index.js +4 -0
  225. package/dist/modules/tenant/tenant.d.ts +32 -0
  226. package/dist/modules/tenant/tenant.js +125 -0
  227. package/dist/modules/tenant/types.d.ts +11 -0
  228. package/dist/modules/tenant/types.js +2 -0
  229. package/dist/modules/waitlist/action.d.ts +71 -0
  230. package/dist/modules/waitlist/action.js +78 -0
  231. package/dist/modules/waitlist/index.d.ts +4 -0
  232. package/dist/modules/waitlist/index.js +5 -0
  233. package/dist/modules/waitlist/schema.d.ts +39 -0
  234. package/dist/modules/waitlist/schema.js +18 -0
  235. package/dist/modules/waitlist/service.d.ts +13 -0
  236. package/dist/modules/waitlist/service.js +28 -0
  237. package/dist/modules/waitlist/types.d.ts +14 -0
  238. package/dist/modules/waitlist/types.js +2 -0
  239. package/dist/permission.d.ts +43 -0
  240. package/dist/permission.js +54 -0
  241. package/dist/query.d.ts +194 -0
  242. package/dist/query.js +204 -0
  243. package/dist/role.d.ts +70 -0
  244. package/dist/role.js +94 -0
  245. package/dist/schemas/nodes.d.ts +0 -0
  246. package/dist/schemas/nodes.js +1 -0
  247. package/dist/service-client.d.ts +7 -0
  248. package/dist/service-client.js +14 -0
  249. package/dist/service.d.ts +11 -0
  250. package/dist/service.js +23 -0
  251. package/dist/services/applets.d.ts +9 -0
  252. package/dist/services/applets.js +40 -0
  253. package/dist/services/avatars.d.ts +115 -0
  254. package/dist/services/avatars.js +251 -0
  255. package/dist/services/chat-flow.d.ts +7 -0
  256. package/dist/services/chat-flow.js +26 -0
  257. package/dist/services/community.d.ts +19 -0
  258. package/dist/services/community.js +69 -0
  259. package/dist/services/configuration.d.ts +5 -0
  260. package/dist/services/configuration.js +11 -0
  261. package/dist/services/databases.d.ts +613 -0
  262. package/dist/services/databases.js +1736 -0
  263. package/dist/services/functions.d.ts +319 -0
  264. package/dist/services/functions.js +810 -0
  265. package/dist/services/graphql.d.ts +25 -0
  266. package/dist/services/graphql.js +57 -0
  267. package/dist/services/health.d.ts +231 -0
  268. package/dist/services/health.js +463 -0
  269. package/dist/services/locale.d.ts +80 -0
  270. package/dist/services/locale.js +144 -0
  271. package/dist/services/messaging.d.ts +685 -0
  272. package/dist/services/messaging.js +1920 -0
  273. package/dist/services/permissions.d.ts +20 -0
  274. package/dist/services/permissions.js +90 -0
  275. package/dist/services/pricing.d.ts +15 -0
  276. package/dist/services/pricing.js +21 -0
  277. package/dist/services/projects.d.ts +542 -0
  278. package/dist/services/projects.js +1526 -0
  279. package/dist/services/roles.d.ts +19 -0
  280. package/dist/services/roles.js +72 -0
  281. package/dist/services/schema.d.ts +17 -0
  282. package/dist/services/schema.js +48 -0
  283. package/dist/services/storage.d.ts +189 -0
  284. package/dist/services/storage.js +474 -0
  285. package/dist/services/subscription.d.ts +15 -0
  286. package/dist/services/subscription.js +30 -0
  287. package/dist/services/teams.d.ts +167 -0
  288. package/dist/services/teams.js +395 -0
  289. package/dist/services/tenant-subscription.d.ts +12 -0
  290. package/dist/services/tenant-subscription.js +52 -0
  291. package/dist/services/users.d.ts +499 -0
  292. package/dist/services/users.js +1283 -0
  293. package/package.json +3 -3
  294. package/src/actions/actionClient.ts +6 -3
  295. package/src/actions/auth.ts +2 -1
  296. package/src/actions/authOptions.ts +1 -1
  297. package/src/client.ts +1 -1
  298. package/src/lib/env.ts +1 -1
  299. package/src/lib/jwt.ts +1 -1
  300. package/src/modules/account/actions.ts +1 -1
  301. package/src/modules/task/schema.ts +1 -1
  302. package/tsconfig.json +2 -0
@@ -0,0 +1,1526 @@
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=