@kaspernj/api-maker 1.0.2056 → 1.0.2057

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 (209) hide show
  1. package/build/api.js +22 -16
  2. package/build/attribute-not-loaded-error.js +5 -2
  3. package/build/base-component.js +6 -3
  4. package/build/base-error.js +15 -9
  5. package/build/base-model/attribute.js +10 -4
  6. package/build/base-model/column.js +5 -2
  7. package/build/base-model/reflection.js +49 -10
  8. package/build/base-model/scope.js +41 -5
  9. package/build/base-model.js +115 -76
  10. package/build/bootstrap/attribute-row.js +71 -33
  11. package/build/bootstrap/attribute-rows.js +20 -15
  12. package/build/bootstrap/card.js +72 -34
  13. package/build/bootstrap/checkbox.js +35 -30
  14. package/build/bootstrap/checkboxes.js +69 -31
  15. package/build/bootstrap/index.d.ts +1 -0
  16. package/build/bootstrap/index.js +2 -0
  17. package/build/bootstrap/input.js +48 -43
  18. package/build/bootstrap/invalid-feedback.js +17 -11
  19. package/build/bootstrap/paginate.js +73 -35
  20. package/build/bootstrap/radio-buttons.js +33 -28
  21. package/build/bootstrap/select.js +34 -29
  22. package/build/bootstrap/sort-link.js +68 -30
  23. package/build/cable-connection-pool.js +18 -12
  24. package/build/cable-subscription-pool.js +58 -19
  25. package/build/cable-subscription.d.ts +2 -2
  26. package/build/cable-subscription.d.ts.map +1 -1
  27. package/build/cable-subscription.js +12 -6
  28. package/build/cache-key-generator.js +11 -5
  29. package/build/can-can.d.ts +2 -2
  30. package/build/can-can.d.ts.map +1 -1
  31. package/build/can-can.js +56 -17
  32. package/build/channels-consumer.js +10 -5
  33. package/build/collection-loader.js +36 -31
  34. package/build/collection.js +58 -19
  35. package/build/command-submit-data.d.ts +1 -1
  36. package/build/command-submit-data.d.ts.map +1 -1
  37. package/build/command-submit-data.js +10 -4
  38. package/build/commands-pool.js +39 -33
  39. package/build/compose.js +5 -2
  40. package/build/config.d.ts +3 -3
  41. package/build/config.d.ts.map +1 -1
  42. package/build/config.js +40 -6
  43. package/build/custom-error.js +9 -4
  44. package/build/data-set-to-attributes.js +39 -3
  45. package/build/deserializer.js +57 -18
  46. package/build/destroy-error.js +9 -4
  47. package/build/devise.d.ts +1 -1
  48. package/build/devise.d.ts.map +1 -1
  49. package/build/devise.js +55 -16
  50. package/build/draggable-sort/controller.js +14 -11
  51. package/build/draggable-sort/index.js +69 -31
  52. package/build/draggable-sort/item.js +70 -32
  53. package/build/error-logger.js +14 -8
  54. package/build/error-messages.js +8 -5
  55. package/build/event-connection.js +18 -12
  56. package/build/event-emitter-listener.js +9 -4
  57. package/build/event-model-class.js +17 -11
  58. package/build/events.d.ts +2 -2
  59. package/build/events.d.ts.map +1 -1
  60. package/build/events.js +6 -5
  61. package/build/form.js +69 -27
  62. package/build/history-expo.js +11 -6
  63. package/build/history-react-native.js +14 -9
  64. package/build/history.js +5 -3
  65. package/build/index.js +5 -2
  66. package/build/inputs/attachment.js +29 -24
  67. package/build/inputs/auto-submit.js +42 -6
  68. package/build/inputs/checkbox.js +73 -35
  69. package/build/inputs/checkboxes.js +68 -30
  70. package/build/inputs/id-for-component.js +39 -3
  71. package/build/inputs/input-wrapper.js +12 -7
  72. package/build/inputs/input.js +101 -62
  73. package/build/inputs/money.js +85 -47
  74. package/build/inputs/name-for-component.js +39 -3
  75. package/build/inputs/select.js +32 -26
  76. package/build/instance-of-class-name.js +7 -5
  77. package/build/is-expo.js +8 -6
  78. package/build/key-value-store.js +10 -4
  79. package/build/link.js +21 -16
  80. package/build/logger.js +5 -2
  81. package/build/merge-styles.js +7 -4
  82. package/build/modal.js +15 -10
  83. package/build/model-class-require.js +39 -4
  84. package/build/model-events.js +20 -14
  85. package/build/model-name.js +44 -5
  86. package/build/model-prop-type.js +15 -9
  87. package/build/model-recipes-loader.js +14 -8
  88. package/build/model-recipes-model-loader.d.ts +1 -1
  89. package/build/model-recipes-model-loader.js +57 -18
  90. package/build/models-response-reader.js +46 -7
  91. package/build/models.js +10 -5
  92. package/build/money-formatter.d.ts +2 -2
  93. package/build/money-formatter.d.ts.map +1 -1
  94. package/build/money-formatter.js +19 -13
  95. package/build/not-loaded-error.js +5 -2
  96. package/build/params.js +19 -13
  97. package/build/preloaded.js +44 -5
  98. package/build/resize-observer.js +11 -6
  99. package/build/rest-props-validator.js +4 -2
  100. package/build/result.js +5 -2
  101. package/build/router/route.js +82 -40
  102. package/build/router/switch.js +56 -17
  103. package/build/router.js +59 -21
  104. package/build/routes-native.js +54 -15
  105. package/build/routes.js +49 -13
  106. package/build/run-last.js +5 -2
  107. package/build/serializer.js +8 -5
  108. package/build/services.js +10 -4
  109. package/build/session-status-updater.js +53 -14
  110. package/build/source-maps-loader.js +50 -11
  111. package/build/super-admin/config-reader.d.ts +2 -2
  112. package/build/super-admin/config-reader.js +45 -9
  113. package/build/super-admin/edit-page/edit-attribute-checkbox.js +61 -23
  114. package/build/super-admin/edit-page/edit-attribute-content.js +21 -16
  115. package/build/super-admin/edit-page/edit-attribute-input.js +59 -21
  116. package/build/super-admin/edit-page/edit-attribute.js +65 -27
  117. package/build/super-admin/edit-page.js +72 -34
  118. package/build/super-admin/has-edit-config.js +9 -4
  119. package/build/super-admin/index-page.js +17 -12
  120. package/build/super-admin/index.js +84 -46
  121. package/build/super-admin/layout/header/index.js +63 -25
  122. package/build/super-admin/layout/index.js +78 -40
  123. package/build/super-admin/layout/menu/index.js +47 -42
  124. package/build/super-admin/layout/menu/menu-content.js +60 -22
  125. package/build/super-admin/layout/menu/menu-item.js +23 -18
  126. package/build/super-admin/layout/no-access.js +20 -15
  127. package/build/super-admin/model-class-table.js +64 -26
  128. package/build/super-admin/models.js +38 -3
  129. package/build/super-admin/show-nav.js +61 -23
  130. package/build/super-admin/show-page/belongs-to-attribute-row.js +52 -14
  131. package/build/super-admin/show-page/index.js +63 -25
  132. package/build/super-admin/show-reflection-actions.js +62 -24
  133. package/build/super-admin/show-reflection-link.js +19 -14
  134. package/build/super-admin/show-reflection-page.js +63 -25
  135. package/build/table/column-content.js +54 -15
  136. package/build/table/column-identifier.js +5 -2
  137. package/build/table/column-visible.js +5 -2
  138. package/build/table/components/column.js +14 -9
  139. package/build/table/components/flat-list.js +14 -9
  140. package/build/table/components/header.js +16 -11
  141. package/build/table/components/row.js +16 -11
  142. package/build/table/filters/attribute-element.js +26 -21
  143. package/build/table/filters/filter-form.js +109 -71
  144. package/build/table/filters/filter.js +29 -24
  145. package/build/table/filters/index.js +43 -38
  146. package/build/table/filters/load-search-modal.js +64 -26
  147. package/build/table/filters/reflection-element.js +22 -17
  148. package/build/table/filters/save-search-modal.js +27 -22
  149. package/build/table/filters/scope-element.js +19 -14
  150. package/build/table/header-column-content.js +27 -22
  151. package/build/table/header-column.js +71 -33
  152. package/build/table/header-select.js +29 -24
  153. package/build/table/model-callback-args.js +39 -3
  154. package/build/table/model-column.js +75 -37
  155. package/build/table/model-row.js +79 -41
  156. package/build/table/select-calculator.js +52 -13
  157. package/build/table/settings/column-row.js +57 -19
  158. package/build/table/settings/download-action.js +31 -26
  159. package/build/table/settings/index.js +61 -23
  160. package/build/table/table-settings.js +70 -31
  161. package/build/table/table.js +196 -158
  162. package/build/table/use-sorting.js +12 -6
  163. package/build/table/widths.js +12 -9
  164. package/build/table/worker-plugins-check-all-checkbox.js +64 -26
  165. package/build/table/worker-plugins-checkbox.js +61 -23
  166. package/build/translated-attributes.js +5 -2
  167. package/build/translated-collections.js +14 -8
  168. package/build/updated-attribute.js +21 -15
  169. package/build/url-encode.js +10 -4
  170. package/build/use-breakpoint.js +58 -20
  171. package/build/use-can-can.js +21 -15
  172. package/build/use-collection.js +70 -32
  173. package/build/use-created-event.js +27 -22
  174. package/build/use-current-user-context.js +74 -36
  175. package/build/use-current-user.d.ts +2 -2
  176. package/build/use-current-user.d.ts.map +1 -1
  177. package/build/use-current-user.js +17 -11
  178. package/build/use-destroyed-event.js +18 -13
  179. package/build/use-event-emitter.js +13 -7
  180. package/build/use-event-listener.js +12 -7
  181. package/build/use-input.js +33 -28
  182. package/build/use-model-event.js +18 -13
  183. package/build/use-model.js +65 -27
  184. package/build/use-resize-observer.js +13 -8
  185. package/build/use-router.js +62 -24
  186. package/build/use-screen-layout.js +7 -5
  187. package/build/use-styles.js +52 -13
  188. package/build/use-updated-event.js +18 -13
  189. package/build/use-validation-errors.js +14 -9
  190. package/build/utils/button.js +33 -28
  191. package/build/utils/card.js +61 -23
  192. package/build/utils/checkbox.js +60 -22
  193. package/build/utils/checkboxes.js +78 -40
  194. package/build/utils/default-style.js +56 -15
  195. package/build/utils/header.js +12 -7
  196. package/build/utils/icon.js +61 -23
  197. package/build/utils/invalid-feedback.js +17 -12
  198. package/build/utils/modal.js +55 -17
  199. package/build/utils/text.js +14 -9
  200. package/build/validation-error.js +45 -6
  201. package/build/validation-errors.js +59 -19
  202. package/build/with-api-maker.js +52 -12
  203. package/build/with-collection.js +50 -12
  204. package/build/with-current-user.js +12 -7
  205. package/build/with-model.js +14 -9
  206. package/build/with-router.js +12 -7
  207. package/package.json +2 -1
  208. package/build/source-maps-loader.d.ts +0 -37
  209. package/build/source-maps-loader.d.ts.map +0 -1
@@ -1,21 +1,59 @@
1
- import Attribute from "./base-model/attribute";
2
- import AttributeNotLoadedError from "./attribute-not-loaded-error";
3
- import CacheKeyGenerator from "./cache-key-generator";
4
- import Collection from "./collection.js";
5
- import CommandsPool from "./commands-pool.js";
6
- import Config from "./config.js";
7
- import CustomError from "./custom-error.js";
8
- import { digg } from "diggerize";
9
- import FormDataObjectizer from "form-data-objectizer";
10
- import * as inflection from "inflection";
11
- import ModelName from "./model-name";
12
- import NotLoadedError from "./not-loaded-error";
13
- import objectToFormData from "object-to-formdata";
14
- import Reflection from "./base-model/reflection";
15
- import Scope from "./base-model/scope";
16
- import Services from "./services.js";
17
- import ValidationError from "./validation-error.js";
18
- import { ValidationErrors } from "./validation-errors.js";
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const attribute_1 = __importDefault(require("./base-model/attribute"));
40
+ const attribute_not_loaded_error_1 = __importDefault(require("./attribute-not-loaded-error"));
41
+ const cache_key_generator_1 = __importDefault(require("./cache-key-generator"));
42
+ const collection_js_1 = __importDefault(require("./collection.js"));
43
+ const commands_pool_js_1 = __importDefault(require("./commands-pool.js"));
44
+ const config_js_1 = __importDefault(require("./config.js"));
45
+ const custom_error_js_1 = __importDefault(require("./custom-error.js"));
46
+ const diggerize_1 = require("diggerize");
47
+ const form_data_objectizer_1 = __importDefault(require("form-data-objectizer"));
48
+ const inflection = __importStar(require("inflection"));
49
+ const model_name_1 = __importDefault(require("./model-name"));
50
+ const not_loaded_error_1 = __importDefault(require("./not-loaded-error"));
51
+ const object_to_formdata_1 = __importDefault(require("object-to-formdata"));
52
+ const reflection_1 = __importDefault(require("./base-model/reflection"));
53
+ const scope_1 = __importDefault(require("./base-model/scope"));
54
+ const services_js_1 = __importDefault(require("./services.js"));
55
+ const validation_error_js_1 = __importDefault(require("./validation-error.js"));
56
+ const validation_errors_js_1 = require("./validation-errors.js");
19
57
  /**
20
58
  * @typedef {object} ModelClassDataType
21
59
  * @property {import("./base-model/attribute.js").AttributeArgType[]} attributes
@@ -38,7 +76,7 @@ function objectToUnderscore(object) {
38
76
  }
39
77
  return newObject;
40
78
  }
41
- export default class BaseModel {
79
+ class BaseModel {
42
80
  static apiMakerType = "BaseModel";
43
81
  /** @returns {Attribute[]} */
44
82
  static attributes() {
@@ -46,14 +84,14 @@ export default class BaseModel {
46
84
  const result = [];
47
85
  for (const attributeKey in attributes) {
48
86
  const attributeData = attributes[attributeKey];
49
- const attribute = new Attribute(attributeData);
87
+ const attribute = new attribute_1.default(attributeData);
50
88
  result.push(attribute);
51
89
  }
52
90
  return result;
53
91
  }
54
92
  /** @returns {boolean} */
55
93
  static hasAttribute(attributeName) {
56
- const attributes = digg(this.modelClassData(), "attributes");
94
+ const attributes = (0, diggerize_1.digg)(this.modelClassData(), "attributes");
57
95
  const lowerCaseAttributeName = inflection.underscore(attributeName);
58
96
  if (lowerCaseAttributeName in attributes)
59
97
  return true;
@@ -100,7 +138,7 @@ export default class BaseModel {
100
138
  return model;
101
139
  }
102
140
  else {
103
- throw new CustomError("Record not found");
141
+ throw new custom_error_js_1.default("Record not found");
104
142
  }
105
143
  }
106
144
  /**
@@ -110,21 +148,21 @@ export default class BaseModel {
110
148
  * @returns {Promise<InstanceType<T>>}
111
149
  */
112
150
  static async findOrCreateBy(findOrCreateByArgs, args = {}) {
113
- const result = await Services.current().sendRequest("Models::FindOrCreateBy", {
151
+ const result = await services_js_1.default.current().sendRequest("Models::FindOrCreateBy", {
114
152
  additional_data: args.additionalData,
115
153
  find_or_create_by_args: findOrCreateByArgs,
116
- resource_name: digg(this.modelClassData(), "name")
154
+ resource_name: (0, diggerize_1.digg)(this.modelClassData(), "name")
117
155
  });
118
- const model = /** @type {InstanceType<T>} */ (digg(result, "model"));
156
+ const model = /** @type {InstanceType<T>} */ ((0, diggerize_1.digg)(result, "model"));
119
157
  return model;
120
158
  }
121
159
  /** @returns {ModelName} */
122
160
  static modelName() {
123
- return new ModelName({ modelClassData: this.modelClassData() });
161
+ return new model_name_1.default({ modelClassData: this.modelClassData() });
124
162
  }
125
163
  /** @returns {string} */
126
164
  static primaryKey() {
127
- return digg(this.modelClassData(), "primaryKey");
165
+ return (0, diggerize_1.digg)(this.modelClassData(), "primaryKey");
128
166
  }
129
167
  /**
130
168
  * @template {typeof BaseModel} MC
@@ -134,7 +172,7 @@ export default class BaseModel {
134
172
  */
135
173
  static ransack(query = {}) {
136
174
  const ModelClass = /** @type {MC} */ (this);
137
- return new Collection({ modelClass: ModelClass }, { ransack: query });
175
+ return new collection_js_1.default({ modelClass: ModelClass }, { ransack: query });
138
176
  }
139
177
  /**
140
178
  * @template {typeof BaseModel} MC
@@ -147,10 +185,10 @@ export default class BaseModel {
147
185
  }
148
186
  /** @returns {Reflection[]} */
149
187
  static ransackableAssociations() {
150
- const relationships = digg(this.modelClassData(), "ransackable_associations");
188
+ const relationships = (0, diggerize_1.digg)(this.modelClassData(), "ransackable_associations");
151
189
  const reflections = [];
152
190
  for (const relationshipData of relationships) {
153
- reflections.push(new Reflection(relationshipData));
191
+ reflections.push(new reflection_1.default(relationshipData));
154
192
  }
155
193
  return reflections;
156
194
  }
@@ -159,26 +197,26 @@ export default class BaseModel {
159
197
  const attributes = this.modelClassData().ransackable_attributes;
160
198
  const result = [];
161
199
  for (const attributeData of attributes) {
162
- result.push(new Attribute(attributeData));
200
+ result.push(new attribute_1.default(attributeData));
163
201
  }
164
202
  return result;
165
203
  }
166
204
  /** @returns {Scope[]} */
167
205
  static ransackableScopes() {
168
- const ransackableScopes = digg(this.modelClassData(), "ransackable_scopes");
206
+ const ransackableScopes = (0, diggerize_1.digg)(this.modelClassData(), "ransackable_scopes");
169
207
  const result = [];
170
208
  for (const scopeData of ransackableScopes) {
171
- const scope = new Scope(scopeData);
209
+ const scope = new scope_1.default(scopeData);
172
210
  result.push(scope);
173
211
  }
174
212
  return result;
175
213
  }
176
214
  /** @returns {Reflection[]} */
177
215
  static reflections() {
178
- const relationships = digg(this.modelClassData(), "relationships");
216
+ const relationships = (0, diggerize_1.digg)(this.modelClassData(), "relationships");
179
217
  const reflections = [];
180
218
  for (const relationshipData of relationships) {
181
- const reflection = new Reflection(relationshipData);
219
+ const reflection = new reflection_1.default(relationshipData);
182
220
  reflections.push(reflection);
183
221
  }
184
222
  return reflections;
@@ -268,7 +306,7 @@ export default class BaseModel {
268
306
  can(givenAbilityName) {
269
307
  const abilityName = inflection.underscore(givenAbilityName);
270
308
  if (!(abilityName in this.abilities)) {
271
- throw new Error(`Ability ${abilityName} hasn't been loaded for ${digg(this.modelClassData(), "name")}`);
309
+ throw new Error(`Ability ${abilityName} hasn't been loaded for ${(0, diggerize_1.digg)(this.modelClassData(), "name")}`);
272
310
  }
273
311
  return this.abilities[abilityName];
274
312
  }
@@ -313,12 +351,12 @@ export default class BaseModel {
313
351
  }
314
352
  /** @returns {string} */
315
353
  localCacheKey() {
316
- const cacheKeyGenerator = new CacheKeyGenerator(this);
354
+ const cacheKeyGenerator = new cache_key_generator_1.default(this);
317
355
  return cacheKeyGenerator.local();
318
356
  }
319
357
  /** @returns {string} */
320
358
  fullCacheKey() {
321
- const cacheKeyGenerator = new CacheKeyGenerator(this);
359
+ const cacheKeyGenerator = new cache_key_generator_1.default(this);
322
360
  return cacheKeyGenerator.cacheKey();
323
361
  }
324
362
  /**
@@ -346,7 +384,7 @@ export default class BaseModel {
346
384
  dataToUse[paramKey] = modelData;
347
385
  let response;
348
386
  try {
349
- response = await CommandsPool.addCommand({
387
+ response = await commands_pool_js_1.default.addCommand({
350
388
  args: {
351
389
  save: dataToUse
352
390
  },
@@ -374,7 +412,7 @@ export default class BaseModel {
374
412
  const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
375
413
  let response;
376
414
  try {
377
- response = await CommandsPool.addCommand({
415
+ response = await commands_pool_js_1.default.addCommand({
378
416
  args: {
379
417
  save: objectData
380
418
  },
@@ -396,7 +434,7 @@ export default class BaseModel {
396
434
  }
397
435
  /** @returns {Promise<{model: BaseModel, response: object}>} */
398
436
  async destroy() {
399
- const response = await CommandsPool.addCommand({
437
+ const response = await commands_pool_js_1.default.addCommand({
400
438
  args: { query_params: this.collection && this.collection.params() },
401
439
  command: `${this.modelClassData().collectionName}-destroy`,
402
440
  collectionName: this.modelClassData().collectionName,
@@ -428,7 +466,7 @@ export default class BaseModel {
428
466
  const ransackParams = {};
429
467
  ransackParams[`${primaryKeyName}_eq`] = this.primaryKey();
430
468
  const abilitiesParams = {};
431
- abilitiesParams[digg(this.modelClassData(), "name")] = abilitiesToLoad;
469
+ abilitiesParams[(0, diggerize_1.digg)(this.modelClassData(), "name")] = abilitiesToLoad;
432
470
  const anotherModel = await this.modelClass()
433
471
  .ransack(ransackParams)
434
472
  .abilities(abilitiesParams)
@@ -450,7 +488,7 @@ export default class BaseModel {
450
488
  handleResponseError(response) {
451
489
  // @ts-expect-error
452
490
  BaseModel.parseValidationErrors({ model: this, response });
453
- throw new CustomError("Response wasn't successful", { model: this, response });
491
+ throw new custom_error_js_1.default("Response wasn't successful", { model: this, response });
454
492
  }
455
493
  /**
456
494
  * @returns {number | string}
@@ -489,13 +527,13 @@ export default class BaseModel {
489
527
  * @param {ParseValidationErrorsOptions} args.options
490
528
  */
491
529
  static parseValidationErrors({ error, model, options }) {
492
- if (!(error instanceof ValidationError))
530
+ if (!(error instanceof validation_error_js_1.default))
493
531
  return;
494
532
  if (!error.args.response.validation_errors)
495
533
  return;
496
- const validationErrors = new ValidationErrors({
534
+ const validationErrors = new validation_errors_js_1.ValidationErrors({
497
535
  model,
498
- validationErrors: digg(error, "args", "response", "validation_errors")
536
+ validationErrors: (0, diggerize_1.digg)(error, "args", "response", "validation_errors")
499
537
  });
500
538
  BaseModel.sendValidationErrorsEvent(validationErrors, options);
501
539
  if (!options || options.throwValidationError != false) {
@@ -503,9 +541,9 @@ export default class BaseModel {
503
541
  }
504
542
  }
505
543
  static humanAttributeName(attributeName) {
506
- const keyName = digg(this.modelClassData(), "i18nKey");
544
+ const keyName = (0, diggerize_1.digg)(this.modelClassData(), "i18nKey");
507
545
  // @ts-expect-error
508
- const i18n = Config.getI18n();
546
+ const i18n = config_js_1.default.getI18n();
509
547
  if (i18n)
510
548
  return i18n.t(`activerecord.attributes.${keyName}.${BaseModel.snakeCase(attributeName)}`, { defaultValue: attributeName });
511
549
  return inflection.humanize(attributeName);
@@ -516,9 +554,9 @@ export default class BaseModel {
516
554
  */
517
555
  isAttributeChanged(attributeName) {
518
556
  const attributeNameUnderscore = inflection.underscore(attributeName);
519
- const attributeData = this.modelClassData().attributes.find((attribute) => digg(attribute, "name") == attributeNameUnderscore);
557
+ const attributeData = this.modelClassData().attributes.find((attribute) => (0, diggerize_1.digg)(attribute, "name") == attributeNameUnderscore);
520
558
  if (!attributeData) {
521
- const attributeNames = this.modelClassData().attributes.map((attribute) => digg(attribute, "name"));
559
+ const attributeNames = this.modelClassData().attributes.map((attribute) => (0, diggerize_1.digg)(attribute, "name"));
522
560
  throw new Error(`Couldn't find an attribute by that name: "${attributeName}" in: ${attributeNames.join(", ")}`);
523
561
  }
524
562
  if (!(attributeNameUnderscore in this.changes))
@@ -604,7 +642,7 @@ export default class BaseModel {
604
642
  setNewModelData(model) {
605
643
  if (!("modelData" in model))
606
644
  throw new Error(`No modelData in model: ${JSON.stringify(model)}`);
607
- this.previousModelData = Object.assign({}, digg(this, "modelData"));
645
+ this.previousModelData = Object.assign({}, (0, diggerize_1.digg)(this, "modelData"));
608
646
  for (const attributeName in model.modelData) {
609
647
  this.modelData[attributeName] = model.modelData[attributeName];
610
648
  }
@@ -691,7 +729,7 @@ export default class BaseModel {
691
729
  dataToUse[paramKey] = modelData;
692
730
  let response;
693
731
  try {
694
- response = await CommandsPool.addCommand({
732
+ response = await commands_pool_js_1.default.addCommand({
695
733
  args: {
696
734
  query_params: this.collection && this.collection.params(),
697
735
  save: dataToUse
@@ -718,13 +756,13 @@ export default class BaseModel {
718
756
  }
719
757
  }
720
758
  _refreshModelFromResponse(response) {
721
- let newModel = digg(response, "model");
759
+ let newModel = (0, diggerize_1.digg)(response, "model");
722
760
  if (Array.isArray(newModel))
723
761
  newModel = newModel[0];
724
762
  this.setNewModel(newModel);
725
763
  }
726
764
  _refreshModelDataFromResponse(response) {
727
- let newModel = digg(response, "model");
765
+ let newModel = (0, diggerize_1.digg)(response, "model");
728
766
  if (Array.isArray(newModel))
729
767
  newModel = newModel[0];
730
768
  this.setNewModelData(newModel);
@@ -736,8 +774,8 @@ export default class BaseModel {
736
774
  */
737
775
  static _objectDataFromGivenRawData(rawData, options) {
738
776
  if (rawData instanceof FormData || rawData.nodeName == "FORM") {
739
- const formData = FormDataObjectizer.formDataFromObject(rawData, options);
740
- return FormDataObjectizer.toObject(formData);
777
+ const formData = form_data_objectizer_1.default.formDataFromObject(rawData, options);
778
+ return form_data_objectizer_1.default.toObject(formData);
741
779
  }
742
780
  return rawData;
743
781
  }
@@ -745,7 +783,7 @@ export default class BaseModel {
745
783
  const objectData = BaseModel._objectDataFromGivenRawData(rawData, options);
746
784
  let response;
747
785
  try {
748
- response = await CommandsPool.addCommand({
786
+ response = await commands_pool_js_1.default.addCommand({
749
787
  args: {
750
788
  query_params: this.collection && this.collection.params(),
751
789
  save: objectData,
@@ -775,7 +813,7 @@ export default class BaseModel {
775
813
  const paramKey = this.modelClassData().paramKey;
776
814
  const dataToUse = {};
777
815
  dataToUse[paramKey] = modelData;
778
- const response = await CommandsPool.addCommand({
816
+ const response = await commands_pool_js_1.default.addCommand({
779
817
  args: {
780
818
  save: dataToUse
781
819
  },
@@ -823,7 +861,7 @@ export default class BaseModel {
823
861
  static async _callCollectionCommand(args, commandArgs) {
824
862
  const formOrDataObject = args.args;
825
863
  try {
826
- return await CommandsPool.addCommand(args, commandArgs);
864
+ return await commands_pool_js_1.default.addCommand(args, commandArgs);
827
865
  }
828
866
  catch (error) {
829
867
  let form;
@@ -838,7 +876,7 @@ export default class BaseModel {
838
876
  throw error;
839
877
  }
840
878
  }
841
- _callMemberCommand = (args, commandArgs) => CommandsPool.addCommand(args, commandArgs);
879
+ _callMemberCommand = (args, commandArgs) => commands_pool_js_1.default.addCommand(args, commandArgs);
842
880
  static _postDataFromArgs(args) {
843
881
  let postData;
844
882
  if (args) {
@@ -846,7 +884,7 @@ export default class BaseModel {
846
884
  postData = args;
847
885
  }
848
886
  else {
849
- postData = objectToFormData.serialize(args, {}, null, "args");
887
+ postData = object_to_formdata_1.default.serialize(args, {}, null, "args");
850
888
  }
851
889
  }
852
890
  else {
@@ -875,12 +913,12 @@ export default class BaseModel {
875
913
  }
876
914
  else if (this.isNewRecord()) {
877
915
  // Return null if this is a new record and the attribute name is a recognized attribute
878
- const attributes = digg(this.modelClassData(), "attributes");
916
+ const attributes = (0, diggerize_1.digg)(this.modelClassData(), "attributes");
879
917
  if (attributeName in attributes)
880
918
  return null;
881
919
  }
882
920
  if (this.isPersisted()) {
883
- throw new AttributeNotLoadedError(`No such attribute: ${digg(this.modelClassData(), "name")}#${attributeName}: ${JSON.stringify(this.modelData)}`);
921
+ throw new attribute_not_loaded_error_1.default(`No such attribute: ${(0, diggerize_1.digg)(this.modelClassData(), "name")}#${attributeName}: ${JSON.stringify(this.modelData)}`);
884
922
  }
885
923
  }
886
924
  /**
@@ -911,7 +949,7 @@ export default class BaseModel {
911
949
  return this.relationshipsCache[args.reflectionName];
912
950
  }
913
951
  else {
914
- const collection = new Collection(args, queryArgs);
952
+ const collection = new collection_js_1.default(args, queryArgs);
915
953
  const model = await collection.first();
916
954
  this.relationshipsCache[args.reflectionName] = model;
917
955
  return model;
@@ -927,8 +965,8 @@ export default class BaseModel {
927
965
  if (this.isNewRecord())
928
966
  return null;
929
967
  const loadedRelationships = Object.keys(this.relationshipsCache);
930
- const modelClassName = digg(this.modelClassData(), "name");
931
- throw new NotLoadedError(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
968
+ const modelClassName = (0, diggerize_1.digg)(this.modelClassData(), "name");
969
+ throw new not_loaded_error_1.default(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
932
970
  }
933
971
  /**
934
972
  * @template {typeof import("./base-model.js").default} AssocMC
@@ -943,7 +981,7 @@ export default class BaseModel {
943
981
  else if (args.reflectionName in this.relationshipsCache) {
944
982
  return this.relationshipsCache[args.reflectionName];
945
983
  }
946
- const collection = new Collection(args, queryArgs);
984
+ const collection = new collection_js_1.default(args, queryArgs);
947
985
  const models = await collection.toArray();
948
986
  this.relationshipsCache[args.reflectionName] = models;
949
987
  return models;
@@ -962,7 +1000,7 @@ export default class BaseModel {
962
1000
  return this.relationshipsCache[args.reflectionName];
963
1001
  }
964
1002
  else {
965
- const collection = new Collection(args, queryArgs);
1003
+ const collection = new collection_js_1.default(args, queryArgs);
966
1004
  const model = await collection.first();
967
1005
  this.relationshipsCache[args.reflectionName] = model;
968
1006
  return model;
@@ -979,8 +1017,8 @@ export default class BaseModel {
979
1017
  return null;
980
1018
  }
981
1019
  const loadedRelationships = Object.keys(this.relationshipsCache);
982
- const modelClassName = digg(this.modelClassData(), "name");
983
- throw new NotLoadedError(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
1020
+ const modelClassName = (0, diggerize_1.digg)(this.modelClassData(), "name");
1021
+ throw new not_loaded_error_1.default(`${modelClassName}#${reflectionName} hasn't been loaded yet. Only these were loaded: ${loadedRelationships.join(", ")}`);
984
1022
  }
985
1023
  _readModelDataFromArgs(args) {
986
1024
  this.abilities = args.data.b || {};
@@ -992,21 +1030,21 @@ export default class BaseModel {
992
1030
  if (!this.preloadedRelationships) {
993
1031
  return;
994
1032
  }
995
- const relationships = digg(this.modelClassData(), "relationships");
1033
+ const relationships = (0, diggerize_1.digg)(this.modelClassData(), "relationships");
996
1034
  for (const relationshipName in this.preloadedRelationships) {
997
1035
  const relationshipData = this.preloadedRelationships[relationshipName];
998
- const relationshipClassData = relationships.find((relationship) => digg(relationship, "name") == relationshipName);
1036
+ const relationshipClassData = relationships.find((relationship) => (0, diggerize_1.digg)(relationship, "name") == relationshipName);
999
1037
  if (!relationshipClassData) {
1000
- const modelName = digg(this.modelClassData(), "name");
1038
+ const modelName = (0, diggerize_1.digg)(this.modelClassData(), "name");
1001
1039
  const relationshipsList = relationships.map((relationship) => relationship.name).join(", ");
1002
1040
  throw new Error(`Could not find the relation ${relationshipName} on the ${modelName} model: ${relationshipsList}`);
1003
1041
  }
1004
- const relationshipType = digg(relationshipClassData, "collectionName");
1042
+ const relationshipType = (0, diggerize_1.digg)(relationshipClassData, "collectionName");
1005
1043
  if (relationshipName in this.relationshipsCache) {
1006
1044
  throw new Error(`${relationshipName} has already been loaded`);
1007
1045
  }
1008
1046
  if (!relationshipClassData) {
1009
- throw new Error(`No relationship on ${digg(this.modelClassData(), "name")} by that name: ${relationshipName}`);
1047
+ throw new Error(`No relationship on ${(0, diggerize_1.digg)(this.modelClassData(), "name")} by that name: ${relationshipName}`);
1010
1048
  }
1011
1049
  if (!relationshipData) {
1012
1050
  this.relationshipsCache[relationshipName] = null;
@@ -1033,4 +1071,5 @@ export default class BaseModel {
1033
1071
  */
1034
1072
  primaryKey() { return this.readAttributeUnderscore(this.modelClass().primaryKey()); }
1035
1073
  }
1036
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiYmFzZS1tb2RlbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQTtBQUM5QyxPQUFPLHVCQUF1QixNQUFNLDhCQUE4QixDQUFBO0FBQ2xFLE9BQU8saUJBQWlCLE1BQU0sdUJBQXVCLENBQUE7QUFDckQsT0FBTyxVQUFVLE1BQU0saUJBQWlCLENBQUE7QUFDeEMsT0FBTyxZQUFZLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sV0FBVyxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxrQkFBa0IsTUFBTSxzQkFBc0IsQ0FBQTtBQUNyRCxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUE7QUFDcEMsT0FBTyxjQUFjLE1BQU0sb0JBQW9CLENBQUE7QUFDL0MsT0FBTyxnQkFBZ0IsTUFBTSxvQkFBb0IsQ0FBQTtBQUNqRCxPQUFPLFVBQVUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNoRCxPQUFPLEtBQUssTUFBTSxvQkFBb0IsQ0FBQTtBQUN0QyxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUE7QUFDcEMsT0FBTyxlQUFlLE1BQU0sdUJBQXVCLENBQUE7QUFDbkQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFFdkQ7Ozs7Ozs7O0dBUUc7QUFFSDs7OztHQUlHO0FBRUgsU0FBUyxrQkFBa0IsQ0FBQyxNQUFNO0lBQ2hDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQTtJQUVwQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FB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QUE7WUFDN0MsQ0FBQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUE7Z0JBQzlDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUE7Z0JBRXpDLEtBQUssTUFBTSxjQUFjLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztvQkFDOUMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsQ0FBQTtvQkFFbEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO29CQUNyRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNsRCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtnQkFFcEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLEdBQUcsS0FBSyxDQUFBO2dCQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsS0FBSyxDQUFBO1lBQzlDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBdHRyaWJ1dGUgZnJvbSBcIi4vYmFzZS1tb2RlbC9hdHRyaWJ1dGVcIlxuaW1wb3J0IEF0dHJpYnV0ZU5vdExvYWRlZEVycm9yIGZyb20gXCIuL2F0dHJpYnV0ZS1ub3QtbG9hZGVkLWVycm9yXCJcbmltcG9ydCBDYWNoZUtleUdlbmVyYXRvciBmcm9tIFwiLi9jYWNoZS1rZXktZ2VuZXJhdG9yXCJcbmltcG9ydCBDb2xsZWN0aW9uIGZyb20gXCIuL2NvbGxlY3Rpb24uanNcIlxuaW1wb3J0IENvbW1hbmRzUG9vbCBmcm9tIFwiLi9jb21tYW5kcy1wb29sLmpzXCJcbmltcG9ydCBDb25maWcgZnJvbSBcIi4vY29uZmlnLmpzXCJcbmltcG9ydCBDdXN0b21FcnJvciBmcm9tIFwiLi9jdXN0b20tZXJyb3IuanNcIlxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBGb3JtRGF0YU9iamVjdGl6ZXIgZnJvbSBcImZvcm0tZGF0YS1vYmplY3RpemVyXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IE1vZGVsTmFtZSBmcm9tIFwiLi9tb2RlbC1uYW1lXCJcbmltcG9ydCBOb3RMb2FkZWRFcnJvciBmcm9tIFwiLi9ub3QtbG9hZGVkLWVycm9yXCJcbmltcG9ydCBvYmplY3RUb0Zvcm1EYXRhIGZyb20gXCJvYmplY3QtdG8tZm9ybWRhdGFcIlxuaW1wb3J0IFJlZmxlY3Rpb24gZnJvbSBcIi4vYmFzZS1tb2RlbC9yZWZsZWN0aW9uXCJcbmltcG9ydCBTY29wZSBmcm9tIFwiLi9iYXNlLW1vZGVsL3Njb3BlXCJcbmltcG9ydCBTZXJ2aWNlcyBmcm9tIFwiLi9zZXJ2aWNlcy5qc1wiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gXCIuL3ZhbGlkYXRpb24tZXJyb3IuanNcIlxuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3JzfSBmcm9tIFwiLi92YWxpZGF0aW9uLWVycm9ycy5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTW9kZWxDbGFzc0RhdGFUeXBlXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vYmFzZS1tb2RlbC9hdHRyaWJ1dGUuanNcIikuQXR0cmlidXRlQXJnVHlwZVtdfSBhdHRyaWJ1dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29sbGVjdGlvbk5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFyYW1LZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcmltYXJ5S2V5XG4gKiBAcHJvcGVydHkge29iamVjdH0gcmFuc2Fja2FibGVfYXR0cmlidXRlc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc1xuICogQHByb3BlcnR5IHtvYmplY3R9IFtmb3JtXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdGhyb3dWYWxpZGF0aW9uRXJyb3JdXG4gKi9cblxuZnVuY3Rpb24gb2JqZWN0VG9VbmRlcnNjb3JlKG9iamVjdCkge1xuICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgIGNvbnN0IHVuZGVyc2NvcmVLZXkgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoa2V5KVxuXG4gICAgbmV3T2JqZWN0W3VuZGVyc2NvcmVLZXldID0gb2JqZWN0W2tleV1cbiAgfVxuXG4gIHJldHVybiBuZXdPYmplY3Rcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZU1vZGVsIHtcbiAgc3RhdGljIGFwaU1ha2VyVHlwZSA9IFwiQmFzZU1vZGVsXCJcblxuICAvKiogQHJldHVybnMge0F0dHJpYnV0ZVtdfSAqL1xuICBzdGF0aWMgYXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXNcbiAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVLZXkgaW4gYXR0cmlidXRlcykge1xuICAgICAgY29uc3QgYXR0cmlidXRlRGF0YSA9IGF0dHJpYnV0ZXNbYXR0cmlidXRlS2V5XVxuICAgICAgY29uc3QgYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZShhdHRyaWJ1dGVEYXRhKVxuXG4gICAgICByZXN1bHQucHVzaChhdHRyaWJ1dGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBzdGF0aWMgaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwiYXR0cmlidXRlc1wiKVxuICAgIGNvbnN0IGxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcblxuICAgIGlmIChsb3dlckNhc2VBdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJmYWNlXG4gICAqIEByZXR1cm5zIHtNb2RlbENsYXNzRGF0YVR5cGV9XG4gICAqL1xuICBzdGF0aWMgbW9kZWxDbGFzc0RhdGEoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibW9kZWxDbGFzc0RhdGEgc2hvdWxkIGJlIG92ZXJyaWRlbiBieSBjaGlsZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmFsaWRhdGlvbkVycm9yc30gdmFsaWRhdGlvbkVycm9yc1xuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBzdGF0aWMgbmV3Q3VzdG9tRXZlbnQgPSAodmFsaWRhdGlvbkVycm9ycykgPT4ge1xuICAgIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQoXCJ2YWxpZGF0aW9uLWVycm9yc1wiLCB7ZGV0YWlsOiB2YWxpZGF0aW9uRXJyb3JzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25FcnJvcnN9IHZhbGlkYXRpb25FcnJvcnNcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuZm9ybV1cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50aHJvd1ZhbGlkYXRpb25FcnJvcl1cbiAgICovXG4gIHN0YXRpYyBzZW5kVmFsaWRhdGlvbkVycm9yc0V2ZW50KHZhbGlkYXRpb25FcnJvcnMsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZvcm0pIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gQmFzZU1vZGVsLm5ld0N1c3RvbUV2ZW50KHZhbGlkYXRpb25FcnJvcnMpXG4gICAgICBvcHRpb25zLmZvcm0uZGlzcGF0Y2hFdmVudChldmVudClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgQmFzZU1vZGVsfSBUXG4gICAqIEB0aGlzIHtUfVxuICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gaWRcbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kKGlkKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIGNvbnN0IHF1ZXJ5ID0ge31cblxuICAgIHF1ZXJ5W2Ake3RoaXMucHJpbWFyeUtleSgpfV9lcWBdID0gaWRcblxuICAgIGNvbnN0IG1vZGVsID0gLyoqIEB0eXBlIHtJbnN0YW5jZVR5cGU8VD59ICovIChhd2FpdCB0aGlzLnJhbnNhY2socXVlcnkpLmZpcnN0KCkpXG5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIHJldHVybiBtb2RlbFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQ3VzdG9tRXJyb3IoXCJSZWNvcmQgbm90IGZvdW5kXCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEJhc2VNb2RlbH0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBmaW5kT3JDcmVhdGVCeUFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPFQ+Pn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBmaW5kT3JDcmVhdGVCeShmaW5kT3JDcmVhdGVCeUFyZ3MsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFNlcnZpY2VzLmN1cnJlbnQoKS5zZW5kUmVxdWVzdChcIk1vZGVsczo6RmluZE9yQ3JlYXRlQnlcIiwge1xuICAgICAgYWRkaXRpb25hbF9kYXRhOiBhcmdzLmFkZGl0aW9uYWxEYXRhLFxuICAgICAgZmluZF9vcl9jcmVhdGVfYnlfYXJnczogZmluZE9yQ3JlYXRlQnlBcmdzLFxuICAgICAgcmVzb3VyY2VfbmFtZTogZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKVxuICAgIH0pXG4gICAgY29uc3QgbW9kZWwgPSAvKiogQHR5cGUge0luc3RhbmNlVHlwZTxUPn0gKi8gKGRpZ2cocmVzdWx0LCBcIm1vZGVsXCIpKVxuXG4gICAgcmV0dXJuIG1vZGVsXG4gIH1cblxuICAvKiogQHJldHVybnMge01vZGVsTmFtZX0gKi9cbiAgc3RhdGljIG1vZGVsTmFtZSgpIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsTmFtZSh7bW9kZWxDbGFzc0RhdGE6IHRoaXMubW9kZWxDbGFzc0RhdGEoKX0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgc3RhdGljIHByaW1hcnlLZXkoKSB7XG4gICAgcmV0dXJuIGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInByaW1hcnlLZXlcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBCYXNlTW9kZWx9IE1DXG4gICAqIEB0aGlzIHtNQ31cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcXVlcnldXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdDxNQz59XG4gICAqL1xuICBzdGF0aWMgcmFuc2FjayhxdWVyeSA9IHt9KSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7TUN9ICovICh0aGlzKVxuXG4gICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uKHttb2RlbENsYXNzOiBNb2RlbENsYXNzfSwge3JhbnNhY2s6IHF1ZXJ5fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBCYXNlTW9kZWx9IE1DXG4gICAqIEB0aGlzIHtNQ31cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbc2VsZWN0XVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHQ8TUM+fVxuICAgKi9cbiAgc3RhdGljIHNlbGVjdChzZWxlY3QpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5zYWNrKCkuc2VsZWN0KHNlbGVjdClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVmbGVjdGlvbltdfSAqL1xuICBzdGF0aWMgcmFuc2Fja2FibGVBc3NvY2lhdGlvbnMoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJhbnNhY2thYmxlX2Fzc29jaWF0aW9uc1wiKVxuICAgIGNvbnN0IHJlZmxlY3Rpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwRGF0YSBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZWZsZWN0aW9ucy5wdXNoKG5ldyBSZWZsZWN0aW9uKHJlbGF0aW9uc2hpcERhdGEpKVxuICAgIH1cblxuICAgIHJldHVybiByZWZsZWN0aW9uc1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtBdHRyaWJ1dGVbXX0gKi9cbiAgc3RhdGljIHJhbnNhY2thYmxlQXR0cmlidXRlcygpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnJhbnNhY2thYmxlX2F0dHJpYnV0ZXNcbiAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVEYXRhIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIHJlc3VsdC5wdXNoKG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlRGF0YSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtTY29wZVtdfSAqL1xuICBzdGF0aWMgcmFuc2Fja2FibGVTY29wZXMoKSB7XG4gICAgY29uc3QgcmFuc2Fja2FibGVTY29wZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyYW5zYWNrYWJsZV9zY29wZXNcIilcbiAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBzY29wZURhdGEgb2YgcmFuc2Fja2FibGVTY29wZXMpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKHNjb3BlRGF0YSlcblxuICAgICAgcmVzdWx0LnB1c2goc2NvcGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWZsZWN0aW9uW119ICovXG4gIHN0YXRpYyByZWZsZWN0aW9ucygpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmVsYXRpb25zaGlwc1wiKVxuICAgIGNvbnN0IHJlZmxlY3Rpb25zID0gW11cblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwRGF0YSBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByZWZsZWN0aW9uID0gbmV3IFJlZmxlY3Rpb24ocmVsYXRpb25zaGlwRGF0YSlcblxuICAgICAgcmVmbGVjdGlvbnMucHVzaChyZWZsZWN0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiByZWZsZWN0aW9uc1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWZsZWN0aW9ufSAqL1xuICBzdGF0aWMgcmVmbGVjdGlvbihuYW1lKSB7XG4gICAgY29uc3QgZm91bmRSZWZsZWN0aW9uID0gdGhpcy5yZWZsZWN0aW9ucygpLmZpbmQoKHJlZmxlY3Rpb24pID0+IHJlZmxlY3Rpb24ubmFtZSgpID09IG5hbWUpXG5cbiAgICBpZiAoIWZvdW5kUmVmbGVjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIHJlZmxlY3Rpb246ICR7bmFtZX0gaW4gJHt0aGlzLnJlZmxlY3Rpb25zKCkubWFwKChyZWZsZWN0aW9uKSA9PiByZWZsZWN0aW9uLm5hbWUoKSkuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kUmVmbGVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgX3Rva2VuKCkge1xuICAgIGNvbnN0IGNzcmZUb2tlbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcblxuICAgIGlmIChjc3JmVG9rZW5FbGVtZW50KSB7XG4gICAgICByZXR1cm4gY3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoYXJncyA9IHt9KSB7XG4gICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB0aGlzLm5ld1JlY29yZCA9IGFyZ3MuaXNOZXdSZWNvcmRcbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSA9IHt9XG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzID0ge31cblxuICAgIGlmIChhcmdzICYmIGFyZ3MuZGF0YSAmJiBhcmdzLmRhdGEuYSkge1xuICAgICAgdGhpcy5fcmVhZE1vZGVsRGF0YUZyb21BcmdzKGFyZ3MpXG4gICAgfSBlbHNlIGlmIChhcmdzLmEpIHtcbiAgICAgIHRoaXMuYWJpbGl0aWVzID0gYXJncy5iIHx8IHt9XG4gICAgICB0aGlzLm1vZGVsRGF0YSA9IG9iamVjdFRvVW5kZXJzY29yZShhcmdzLmEpXG4gICAgfSBlbHNlIGlmIChhcmdzKSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IHt9XG4gICAgICB0aGlzLm1vZGVsRGF0YSA9IG9iamVjdFRvVW5kZXJzY29yZShhcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IHt9XG4gICAgICB0aGlzLm1vZGVsRGF0YSA9IHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbmV3QXR0cmlidXRlc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFzc2lnbkF0dHJpYnV0ZXMobmV3QXR0cmlidXRlcykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG5ld0F0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gbmV3QXR0cmlidXRlc1trZXldXG4gICAgICBjb25zdCBhdHRyaWJ1dGVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGtleSlcblxuICAgICAgbGV0IGFwcGx5Q2hhbmdlID0gdHJ1ZVxuICAgICAgbGV0IGRlbGV0ZUNoYW5nZSA9IGZhbHNlXG5cbiAgICAgIGlmICh0aGlzLmlzQXR0cmlidXRlTG9hZGVkKGtleSkpIHtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnJlYWRBdHRyaWJ1dGUoa2V5KVxuICAgICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gdGhpcy5tb2RlbERhdGFbYXR0cmlidXRlVW5kZXJzY29yZV1cblxuICAgICAgICBpZiAobmV3VmFsdWUgPT0gb2xkVmFsdWUpIHtcbiAgICAgICAgICBhcHBseUNoYW5nZSA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSBpZiAobmV3VmFsdWUgPT0gb3JpZ2luYWxWYWx1ZSkge1xuICAgICAgICAgIGFwcGx5Q2hhbmdlID0gZmFsc2VcbiAgICAgICAgICBkZWxldGVDaGFuZ2UgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFwcGx5Q2hhbmdlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVVbmRlcnNjb3JlXSA9IG5ld1ZhbHVlXG4gICAgICB9IGVsc2UgaWYgKGRlbGV0ZUNoYW5nZSkge1xuICAgICAgICBkZWxldGUgdGhpcy5jaGFuZ2VzW2F0dHJpYnV0ZVVuZGVyc2NvcmVdXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICBhdHRyaWJ1dGVzKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLm1vZGVsRGF0YSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLm1vZGVsRGF0YVtrZXldXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5jaGFuZ2VzKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHRoaXMuY2hhbmdlc1trZXldXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBnaXZlbkFiaWxpdHlOYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgY2FuKGdpdmVuQWJpbGl0eU5hbWUpIHtcbiAgICBjb25zdCBhYmlsaXR5TmFtZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShnaXZlbkFiaWxpdHlOYW1lKVxuXG4gICAgaWYgKCEoYWJpbGl0eU5hbWUgaW4gdGhpcy5hYmlsaXRpZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFiaWxpdHkgJHthYmlsaXR5TmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIGZvciAke2RpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIil9YClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hYmlsaXRpZXNbYWJpbGl0eU5hbWVdXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtCYXNlTW9kZWx9IFNlbGZcbiAgICogQHRoaXMge1NlbGZ9XG4gICAqIEByZXR1cm5zIHtTZWxmfVxuICAgKi9cbiAgY2xvbmUoKSB7XG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7bmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gU2VsZn0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gICAgY29uc3QgY2xvbmUgPSBuZXcgTW9kZWxDbGFzcygpXG5cbiAgICBjbG9uZS5hYmlsaXRpZXMgPSB7Li4udGhpcy5hYmlsaXRpZXN9XG4gICAgY2xvbmUubW9kZWxEYXRhID0gey4uLnRoaXMubW9kZWxEYXRhfVxuICAgIGNsb25lLnJlbGF0aW9uc2hpcHMgPSB7Li4udGhpcy5yZWxhdGlvbnNoaXBzfVxuICAgIGNsb25lLnJlbGF0aW9uc2hpcHNDYWNoZSA9IHsuLi50aGlzLnJlbGF0aW9uc2hpcHNDYWNoZX1cblxuICAgIHJldHVybiBjbG9uZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXIgfCBzdHJpbmd9ICovXG4gIGNhY2hlS2V5KCkge1xuICAgIGlmICh0aGlzLmlzUGVyc2lzdGVkKCkpIHtcbiAgICAgIGNvbnN0IGtleVBhcnRzID0gW1xuICAgICAgICB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXksXG4gICAgICAgIHRoaXMucHJpbWFyeUtleSgpXG4gICAgICBdXG5cbiAgICAgIGlmIChcInVwZGF0ZWRfYXRcIiBpbiB0aGlzLm1vZGVsRGF0YSkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRBdCA9IHRoaXMudXBkYXRlZEF0KClcblxuICAgICAgICBpZiAodHlwZW9mIHVwZGF0ZWRBdCAhPSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVkQXQgd2Fzbid0IGFuIG9iamVjdDogJHt0eXBlb2YgdXBkYXRlZEF0fWApXG4gICAgICAgIH0gZWxzZSBpZiAoIShcImdldFRpbWVcIiBpbiB1cGRhdGVkQXQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1cGRhdGVkQXQgZGlkbid0IHN1cHBvcnQgZ2V0VGltZSB3aXRoIGNsYXNzOiAke3VwZGF0ZWRBdC5jb25zdHJ1Y3RvciAmJiB1cGRhdGVkQXQuY29uc3RydWN0b3IubmFtZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBrZXlQYXJ0cy5wdXNoKGB1cGRhdGVkQXQtJHt0aGlzLnVwZGF0ZWRBdCgpLmdldFRpbWUoKX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5UGFydHMuam9pbihcIi1cIilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudW5pcXVlS2V5KClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgbG9jYWxDYWNoZUtleSgpIHtcbiAgICBjb25zdCBjYWNoZUtleUdlbmVyYXRvciA9IG5ldyBDYWNoZUtleUdlbmVyYXRvcih0aGlzKVxuXG4gICAgcmV0dXJuIGNhY2hlS2V5R2VuZXJhdG9yLmxvY2FsKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBmdWxsQ2FjaGVLZXkoKSB7XG4gICAgY29uc3QgY2FjaGVLZXlHZW5lcmF0b3IgPSBuZXcgQ2FjaGVLZXlHZW5lcmF0b3IodGhpcylcblxuICAgIHJldHVybiBjYWNoZUtleUdlbmVyYXRvci5jYWNoZUtleSgpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgQmFzZU1vZGVsfSBNQ1xuICAgKiBAdGhpcyB7TUN9XG4gICAqIEByZXR1cm5zIHtDb2xsZWN0aW9uPE1DPn1cbiAgICovXG4gIHN0YXRpYyBhbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuc2FjaygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXR0cmlidXRlc11cbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7XG4gICAqICAgbW9kZWw6IEJhc2VNb2RlbCxcbiAgICogICByZXNwb25zZTogb2JqZWN0XG4gICAqIH0+fVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgICBpZiAoYXR0cmlidXRlcykgdGhpcy5hc3NpZ25BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpXG4gICAgY29uc3QgcGFyYW1LZXkgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXlcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmdldEF0dHJpYnV0ZXMoKVxuICAgIGNvbnN0IGRhdGFUb1VzZSA9IHt9XG4gICAgZGF0YVRvVXNlW3BhcmFtS2V5XSA9IG1vZGVsRGF0YVxuICAgIGxldCByZXNwb25zZVxuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICAgIHtcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBzYXZlOiBkYXRhVG9Vc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxGcm9tUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgIH1cblxuICAgIHJldHVybiB7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGEgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSByYXdEYXRhXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVJhdyhyYXdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBvYmplY3REYXRhID0gQmFzZU1vZGVsLl9vYmplY3REYXRhRnJvbUdpdmVuUmF3RGF0YShyYXdEYXRhLCBvcHRpb25zKVxuXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tY3JlYXRlYCxcbiAgICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICAgIHR5cGU6IFwiY3JlYXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgIClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsOiB0aGlzLCBvcHRpb25zfSlcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoTW9kZWxEYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx7bW9kZWw6IEJhc2VNb2RlbCwgcmVzcG9uc2U6IG9iamVjdH0+fSAqL1xuICBhc3luYyBkZXN0cm95KCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICB7XG4gICAgICAgIGFyZ3M6IHtxdWVyeV9wYXJhbXM6IHRoaXMuY29sbGVjdGlvbiAmJiB0aGlzLmNvbGxlY3Rpb24ucGFyYW1zKCl9LFxuICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LWRlc3Ryb3lgLFxuICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgdHlwZTogXCJkZXN0cm95XCJcbiAgICAgIH0sXG4gICAgICB7fVxuICAgIClcblxuICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICBpZiAocmVzcG9uc2UubW9kZWwpIHtcbiAgICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHttb2RlbDogdGhpcywgcmVzcG9uc2V9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBlbnN1cmVBYmlsaXRpZXMobGlzdE9mQWJpbGl0aWVzKSB7XG4gICAgLy8gUG9wdWxhdGUgYW4gYXJyYXkgd2l0aCBhIGxpc3Qgb2YgYWJpbGl0aWVzIGN1cnJlbnRseSBub3QgbG9hZGVkXG4gICAgY29uc3QgYWJpbGl0aWVzVG9Mb2FkID0gW11cblxuICAgIGZvciAoY29uc3QgYWJpbGl0eUluTGlzdCBvZiBsaXN0T2ZBYmlsaXRpZXMpIHtcbiAgICAgIGlmICghKGFiaWxpdHlJbkxpc3QgaW4gdGhpcy5hYmlsaXRpZXMpKSB7XG4gICAgICAgIGFiaWxpdGllc1RvTG9hZC5wdXNoKGFiaWxpdHlJbkxpc3QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9hZCB0aGUgbWlzc2luZyBhYmlsaXRpZXMgaWYgYW55XG4gICAgaWYgKGFiaWxpdGllc1RvTG9hZC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwcmltYXJ5S2V5TmFtZSA9IHRoaXMubW9kZWxDbGFzcygpLnByaW1hcnlLZXkoKVxuICAgICAgY29uc3QgcmFuc2Fja1BhcmFtcyA9IHt9XG4gICAgICByYW5zYWNrUGFyYW1zW2Ake3ByaW1hcnlLZXlOYW1lfV9lcWBdID0gdGhpcy5wcmltYXJ5S2V5KClcblxuICAgICAgY29uc3QgYWJpbGl0aWVzUGFyYW1zID0ge31cbiAgICAgIGFiaWxpdGllc1BhcmFtc1tkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXSA9IGFiaWxpdGllc1RvTG9hZFxuXG4gICAgICBjb25zdCBhbm90aGVyTW9kZWwgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MoKVxuICAgICAgICAucmFuc2FjayhyYW5zYWNrUGFyYW1zKVxuICAgICAgICAuYWJpbGl0aWVzKGFiaWxpdGllc1BhcmFtcylcbiAgICAgICAgLmZpcnN0KClcblxuICAgICAgaWYgKCFhbm90aGVyTW9kZWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9vayB1cCB0aGUgc2FtZSBtb2RlbCAke3RoaXMucHJpbWFyeUtleSgpfSB3aXRoIGFiaWxpdGllczogJHthYmlsaXRpZXNUb0xvYWQuam9pbihcIiwgXCIpfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld0FiaWxpdGllcyA9IGFub3RoZXJNb2RlbC5hYmlsaXRpZXNcbiAgICAgIGZvciAoY29uc3QgbmV3QWJpbGl0eSBpbiBuZXdBYmlsaXRpZXMpIHtcbiAgICAgICAgdGhpcy5hYmlsaXRpZXNbbmV3QWJpbGl0eV0gPSBuZXdBYmlsaXRpZXNbbmV3QWJpbGl0eV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59XG4gICAqL1xuICBnZXRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLm1vZGVsRGF0YSwgdGhpcy5jaGFuZ2VzKSB9XG5hc2RcbiAgaGFuZGxlUmVzcG9uc2VFcnJvcihyZXNwb25zZSkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHttb2RlbDogdGhpcywgcmVzcG9uc2V9KVxuICAgIHRocm93IG5ldyBDdXN0b21FcnJvcihcIlJlc3BvbnNlIHdhc24ndCBzdWNjZXNzZnVsXCIsIHttb2RlbDogdGhpcywgcmVzcG9uc2V9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCBzdHJpbmd9XG4gICAqL1xuICBpZGVudGlmaWVyS2V5KCkge1xuICAgIGlmICghdGhpcy5faWRlbnRpZmllcktleSkgdGhpcy5faWRlbnRpZmllcktleSA9IHRoaXMuaXNQZXJzaXN0ZWQoKSA/IHRoaXMucHJpbWFyeUtleSgpIDogdGhpcy51bmlxdWVLZXkoKVxuXG4gICAgcmV0dXJuIHRoaXMuX2lkZW50aWZpZXJLZXlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXNzb2NpYXRpb25Mb2FkZWQoYXNzb2NpYXRpb25OYW1lKSB7IHJldHVybiB0aGlzLmlzQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlKGluZmxlY3Rpb24udW5kZXJzY29yZShhc3NvY2lhdGlvbk5hbWUpKSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBc3NvY2lhdGlvbkxvYWRlZFVuZGVyc2NvcmUgKGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmUpIHtcbiAgICBpZiAoYXNzb2NpYXRpb25OYW1lVW5kZXJzY29yZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXNzb2NpYXRpb25QcmVzZW50KGFzc29jaWF0aW9uTmFtZSkge1xuICAgIGlmICh0aGlzLmlzQXNzb2NpYXRpb25Mb2FkZWQoYXNzb2NpYXRpb25OYW1lKSkgcmV0dXJuIHRydWVcbiAgICBpZiAoYXNzb2NpYXRpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge2FueX0gYXJncy5lcnJvclxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbH0gW2FyZ3MubW9kZWxdXG4gICAqIEBwYXJhbSB7UGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc30gYXJncy5vcHRpb25zXG4gICAqL1xuICBzdGF0aWMgcGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWwsIG9wdGlvbnN9KSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSByZXR1cm5cbiAgICBpZiAoIWVycm9yLmFyZ3MucmVzcG9uc2UudmFsaWRhdGlvbl9lcnJvcnMpIHJldHVyblxuXG4gICAgY29uc3QgdmFsaWRhdGlvbkVycm9ycyA9IG5ldyBWYWxpZGF0aW9uRXJyb3JzKHtcbiAgICAgIG1vZGVsLFxuICAgICAgdmFsaWRhdGlvbkVycm9yczogZGlnZyhlcnJvciwgXCJhcmdzXCIsIFwicmVzcG9uc2VcIiwgXCJ2YWxpZGF0aW9uX2Vycm9yc1wiKVxuICAgIH0pXG5cbiAgICBCYXNlTW9kZWwuc2VuZFZhbGlkYXRpb25FcnJvcnNFdmVudCh2YWxpZGF0aW9uRXJyb3JzLCBvcHRpb25zKVxuXG4gICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudGhyb3dWYWxpZGF0aW9uRXJyb3IgIT0gZmFsc2UpIHtcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGh1bWFuQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3Qga2V5TmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcImkxOG5LZXlcIilcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBjb25zdCBpMThuID0gQ29uZmlnLmdldEkxOG4oKVxuXG4gICAgaWYgKGkxOG4pIHJldHVybiBpMThuLnQoYGFjdGl2ZXJlY29yZC5hdHRyaWJ1dGVzLiR7a2V5TmFtZX0uJHtCYXNlTW9kZWwuc25ha2VDYXNlKGF0dHJpYnV0ZU5hbWUpfWAsIHtkZWZhdWx0VmFsdWU6IGF0dHJpYnV0ZU5hbWV9KVxuXG4gICAgcmV0dXJuIGluZmxlY3Rpb24uaHVtYW5pemUoYXR0cmlidXRlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXR0cmlidXRlQ2hhbmdlZChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBhdHRyaWJ1dGVEYXRhID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBkaWdnKGF0dHJpYnV0ZSwgXCJuYW1lXCIpID09IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlKVxuXG4gICAgaWYgKCFhdHRyaWJ1dGVEYXRhKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBkaWdnKGF0dHJpYnV0ZSwgXCJuYW1lXCIpKVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZTogXCIke2F0dHJpYnV0ZU5hbWV9XCIgaW46ICR7YXR0cmlidXRlTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKCEoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5jaGFuZ2VzKSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kID0gdGhpc1tgX2lzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZURhdGEudHlwZSwgdHJ1ZSl9Q2hhbmdlZGBdXG5cbiAgICBpZiAoIWNoYW5nZWRNZXRob2QpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERvbid0IGtub3cgaG93IHRvIGhhbmRsZSB0eXBlOiAke2F0dHJpYnV0ZURhdGEudHlwZX1gKVxuXG4gICAgcmV0dXJuIGNoYW5nZWRNZXRob2Qob2xkVmFsdWUsIG5ld1ZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNDaGFuZ2VkKCkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpXG5cbiAgICBpZiAoa2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc05ld1JlY29yZCgpIHtcbiAgICBpZiAodGhpcy5uZXdSZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMubmV3UmVjb3JkXG4gICAgfSBlbHNlIGlmIChcImlkXCIgaW4gdGhpcy5tb2RlbERhdGEgJiYgdGhpcy5tb2RlbERhdGEuaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzUGVyc2lzdGVkKCkgeyByZXR1cm4gIXRoaXMuaXNOZXdSZWNvcmQoKSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBzbmFrZUNhc2Uoc3RyaW5nKSB7IHJldHVybiBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoc3RyaW5nKSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2F2ZWRDaGFuZ2VUb0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgaWYgKCF0aGlzLnByZXZpb3VzTW9kZWxEYXRhKVxuICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuYXR0cmlidXRlcy5maW5kKChhdHRyaWJ1dGUpID0+IGF0dHJpYnV0ZS5uYW1lID09IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlKVxuXG4gICAgaWYgKCFhdHRyaWJ1dGVEYXRhKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVOYW1lcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lOiBcIiR7YXR0cmlidXRlTmFtZX1cIiBpbjogJHthdHRyaWJ1dGVOYW1lcy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAoIShhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSBpbiB0aGlzLnByZXZpb3VzTW9kZWxEYXRhKSlcbiAgICAgIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMucHJldmlvdXNNb2RlbERhdGFbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lVW5kZXJzY29yZV1cbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kTmFtZSA9IGBfaXMke2luZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlRGF0YS50eXBlKX1DaGFuZ2VkYFxuICAgIGNvbnN0IGNoYW5nZWRNZXRob2QgPSB0aGlzW2NoYW5nZWRNZXRob2ROYW1lXVxuXG4gICAgaWYgKCFjaGFuZ2VkTWV0aG9kKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdHlwZTogJHthdHRyaWJ1dGVEYXRhLnR5cGV9YClcblxuICAgIHJldHVybiBjaGFuZ2VkTWV0aG9kKG9sZFZhbHVlLCBuZXdWYWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Jhc2VNb2RlbH0gbW9kZWxcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXROZXdNb2RlbChtb2RlbCkge1xuICAgIHRoaXMuc2V0TmV3TW9kZWxEYXRhKG1vZGVsKVxuXG4gICAgZm9yKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gbW9kZWwucmVsYXRpb25zaGlwcykge1xuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWwucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuICAgIH1cblxuICAgIGZvcihjb25zdCByZWxhdGlvbnNoaXBDYWNoZU5hbWUgaW4gbW9kZWwucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBDYWNoZU5hbWVdID0gbW9kZWwucmVsYXRpb25zaGlwc0NhY2hlW25hbWVdXG4gICAgfVxuICB9XG5cbiAgc2V0TmV3TW9kZWxEYXRhKG1vZGVsKSB7XG4gICAgaWYgKCEoXCJtb2RlbERhdGFcIiBpbiBtb2RlbCkpIHRocm93IG5ldyBFcnJvcihgTm8gbW9kZWxEYXRhIGluIG1vZGVsOiAke0pTT04uc3RyaW5naWZ5KG1vZGVsKX1gKVxuXG4gICAgdGhpcy5wcmV2aW91c01vZGVsRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRpZ2codGhpcywgXCJtb2RlbERhdGFcIikpXG5cbiAgICBmb3IoY29uc3QgYXR0cmlidXRlTmFtZSBpbiBtb2RlbC5tb2RlbERhdGEpIHtcbiAgICAgIHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdID0gbW9kZWwubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdXG4gICAgfVxuICB9XG5cbiAgX2lzRGF0ZUNoYW5nZWQob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgaWYgKERhdGUucGFyc2Uob2xkVmFsdWUpICE9IERhdGUucGFyc2UobmV3VmFsdWUpKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIF9pc0ludGVnZXJDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgIGlmIChwYXJzZUludChvbGRWYWx1ZSwgMTApICE9IHBhcnNlSW50KG5ld1ZhbHVlLCAxMCkpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX2lzU3RyaW5nQ2hhbmdlZCAob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gICAgY29uc3Qgb2xkQ29udmVydGVkVmFsdWUgPSBgJHtvbGRWYWx1ZX1gXG4gICAgY29uc3QgbmV3Q29udmVydGVkVmFsdWUgPSBgJHtuZXdWYWx1ZX1gXG5cbiAgICBpZiAob2xkQ29udmVydGVkVmFsdWUgIT0gbmV3Q29udmVydGVkVmFsdWUpXG4gICAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtNb2RlbENsYXNzRGF0YVR5cGV9ICovXG4gIG1vZGVsQ2xhc3NEYXRhKCkgeyByZXR1cm4gdGhpcy5tb2RlbENsYXNzKCkubW9kZWxDbGFzc0RhdGEoKSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVsb2FkKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuY29sbGVjdGlvbiAmJiB0aGlzLmNvbGxlY3Rpb24ucGFyYW1zKClcbiAgICBjb25zdCByYW5zYWNrUGFyYW1zID0ge31cbiAgICByYW5zYWNrUGFyYW1zW2Ake3RoaXMubW9kZWxDbGFzcygpLnByaW1hcnlLZXkoKX1fZXFgXSA9IHRoaXMucHJpbWFyeUtleSgpXG5cbiAgICBsZXQgcXVlcnkgPSB0aGlzLm1vZGVsQ2xhc3MoKS5yYW5zYWNrKHJhbnNhY2tQYXJhbXMpXG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBpZiAocGFyYW1zLnByZWxvYWQpIHtcbiAgICAgICAgcXVlcnkucXVlcnlBcmdzLnByZWxvYWQgPSBwYXJhbXMucHJlbG9hZFxuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNlbGVjdCkge1xuICAgICAgICBxdWVyeS5xdWVyeUFyZ3Muc2VsZWN0ID0gcGFyYW1zLnNlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnNlbGVjdF9jb2x1bW5zKSB7XG4gICAgICAgIHF1ZXJ5LnF1ZXJ5QXJncy5zZWxlY3RDb2x1bW5zID0gcGFyYW1zLnNlbGVjdF9jb2x1bW5zXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWwgPSBhd2FpdCBxdWVyeS5maXJzdCgpXG4gICAgdGhpcy5zZXROZXdNb2RlbChtb2RlbClcbiAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHttb2RlbDogQmFzZU1vZGVsLCByZXNwb25zZT86IG9iamVjdH0+fVxuICAgKi9cbiAgc2F2ZSgpIHtcbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGUoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7bW9kZWw6IEJhc2VNb2RlbCwgcmVzcG9uc2U6IG9iamVjdH0+fVxuICAgKi9cbiAgc2F2ZVJhdyhyYXdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVSYXcocmF3RGF0YSwgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW25ld0F0dHJpYnV0ZXNdXG4gICAqIEBwYXJhbSB7UGFyc2VWYWxpZGF0aW9uRXJyb3JzT3B0aW9uc30gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtcbiAgICogICBtb2RlbDogQmFzZU1vZGVsLFxuICAgKiAgIHJlc3BvbnNlPzogb2JqZWN0XG4gICAqIH0+fVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKG5ld0F0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgICBpZiAobmV3QXR0cmlidXRlcykge1xuICAgICAgdGhpcy5hc3NpZ25BdHRyaWJ1dGVzKG5ld0F0dHJpYnV0ZXMpXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY2hhbmdlcykubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiB7bW9kZWw6IHRoaXN9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1LZXkgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXlcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmNoYW5nZXNcbiAgICBjb25zdCBkYXRhVG9Vc2UgPSB7fVxuICAgIGRhdGFUb1VzZVtwYXJhbUtleV0gPSBtb2RlbERhdGFcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgcXVlcnlfcGFyYW1zOiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpLFxuICAgICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LXVwZGF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICBpZiAocmVzcG9uc2UubW9kZWwpIHtcbiAgICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgICB0aGlzLmNoYW5nZXMgPSB7fVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge3Jlc3BvbnNlLCBtb2RlbDogdGhpc31cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZUVycm9yKHJlc3BvbnNlKVxuICAgIH1cbiAgfVxuXG4gIF9yZWZyZXNoTW9kZWxGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBsZXQgbmV3TW9kZWwgPSBkaWdnKHJlc3BvbnNlLCBcIm1vZGVsXCIpXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdNb2RlbCkpIG5ld01vZGVsID0gbmV3TW9kZWxbMF1cblxuICAgIHRoaXMuc2V0TmV3TW9kZWwobmV3TW9kZWwpXG4gIH1cblxuICBfcmVmcmVzaE1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSkge1xuICAgIGxldCBuZXdNb2RlbCA9IGRpZ2cocmVzcG9uc2UsIFwibW9kZWxcIilcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG5ld01vZGVsKSkgbmV3TW9kZWwgPSBuZXdNb2RlbFswXVxuXG4gICAgdGhpcy5zZXROZXdNb2RlbERhdGEobmV3TW9kZWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YSB8IFJlY29yZDxzdHJpbmcsIGFueT59IHJhd0RhdGFcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGFueT59XG4gICAqL1xuICBzdGF0aWMgX29iamVjdERhdGFGcm9tR2l2ZW5SYXdEYXRhKHJhd0RhdGEsIG9wdGlvbnMpIHtcbiAgICBpZiAocmF3RGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhIHx8IHJhd0RhdGEubm9kZU5hbWUgPT0gXCJGT1JNXCIpIHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gRm9ybURhdGFPYmplY3RpemVyLmZvcm1EYXRhRnJvbU9iamVjdChyYXdEYXRhLCBvcHRpb25zKVxuXG4gICAgICByZXR1cm4gRm9ybURhdGFPYmplY3RpemVyLnRvT2JqZWN0KGZvcm1EYXRhKVxuICAgIH1cblxuICAgIHJldHVybiByYXdEYXRhXG4gIH1cblxuICBhc3luYyB1cGRhdGVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgb2JqZWN0RGF0YSA9IEJhc2VNb2RlbC5fb2JqZWN0RGF0YUZyb21HaXZlblJhd0RhdGEocmF3RGF0YSwgb3B0aW9ucylcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgcXVlcnlfcGFyYW1zOiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpLFxuICAgICAgICAgICAgc2F2ZTogb2JqZWN0RGF0YSxcbiAgICAgICAgICAgIHNpbXBsZV9tb2RlbF9lcnJvcnM6IG9wdGlvbnM/LnNpbXBsZU1vZGVsRXJyb3JzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LXVwZGF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcInVwZGF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge3Jlc3BvbnNlLCBtb2RlbDogdGhpc31cbiAgfVxuXG4gIGlzVmFsaWQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkIHlldFwiKVxuICB9XG5cbiAgYXN5bmMgaXNWYWxpZE9uU2VydmVyKCkge1xuICAgIGNvbnN0IG1vZGVsRGF0YSA9IHRoaXMuZ2V0QXR0cmlidXRlcygpXG4gICAgY29uc3QgcGFyYW1LZXkgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkucGFyYW1LZXlcbiAgICBjb25zdCBkYXRhVG9Vc2UgPSB7fVxuICAgIGRhdGFUb1VzZVtwYXJhbUtleV0gPSBtb2RlbERhdGFcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICB7XG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICBzYXZlOiBkYXRhVG9Vc2VcbiAgICAgICAgfSxcbiAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS12YWxpZGAsXG4gICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgIHByaW1hcnlLZXk6IHRoaXMucHJpbWFyeUtleSgpLFxuICAgICAgICB0eXBlOiBcInZhbGlkXCJcbiAgICAgIH0sXG4gICAgICB7fVxuICAgIClcblxuICAgIHJldHVybiB7dmFsaWQ6IHJlc3BvbnNlLnZhbGlkLCBlcnJvcnM6IHJlc3BvbnNlLmVycm9yc31cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0Jhc2VNb2RlbH0gU2VsZlxuICAgKiBAdGhpcyB7U2VsZn1cbiAgICogQHJldHVybnMge3R5cGVvZiBCYXNlTW9kZWwgJiAobmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gU2VsZil9XG4gICAqL1xuICBtb2RlbENsYXNzKCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKHRoaXMuY29uc3RydWN0b3IpXG4gIH1cblxuICBwcmVsb2FkUmVsYXRpb25zaGlwKHJlbGF0aW9uc2hpcE5hbWUsIG1vZGVsKSB7XG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbQmFzZU1vZGVsLnNuYWtlQ2FzZShyZWxhdGlvbnNoaXBOYW1lKV0gPSBtb2RlbFxuICAgIHRoaXMucmVsYXRpb25zaGlwc1tCYXNlTW9kZWwuc25ha2VDYXNlKHJlbGF0aW9uc2hpcE5hbWUpXSA9IG1vZGVsXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBtYXJrRm9yRGVzdHJ1Y3Rpb24oKSB7XG4gICAgdGhpcy5fbWFya2VkRm9yRGVzdHJ1Y3Rpb24gPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBtYXJrZWRGb3JEZXN0cnVjdGlvbigpIHsgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRlc3RydWN0aW9uIHx8IGZhbHNlIH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIHVuaXF1ZUtleSgpIHtcbiAgICBpZiAoIXRoaXMudW5pcXVlS2V5VmFsdWUpIHtcbiAgICAgIGNvbnN0IG1pbiA9IDUwMDAwMDAwMDAwMDAwMDBcbiAgICAgIGNvbnN0IG1heCA9IDkwMDcxOTkyNTQ3NDA5OTFcbiAgICAgIGNvbnN0IHJhbmRvbUJldHdlZW4gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkgKyBtaW4pXG4gICAgICB0aGlzLnVuaXF1ZUtleVZhbHVlID0gcmFuZG9tQmV0d2VlblxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVuaXF1ZUtleVZhbHVlXG4gIH1cblxuICBzdGF0aWMgYXN5bmMgX2NhbGxDb2xsZWN0aW9uQ29tbWFuZChhcmdzLCBjb21tYW5kQXJncykge1xuICAgIGNvbnN0IGZvcm1PckRhdGFPYmplY3QgPSBhcmdzLmFyZ3NcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxldCBmb3JtXG5cbiAgICAgIGlmIChjb21tYW5kQXJncy5mb3JtKSB7XG4gICAgICAgIGZvcm0gPSBjb21tYW5kQXJncy5mb3JtXG4gICAgICB9IGVsc2UgaWYgKGZvcm1PckRhdGFPYmplY3Q/Lm5vZGVOYW1lID09IFwiRk9STVwiKSB7XG4gICAgICAgIGZvcm0gPSBmb3JtT3JEYXRhT2JqZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtKSBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgb3B0aW9uczoge2Zvcm19fSlcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBfY2FsbE1lbWJlckNvbW1hbmQgPSAoYXJncywgY29tbWFuZEFyZ3MpID0+IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKGFyZ3MsIGNvbW1hbmRBcmdzKVxuXG4gIHN0YXRpYyBfcG9zdERhdGFGcm9tQXJncyhhcmdzKSB7XG4gICAgbGV0IHBvc3REYXRhXG5cbiAgICBpZiAoYXJncykge1xuICAgICAgaWYgKGFyZ3MgaW5zdGFuY2VvZiBGb3JtRGF0YSkge1xuICAgICAgICBwb3N0RGF0YSA9IGFyZ3NcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvc3REYXRhID0gb2JqZWN0VG9Gb3JtRGF0YS5zZXJpYWxpemUoYXJncywge30sIG51bGwsIFwiYXJnc1wiKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwb3N0RGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3REYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHJlYWRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICByZXR1cm4gdGhpcy5yZWFkQXR0cmlidXRlVW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgcmVhZEF0dHJpYnV0ZVVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSkge1xuICAgIGlmIChhdHRyaWJ1dGVOYW1lIGluIHRoaXMuY2hhbmdlcykge1xuICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVOYW1lXVxuICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZSBpbiB0aGlzLm1vZGVsRGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVdXG4gICAgfSBlbHNlIGlmICh0aGlzLmlzTmV3UmVjb3JkKCkpIHtcbiAgICAgIC8vIFJldHVybiBudWxsIGlmIHRoaXMgaXMgYSBuZXcgcmVjb3JkIGFuZCB0aGUgYXR0cmlidXRlIG5hbWUgaXMgYSByZWNvZ25pemVkIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcImF0dHJpYnV0ZXNcIilcblxuICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gYXR0cmlidXRlcykgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1BlcnNpc3RlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgQXR0cmlidXRlTm90TG9hZGVkRXJyb3IoYE5vIHN1Y2ggYXR0cmlidXRlOiAke2RpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIil9IyR7YXR0cmlidXRlTmFtZX06ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbERhdGEpfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNBdHRyaWJ1dGVMb2FkZWQoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICBpZiAoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5jaGFuZ2VzKSByZXR1cm4gdHJ1ZVxuICAgIGlmIChhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSBpbiB0aGlzLm1vZGVsRGF0YSkgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIF9pc1ByZXNlbnQodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiICYmIHZhbHVlLm1hdGNoKC9eXFxzKiQvKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGFzeW5jIF9sb2FkQmVsb25nc1RvUmVmbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MgPSB7fSkge1xuICAgIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1thcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MpXG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IGNvbGxlY3Rpb24uZmlyc3QoKVxuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV0gPSBtb2RlbFxuICAgICAgcmV0dXJuIG1vZGVsXG4gICAgfVxuICB9XG5cbiAgX3JlYWRCZWxvbmdzVG9SZWZsZWN0aW9uKHtyZWZsZWN0aW9uTmFtZX0pIHtcbiAgICBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW3JlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWZsZWN0aW9uTmFtZV1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgbG9hZGVkUmVsYXRpb25zaGlwcyA9IE9iamVjdC5rZXlzKHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKVxuICAgIGNvbnN0IG1vZGVsQ2xhc3NOYW1lID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKVxuXG4gICAgdGhyb3cgbmV3IE5vdExvYWRlZEVycm9yKGAke21vZGVsQ2xhc3NOYW1lfSMke3JlZmxlY3Rpb25OYW1lfSBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0LiBPbmx5IHRoZXNlIHdlcmUgbG9hZGVkOiAke2xvYWRlZFJlbGF0aW9uc2hpcHMuam9pbihcIiwgXCIpfWApXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9IEFzc29jTUNcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPEFzc29jTUM+fSBhcmdzXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLlF1ZXJ5QXJnc1R5cGV9IHF1ZXJ5QXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxJbnN0YW5jZVR5cGU8QXNzb2NNQz4+Pn1cbiAgICovXG4gIGFzeW5jIF9sb2FkSGFzTWFueVJlZmxlY3Rpb24oYXJncywgcXVlcnlBcmdzID0ge30pIHtcbiAgICBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH1cblxuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MpXG4gICAgY29uc3QgbW9kZWxzID0gYXdhaXQgY29sbGVjdGlvbi50b0FycmF5KClcblxuICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxzXG5cbiAgICByZXR1cm4gbW9kZWxzXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9IEFzc29jTUNcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuQ29sbGVjdGlvbkFyZ3NUeXBlPEFzc29jTUM+fSBhcmdzXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLlF1ZXJ5QXJnc1R5cGV9IHF1ZXJ5QXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YW5jZVR5cGU8QXNzb2NNQz4+fVxuICAgKi9cbiAgYXN5bmMgX2xvYWRIYXNPbmVSZWZsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncyA9IHt9KSB7XG4gICAgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncylcbiAgICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgY29sbGVjdGlvbi5maXJzdCgpXG5cbiAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxcblxuICAgICAgcmV0dXJuIG1vZGVsXG4gICAgfVxuICB9XG5cbiAgX3JlYWRIYXNPbmVSZWZsZWN0aW9uKHtyZWZsZWN0aW9uTmFtZX0pIHtcbiAgICBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW3JlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAocmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWZsZWN0aW9uTmFtZV1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZFJlbGF0aW9uc2hpcHMgPSBPYmplY3Qua2V5cyh0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSlcbiAgICBjb25zdCBtb2RlbENsYXNzTmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcblxuICAgIHRocm93IG5ldyBOb3RMb2FkZWRFcnJvcihgJHttb2RlbENsYXNzTmFtZX0jJHtyZWZsZWN0aW9uTmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIHlldC4gT25seSB0aGVzZSB3ZXJlIGxvYWRlZDogJHtsb2FkZWRSZWxhdGlvbnNoaXBzLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgX3JlYWRNb2RlbERhdGFGcm9tQXJncyhhcmdzKSB7XG4gICAgdGhpcy5hYmlsaXRpZXMgPSBhcmdzLmRhdGEuYiB8fCB7fVxuICAgIHRoaXMuY29sbGVjdGlvbiA9IGFyZ3MuY29sbGVjdGlvblxuICAgIHRoaXMubW9kZWxEYXRhID0gb2JqZWN0VG9VbmRlcnNjb3JlKGFyZ3MuZGF0YS5hKVxuICAgIHRoaXMucHJlbG9hZGVkUmVsYXRpb25zaGlwcyA9IGFyZ3MuZGF0YS5yXG4gIH1cblxuICBfcmVhZFByZWxvYWRlZFJlbGF0aW9uc2hpcHMocHJlbG9hZGVkKSB7XG4gICAgaWYgKCF0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyZWxhdGlvbnNoaXBzXCIpXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBEYXRhID0gdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBDbGFzc0RhdGEgPSByZWxhdGlvbnNoaXBzLmZpbmQoKHJlbGF0aW9uc2hpcCkgPT4gZGlnZyhyZWxhdGlvbnNoaXAsIFwibmFtZVwiKSA9PSByZWxhdGlvbnNoaXBOYW1lKVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcENsYXNzRGF0YSkge1xuICAgICAgICBjb25zdCBtb2RlbE5hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcHNMaXN0ID0gcmVsYXRpb25zaGlwcy5tYXAoKHJlbGF0aW9uc2hpcCkgPT4gcmVsYXRpb25zaGlwLm5hbWUpLmpvaW4oXCIsIFwiKVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIHJlbGF0aW9uICR7cmVsYXRpb25zaGlwTmFtZX0gb24gdGhlICR7bW9kZWxOYW1lfSBtb2RlbDogJHtyZWxhdGlvbnNoaXBzTGlzdH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXBUeXBlID0gZGlnZyhyZWxhdGlvbnNoaXBDbGFzc0RhdGEsIFwiY29sbGVjdGlvbk5hbWVcIilcblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcE5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0aW9uc2hpcE5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkYClcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXBDbGFzc0RhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyByZWxhdGlvbnNoaXAgb24gJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfSBieSB0aGF0IG5hbWU6ICR7cmVsYXRpb25zaGlwTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcERhdGEpIHtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwTmFtZV0gPSBudWxsXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZWxhdGlvbnNoaXBEYXRhKSkge1xuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXSA9IFtdXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBJZCBvZiByZWxhdGlvbnNoaXBEYXRhKSB7XG4gICAgICAgICAgY29uc3QgbW9kZWwgPSBwcmVsb2FkZWQuZ2V0TW9kZWwocmVsYXRpb25zaGlwVHlwZSwgcmVsYXRpb25zaGlwSWQpXG5cbiAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXS5wdXNoKG1vZGVsKVxuICAgICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXS5wdXNoKG1vZGVsKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHByZWxvYWRlZC5nZXRNb2RlbChyZWxhdGlvbnNoaXBUeXBlLCByZWxhdGlvbnNoaXBEYXRhKVxuXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWxcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzW3JlbGF0aW9uc2hpcE5hbWVdID0gbW9kZWxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlcnxzdHJpbmd9XG4gICAqL1xuICBwcmltYXJ5S2V5KCkgeyByZXR1cm4gdGhpcy5yZWFkQXR0cmlidXRlVW5kZXJzY29yZSh0aGlzLm1vZGVsQ2xhc3MoKS5wcmltYXJ5S2V5KCkpIH1cbn1cbiJdfQ==
1074
+ exports.default = BaseModel;
1075
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsiYmFzZS1tb2RlbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVFQUE4QztBQUM5Qyw4RkFBa0U7QUFDbEUsZ0ZBQXFEO0FBQ3JELG9FQUF3QztBQUN4QywwRUFBNkM7QUFDN0MsNERBQWdDO0FBQ2hDLHdFQUEyQztBQUMzQyx5Q0FBOEI7QUFDOUIsZ0ZBQXFEO0FBQ3JELHVEQUF3QztBQUN4Qyw4REFBb0M7QUFDcEMsMEVBQStDO0FBQy9DLDRFQUFpRDtBQUNqRCx5RUFBZ0Q7QUFDaEQsK0RBQXNDO0FBQ3RDLGdFQUFvQztBQUNwQyxnRkFBbUQ7QUFDbkQsaUVBQXVEO0FBRXZEOzs7Ozs7OztHQVFHO0FBRUg7Ozs7R0FJRztBQUVILFNBQVMsa0JBQWtCLENBQUMsTUFBTTtJQUNoQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7SUFFcEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN6QixNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRWhELFNBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDeEMsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRCxNQUFxQixTQUFTO0lBQzVCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFBO0lBRWpDLDZCQUE2QjtJQUM3QixNQUFNLENBQUMsVUFBVTtRQUNmLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxVQUFVLENBQUE7UUFDbkQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO1FBRWpCLEtBQUssTUFBTSxZQUFZLElBQUksVUFBVSxFQUFFLENBQUM7WUFDdEMsTUFBTSxhQUFhLEdBQUcsVUFB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SyxNQUFNLGNBQWMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO29CQUM5QyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFBO29CQUVsRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ2xELENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO2dCQUVwRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLENBQUE7Z0JBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLENBQUE7WUFDOUMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLEtBQUssT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDOztBQXRwQ3RGLDRCQXVwQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQXR0cmlidXRlIGZyb20gXCIuL2Jhc2UtbW9kZWwvYXR0cmlidXRlXCJcbmltcG9ydCBBdHRyaWJ1dGVOb3RMb2FkZWRFcnJvciBmcm9tIFwiLi9hdHRyaWJ1dGUtbm90LWxvYWRlZC1lcnJvclwiXG5pbXBvcnQgQ2FjaGVLZXlHZW5lcmF0b3IgZnJvbSBcIi4vY2FjaGUta2V5LWdlbmVyYXRvclwiXG5pbXBvcnQgQ29sbGVjdGlvbiBmcm9tIFwiLi9jb2xsZWN0aW9uLmpzXCJcbmltcG9ydCBDb21tYW5kc1Bvb2wgZnJvbSBcIi4vY29tbWFuZHMtcG9vbC5qc1wiXG5pbXBvcnQgQ29uZmlnIGZyb20gXCIuL2NvbmZpZy5qc1wiXG5pbXBvcnQgQ3VzdG9tRXJyb3IgZnJvbSBcIi4vY3VzdG9tLWVycm9yLmpzXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgRm9ybURhdGFPYmplY3RpemVyIGZyb20gXCJmb3JtLWRhdGEtb2JqZWN0aXplclwiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBNb2RlbE5hbWUgZnJvbSBcIi4vbW9kZWwtbmFtZVwiXG5pbXBvcnQgTm90TG9hZGVkRXJyb3IgZnJvbSBcIi4vbm90LWxvYWRlZC1lcnJvclwiXG5pbXBvcnQgb2JqZWN0VG9Gb3JtRGF0YSBmcm9tIFwib2JqZWN0LXRvLWZvcm1kYXRhXCJcbmltcG9ydCBSZWZsZWN0aW9uIGZyb20gXCIuL2Jhc2UtbW9kZWwvcmVmbGVjdGlvblwiXG5pbXBvcnQgU2NvcGUgZnJvbSBcIi4vYmFzZS1tb2RlbC9zY29wZVwiXG5pbXBvcnQgU2VydmljZXMgZnJvbSBcIi4vc2VydmljZXMuanNcIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tIFwiLi92YWxpZGF0aW9uLWVycm9yLmpzXCJcbmltcG9ydCB7VmFsaWRhdGlvbkVycm9yc30gZnJvbSBcIi4vdmFsaWRhdGlvbi1lcnJvcnMuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1vZGVsQ2xhc3NEYXRhVHlwZVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2Jhc2UtbW9kZWwvYXR0cmlidXRlLmpzXCIpLkF0dHJpYnV0ZUFyZ1R5cGVbXX0gYXR0cmlidXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbGxlY3Rpb25OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJpbWFyeUtleVxuICogQHByb3BlcnR5IHtvYmplY3R9IHJhbnNhY2thYmxlX2F0dHJpYnV0ZXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcnNlVmFsaWRhdGlvbkVycm9yc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbZm9ybV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Rocm93VmFsaWRhdGlvbkVycm9yXVxuICovXG5cbmZ1bmN0aW9uIG9iamVjdFRvVW5kZXJzY29yZShvYmplY3QpIHtcbiAgY29uc3QgbmV3T2JqZWN0ID0ge31cblxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICBjb25zdCB1bmRlcnNjb3JlS2V5ID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGtleSlcblxuICAgIG5ld09iamVjdFt1bmRlcnNjb3JlS2V5XSA9IG9iamVjdFtrZXldXG4gIH1cblxuICByZXR1cm4gbmV3T2JqZWN0XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VNb2RlbCB7XG4gIHN0YXRpYyBhcGlNYWtlclR5cGUgPSBcIkJhc2VNb2RlbFwiXG5cbiAgLyoqIEByZXR1cm5zIHtBdHRyaWJ1dGVbXX0gKi9cbiAgc3RhdGljIGF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlS2V5IGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZURhdGEgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZUtleV1cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGUoYXR0cmlidXRlRGF0YSlcblxuICAgICAgcmVzdWx0LnB1c2goYXR0cmlidXRlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgc3RhdGljIGhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcImF0dHJpYnV0ZXNcIilcbiAgICBjb25zdCBsb3dlckNhc2VBdHRyaWJ1dGVOYW1lID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG5cbiAgICBpZiAobG93ZXJDYXNlQXR0cmlidXRlTmFtZSBpbiBhdHRyaWJ1dGVzKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBAcmV0dXJucyB7TW9kZWxDbGFzc0RhdGFUeXBlfVxuICAgKi9cbiAgc3RhdGljIG1vZGVsQ2xhc3NEYXRhKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIm1vZGVsQ2xhc3NEYXRhIHNob3VsZCBiZSBvdmVycmlkZW4gYnkgY2hpbGRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25FcnJvcnN9IHZhbGlkYXRpb25FcnJvcnNcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgc3RhdGljIG5ld0N1c3RvbUV2ZW50ID0gKHZhbGlkYXRpb25FcnJvcnMpID0+IHtcbiAgICByZXR1cm4gbmV3IEN1c3RvbUV2ZW50KFwidmFsaWRhdGlvbi1lcnJvcnNcIiwge2RldGFpbDogdmFsaWRhdGlvbkVycm9yc30pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtWYWxpZGF0aW9uRXJyb3JzfSB2YWxpZGF0aW9uRXJyb3JzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zLmZvcm1dXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudGhyb3dWYWxpZGF0aW9uRXJyb3JdXG4gICAqL1xuICBzdGF0aWMgc2VuZFZhbGlkYXRpb25FcnJvcnNFdmVudCh2YWxpZGF0aW9uRXJyb3JzLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5mb3JtKSB7XG4gICAgICBjb25zdCBldmVudCA9IEJhc2VNb2RlbC5uZXdDdXN0b21FdmVudCh2YWxpZGF0aW9uRXJyb3JzKVxuICAgICAgb3B0aW9ucy5mb3JtLmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEJhc2VNb2RlbH0gVFxuICAgKiBAdGhpcyB7VH1cbiAgICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPj59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZChpZCkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICBjb25zdCBxdWVyeSA9IHt9XG5cbiAgICBxdWVyeVtgJHt0aGlzLnByaW1hcnlLZXkoKX1fZXFgXSA9IGlkXG5cbiAgICBjb25zdCBtb2RlbCA9IC8qKiBAdHlwZSB7SW5zdGFuY2VUeXBlPFQ+fSAqLyAoYXdhaXQgdGhpcy5yYW5zYWNrKHF1ZXJ5KS5maXJzdCgpKVxuXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICByZXR1cm4gbW9kZWxcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEN1c3RvbUVycm9yKFwiUmVjb3JkIG5vdCBmb3VuZFwiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBCYXNlTW9kZWx9IFRcbiAgICogQHRoaXMge1R9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZmluZE9yQ3JlYXRlQnlBcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbmNlVHlwZTxUPj59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZE9yQ3JlYXRlQnkoZmluZE9yQ3JlYXRlQnlBcmdzLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBTZXJ2aWNlcy5jdXJyZW50KCkuc2VuZFJlcXVlc3QoXCJNb2RlbHM6OkZpbmRPckNyZWF0ZUJ5XCIsIHtcbiAgICAgIGFkZGl0aW9uYWxfZGF0YTogYXJncy5hZGRpdGlvbmFsRGF0YSxcbiAgICAgIGZpbmRfb3JfY3JlYXRlX2J5X2FyZ3M6IGZpbmRPckNyZWF0ZUJ5QXJncyxcbiAgICAgIHJlc291cmNlX25hbWU6IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcbiAgICB9KVxuICAgIGNvbnN0IG1vZGVsID0gLyoqIEB0eXBlIHtJbnN0YW5jZVR5cGU8VD59ICovIChkaWdnKHJlc3VsdCwgXCJtb2RlbFwiKSlcblxuICAgIHJldHVybiBtb2RlbFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtNb2RlbE5hbWV9ICovXG4gIHN0YXRpYyBtb2RlbE5hbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbE5hbWUoe21vZGVsQ2xhc3NEYXRhOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCl9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIHN0YXRpYyBwcmltYXJ5S2V5KCkge1xuICAgIHJldHVybiBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJwcmltYXJ5S2V5XCIpXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgQmFzZU1vZGVsfSBNQ1xuICAgKiBAdGhpcyB7TUN9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3F1ZXJ5XVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHQ8TUM+fVxuICAgKi9cbiAgc3RhdGljIHJhbnNhY2socXVlcnkgPSB7fSkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge01DfSAqLyAodGhpcylcblxuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbih7bW9kZWxDbGFzczogTW9kZWxDbGFzc30sIHtyYW5zYWNrOiBxdWVyeX0pXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgQmFzZU1vZGVsfSBNQ1xuICAgKiBAdGhpcyB7TUN9XG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3NlbGVjdF1cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0PE1DPn1cbiAgICovXG4gIHN0YXRpYyBzZWxlY3Qoc2VsZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMucmFuc2FjaygpLnNlbGVjdChzZWxlY3QpXG4gIH1cblxuICAvKiogQHJldHVybnMge1JlZmxlY3Rpb25bXX0gKi9cbiAgc3RhdGljIHJhbnNhY2thYmxlQXNzb2NpYXRpb25zKCkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJyYW5zYWNrYWJsZV9hc3NvY2lhdGlvbnNcIilcbiAgICBjb25zdCByZWZsZWN0aW9ucyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcERhdGEgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgcmVmbGVjdGlvbnMucHVzaChuZXcgUmVmbGVjdGlvbihyZWxhdGlvbnNoaXBEYXRhKSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmbGVjdGlvbnNcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7QXR0cmlidXRlW119ICovXG4gIHN0YXRpYyByYW5zYWNrYWJsZUF0dHJpYnV0ZXMoKSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5yYW5zYWNrYWJsZV9hdHRyaWJ1dGVzXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlRGF0YSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICByZXN1bHQucHVzaChuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZURhdGEpKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7U2NvcGVbXX0gKi9cbiAgc3RhdGljIHJhbnNhY2thYmxlU2NvcGVzKCkge1xuICAgIGNvbnN0IHJhbnNhY2thYmxlU2NvcGVzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmFuc2Fja2FibGVfc2NvcGVzXCIpXG4gICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgIGZvciAoY29uc3Qgc2NvcGVEYXRhIG9mIHJhbnNhY2thYmxlU2NvcGVzKSB7XG4gICAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZShzY29wZURhdGEpXG5cbiAgICAgIHJlc3VsdC5wdXNoKHNjb3BlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVmbGVjdGlvbltdfSAqL1xuICBzdGF0aWMgcmVmbGVjdGlvbnMoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcInJlbGF0aW9uc2hpcHNcIilcbiAgICBjb25zdCByZWZsZWN0aW9ucyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcERhdGEgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVmbGVjdGlvbiA9IG5ldyBSZWZsZWN0aW9uKHJlbGF0aW9uc2hpcERhdGEpXG5cbiAgICAgIHJlZmxlY3Rpb25zLnB1c2gocmVmbGVjdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmbGVjdGlvbnNcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVmbGVjdGlvbn0gKi9cbiAgc3RhdGljIHJlZmxlY3Rpb24obmFtZSkge1xuICAgIGNvbnN0IGZvdW5kUmVmbGVjdGlvbiA9IHRoaXMucmVmbGVjdGlvbnMoKS5maW5kKChyZWZsZWN0aW9uKSA9PiByZWZsZWN0aW9uLm5hbWUoKSA9PSBuYW1lKVxuXG4gICAgaWYgKCFmb3VuZFJlZmxlY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCByZWZsZWN0aW9uOiAke25hbWV9IGluICR7dGhpcy5yZWZsZWN0aW9ucygpLm1hcCgocmVmbGVjdGlvbikgPT4gcmVmbGVjdGlvbi5uYW1lKCkpLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIHJldHVybiBmb3VuZFJlZmxlY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIF90b2tlbigpIHtcbiAgICBjb25zdCBjc3JmVG9rZW5FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nY3NyZi10b2tlbiddXCIpXG5cbiAgICBpZiAoY3NyZlRva2VuRWxlbWVudCkge1xuICAgICAgcmV0dXJuIGNzcmZUb2tlbkVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gICAgdGhpcy5uZXdSZWNvcmQgPSBhcmdzLmlzTmV3UmVjb3JkXG4gICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUgPSB7fVxuICAgIHRoaXMucmVsYXRpb25zaGlwcyA9IHt9XG5cbiAgICBpZiAoYXJncyAmJiBhcmdzLmRhdGEgJiYgYXJncy5kYXRhLmEpIHtcbiAgICAgIHRoaXMuX3JlYWRNb2RlbERhdGFGcm9tQXJncyhhcmdzKVxuICAgIH0gZWxzZSBpZiAoYXJncy5hKSB7XG4gICAgICB0aGlzLmFiaWxpdGllcyA9IGFyZ3MuYiB8fCB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSBvYmplY3RUb1VuZGVyc2NvcmUoYXJncy5hKVxuICAgIH0gZWxzZSBpZiAoYXJncykge1xuICAgICAgdGhpcy5hYmlsaXRpZXMgPSB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSBvYmplY3RUb1VuZGVyc2NvcmUoYXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hYmlsaXRpZXMgPSB7fVxuICAgICAgdGhpcy5tb2RlbERhdGEgPSB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG5ld0F0dHJpYnV0ZXNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NpZ25BdHRyaWJ1dGVzKG5ld0F0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdBdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld0F0dHJpYnV0ZXNba2V5XVxuICAgICAgY29uc3QgYXR0cmlidXRlVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShrZXkpXG5cbiAgICAgIGxldCBhcHBseUNoYW5nZSA9IHRydWVcbiAgICAgIGxldCBkZWxldGVDaGFuZ2UgPSBmYWxzZVxuXG4gICAgICBpZiAodGhpcy5pc0F0dHJpYnV0ZUxvYWRlZChrZXkpKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5yZWFkQXR0cmlidXRlKGtleSlcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IHRoaXMubW9kZWxEYXRhW2F0dHJpYnV0ZVVuZGVyc2NvcmVdXG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlID09IG9sZFZhbHVlKSB7XG4gICAgICAgICAgYXBwbHlDaGFuZ2UgPSBmYWxzZVxuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID09IG9yaWdpbmFsVmFsdWUpIHtcbiAgICAgICAgICBhcHBseUNoYW5nZSA9IGZhbHNlXG4gICAgICAgICAgZGVsZXRlQ2hhbmdlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhcHBseUNoYW5nZSkge1xuICAgICAgICB0aGlzLmNoYW5nZXNbYXR0cmlidXRlVW5kZXJzY29yZV0gPSBuZXdWYWx1ZVxuICAgICAgfSBlbHNlIGlmIChkZWxldGVDaGFuZ2UpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2hhbmdlc1thdHRyaWJ1dGVVbmRlcnNjb3JlXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgYXR0cmlidXRlcygpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5tb2RlbERhdGFba2V5XVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY2hhbmdlcykge1xuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmNoYW5nZXNba2V5XVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZ2l2ZW5BYmlsaXR5TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGNhbihnaXZlbkFiaWxpdHlOYW1lKSB7XG4gICAgY29uc3QgYWJpbGl0eU5hbWUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoZ2l2ZW5BYmlsaXR5TmFtZSlcblxuICAgIGlmICghKGFiaWxpdHlOYW1lIGluIHRoaXMuYWJpbGl0aWVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBYmlsaXR5ICR7YWJpbGl0eU5hbWV9IGhhc24ndCBiZWVuIGxvYWRlZCBmb3IgJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWJpbGl0aWVzW2FiaWxpdHlOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7QmFzZU1vZGVsfSBTZWxmXG4gICAqIEB0aGlzIHtTZWxmfVxuICAgKiBAcmV0dXJucyB7U2VsZn1cbiAgICovXG4gIGNsb25lKCkge1xuICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge25ldyAoLi4uYXJnczogYW55W10pID0+IFNlbGZ9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICAgIGNvbnN0IGNsb25lID0gbmV3IE1vZGVsQ2xhc3MoKVxuXG4gICAgY2xvbmUuYWJpbGl0aWVzID0gey4uLnRoaXMuYWJpbGl0aWVzfVxuICAgIGNsb25lLm1vZGVsRGF0YSA9IHsuLi50aGlzLm1vZGVsRGF0YX1cbiAgICBjbG9uZS5yZWxhdGlvbnNoaXBzID0gey4uLnRoaXMucmVsYXRpb25zaGlwc31cbiAgICBjbG9uZS5yZWxhdGlvbnNoaXBzQ2FjaGUgPSB7Li4udGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGV9XG5cbiAgICByZXR1cm4gY2xvbmVcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyIHwgc3RyaW5nfSAqL1xuICBjYWNoZUtleSgpIHtcbiAgICBpZiAodGhpcy5pc1BlcnNpc3RlZCgpKSB7XG4gICAgICBjb25zdCBrZXlQYXJ0cyA9IFtcbiAgICAgICAgdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5LFxuICAgICAgICB0aGlzLnByaW1hcnlLZXkoKVxuICAgICAgXVxuXG4gICAgICBpZiAoXCJ1cGRhdGVkX2F0XCIgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBjb25zdCB1cGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdCgpXG5cbiAgICAgICAgaWYgKHR5cGVvZiB1cGRhdGVkQXQgIT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdXBkYXRlZEF0IHdhc24ndCBhbiBvYmplY3Q6ICR7dHlwZW9mIHVwZGF0ZWRBdH1gKVxuICAgICAgICB9IGVsc2UgaWYgKCEoXCJnZXRUaW1lXCIgaW4gdXBkYXRlZEF0KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdXBkYXRlZEF0IGRpZG4ndCBzdXBwb3J0IGdldFRpbWUgd2l0aCBjbGFzczogJHt1cGRhdGVkQXQuY29uc3RydWN0b3IgJiYgdXBkYXRlZEF0LmNvbnN0cnVjdG9yLm5hbWV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAga2V5UGFydHMucHVzaChgdXBkYXRlZEF0LSR7dGhpcy51cGRhdGVkQXQoKS5nZXRUaW1lKCl9YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGtleVBhcnRzLmpvaW4oXCItXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnVuaXF1ZUtleSgpXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIGxvY2FsQ2FjaGVLZXkoKSB7XG4gICAgY29uc3QgY2FjaGVLZXlHZW5lcmF0b3IgPSBuZXcgQ2FjaGVLZXlHZW5lcmF0b3IodGhpcylcblxuICAgIHJldHVybiBjYWNoZUtleUdlbmVyYXRvci5sb2NhbCgpXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgZnVsbENhY2hlS2V5KCkge1xuICAgIGNvbnN0IGNhY2hlS2V5R2VuZXJhdG9yID0gbmV3IENhY2hlS2V5R2VuZXJhdG9yKHRoaXMpXG5cbiAgICByZXR1cm4gY2FjaGVLZXlHZW5lcmF0b3IuY2FjaGVLZXkoKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIEJhc2VNb2RlbH0gTUNcbiAgICogQHRoaXMge01DfVxuICAgKiBAcmV0dXJucyB7Q29sbGVjdGlvbjxNQz59XG4gICAqL1xuICBzdGF0aWMgYWxsKCkge1xuICAgIHJldHVybiB0aGlzLnJhbnNhY2soKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2F0dHJpYnV0ZXNdXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHJldHVybnMge1Byb21pc2U8e1xuICAgKiAgIG1vZGVsOiBCYXNlTW9kZWwsXG4gICAqICAgcmVzcG9uc2U6IG9iamVjdFxuICAgKiB9Pn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZShhdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG4gICAgaWYgKGF0dHJpYnV0ZXMpIHRoaXMuYXNzaWduQXR0cmlidXRlcyhhdHRyaWJ1dGVzKVxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgbW9kZWxEYXRhID0gdGhpcy5nZXRBdHRyaWJ1dGVzKClcbiAgICBjb25zdCBkYXRhVG9Vc2UgPSB7fVxuICAgIGRhdGFUb1VzZVtwYXJhbUtleV0gPSBtb2RlbERhdGFcbiAgICBsZXQgcmVzcG9uc2VcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAgICB7XG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LWNyZWF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcImNyZWF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICB9XG5cbiAgICByZXR1cm4ge21vZGVsOiB0aGlzLCByZXNwb25zZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhIHwgUmVjb3JkPHN0cmluZywgYW55Pn0gcmF3RGF0YVxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gICAqL1xuICBhc3luYyBjcmVhdGVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgb2JqZWN0RGF0YSA9IEJhc2VNb2RlbC5fb2JqZWN0RGF0YUZyb21HaXZlblJhd0RhdGEocmF3RGF0YSwgb3B0aW9ucylcblxuICAgIGxldCByZXNwb25zZVxuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgQ29tbWFuZHNQb29sLmFkZENvbW1hbmQoXG4gICAgICAgIHtcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBzYXZlOiBvYmplY3REYXRhXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb21tYW5kOiBgJHt0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWV9LWNyZWF0ZWAsXG4gICAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgICB0eXBlOiBcImNyZWF0ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIHt9XG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEJhc2VNb2RlbC5wYXJzZVZhbGlkYXRpb25FcnJvcnMoe2Vycm9yLCBtb2RlbDogdGhpcywgb3B0aW9uc30pXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5tb2RlbCkge1xuICAgICAgdGhpcy5fcmVmcmVzaE1vZGVsRGF0YUZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIHttb2RlbDogdGhpcywgcmVzcG9uc2V9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8e21vZGVsOiBCYXNlTW9kZWwsIHJlc3BvbnNlOiBvYmplY3R9Pn0gKi9cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAge1xuICAgICAgICBhcmdzOiB7cXVlcnlfcGFyYW1zOiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpfSxcbiAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS1kZXN0cm95YCxcbiAgICAgICAgY29sbGVjdGlvbk5hbWU6IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgIHR5cGU6IFwiZGVzdHJveVwiXG4gICAgICB9LFxuICAgICAge31cbiAgICApXG5cbiAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hNb2RlbERhdGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpXG4gICAgICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhbmRsZVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZW5zdXJlQWJpbGl0aWVzKGxpc3RPZkFiaWxpdGllcykge1xuICAgIC8vIFBvcHVsYXRlIGFuIGFycmF5IHdpdGggYSBsaXN0IG9mIGFiaWxpdGllcyBjdXJyZW50bHkgbm90IGxvYWRlZFxuICAgIGNvbnN0IGFiaWxpdGllc1RvTG9hZCA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGFiaWxpdHlJbkxpc3Qgb2YgbGlzdE9mQWJpbGl0aWVzKSB7XG4gICAgICBpZiAoIShhYmlsaXR5SW5MaXN0IGluIHRoaXMuYWJpbGl0aWVzKSkge1xuICAgICAgICBhYmlsaXRpZXNUb0xvYWQucHVzaChhYmlsaXR5SW5MaXN0KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgdGhlIG1pc3NpbmcgYWJpbGl0aWVzIGlmIGFueVxuICAgIGlmIChhYmlsaXRpZXNUb0xvYWQubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcHJpbWFyeUtleU5hbWUgPSB0aGlzLm1vZGVsQ2xhc3MoKS5wcmltYXJ5S2V5KClcbiAgICAgIGNvbnN0IHJhbnNhY2tQYXJhbXMgPSB7fVxuICAgICAgcmFuc2Fja1BhcmFtc1tgJHtwcmltYXJ5S2V5TmFtZX1fZXFgXSA9IHRoaXMucHJpbWFyeUtleSgpXG5cbiAgICAgIGNvbnN0IGFiaWxpdGllc1BhcmFtcyA9IHt9XG4gICAgICBhYmlsaXRpZXNQYXJhbXNbZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKV0gPSBhYmlsaXRpZXNUb0xvYWRcblxuICAgICAgY29uc3QgYW5vdGhlck1vZGVsID0gYXdhaXQgdGhpcy5tb2RlbENsYXNzKClcbiAgICAgICAgLnJhbnNhY2socmFuc2Fja1BhcmFtcylcbiAgICAgICAgLmFiaWxpdGllcyhhYmlsaXRpZXNQYXJhbXMpXG4gICAgICAgIC5maXJzdCgpXG5cbiAgICAgIGlmICghYW5vdGhlck1vZGVsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvb2sgdXAgdGhlIHNhbWUgbW9kZWwgJHt0aGlzLnByaW1hcnlLZXkoKX0gd2l0aCBhYmlsaXRpZXM6ICR7YWJpbGl0aWVzVG9Mb2FkLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdBYmlsaXRpZXMgPSBhbm90aGVyTW9kZWwuYWJpbGl0aWVzXG4gICAgICBmb3IgKGNvbnN0IG5ld0FiaWxpdHkgaW4gbmV3QWJpbGl0aWVzKSB7XG4gICAgICAgIHRoaXMuYWJpbGl0aWVzW25ld0FiaWxpdHldID0gbmV3QWJpbGl0aWVzW25ld0FiaWxpdHldXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICAgKi9cbiAgZ2V0QXR0cmlidXRlcygpIHsgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5tb2RlbERhdGEsIHRoaXMuY2hhbmdlcykgfVxuYXNkXG4gIGhhbmRsZVJlc3BvbnNlRXJyb3IocmVzcG9uc2UpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfSlcbiAgICB0aHJvdyBuZXcgQ3VzdG9tRXJyb3IoXCJSZXNwb25zZSB3YXNuJ3Qgc3VjY2Vzc2Z1bFwiLCB7bW9kZWw6IHRoaXMsIHJlc3BvbnNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgc3RyaW5nfVxuICAgKi9cbiAgaWRlbnRpZmllcktleSgpIHtcbiAgICBpZiAoIXRoaXMuX2lkZW50aWZpZXJLZXkpIHRoaXMuX2lkZW50aWZpZXJLZXkgPSB0aGlzLmlzUGVyc2lzdGVkKCkgPyB0aGlzLnByaW1hcnlLZXkoKSA6IHRoaXMudW5pcXVlS2V5KClcblxuICAgIHJldHVybiB0aGlzLl9pZGVudGlmaWVyS2V5XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0Fzc29jaWF0aW9uTG9hZGVkKGFzc29jaWF0aW9uTmFtZSkgeyByZXR1cm4gdGhpcy5pc0Fzc29jaWF0aW9uTG9hZGVkVW5kZXJzY29yZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXNzb2NpYXRpb25OYW1lKSkgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXNzb2NpYXRpb25Mb2FkZWRVbmRlcnNjb3JlIChhc3NvY2lhdGlvbk5hbWVVbmRlcnNjb3JlKSB7XG4gICAgaWYgKGFzc29jaWF0aW9uTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0Fzc29jaWF0aW9uUHJlc2VudChhc3NvY2lhdGlvbk5hbWUpIHtcbiAgICBpZiAodGhpcy5pc0Fzc29jaWF0aW9uTG9hZGVkKGFzc29jaWF0aW9uTmFtZSkpIHJldHVybiB0cnVlXG4gICAgaWYgKGFzc29jaWF0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHthbnl9IGFyZ3MuZXJyb3JcbiAgICogQHBhcmFtIHtCYXNlTW9kZWx9IFthcmdzLm1vZGVsXVxuICAgKiBAcGFyYW0ge1BhcnNlVmFsaWRhdGlvbkVycm9yc09wdGlvbnN9IGFyZ3Mub3B0aW9uc1xuICAgKi9cbiAgc3RhdGljIHBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG1vZGVsLCBvcHRpb25zfSkge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSkgcmV0dXJuXG4gICAgaWYgKCFlcnJvci5hcmdzLnJlc3BvbnNlLnZhbGlkYXRpb25fZXJyb3JzKSByZXR1cm5cblxuICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSBuZXcgVmFsaWRhdGlvbkVycm9ycyh7XG4gICAgICBtb2RlbCxcbiAgICAgIHZhbGlkYXRpb25FcnJvcnM6IGRpZ2coZXJyb3IsIFwiYXJnc1wiLCBcInJlc3BvbnNlXCIsIFwidmFsaWRhdGlvbl9lcnJvcnNcIilcbiAgICB9KVxuXG4gICAgQmFzZU1vZGVsLnNlbmRWYWxpZGF0aW9uRXJyb3JzRXZlbnQodmFsaWRhdGlvbkVycm9ycywgb3B0aW9ucylcblxuICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnRocm93VmFsaWRhdGlvbkVycm9yICE9IGZhbHNlKSB7XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBodW1hbkF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGtleU5hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJpMThuS2V5XCIpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgY29uc3QgaTE4biA9IENvbmZpZy5nZXRJMThuKClcblxuICAgIGlmIChpMThuKSByZXR1cm4gaTE4bi50KGBhY3RpdmVyZWNvcmQuYXR0cmlidXRlcy4ke2tleU5hbWV9LiR7QmFzZU1vZGVsLnNuYWtlQ2FzZShhdHRyaWJ1dGVOYW1lKX1gLCB7ZGVmYXVsdFZhbHVlOiBhdHRyaWJ1dGVOYW1lfSlcblxuICAgIHJldHVybiBpbmZsZWN0aW9uLmh1bWFuaXplKGF0dHJpYnV0ZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc0F0dHJpYnV0ZUNoYW5nZWQoYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgYXR0cmlidXRlRGF0YSA9IHRoaXMubW9kZWxDbGFzc0RhdGEoKS5hdHRyaWJ1dGVzLmZpbmQoKGF0dHJpYnV0ZSkgPT4gZGlnZyhhdHRyaWJ1dGUsIFwibmFtZVwiKSA9PSBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSlcblxuICAgIGlmICghYXR0cmlidXRlRGF0YSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gZGlnZyhhdHRyaWJ1dGUsIFwibmFtZVwiKSlcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGFuIGF0dHJpYnV0ZSBieSB0aGF0IG5hbWU6IFwiJHthdHRyaWJ1dGVOYW1lfVwiIGluOiAke2F0dHJpYnV0ZU5hbWVzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIGlmICghKGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlIGluIHRoaXMuY2hhbmdlcykpXG4gICAgICByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5tb2RlbERhdGFbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmNoYW5nZXNbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgY2hhbmdlZE1ldGhvZCA9IHRoaXNbYF9pcyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhdHRyaWJ1dGVEYXRhLnR5cGUsIHRydWUpfUNoYW5nZWRgXVxuXG4gICAgaWYgKCFjaGFuZ2VkTWV0aG9kKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdHlwZTogJHthdHRyaWJ1dGVEYXRhLnR5cGV9YClcblxuICAgIHJldHVybiBjaGFuZ2VkTWV0aG9kKG9sZFZhbHVlLCBuZXdWYWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQ2hhbmdlZCgpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5jaGFuZ2VzKVxuXG4gICAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNOZXdSZWNvcmQoKSB7XG4gICAgaWYgKHRoaXMubmV3UmVjb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5ld1JlY29yZFxuICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHRoaXMubW9kZWxEYXRhICYmIHRoaXMubW9kZWxEYXRhLmlkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc1BlcnNpc3RlZCgpIHsgcmV0dXJuICF0aGlzLmlzTmV3UmVjb3JkKCkgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgc25ha2VDYXNlKHN0cmluZykgeyByZXR1cm4gaW5mbGVjdGlvbi51bmRlcnNjb3JlKHN0cmluZykgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNhdmVkQ2hhbmdlVG9BdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkge1xuICAgIGlmICghdGhpcy5wcmV2aW91c01vZGVsRGF0YSlcbiAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBhdHRyaWJ1dGVEYXRhID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLmF0dHJpYnV0ZXMuZmluZCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSA9PSBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSlcblxuICAgIGlmICghYXR0cmlidXRlRGF0YSkge1xuICAgICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuYXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlLm5hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZTogXCIke2F0dHJpYnV0ZU5hbWV9XCIgaW46ICR7YXR0cmlidXRlTmFtZXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgaWYgKCEoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5wcmV2aW91c01vZGVsRGF0YSkpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnByZXZpb3VzTW9kZWxEYXRhW2F0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlXVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5tb2RlbERhdGFbYXR0cmlidXRlTmFtZVVuZGVyc2NvcmVdXG4gICAgY29uc3QgY2hhbmdlZE1ldGhvZE5hbWUgPSBgX2lzJHtpbmZsZWN0aW9uLmNhbWVsaXplKGF0dHJpYnV0ZURhdGEudHlwZSl9Q2hhbmdlZGBcbiAgICBjb25zdCBjaGFuZ2VkTWV0aG9kID0gdGhpc1tjaGFuZ2VkTWV0aG9kTmFtZV1cblxuICAgIGlmICghY2hhbmdlZE1ldGhvZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHR5cGU6ICR7YXR0cmlidXRlRGF0YS50eXBlfWApXG5cbiAgICByZXR1cm4gY2hhbmdlZE1ldGhvZChvbGRWYWx1ZSwgbmV3VmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCYXNlTW9kZWx9IG1vZGVsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TmV3TW9kZWwobW9kZWwpIHtcbiAgICB0aGlzLnNldE5ld01vZGVsRGF0YShtb2RlbClcblxuICAgIGZvcihjb25zdCByZWxhdGlvbnNoaXBOYW1lIGluIG1vZGVsLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG1vZGVsLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cbiAgICB9XG5cbiAgICBmb3IoY29uc3QgcmVsYXRpb25zaGlwQ2FjaGVOYW1lIGluIG1vZGVsLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwQ2FjaGVOYW1lXSA9IG1vZGVsLnJlbGF0aW9uc2hpcHNDYWNoZVtuYW1lXVxuICAgIH1cbiAgfVxuXG4gIHNldE5ld01vZGVsRGF0YShtb2RlbCkge1xuICAgIGlmICghKFwibW9kZWxEYXRhXCIgaW4gbW9kZWwpKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG1vZGVsRGF0YSBpbiBtb2RlbDogJHtKU09OLnN0cmluZ2lmeShtb2RlbCl9YClcblxuICAgIHRoaXMucHJldmlvdXNNb2RlbERhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkaWdnKHRoaXMsIFwibW9kZWxEYXRhXCIpKVxuXG4gICAgZm9yKGNvbnN0IGF0dHJpYnV0ZU5hbWUgaW4gbW9kZWwubW9kZWxEYXRhKSB7XG4gICAgICB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXSA9IG1vZGVsLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXVxuICAgIH1cbiAgfVxuXG4gIF9pc0RhdGVDaGFuZ2VkKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgIGlmIChEYXRlLnBhcnNlKG9sZFZhbHVlKSAhPSBEYXRlLnBhcnNlKG5ld1ZhbHVlKSlcbiAgICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBfaXNJbnRlZ2VyQ2hhbmdlZChvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAgICBpZiAocGFyc2VJbnQob2xkVmFsdWUsIDEwKSAhPSBwYXJzZUludChuZXdWYWx1ZSwgMTApKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIF9pc1N0cmluZ0NoYW5nZWQgKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgIGNvbnN0IG9sZENvbnZlcnRlZFZhbHVlID0gYCR7b2xkVmFsdWV9YFxuICAgIGNvbnN0IG5ld0NvbnZlcnRlZFZhbHVlID0gYCR7bmV3VmFsdWV9YFxuXG4gICAgaWYgKG9sZENvbnZlcnRlZFZhbHVlICE9IG5ld0NvbnZlcnRlZFZhbHVlKVxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7TW9kZWxDbGFzc0RhdGFUeXBlfSAqL1xuICBtb2RlbENsYXNzRGF0YSgpIHsgcmV0dXJuIHRoaXMubW9kZWxDbGFzcygpLm1vZGVsQ2xhc3NEYXRhKCkgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlbG9hZCgpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLnBhcmFtcygpXG4gICAgY29uc3QgcmFuc2Fja1BhcmFtcyA9IHt9XG4gICAgcmFuc2Fja1BhcmFtc1tgJHt0aGlzLm1vZGVsQ2xhc3MoKS5wcmltYXJ5S2V5KCl9X2VxYF0gPSB0aGlzLnByaW1hcnlLZXkoKVxuXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5tb2RlbENsYXNzKCkucmFuc2FjayhyYW5zYWNrUGFyYW1zKVxuXG4gICAgaWYgKHBhcmFtcykge1xuICAgICAgaWYgKHBhcmFtcy5wcmVsb2FkKSB7XG4gICAgICAgIHF1ZXJ5LnF1ZXJ5QXJncy5wcmVsb2FkID0gcGFyYW1zLnByZWxvYWRcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5zZWxlY3QpIHtcbiAgICAgICAgcXVlcnkucXVlcnlBcmdzLnNlbGVjdCA9IHBhcmFtcy5zZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy5zZWxlY3RfY29sdW1ucykge1xuICAgICAgICBxdWVyeS5xdWVyeUFyZ3Muc2VsZWN0Q29sdW1ucyA9IHBhcmFtcy5zZWxlY3RfY29sdW1uc1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsID0gYXdhaXQgcXVlcnkuZmlyc3QoKVxuICAgIHRoaXMuc2V0TmV3TW9kZWwobW9kZWwpXG4gICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7bW9kZWw6IEJhc2VNb2RlbCwgcmVzcG9uc2U/OiBvYmplY3R9Pn1cbiAgICovXG4gIHNhdmUoKSB7XG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8e21vZGVsOiBCYXNlTW9kZWwsIHJlc3BvbnNlOiBvYmplY3R9Pn1cbiAgICovXG4gIHNhdmVSYXcocmF3RGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVJhdyhyYXdEYXRhLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtuZXdBdHRyaWJ1dGVzXVxuICAgKiBAcGFyYW0ge1BhcnNlVmFsaWRhdGlvbkVycm9yc09wdGlvbnN9IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7XG4gICAqICAgbW9kZWw6IEJhc2VNb2RlbCxcbiAgICogICByZXNwb25zZT86IG9iamVjdFxuICAgKiB9Pn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShuZXdBdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG4gICAgaWYgKG5ld0F0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuYXNzaWduQXR0cmlidXRlcyhuZXdBdHRyaWJ1dGVzKVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmNoYW5nZXMpLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4ge21vZGVsOiB0aGlzfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgbW9kZWxEYXRhID0gdGhpcy5jaGFuZ2VzXG4gICAgY29uc3QgZGF0YVRvVXNlID0ge31cbiAgICBkYXRhVG9Vc2VbcGFyYW1LZXldID0gbW9kZWxEYXRhXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHF1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKSxcbiAgICAgICAgICAgIHNhdmU6IGRhdGFUb1VzZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS11cGRhdGVgLFxuICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIlxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWw6IHRoaXMsIG9wdGlvbnN9KVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgaWYgKHJlc3BvbnNlLm1vZGVsKSB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hNb2RlbEZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgICAgdGhpcy5jaGFuZ2VzID0ge31cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtyZXNwb25zZSwgbW9kZWw6IHRoaXN9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2VFcnJvcihyZXNwb25zZSlcbiAgICB9XG4gIH1cblxuICBfcmVmcmVzaE1vZGVsRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgbGV0IG5ld01vZGVsID0gZGlnZyhyZXNwb25zZSwgXCJtb2RlbFwiKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3TW9kZWwpKSBuZXdNb2RlbCA9IG5ld01vZGVsWzBdXG5cbiAgICB0aGlzLnNldE5ld01vZGVsKG5ld01vZGVsKVxuICB9XG5cbiAgX3JlZnJlc2hNb2RlbERhdGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBsZXQgbmV3TW9kZWwgPSBkaWdnKHJlc3BvbnNlLCBcIm1vZGVsXCIpXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdNb2RlbCkpIG5ld01vZGVsID0gbmV3TW9kZWxbMF1cblxuICAgIHRoaXMuc2V0TmV3TW9kZWxEYXRhKG5ld01vZGVsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGEgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+fSByYXdEYXRhXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICAgKi9cbiAgc3RhdGljIF9vYmplY3REYXRhRnJvbUdpdmVuUmF3RGF0YShyYXdEYXRhLCBvcHRpb25zKSB7XG4gICAgaWYgKHJhd0RhdGEgaW5zdGFuY2VvZiBGb3JtRGF0YSB8fCByYXdEYXRhLm5vZGVOYW1lID09IFwiRk9STVwiKSB7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IEZvcm1EYXRhT2JqZWN0aXplci5mb3JtRGF0YUZyb21PYmplY3QocmF3RGF0YSwgb3B0aW9ucylcblxuICAgICAgcmV0dXJuIEZvcm1EYXRhT2JqZWN0aXplci50b09iamVjdChmb3JtRGF0YSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmF3RGF0YVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlUmF3KHJhd0RhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IG9iamVjdERhdGEgPSBCYXNlTW9kZWwuX29iamVjdERhdGFGcm9tR2l2ZW5SYXdEYXRhKHJhd0RhdGEsIG9wdGlvbnMpXG4gICAgbGV0IHJlc3BvbnNlXG5cbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIHF1ZXJ5X3BhcmFtczogdGhpcy5jb2xsZWN0aW9uICYmIHRoaXMuY29sbGVjdGlvbi5wYXJhbXMoKSxcbiAgICAgICAgICAgIHNhdmU6IG9iamVjdERhdGEsXG4gICAgICAgICAgICBzaW1wbGVfbW9kZWxfZXJyb3JzOiBvcHRpb25zPy5zaW1wbGVNb2RlbEVycm9yc1xuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogYCR7dGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lfS11cGRhdGVgLFxuICAgICAgICAgIGNvbGxlY3Rpb25OYW1lOiB0aGlzLm1vZGVsQ2xhc3NEYXRhKCkuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgcHJpbWFyeUtleTogdGhpcy5wcmltYXJ5S2V5KCksXG4gICAgICAgICAgdHlwZTogXCJ1cGRhdGVcIlxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBCYXNlTW9kZWwucGFyc2VWYWxpZGF0aW9uRXJyb3JzKHtlcnJvciwgbW9kZWw6IHRoaXMsIG9wdGlvbnN9KVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2UubW9kZWwpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hNb2RlbEZyb21SZXNwb25zZShyZXNwb25zZSlcbiAgICAgIHRoaXMuY2hhbmdlcyA9IHt9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtyZXNwb25zZSwgbW9kZWw6IHRoaXN9XG4gIH1cblxuICBpc1ZhbGlkKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZCB5ZXRcIilcbiAgfVxuXG4gIGFzeW5jIGlzVmFsaWRPblNlcnZlcigpIHtcbiAgICBjb25zdCBtb2RlbERhdGEgPSB0aGlzLmdldEF0dHJpYnV0ZXMoKVxuICAgIGNvbnN0IHBhcmFtS2V5ID0gdGhpcy5tb2RlbENsYXNzRGF0YSgpLnBhcmFtS2V5XG4gICAgY29uc3QgZGF0YVRvVXNlID0ge31cbiAgICBkYXRhVG9Vc2VbcGFyYW1LZXldID0gbW9kZWxEYXRhXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKFxuICAgICAge1xuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgc2F2ZTogZGF0YVRvVXNlXG4gICAgICAgIH0sXG4gICAgICAgIGNvbW1hbmQ6IGAke3RoaXMubW9kZWxDbGFzc0RhdGEoKS5jb2xsZWN0aW9uTmFtZX0tdmFsaWRgLFxuICAgICAgICBjb2xsZWN0aW9uTmFtZTogdGhpcy5tb2RlbENsYXNzRGF0YSgpLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICBwcmltYXJ5S2V5OiB0aGlzLnByaW1hcnlLZXkoKSxcbiAgICAgICAgdHlwZTogXCJ2YWxpZFwiXG4gICAgICB9LFxuICAgICAge31cbiAgICApXG5cbiAgICByZXR1cm4ge3ZhbGlkOiByZXNwb25zZS52YWxpZCwgZXJyb3JzOiByZXNwb25zZS5lcnJvcnN9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtCYXNlTW9kZWx9IFNlbGZcbiAgICogQHRoaXMge1NlbGZ9XG4gICAqIEByZXR1cm5zIHt0eXBlb2YgQmFzZU1vZGVsICYgKG5ldyAoLi4uYXJnczogYW55W10pID0+IFNlbGYpfVxuICAgKi9cbiAgbW9kZWxDbGFzcygpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovICh0aGlzLmNvbnN0cnVjdG9yKVxuICB9XG5cbiAgcHJlbG9hZFJlbGF0aW9uc2hpcChyZWxhdGlvbnNoaXBOYW1lLCBtb2RlbCkge1xuICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW0Jhc2VNb2RlbC5zbmFrZUNhc2UocmVsYXRpb25zaGlwTmFtZSldID0gbW9kZWxcbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNbQmFzZU1vZGVsLnNuYWtlQ2FzZShyZWxhdGlvbnNoaXBOYW1lKV0gPSBtb2RlbFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgbWFya0ZvckRlc3RydWN0aW9uKCkge1xuICAgIHRoaXMuX21hcmtlZEZvckRlc3RydWN0aW9uID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgbWFya2VkRm9yRGVzdHJ1Y3Rpb24oKSB7IHJldHVybiB0aGlzLl9tYXJrZWRGb3JEZXN0cnVjdGlvbiB8fCBmYWxzZSB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICB1bmlxdWVLZXkoKSB7XG4gICAgaWYgKCF0aGlzLnVuaXF1ZUtleVZhbHVlKSB7XG4gICAgICBjb25zdCBtaW4gPSA1MDAwMDAwMDAwMDAwMDAwXG4gICAgICBjb25zdCBtYXggPSA5MDA3MTk5MjU0NzQwOTkxXG4gICAgICBjb25zdCByYW5kb21CZXR3ZWVuID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpICsgbWluKVxuICAgICAgdGhpcy51bmlxdWVLZXlWYWx1ZSA9IHJhbmRvbUJldHdlZW5cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51bmlxdWVLZXlWYWx1ZVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIF9jYWxsQ29sbGVjdGlvbkNvbW1hbmQoYXJncywgY29tbWFuZEFyZ3MpIHtcbiAgICBjb25zdCBmb3JtT3JEYXRhT2JqZWN0ID0gYXJncy5hcmdzXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IENvbW1hbmRzUG9vbC5hZGRDb21tYW5kKGFyZ3MsIGNvbW1hbmRBcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsZXQgZm9ybVxuXG4gICAgICBpZiAoY29tbWFuZEFyZ3MuZm9ybSkge1xuICAgICAgICBmb3JtID0gY29tbWFuZEFyZ3MuZm9ybVxuICAgICAgfSBlbHNlIGlmIChmb3JtT3JEYXRhT2JqZWN0Py5ub2RlTmFtZSA9PSBcIkZPUk1cIikge1xuICAgICAgICBmb3JtID0gZm9ybU9yRGF0YU9iamVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoZm9ybSkgQmFzZU1vZGVsLnBhcnNlVmFsaWRhdGlvbkVycm9ycyh7ZXJyb3IsIG9wdGlvbnM6IHtmb3JtfX0pXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgX2NhbGxNZW1iZXJDb21tYW5kID0gKGFyZ3MsIGNvbW1hbmRBcmdzKSA9PiBDb21tYW5kc1Bvb2wuYWRkQ29tbWFuZChhcmdzLCBjb21tYW5kQXJncylcblxuICBzdGF0aWMgX3Bvc3REYXRhRnJvbUFyZ3MoYXJncykge1xuICAgIGxldCBwb3N0RGF0YVxuXG4gICAgaWYgKGFyZ3MpIHtcbiAgICAgIGlmIChhcmdzIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgcG9zdERhdGEgPSBhcmdzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3N0RGF0YSA9IG9iamVjdFRvRm9ybURhdGEuc2VyaWFsaXplKGFyZ3MsIHt9LCBudWxsLCBcImFyZ3NcIilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcG9zdERhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIH1cblxuICAgIHJldHVybiBwb3N0RGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICByZWFkQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgcmV0dXJuIHRoaXMucmVhZEF0dHJpYnV0ZVVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHJlYWRBdHRyaWJ1dGVVbmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBpZiAoYXR0cmlidXRlTmFtZSBpbiB0aGlzLmNoYW5nZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZXNbYXR0cmlidXRlTmFtZV1cbiAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgaW4gdGhpcy5tb2RlbERhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGVsRGF0YVthdHRyaWJ1dGVOYW1lXVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc05ld1JlY29yZCgpKSB7XG4gICAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGlzIGlzIGEgbmV3IHJlY29yZCBhbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIGEgcmVjb2duaXplZCBhdHRyaWJ1dGVcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJhdHRyaWJ1dGVzXCIpXG5cbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNQZXJzaXN0ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZU5vdExvYWRlZEVycm9yKGBObyBzdWNoIGF0dHJpYnV0ZTogJHtkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpfSMke2F0dHJpYnV0ZU5hbWV9OiAke0pTT04uc3RyaW5naWZ5KHRoaXMubW9kZWxEYXRhKX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQXR0cmlidXRlTG9hZGVkKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShhdHRyaWJ1dGVOYW1lKVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVVbmRlcnNjb3JlIGluIHRoaXMuY2hhbmdlcykgcmV0dXJuIHRydWVcbiAgICBpZiAoYXR0cmlidXRlTmFtZVVuZGVyc2NvcmUgaW4gdGhpcy5tb2RlbERhdGEpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBfaXNQcmVzZW50KHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5tYXRjaCgvXlxccyokLykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBhc3luYyBfbG9hZEJlbG9uZ3NUb1JlZmxlY3Rpb24oYXJncywgcXVlcnlBcmdzID0ge30pIHtcbiAgICBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IENvbGxlY3Rpb24oYXJncywgcXVlcnlBcmdzKVxuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCBjb2xsZWN0aW9uLmZpcnN0KClcbiAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdID0gbW9kZWxcbiAgICAgIHJldHVybiBtb2RlbFxuICAgIH1cbiAgfVxuXG4gIF9yZWFkQmVsb25nc1RvUmVmbGVjdGlvbih7cmVmbGVjdGlvbk5hbWV9KSB7XG4gICAgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1tyZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVmbGVjdGlvbk5hbWVdXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGxvYWRlZFJlbGF0aW9uc2hpcHMgPSBPYmplY3Qua2V5cyh0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSlcbiAgICBjb25zdCBtb2RlbENsYXNzTmFtZSA9IGRpZ2codGhpcy5tb2RlbENsYXNzRGF0YSgpLCBcIm5hbWVcIilcblxuICAgIHRocm93IG5ldyBOb3RMb2FkZWRFcnJvcihgJHttb2RlbENsYXNzTmFtZX0jJHtyZWZsZWN0aW9uTmFtZX0gaGFzbid0IGJlZW4gbG9hZGVkIHlldC4gT25seSB0aGVzZSB3ZXJlIGxvYWRlZDogJHtsb2FkZWRSZWxhdGlvbnNoaXBzLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0fSBBc3NvY01DXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLkNvbGxlY3Rpb25BcmdzVHlwZTxBc3NvY01DPn0gYXJnc1xuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5RdWVyeUFyZ3NUeXBlfSBxdWVyeUFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8SW5zdGFuY2VUeXBlPEFzc29jTUM+Pj59XG4gICAqL1xuICBhc3luYyBfbG9hZEhhc01hbnlSZWZsZWN0aW9uKGFyZ3MsIHF1ZXJ5QXJncyA9IHt9KSB7XG4gICAgaWYgKGFyZ3MucmVmbGVjdGlvbk5hbWUgaW4gdGhpcy5yZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbYXJncy5yZWZsZWN0aW9uTmFtZV1cbiAgICB9XG5cbiAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IENvbGxlY3Rpb24oYXJncywgcXVlcnlBcmdzKVxuICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IGNvbGxlY3Rpb24udG9BcnJheSgpXG5cbiAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXSA9IG1vZGVsc1xuXG4gICAgcmV0dXJuIG1vZGVsc1xuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7dHlwZW9mIGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0fSBBc3NvY01DXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLkNvbGxlY3Rpb25BcmdzVHlwZTxBc3NvY01DPn0gYXJnc1xuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5RdWVyeUFyZ3NUeXBlfSBxdWVyeUFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8SW5zdGFuY2VUeXBlPEFzc29jTUM+Pn1cbiAgICovXG4gIGFzeW5jIF9sb2FkSGFzT25lUmVmbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MgPSB7fSkge1xuICAgIGlmIChhcmdzLnJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1thcmdzLnJlZmxlY3Rpb25OYW1lXVxuICAgIH0gZWxzZSBpZiAoYXJncy5yZWZsZWN0aW9uTmFtZSBpbiB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW2FyZ3MucmVmbGVjdGlvbk5hbWVdXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgQ29sbGVjdGlvbihhcmdzLCBxdWVyeUFyZ3MpXG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IGNvbGxlY3Rpb24uZmlyc3QoKVxuXG4gICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVthcmdzLnJlZmxlY3Rpb25OYW1lXSA9IG1vZGVsXG5cbiAgICAgIHJldHVybiBtb2RlbFxuICAgIH1cbiAgfVxuXG4gIF9yZWFkSGFzT25lUmVmbGVjdGlvbih7cmVmbGVjdGlvbk5hbWV9KSB7XG4gICAgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwcykge1xuICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwc1tyZWZsZWN0aW9uTmFtZV1cbiAgICB9IGVsc2UgaWYgKHJlZmxlY3Rpb25OYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVmbGVjdGlvbk5hbWVdXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOZXdSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkZWRSZWxhdGlvbnNoaXBzID0gT2JqZWN0LmtleXModGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGUpXG4gICAgY29uc3QgbW9kZWxDbGFzc05hbWUgPSBkaWdnKHRoaXMubW9kZWxDbGFzc0RhdGEoKSwgXCJuYW1lXCIpXG5cbiAgICB0aHJvdyBuZXcgTm90TG9hZGVkRXJyb3IoYCR7bW9kZWxDbGFzc05hbWV9IyR7cmVmbGVjdGlvbk5hbWV9IGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQuIE9ubHkgdGhlc2Ugd2VyZSBsb2FkZWQ6ICR7bG9hZGVkUmVsYXRpb25zaGlwcy5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIF9yZWFkTW9kZWxEYXRhRnJvbUFyZ3MoYXJncykge1xuICAgIHRoaXMuYWJpbGl0aWVzID0gYXJncy5kYXRhLmIgfHwge31cbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBhcmdzLmNvbGxlY3Rpb25cbiAgICB0aGlzLm1vZGVsRGF0YSA9IG9iamVjdFRvVW5kZXJzY29yZShhcmdzLmRhdGEuYSlcbiAgICB0aGlzLnByZWxvYWRlZFJlbGF0aW9uc2hpcHMgPSBhcmdzLmRhdGEuclxuICB9XG5cbiAgX3JlYWRQcmVsb2FkZWRSZWxhdGlvbnNoaXBzKHByZWxvYWRlZCkge1xuICAgIGlmICghdGhpcy5wcmVsb2FkZWRSZWxhdGlvbnNoaXBzKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwicmVsYXRpb25zaGlwc1wiKVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIGluIHRoaXMucHJlbG9hZGVkUmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwRGF0YSA9IHRoaXMucHJlbG9hZGVkUmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXVxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwQ2xhc3NEYXRhID0gcmVsYXRpb25zaGlwcy5maW5kKChyZWxhdGlvbnNoaXApID0+IGRpZ2cocmVsYXRpb25zaGlwLCBcIm5hbWVcIikgPT0gcmVsYXRpb25zaGlwTmFtZSlcblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXBDbGFzc0RhdGEpIHtcbiAgICAgICAgY29uc3QgbW9kZWxOYW1lID0gZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKVxuICAgICAgICBjb25zdCByZWxhdGlvbnNoaXBzTGlzdCA9IHJlbGF0aW9uc2hpcHMubWFwKChyZWxhdGlvbnNoaXApID0+IHJlbGF0aW9uc2hpcC5uYW1lKS5qb2luKFwiLCBcIilcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHRoZSByZWxhdGlvbiAke3JlbGF0aW9uc2hpcE5hbWV9IG9uIHRoZSAke21vZGVsTmFtZX0gbW9kZWw6ICR7cmVsYXRpb25zaGlwc0xpc3R9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwVHlwZSA9IGRpZ2cocmVsYXRpb25zaGlwQ2xhc3NEYXRhLCBcImNvbGxlY3Rpb25OYW1lXCIpXG5cbiAgICAgIGlmIChyZWxhdGlvbnNoaXBOYW1lIGluIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtyZWxhdGlvbnNoaXBOYW1lfSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZGApXG4gICAgICB9XG5cbiAgICAgIGlmICghcmVsYXRpb25zaGlwQ2xhc3NEYXRhKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcmVsYXRpb25zaGlwIG9uICR7ZGlnZyh0aGlzLm1vZGVsQ2xhc3NEYXRhKCksIFwibmFtZVwiKX0gYnkgdGhhdCBuYW1lOiAke3JlbGF0aW9uc2hpcE5hbWV9YClcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZWxhdGlvbnNoaXBEYXRhKSB7XG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc0NhY2hlW3JlbGF0aW9uc2hpcE5hbWVdID0gbnVsbFxuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV0gPSBudWxsXG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVsYXRpb25zaGlwRGF0YSkpIHtcbiAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwTmFtZV0gPSBbXVxuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV0gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwSWQgb2YgcmVsYXRpb25zaGlwRGF0YSkge1xuICAgICAgICAgIGNvbnN0IG1vZGVsID0gcHJlbG9hZGVkLmdldE1vZGVsKHJlbGF0aW9uc2hpcFR5cGUsIHJlbGF0aW9uc2hpcElkKVxuXG4gICAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBzQ2FjaGVbcmVsYXRpb25zaGlwTmFtZV0ucHVzaChtb2RlbClcbiAgICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV0ucHVzaChtb2RlbClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwcmVsb2FkZWQuZ2V0TW9kZWwocmVsYXRpb25zaGlwVHlwZSwgcmVsYXRpb25zaGlwRGF0YSlcblxuICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcHNDYWNoZVtyZWxhdGlvbnNoaXBOYW1lXSA9IG1vZGVsXG4gICAgICAgIHRoaXMucmVsYXRpb25zaGlwc1tyZWxhdGlvbnNoaXBOYW1lXSA9IG1vZGVsXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8c3RyaW5nfVxuICAgKi9cbiAgcHJpbWFyeUtleSgpIHsgcmV0dXJuIHRoaXMucmVhZEF0dHJpYnV0ZVVuZGVyc2NvcmUodGhpcy5tb2RlbENsYXNzKCkucHJpbWFyeUtleSgpKSB9XG59XG4iXX0=