ng-pli-commons 1.0.135 → 1.0.137

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 (226) hide show
  1. package/esm2022/lib/components/backoffice.commons.component.mjs +41 -0
  2. package/esm2022/lib/components/common.lists.component.mjs +177 -0
  3. package/esm2022/lib/components/configuration-token/configuration-token-subject.service.mjs +23 -0
  4. package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +665 -0
  5. package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +103 -0
  6. package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +108 -0
  7. package/esm2022/lib/components/configuration.commons.component.mjs +41 -0
  8. package/esm2022/lib/components/dashboard.commons.component.mjs +85 -0
  9. package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +131 -0
  10. package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +54 -0
  11. package/esm2022/lib/components/frontoffice.commons.component.mjs +89 -0
  12. package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +162 -0
  13. package/esm2022/lib/components/pdf-config/pdf-config.component.mjs +170 -0
  14. package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +207 -0
  15. package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +307 -0
  16. package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +387 -0
  17. package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +92 -0
  18. package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +199 -0
  19. package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +200 -0
  20. package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +116 -0
  21. package/esm2022/lib/components/token/token.component.mjs +1047 -0
  22. package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +128 -0
  23. package/esm2022/lib/directives/currency-colfuturo-formatter.directive.mjs +48 -0
  24. package/esm2022/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +35 -0
  25. package/esm2022/lib/ng-pli-commons.module.mjs +385 -0
  26. package/esm2022/lib/ng-pli-commons.service.mjs +14 -0
  27. package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +36 -0
  28. package/esm2022/lib/pipes/currency-decimal-colfuturo.pipe.mjs +39 -0
  29. package/esm2022/lib/pipes/currency-print-colfuturo.pipe.mjs +34 -0
  30. package/esm2022/lib/pipes/thousands.pipe.mjs +61 -0
  31. package/esm2022/lib/services/application-fill-percentage.service.mjs +30 -0
  32. package/esm2022/lib/services/application-pdf-form.service.mjs +27 -0
  33. package/esm2022/lib/services/application-tag.service.mjs +56 -0
  34. package/esm2022/lib/services/application.service.mjs +253 -0
  35. package/esm2022/lib/services/assign-task.service.mjs +30 -0
  36. package/esm2022/lib/services/authentication.service.mjs +133 -0
  37. package/esm2022/lib/services/blocked-beneficiary.service.mjs +42 -0
  38. package/esm2022/lib/services/budget-application.service.mjs +265 -0
  39. package/esm2022/lib/services/budget-setup.service.mjs +26 -0
  40. package/esm2022/lib/services/budget-simulation.service.mjs +65 -0
  41. package/esm2022/lib/services/budget.service.mjs +205 -0
  42. package/esm2022/lib/services/closure-wallet.service.mjs +39 -0
  43. package/esm2022/lib/services/cnf-correspondence-document-manager.service.mjs +39 -0
  44. package/esm2022/lib/services/codebtors.service.mjs +28 -0
  45. package/esm2022/lib/services/committee-assistant.service.mjs +55 -0
  46. package/esm2022/lib/services/committee-money.service.mjs +44 -0
  47. package/esm2022/lib/services/committee-pdf.service.mjs +27 -0
  48. package/esm2022/lib/services/committee-snapshot.service.mjs +60 -0
  49. package/esm2022/lib/services/common-info.service.mjs +51 -0
  50. package/esm2022/lib/services/common.service.mjs +285 -0
  51. package/esm2022/lib/services/configuration-document.service.mjs +297 -0
  52. package/esm2022/lib/services/configuration-minisite.service.mjs +26 -0
  53. package/esm2022/lib/services/configuration.service.mjs +53 -0
  54. package/esm2022/lib/services/correspondence-document-category.service.mjs +31 -0
  55. package/esm2022/lib/services/correspondence-manager.service.mjs +74 -0
  56. package/esm2022/lib/services/credit-score.service.mjs +48 -0
  57. package/esm2022/lib/services/credit-study.service.mjs +292 -0
  58. package/esm2022/lib/services/cube.service.mjs +27 -0
  59. package/esm2022/lib/services/data-form-history.service.mjs +25 -0
  60. package/esm2022/lib/services/data-form.service.mjs +176 -0
  61. package/esm2022/lib/services/data-letter-segmentation.service.mjs +64 -0
  62. package/esm2022/lib/services/document-analysis-auto.service.mjs +27 -0
  63. package/esm2022/lib/services/document-history.service.mjs +43 -0
  64. package/esm2022/lib/services/document-management.service.mjs +57 -0
  65. package/esm2022/lib/services/document-process.service.mjs +27 -0
  66. package/esm2022/lib/services/document-validation-attempt.service.mjs +32 -0
  67. package/esm2022/lib/services/document.service.mjs +144 -0
  68. package/esm2022/lib/services/documentary.type.service.mjs +69 -0
  69. package/esm2022/lib/services/email.service.mjs +30 -0
  70. package/esm2022/lib/services/evaluation.service.mjs +181 -0
  71. package/esm2022/lib/services/export-excel.service.mjs +32 -0
  72. package/esm2022/lib/services/file.service.mjs +153 -0
  73. package/esm2022/lib/services/form.service.mjs +112 -0
  74. package/esm2022/lib/services/gic-client-disbursement-metadata.service.mjs +31 -0
  75. package/esm2022/lib/services/gic-client.service.mjs +49 -0
  76. package/esm2022/lib/services/gic-cnf-bankvision-transaction.service.mjs +31 -0
  77. package/esm2022/lib/services/gic-cnf-closing-date.service.mjs +34 -0
  78. package/esm2022/lib/services/gic-cnf-maintenance.service.mjs +30 -0
  79. package/esm2022/lib/services/gic-collection.service.mjs +53 -0
  80. package/esm2022/lib/services/gic-disbursement.service.mjs +39 -0
  81. package/esm2022/lib/services/gic-extract.service.mjs +41 -0
  82. package/esm2022/lib/services/gic-log.service.mjs +41 -0
  83. package/esm2022/lib/services/gic-payment-application.service.mjs +35 -0
  84. package/esm2022/lib/services/gic-payment-plan-cube.service.mjs +27 -0
  85. package/esm2022/lib/services/gic-payment-plan.service.mjs +32 -0
  86. package/esm2022/lib/services/gic-trm.service.mjs +27 -0
  87. package/esm2022/lib/services/global.show.task.service.mjs +37 -0
  88. package/esm2022/lib/services/guarantee-document.service.mjs +52 -0
  89. package/esm2022/lib/services/guarantee-enrollment.service.mjs +37 -0
  90. package/esm2022/lib/services/guarantee.service.mjs +128 -0
  91. package/esm2022/lib/services/guarantees-summary-service.mjs +26 -0
  92. package/esm2022/lib/services/hash.service.mjs +36 -0
  93. package/esm2022/lib/services/import-data.service.mjs +27 -0
  94. package/esm2022/lib/services/import-excel-gic.service.mjs +53 -0
  95. package/esm2022/lib/services/initial-configuration-gic-parameters.service.mjs +51 -0
  96. package/esm2022/lib/services/initial-record.service.mjs +51 -0
  97. package/esm2022/lib/services/integration-ado.service.mjs +54 -0
  98. package/esm2022/lib/services/interaction-application-user.service.mjs +81 -0
  99. package/esm2022/lib/services/interest-adjustment.service.mjs +34 -0
  100. package/esm2022/lib/services/keys-assignation.service.mjs +127 -0
  101. package/esm2022/lib/services/legalization.service.mjs +150 -0
  102. package/esm2022/lib/services/letter-campaing.service.mjs +49 -0
  103. package/esm2022/lib/services/letter-task-mapping.service.mjs +40 -0
  104. package/esm2022/lib/services/log.service.mjs +41 -0
  105. package/esm2022/lib/services/maintenance.service.mjs +86 -0
  106. package/esm2022/lib/services/master-category.service.mjs +66 -0
  107. package/esm2022/lib/services/master-program.service.mjs +78 -0
  108. package/esm2022/lib/services/master-university.service.mjs +79 -0
  109. package/esm2022/lib/services/migration-plis.service.mjs +27 -0
  110. package/esm2022/lib/services/migration-survey-queue.service.mjs +24 -0
  111. package/esm2022/lib/services/openkm-document.service.mjs +27 -0
  112. package/esm2022/lib/services/page.service.mjs +38 -0
  113. package/esm2022/lib/services/partner-system.service.mjs +30 -0
  114. package/esm2022/lib/services/partner.service.mjs +34 -0
  115. package/esm2022/lib/services/pdf-analyzer.service.mjs +33 -0
  116. package/esm2022/lib/services/people-master.service.mjs +42 -0
  117. package/esm2022/lib/services/permission.service.mjs +29 -0
  118. package/esm2022/lib/services/pli-cnf-acuity-fields.service.mjs +34 -0
  119. package/esm2022/lib/services/pli-cnf-app-card-filter.service.mjs +40 -0
  120. package/esm2022/lib/services/pli-cnf-appointment-type.service.mjs +41 -0
  121. package/esm2022/lib/services/pli-cnf-budget-program-type.service.mjs +54 -0
  122. package/esm2022/lib/services/pli-cnf-budget.service.mjs +31 -0
  123. package/esm2022/lib/services/pli-cnf-cloning.service.mjs +27 -0
  124. package/esm2022/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +47 -0
  125. package/esm2022/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +30 -0
  126. package/esm2022/lib/services/pli-cnf-committee-valpro-columns.service.mjs +42 -0
  127. package/esm2022/lib/services/pli-cnf-committee-visualization-mode.service.mjs +42 -0
  128. package/esm2022/lib/services/pli-cnf-committee.service.mjs +66 -0
  129. package/esm2022/lib/services/pli-cnf-config-minisite.service.mjs +90 -0
  130. package/esm2022/lib/services/pli-cnf-configuration-credit-study.service.mjs +41 -0
  131. package/esm2022/lib/services/pli-cnf-document-management.service.mjs +40 -0
  132. package/esm2022/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +52 -0
  133. package/esm2022/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +31 -0
  134. package/esm2022/lib/services/pli-cnf-evaluation-task-template.service.mjs +39 -0
  135. package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +112 -0
  136. package/esm2022/lib/services/pli-cnf-evaluation-template.service.mjs +95 -0
  137. package/esm2022/lib/services/pli-cnf-form-edit.service.mjs +68 -0
  138. package/esm2022/lib/services/pli-cnf-form-multiaplicacion.service.mjs +46 -0
  139. package/esm2022/lib/services/pli-cnf-guarantee-documents-template.service.mjs +40 -0
  140. package/esm2022/lib/services/pli-cnf-guarantee-token.service.mjs +42 -0
  141. package/esm2022/lib/services/pli-cnf-header.service.mjs +39 -0
  142. package/esm2022/lib/services/pli-cnf-indicator.service.mjs +39 -0
  143. package/esm2022/lib/services/pli-cnf-information-system.service.mjs +24 -0
  144. package/esm2022/lib/services/pli-cnf-interaction.service.mjs +78 -0
  145. package/esm2022/lib/services/pli-cnf-letter-template-type.service.mjs +29 -0
  146. package/esm2022/lib/services/pli-cnf-letter-template.service.mjs +48 -0
  147. package/esm2022/lib/services/pli-cnf-look-and-feel.service.mjs +28 -0
  148. package/esm2022/lib/services/pli-cnf-mail.service.mjs +30 -0
  149. package/esm2022/lib/services/pli-cnf-menu-form.service.mjs +34 -0
  150. package/esm2022/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +34 -0
  151. package/esm2022/lib/services/pli-cnf-migration-plis-field.service.mjs +47 -0
  152. package/esm2022/lib/services/pli-cnf-migration-status-plis.service.mjs +44 -0
  153. package/esm2022/lib/services/pli-cnf-page-section-form.service.mjs +66 -0
  154. package/esm2022/lib/services/pli-cnf-page-sub-process.service.mjs +25 -0
  155. package/esm2022/lib/services/pli-cnf-pdfs.service.mjs +31 -0
  156. package/esm2022/lib/services/pli-cnf-profile-form.service.mjs +40 -0
  157. package/esm2022/lib/services/pli-cnf-profile-user.service.mjs +49 -0
  158. package/esm2022/lib/services/pli-cnf-project-summary.service.mjs +39 -0
  159. package/esm2022/lib/services/pli-cnf-scenario.service.mjs +47 -0
  160. package/esm2022/lib/services/pli-cnf-segmentation.service.mjs +72 -0
  161. package/esm2022/lib/services/pli-cnf-snapshot-token.service.mjs +42 -0
  162. package/esm2022/lib/services/pli-cnf-status-flow-interaction.service.mjs +74 -0
  163. package/esm2022/lib/services/pli-cnf-status-flow.service.mjs +56 -0
  164. package/esm2022/lib/services/pli-cnf-support-document-category.service.mjs +47 -0
  165. package/esm2022/lib/services/pli-cnf-support-document.service.mjs +56 -0
  166. package/esm2022/lib/services/pli-cnf-survey-document.service.mjs +37 -0
  167. package/esm2022/lib/services/pli-cnf-survey-pdf.service.mjs +34 -0
  168. package/esm2022/lib/services/pli-cnf-survey.service.mjs +46 -0
  169. package/esm2022/lib/services/pli-cnf-task-group.service.mjs +33 -0
  170. package/esm2022/lib/services/pli-cnf-text-category.service.mjs +38 -0
  171. package/esm2022/lib/services/pli-cnf-text-option.service.mjs +39 -0
  172. package/esm2022/lib/services/pli-cnf-text.service.mjs +62 -0
  173. package/esm2022/lib/services/pli-cnf-type-text.service.mjs +45 -0
  174. package/esm2022/lib/services/pli-cnf-university-article.service.mjs +39 -0
  175. package/esm2022/lib/services/pli-cnf-user-calendar.service.mjs +36 -0
  176. package/esm2022/lib/services/pli-cnf-user-workspace.service.mjs +35 -0
  177. package/esm2022/lib/services/pli-cnf-valpro-keys.service.mjs +35 -0
  178. package/esm2022/lib/services/pli-cnf-workspace-segmentation.service.mjs +31 -0
  179. package/esm2022/lib/services/pli-message-type.service.mjs +40 -0
  180. package/esm2022/lib/services/pli-multiple-value-filter.service.mjs +39 -0
  181. package/esm2022/lib/services/pli-promocion-username.service.mjs +57 -0
  182. package/esm2022/lib/services/pli-seg-action-user.service.mjs +37 -0
  183. package/esm2022/lib/services/pli-segmentation.service.mjs +130 -0
  184. package/esm2022/lib/services/pli-tag-assignment.service.mjs +36 -0
  185. package/esm2022/lib/services/pli-tag.service.mjs +55 -0
  186. package/esm2022/lib/services/pli-user.service.mjs +51 -0
  187. package/esm2022/lib/services/plis-beneficiario.service.mjs +29 -0
  188. package/esm2022/lib/services/plis-estatus-change.service.mjs +30 -0
  189. package/esm2022/lib/services/post-selection.service.mjs +25 -0
  190. package/esm2022/lib/services/ppp.service.mjs +360 -0
  191. package/esm2022/lib/services/profile.service.mjs +60 -0
  192. package/esm2022/lib/services/progress-bar.service.mjs +40 -0
  193. package/esm2022/lib/services/promotion-score.service.mjs +44 -0
  194. package/esm2022/lib/services/registry-identifier.service.mjs +49 -0
  195. package/esm2022/lib/services/return-refund.service.mjs +53 -0
  196. package/esm2022/lib/services/segmentation-tokens.service.mjs +43 -0
  197. package/esm2022/lib/services/segmentation-user-service.service.mjs +94 -0
  198. package/esm2022/lib/services/segmentation.service.mjs +31 -0
  199. package/esm2022/lib/services/send-application.service.mjs +541 -0
  200. package/esm2022/lib/services/sesion-form.service.mjs +31 -0
  201. package/esm2022/lib/services/sesion.service.mjs +48 -0
  202. package/esm2022/lib/services/spinner.service.mjs +16 -0
  203. package/esm2022/lib/services/sponsorship-letter.service.mjs +68 -0
  204. package/esm2022/lib/services/status.service.mjs +104 -0
  205. package/esm2022/lib/services/summary-budget.service.mjs +24 -0
  206. package/esm2022/lib/services/survey-metadata.service.mjs +28 -0
  207. package/esm2022/lib/services/survey-queue.service.mjs +24 -0
  208. package/esm2022/lib/services/survey.service.mjs +52 -0
  209. package/esm2022/lib/services/tag-management.service.mjs +58 -0
  210. package/esm2022/lib/services/tasa.cambio.service.mjs +35 -0
  211. package/esm2022/lib/services/token-transformation.service.mjs +62 -0
  212. package/esm2022/lib/services/token.service.mjs +1477 -0
  213. package/esm2022/lib/services/university.service.mjs +50 -0
  214. package/esm2022/lib/services/upload-documents.service.mjs +60 -0
  215. package/esm2022/lib/services/user.service.mjs +28 -0
  216. package/esm2022/lib/services/visualization-committee.service.mjs +91 -0
  217. package/esm2022/lib/utils/custom-validator.mjs +95 -0
  218. package/esm2022/lib/utils/form-util.mjs +35 -0
  219. package/esm2022/lib/utils/formio-util.mjs +582 -0
  220. package/esm2022/lib/utils/version-commons.mjs +10 -0
  221. package/esm2022/ng-pli-commons.mjs +5 -0
  222. package/esm2022/public-api.mjs +226 -0
  223. package/esm2022/version.mjs +29 -0
  224. package/fesm2022/ng-pli-commons.mjs +657 -657
  225. package/fesm2022/ng-pli-commons.mjs.map +1 -1
  226. package/package.json +3 -1
@@ -0,0 +1,582 @@
1
+ // import * as utils_ from 'formiojs-proyectoscolfuturo/utils/utils';
2
+ import * as utils_ from 'formiojs-colfuturo/utils';
3
+ import { TokenService } from '../services/token.service';
4
+ import { EFormioKey } from 'ng-pli-util';
5
+ const utils = utils_;
6
+ export class FormioUtil {
7
+ /**
8
+ * It returns the components formated by panel
9
+ * @param components
10
+ * @return the object is [{panel: , items: [{ value: , label: }]}]
11
+ */
12
+ static getFormattedComponentsByPanel(components) {
13
+ let result = [];
14
+ if (components) {
15
+ let group = null;
16
+ let object = null;
17
+ for (const component of components) {
18
+ if (component[EFormioKey.TITLE_PANEL] !== group) {
19
+ if (group !== null) {
20
+ result.push(object);
21
+ }
22
+ object = { label: component[EFormioKey.TITLE_PANEL], items: [], toggle: false };
23
+ group = component[EFormioKey.TITLE_PANEL];
24
+ }
25
+ object.items.push({
26
+ label: component[EFormioKey.LABEL],
27
+ value: component[EFormioKey.KEY]
28
+ });
29
+ }
30
+ if (group !== null)
31
+ result.push(object);
32
+ }
33
+ return result;
34
+ }
35
+ static getSelectBoxes(selectBoxe) {
36
+ var istrue = false;
37
+ if (selectBoxe != undefined && selectBoxe != null && typeof selectBoxe === 'object') {
38
+ let dataHasTrue = Object.values(selectBoxe);
39
+ dataHasTrue.forEach(function (value) {
40
+ if (typeof value === 'boolean' && value) {
41
+ istrue = value;
42
+ return value;
43
+ }
44
+ });
45
+ }
46
+ // Expected output: Array ["somestring", 42, false]
47
+ return istrue;
48
+ }
49
+ /**
50
+ * It returns the components are required according with data
51
+ * @param components array of components
52
+ * @param data
53
+ */
54
+ static getRequiredComponentsByData(components, data) {
55
+ // get the required components
56
+ let array = FormioUtil.getRequiredComponents(components);
57
+ // if not data then return components
58
+ if (data && array) {
59
+ for (let i = 0; i < array.length; i++) {
60
+ const component = array[i];
61
+ // use formio to check condition according with data
62
+ if (utils.Utils.checkCondition(component, null, data, null, null)) {
63
+ const key = component[EFormioKey.KEY];
64
+ if (Array.isArray(data[key]) && data[key].length > 0) {
65
+ // remove item from array
66
+ array.splice(i, 1);
67
+ i--;
68
+ }
69
+ else if (typeof data[key] === 'object' &&
70
+ !Object.prototype.hasOwnProperty.call(data[key], 'formatted_address') &&
71
+ !Object.prototype.hasOwnProperty.call(data[key], 'callingCodes') &&
72
+ !Object.prototype.hasOwnProperty.call(data[key], 'nativeName') &&
73
+ !Object.prototype.hasOwnProperty.call(data[key], 'original_name') &&
74
+ !Object.prototype.hasOwnProperty.call(data[key], 'fullName') &&
75
+ !Object.prototype.hasOwnProperty.call(data[key], 'fullname') &&
76
+ FormioUtil.getSelectBoxes(data[key])) {
77
+ // remove item from array
78
+ array.splice(i, 1);
79
+ i--;
80
+ }
81
+ else if (typeof data[key] === 'object' &&
82
+ !Object.prototype.hasOwnProperty.call(data[key], 'formatted_address') &&
83
+ !Object.prototype.hasOwnProperty.call(data[key], 'callingCodes') &&
84
+ !Object.prototype.hasOwnProperty.call(data[key], 'nativeName') &&
85
+ !Object.prototype.hasOwnProperty.call(data[key], 'original_name') &&
86
+ !Object.prototype.hasOwnProperty.call(data[key], 'fullName') &&
87
+ !Object.prototype.hasOwnProperty.call(data[key], 'fullname') &&
88
+ !FormioUtil.getSelectBoxes(data[key])) {
89
+ }
90
+ else if (data[key] != undefined && data[key] != null && data[key] != '') {
91
+ // remove item from array
92
+ array.splice(i, 1);
93
+ i--;
94
+ }
95
+ else {
96
+ if (component.customConditional &&
97
+ component.customConditional.includes('show')) {
98
+ // remove item from array
99
+ array.splice(i, 1);
100
+ i--;
101
+ }
102
+ }
103
+ }
104
+ else {
105
+ // remove item from array
106
+ array.splice(i, 1);
107
+ i--;
108
+ }
109
+ }
110
+ }
111
+ return array;
112
+ }
113
+ /**
114
+ * It returns the components that are required
115
+ * @param components array of components
116
+ */
117
+ static getUniqueComponents(components) {
118
+ return FormioUtil.getComponentsByFeature(components, [EFormioKey.UNIQUE], true);
119
+ }
120
+ /**
121
+ * It returns the components that are required
122
+ * @param components array of components
123
+ */
124
+ static getRequiredComponents(components) {
125
+ return FormioUtil.getComponentsByFeature(components, [EFormioKey.VALIDATE, EFormioKey.REQUIRED], true);
126
+ }
127
+ /**
128
+ * It returns the components that have a specific feature defined by properties and value
129
+ * @param components array of components
130
+ * @param properties path of properties example [validate, required] or [unique]
131
+ * @param value the value that should have the property
132
+ */
133
+ static getComponentsByFeature(components, properties, value) {
134
+ let result = [];
135
+ if (properties && properties.length > 0) {
136
+ // get components
137
+ const fields = FormioUtil.getComponents(components);
138
+ // get first and last property
139
+ const firstProperty = properties[0];
140
+ const lastProperty = properties[properties.length - 1];
141
+ if (fields) {
142
+ // iterate the fields
143
+ for (let i = 0; i < fields.length; i++) {
144
+ // it contains the entire object field
145
+ const field = fields[i];
146
+ // it contains the current component and it is gonna be the component of every property
147
+ let component = field;
148
+ if (field[firstProperty]) {
149
+ for (let j = 0; j < properties.length; j++) {
150
+ const property = properties[j];
151
+ // if component.property doesnt exist then break
152
+ if (!component[property])
153
+ break;
154
+ if (property === lastProperty) {
155
+ // it is the last property so if the value is equals to component.lastproperty then it is added to result
156
+ if (component[property] == value)
157
+ result.push(field);
158
+ }
159
+ else {
160
+ // otherwise component will be equal to the component.property
161
+ component = component[property];
162
+ }
163
+ }
164
+ }
165
+ }
166
+ }
167
+ }
168
+ return result;
169
+ }
170
+ /**
171
+ * It returns the components
172
+ * @param components
173
+ */
174
+ static getComponents(components) {
175
+ return FormioUtil.getComponentsByRecursion(components, '', null);
176
+ }
177
+ /**
178
+ * It returns the components array of the form by recursion
179
+ * @param components array of components
180
+ * @param titlePanel name of parent panel, so children components will inherit the panelName
181
+ * @param conditionalObject conditional object it will be inherited from panel {conditional: { eq: , value: , when: , json: }, customConditional: }
182
+ */
183
+ static getComponentsByRecursion(components, titlePanel, conditionalParent) {
184
+ // it contains the result array
185
+ let result = [];
186
+ if (components) {
187
+ // iterate over components
188
+ for (const component of components) {
189
+ // avoid the editgrid component ot if it has a different behavior it should have an else statement
190
+ if (component[EFormioKey.TYPE] !== EFormioKey.EDITGRID) {
191
+ // if component is panel then titlePanel variable is changed, and it is gonna be inherited
192
+ if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
193
+ titlePanel = component[EFormioKey.TITLE];
194
+ }
195
+ if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
196
+ typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
197
+ (typeof component[EFormioKey.TYPE] == 'undefined' ||
198
+ component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
199
+ if (component['type'] !== 'address') {
200
+ // resolve conditional parent conditional
201
+ const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
202
+ // change condition
203
+ if (conditional)
204
+ conditionalParent = conditional;
205
+ // it contains the subcomponents depending on the value of component if it has components or columns
206
+ let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
207
+ ? component[EFormioKey.COMPONENTS]
208
+ : component[EFormioKey.COLUMNS];
209
+ // if component has subComponents, then execute the recursion function to get the recursionnResult
210
+ const recursionResult = FormioUtil.getComponentsByRecursion(subComponents, titlePanel, conditionalParent);
211
+ // if recursion result then result concats the recursionResult
212
+ if (recursionResult)
213
+ result = result.concat(recursionResult);
214
+ // reset conditional Parent
215
+ if (component[EFormioKey.ID] == conditionalParent.id)
216
+ conditionalParent = undefined;
217
+ }
218
+ else {
219
+ result.push(component);
220
+ }
221
+ }
222
+ else {
223
+ // avoid the component type button
224
+ if (component[EFormioKey.TYPE] !== EFormioKey.BUTTON &&
225
+ component[EFormioKey.KEY] &&
226
+ component[EFormioKey.LABEL]) {
227
+ // resolve conditional conditional object
228
+ let conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
229
+ if (!conditional)
230
+ conditional = conditionalParent;
231
+ component[EFormioKey.CONDITIONAL] = conditional[EFormioKey.CONDITIONAL];
232
+ component[EFormioKey.CUSTOM_CONDITIONAL] =
233
+ conditional[EFormioKey.CUSTOM_CONDITIONAL];
234
+ // add namPanel as property
235
+ component[EFormioKey.TITLE_PANEL] = titlePanel;
236
+ // add component to the result
237
+ result.push(component);
238
+ }
239
+ }
240
+ }
241
+ else if (component[EFormioKey.TYPE] === EFormioKey.EDITGRID) {
242
+ if (component.validate.required) {
243
+ result.push(component);
244
+ }
245
+ }
246
+ }
247
+ }
248
+ return result;
249
+ }
250
+ /**
251
+ * It returns the components
252
+ * @param components
253
+ * @param keepEditGrids
254
+ */
255
+ static getComponentsWithEditGrids(components) {
256
+ return FormioUtil.getComponentsByRecursionWithEditGrids(components, '', null);
257
+ }
258
+ /**
259
+ * It returns the components array of the form by recursion
260
+ * @param components array of components
261
+ * @param titlePanel name of parent panel, so children components will inherit the panelName
262
+ * @param conditionalObject conditional object it will be inherited from panel {conditional: { eq: , value: , when: , json: }, customConditional: }
263
+ */
264
+ static getComponentsByRecursionWithEditGrids(components, titlePanel, conditionalParent) {
265
+ // it contains the result array
266
+ let result = [];
267
+ if (components) {
268
+ // iterate over components
269
+ for (const component of components) {
270
+ // avoid the editgrid component ot if it has a different behavior it should have an else statement
271
+ // if component is panel then titlePanel variable is changed, and it is gonna be inherited
272
+ if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
273
+ titlePanel = component[EFormioKey.TITLE];
274
+ }
275
+ if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
276
+ typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
277
+ (typeof component[EFormioKey.TYPE] == 'undefined' ||
278
+ component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
279
+ // resolve conditional parent conditional
280
+ const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
281
+ // change condition
282
+ if (conditional)
283
+ conditionalParent = conditional;
284
+ // it contains the subcomponents depending on the value of component if it has components or columns
285
+ let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
286
+ ? component[EFormioKey.COMPONENTS]
287
+ : component[EFormioKey.COLUMNS];
288
+ if (component[EFormioKey.TYPE] === EFormioKey.EDITGRID) {
289
+ component[EFormioKey.TITLE_PANEL] = titlePanel;
290
+ result.push(component);
291
+ }
292
+ // if component has subComponents, then execute the recursion function to get the recursionnResult
293
+ const recursionResult = FormioUtil.getComponentsByRecursionWithEditGrids(subComponents, titlePanel, conditionalParent);
294
+ // if recursion result then result concats the recursionResult
295
+ if (recursionResult)
296
+ result = result.concat(recursionResult);
297
+ // reset conditional Parent
298
+ if (component[EFormioKey.ID] == conditionalParent.id)
299
+ conditionalParent = undefined;
300
+ }
301
+ else {
302
+ // avoid the component type button
303
+ if (component[EFormioKey.TYPE] !== EFormioKey.BUTTON &&
304
+ component[EFormioKey.KEY] &&
305
+ component[EFormioKey.LABEL]) {
306
+ // resolve conditional conditional object
307
+ let conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
308
+ if (!conditional)
309
+ conditional = conditionalParent;
310
+ component[EFormioKey.CONDITIONAL] = conditional[EFormioKey.CONDITIONAL];
311
+ component[EFormioKey.CUSTOM_CONDITIONAL] =
312
+ conditional[EFormioKey.CUSTOM_CONDITIONAL];
313
+ // add namPanel as property
314
+ component[EFormioKey.TITLE_PANEL] = titlePanel;
315
+ // add component to the result
316
+ result.push(component);
317
+ }
318
+ }
319
+ }
320
+ }
321
+ return result;
322
+ }
323
+ /**
324
+ * It resolve the inheritance conditional
325
+ * @param conditionalObject
326
+ * @param conditional
327
+ * @param customConditional
328
+ */
329
+ static resolveInheritanceConditional(conditionalObject, conditional, customConditional, parentId) {
330
+ // validate if there is a condition with the new fields
331
+ if (!conditionalObject ||
332
+ customConditional ||
333
+ (conditional && conditional[EFormioKey.WHEN] && conditional[EFormioKey.EQ]) ||
334
+ (conditional && conditional[EFormioKey.JSON])) {
335
+ return { conditional: conditional, customConditional: customConditional, id: parentId };
336
+ }
337
+ return null;
338
+ }
339
+ /**
340
+ * It returns the edit grid components
341
+ * @param components
342
+ */
343
+ static getEditGridKeyLabels(components) {
344
+ return FormioUtil.getEditGridKeyLabelsByRecursion(components, '', null);
345
+ }
346
+ /**
347
+ * It returns the components edit grid array of the form by recursion
348
+ * @param components array of components
349
+ * @param titlePanel name of parent panel, so children components will inherit the panelName
350
+ * @param conditionalObject conditional object it will be inherited from panel {conditional: { eq: , value: , when: , json: }, customConditional: }
351
+ */
352
+ static getEditGridKeyLabelsByRecursion(components, titlePanel, conditionalParent) {
353
+ // it contains the result array
354
+ let result = [];
355
+ if (components) {
356
+ // iterate over components
357
+ for (const component of components) {
358
+ // if component is panel then titlePanel variable is changed, and it is gonna be inherited
359
+ if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
360
+ titlePanel = component[EFormioKey.TITLE];
361
+ }
362
+ if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
363
+ typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
364
+ (typeof component[EFormioKey.TYPE] == 'undefined' ||
365
+ component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
366
+ // resolve conditional parent conditional
367
+ const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
368
+ // change condition
369
+ if (conditional)
370
+ conditionalParent = conditional;
371
+ // it contains the subcomponents depending on the value of component if it has components or columns
372
+ let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
373
+ ? component[EFormioKey.COMPONENTS]
374
+ : component[EFormioKey.COLUMNS];
375
+ if (component[EFormioKey.TYPE] == EFormioKey.EDITGRID) {
376
+ // add namPanel as property
377
+ component[EFormioKey.TITLE_PANEL] = titlePanel;
378
+ // add component to the result
379
+ result.push(component);
380
+ }
381
+ else {
382
+ // if component has subComponents, then execute the recursion function to get the recursionnResult
383
+ const recursionResult = FormioUtil.getEditGridKeyLabelsByRecursion(subComponents, titlePanel, conditionalParent);
384
+ // if recursion result then result concats the recursionResult
385
+ if (recursionResult)
386
+ result = result.concat(recursionResult);
387
+ // reset conditional Parent
388
+ if (component[EFormioKey.ID] == conditionalParent.id)
389
+ conditionalParent = undefined;
390
+ }
391
+ }
392
+ else {
393
+ }
394
+ }
395
+ }
396
+ return result;
397
+ }
398
+ /**
399
+ * It returns the components
400
+ * @param components
401
+ * @param keepEditGrids
402
+ */
403
+ static getComponentsIntoEditGrids(components, editGridName) {
404
+ return FormioUtil.getComponentsByRecursionIntoEditGrids(components, '', null, editGridName, false);
405
+ }
406
+ /**
407
+ * It returns the components array of the form by recursion
408
+ * @param components array of components
409
+ * @param titlePanel name of parent panel, so children components will inherit the panelName
410
+ * @param conditionalObject conditional object it will be inherited from panel {conditional: { eq: , value: , when: , json: }, customConditional: }
411
+ */
412
+ static getComponentsByRecursionIntoEditGrids(components, titlePanel, conditionalParent, editGridName, existEditGrid) {
413
+ // it contains the result array
414
+ let result = [];
415
+ if (components) {
416
+ // iterate over components
417
+ for (const component of components) {
418
+ // avoid the editgrid component ot if it has a different behavior it should have an else statement
419
+ // if component is panel then titlePanel variable is changed, and it is gonna be inherited
420
+ if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
421
+ titlePanel = component[EFormioKey.TITLE];
422
+ }
423
+ if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
424
+ typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
425
+ (typeof component[EFormioKey.TYPE] == 'undefined' ||
426
+ component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
427
+ // resolve conditional parent conditional
428
+ const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
429
+ // change condition
430
+ if (conditional)
431
+ conditionalParent = conditional;
432
+ // it contains the subcomponents depending on the value of component if it has components or columns
433
+ let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
434
+ ? component[EFormioKey.COMPONENTS]
435
+ : component[EFormioKey.COLUMNS];
436
+ if (component[EFormioKey.TYPE] === EFormioKey.EDITGRID &&
437
+ component['key'] == editGridName) {
438
+ existEditGrid = true;
439
+ if ((typeof component[EFormioKey.COMPONENTS] !== 'undefined' ||
440
+ typeof component[EFormioKey.COLUMNS] !== 'undefined') &&
441
+ (typeof component[EFormioKey.TYPE] == 'undefined' ||
442
+ component[EFormioKey.TYPE] !== EFormioKey.TYPE_ADDRESS)) {
443
+ // resolve conditional parent conditional
444
+ const conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
445
+ // change condition
446
+ if (conditional)
447
+ conditionalParent = conditional;
448
+ // it contains the subcomponents depending on the value of component if it has components or columns
449
+ let subComponents = typeof component[EFormioKey.COMPONENTS] !== 'undefined'
450
+ ? component[EFormioKey.COMPONENTS]
451
+ : component[EFormioKey.COLUMNS];
452
+ // if component has subComponents, then execute the recursion function to get the recursionnResult
453
+ const recursionResult = FormioUtil.getComponentsByRecursionIntoEditGrids(subComponents, titlePanel, conditionalParent, editGridName, existEditGrid);
454
+ // if recursion result then result concats the recursionResult
455
+ if (recursionResult)
456
+ result = result.concat(recursionResult);
457
+ // reset conditional Parent
458
+ if (component && conditionalParent) {
459
+ if (component[EFormioKey.ID] == conditionalParent.id)
460
+ conditionalParent = undefined;
461
+ }
462
+ }
463
+ else {
464
+ // avoid the component type button
465
+ if (component[EFormioKey.TYPE] !== EFormioKey.BUTTON &&
466
+ component[EFormioKey.KEY] &&
467
+ component[EFormioKey.LABEL] &&
468
+ existEditGrid) {
469
+ // resolve conditional conditional object
470
+ let conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
471
+ if (!conditional)
472
+ conditional = conditionalParent;
473
+ component[EFormioKey.CONDITIONAL] =
474
+ conditional[EFormioKey.CONDITIONAL];
475
+ component[EFormioKey.CUSTOM_CONDITIONAL] =
476
+ conditional[EFormioKey.CUSTOM_CONDITIONAL];
477
+ // add namPanel as property
478
+ component[EFormioKey.TITLE_PANEL] = titlePanel;
479
+ // add component to the result
480
+ result.push(component);
481
+ }
482
+ }
483
+ }
484
+ // if component has subComponents, then execute the recursion function to get the recursionnResult
485
+ const recursionResult = FormioUtil.getComponentsByRecursionIntoEditGrids(subComponents, titlePanel, conditionalParent, editGridName, existEditGrid);
486
+ // if recursion result then result concats the recursionResult
487
+ if (recursionResult)
488
+ result = result.concat(recursionResult);
489
+ // reset conditional Parent
490
+ if (component && conditionalParent) {
491
+ if (component[EFormioKey.ID] == conditionalParent.id)
492
+ conditionalParent = undefined;
493
+ }
494
+ }
495
+ else {
496
+ // avoid the component type button
497
+ if (component[EFormioKey.TYPE] !== EFormioKey.BUTTON &&
498
+ component[EFormioKey.KEY] &&
499
+ component[EFormioKey.LABEL] &&
500
+ existEditGrid) {
501
+ // resolve conditional conditional object
502
+ let conditional = this.resolveInheritanceConditional(conditionalParent, component[EFormioKey.CONDITIONAL], component[EFormioKey.CUSTOM_CONDITIONAL], component[EFormioKey.ID]);
503
+ if (!conditional)
504
+ conditional = conditionalParent;
505
+ component[EFormioKey.CONDITIONAL] = conditional[EFormioKey.CONDITIONAL];
506
+ component[EFormioKey.CUSTOM_CONDITIONAL] =
507
+ conditional[EFormioKey.CUSTOM_CONDITIONAL];
508
+ // add namPanel as property
509
+ component[EFormioKey.TITLE_PANEL] = titlePanel;
510
+ // add component to the result
511
+ result.push(component);
512
+ }
513
+ }
514
+ }
515
+ }
516
+ return result;
517
+ }
518
+ /**
519
+ * Create 2 jason objects of data form by component key and other by component key and title form key
520
+ * @param dataForm dataForm model object
521
+ * @returns Object of 2 element
522
+ */
523
+ static createListDataByDataFormList(dataForm, listForm) {
524
+ let listData = {};
525
+ let listDataByForm = {};
526
+ if (dataForm && dataForm.length > 0) {
527
+ listData = {};
528
+ listDataByForm = {};
529
+ let dForm;
530
+ for (dForm of dataForm) {
531
+ if (!dForm.data) {
532
+ continue;
533
+ }
534
+ const form = listForm.find(function (formTmp) {
535
+ return formTmp.id == dForm.formId;
536
+ });
537
+ if (!form) {
538
+ //console.error('No se encontró el formulario con id ' + dForm.formId);
539
+ continue;
540
+ }
541
+ const keyFormTitle = TokenService.getKeyFormulario(form.title) + '_';
542
+ for (const key in dForm.data) {
543
+ listData[key] = dForm.data[key];
544
+ listDataByForm[keyFormTitle + key] = dForm.data[key];
545
+ }
546
+ }
547
+ }
548
+ return {
549
+ listData: listData,
550
+ listDataByForm: listDataByForm
551
+ };
552
+ }
553
+ /**
554
+ * It returns the components
555
+ * @param components
556
+ */
557
+ static getPanelComponents(components) {
558
+ return FormioUtil.getComponentsByPanel(components);
559
+ }
560
+ /**
561
+ * It returns the components array of the form
562
+ * @param components array of components
563
+ */
564
+ static getComponentsByPanel(components) {
565
+ // it contains the result array
566
+ let result = [];
567
+ if (components) {
568
+ // iterate over components
569
+ for (const component of components) {
570
+ // avoid the editgrid component ot if it has a different behavior it should have an else statement
571
+ if (component[EFormioKey.TYPE] !== EFormioKey.EDITGRID) {
572
+ // if component is panel then titlePanel variable is changed, and it is gonna be inherited
573
+ if (component[EFormioKey.TYPE] === EFormioKey.PANEL) {
574
+ result.push(component);
575
+ }
576
+ }
577
+ }
578
+ }
579
+ return result;
580
+ }
581
+ }
582
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWlvLXV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wbGktY29tbW9ucy9zcmMvbGliL3V0aWxzL2Zvcm1pby11dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFFQUFxRTtBQUNyRSxPQUFPLEtBQUssTUFBTSxNQUFNLDBCQUEwQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUVyQixNQUFNLE9BQU8sVUFBVTtJQUN0Qjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLDZCQUE2QixDQUFDLFVBQVU7UUFDOUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksVUFBVSxFQUFFLENBQUM7WUFDaEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztZQUNsQixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNwQyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQ2pELElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO3dCQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNyQixDQUFDO29CQUNELE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO29CQUNoRixLQUFLLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDM0MsQ0FBQztnQkFDRCxNQUFNLENBQUMsS0FBSyxD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QUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxVQUFpQjtRQUMxQyxPQUFPLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssTUFBTSxDQUFDLG9CQUFvQixDQUFDLFVBQWlCO1FBQ3BELCtCQUErQjtRQUMvQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQiwwQkFBMEI7WUFDMUIsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDcEMsa0dBQWtHO2dCQUNsRyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN4RCwwRkFBMEY7b0JBQzFGLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3hCLENBQUM7Z0JBQ0YsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgKiBhcyB1dGlsc18gZnJvbSAnZm9ybWlvanMtcHJveWVjdG9zY29sZnV0dXJvL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0ICogYXMgdXRpbHNfIGZyb20gJ2Zvcm1pb2pzLWNvbGZ1dHVyby91dGlscyc7XHJcbmltcG9ydCB7IElmU3RtdCB9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcclxuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdG9rZW4uc2VydmljZSc7XHJcbmltcG9ydCB7IEVGb3JtaW9LZXkgfSBmcm9tICduZy1wbGktdXRpbCc7XHJcbmNvbnN0IHV0aWxzID0gdXRpbHNfO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZvcm1pb1V0aWwge1xyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHMgZm9ybWF0ZWQgYnkgcGFuZWxcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50c1xyXG5cdCAqIEByZXR1cm4gdGhlIG9iamVjdCBpcyBbe3BhbmVsOiAsIGl0ZW1zOiBbeyB2YWx1ZTogLCBsYWJlbDogfV19XVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRGb3JtYXR0ZWRDb21wb25lbnRzQnlQYW5lbChjb21wb25lbnRzKTogYW55W10ge1xyXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xyXG5cdFx0aWYgKGNvbXBvbmVudHMpIHtcclxuXHRcdFx0bGV0IGdyb3VwID0gbnVsbDtcclxuXHRcdFx0bGV0IG9iamVjdCA9IG51bGw7XHJcblx0XHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVfUEFORUxdICE9PSBncm91cCkge1xyXG5cdFx0XHRcdFx0aWYgKGdyb3VwICE9PSBudWxsKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKG9iamVjdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRvYmplY3QgPSB7IGxhYmVsOiBjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV9QQU5FTF0sIGl0ZW1zOiBbXSwgdG9nZ2xlOiBmYWxzZSB9O1xyXG5cdFx0XHRcdFx0Z3JvdXAgPSBjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV9QQU5FTF07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdG9iamVjdC5pdGVtcy5wdXNoKHtcclxuXHRcdFx0XHRcdGxhYmVsOiBjb21wb25lbnRbRUZvcm1pb0tleS5MQUJFTF0sXHJcblx0XHRcdFx0XHR2YWx1ZTogY29tcG9uZW50W0VGb3JtaW9LZXkuS0VZXVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChncm91cCAhPT0gbnVsbCkgcmVzdWx0LnB1c2gob2JqZWN0KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cdHN0YXRpYyBnZXRTZWxlY3RCb3hlcyhzZWxlY3RCb3hlKSB7XHJcblx0XHR2YXIgaXN0cnVlID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKHNlbGVjdEJveGUgIT0gdW5kZWZpbmVkICYmIHNlbGVjdEJveGUgIT0gbnVsbCAmJiB0eXBlb2Ygc2VsZWN0Qm94ZSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0bGV0IGRhdGFIYXNUcnVlID0gT2JqZWN0LnZhbHVlcyhzZWxlY3RCb3hlKTtcclxuXHJcblx0XHRcdGRhdGFIYXNUcnVlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XHJcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XHJcblx0XHRcdFx0XHRpc3RydWUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEV4cGVjdGVkIG91dHB1dDogQXJyYXkgW1wic29tZXN0cmluZ1wiLCA0MiwgZmFsc2VdXHJcblxyXG5cdFx0cmV0dXJuIGlzdHJ1ZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHMgYXJlIHJlcXVpcmVkIGFjY29yZGluZyB3aXRoIGRhdGFcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50cyBhcnJheSBvZiBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIGRhdGFcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0UmVxdWlyZWRDb21wb25lbnRzQnlEYXRhKGNvbXBvbmVudHMsIGRhdGEpIHtcclxuXHRcdC8vIGdldCB0aGUgcmVxdWlyZWQgY29tcG9uZW50c1xyXG5cclxuXHRcdGxldCBhcnJheSA9IEZvcm1pb1V0aWwuZ2V0UmVxdWlyZWRDb21wb25lbnRzKGNvbXBvbmVudHMpO1xyXG5cclxuXHRcdC8vIGlmIG5vdCBkYXRhIHRoZW4gcmV0dXJuIGNvbXBvbmVudHNcclxuXHRcdGlmIChkYXRhICYmIGFycmF5KSB7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRjb25zdCBjb21wb25lbnQgPSBhcnJheVtpXTtcclxuXHRcdFx0XHQvLyB1c2UgZm9ybWlvIHRvIGNoZWNrIGNvbmRpdGlvbiBhY2NvcmRpbmcgd2l0aCBkYXRhXHJcblx0XHRcdFx0aWYgKHV0aWxzLlV0aWxzLmNoZWNrQ29uZGl0aW9uKGNvbXBvbmVudCwgbnVsbCwgZGF0YSwgbnVsbCwgbnVsbCkpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGtleSA9IGNvbXBvbmVudFtFRm9ybWlvS2V5LktFWV07XHJcblxyXG5cdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSAmJiBkYXRhW2tleV0ubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHQvLyByZW1vdmUgaXRlbSBmcm9tIGFycmF5XHJcblx0XHRcdFx0XHRcdGFycmF5LnNwbGljZShpLCAxKTtcclxuXHRcdFx0XHRcdFx0aS0tO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRcdFx0dHlwZW9mIGRhdGFba2V5XSA9PT0gJ29iamVjdCcgJiZcclxuXHRcdFx0XHRcdFx0IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICdmb3JtYXR0ZWRfYWRkcmVzcycpICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnY2FsbGluZ0NvZGVzJykgJiZcclxuXHRcdFx0XHRcdFx0IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICduYXRpdmVOYW1lJykgJiZcclxuXHRcdFx0XHRcdFx0IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICdvcmlnaW5hbF9uYW1lJykgJiZcclxuXHRcdFx0XHRcdFx0IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICdmdWxsTmFtZScpICYmIFxyXG5cdFx0XHRcdFx0XHQhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGFba2V5XSwgJ2Z1bGxuYW1lJykgJiZcclxuXHRcdFx0XHRcdFx0Rm9ybWlvVXRpbC5nZXRTZWxlY3RCb3hlcyhkYXRhW2tleV0pXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIGl0ZW0gZnJvbSBhcnJheVxyXG5cdFx0XHRcdFx0XHRhcnJheS5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0XHRcdGktLTtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdFx0XHRcdHR5cGVvZiBkYXRhW2tleV0gPT09ICdvYmplY3QnICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnZm9ybWF0dGVkX2FkZHJlc3MnKSAmJlxyXG5cdFx0XHRcdFx0XHQhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGFba2V5XSwgJ2NhbGxpbmdDb2RlcycpICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnbmF0aXZlTmFtZScpICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnb3JpZ2luYWxfbmFtZScpICYmXHJcblx0XHRcdFx0XHRcdCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGF0YVtrZXldLCAnZnVsbE5hbWUnKSAmJiBcclxuXHRcdFx0XHRcdFx0IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhW2tleV0sICdmdWxsbmFtZScpICYmXHJcblx0XHRcdFx0XHRcdCFGb3JtaW9VdGlsLmdldFNlbGVjdEJveGVzKGRhdGFba2V5XSlcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChkYXRhW2tleV0gIT0gdW5kZWZpbmVkICYmIGRhdGFba2V5XSAhPSBudWxsICYmIGRhdGFba2V5XSAhPSAnJykge1xyXG5cdFx0XHRcdFx0XHQvLyByZW1vdmUgaXRlbSBmcm9tIGFycmF5XHJcblx0XHRcdFx0XHRcdGFycmF5LnNwbGljZShpLCAxKTtcclxuXHRcdFx0XHRcdFx0aS0tO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudC5jdXN0b21Db25kaXRpb25hbCAmJlxyXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudC5jdXN0b21Db25kaXRpb25hbC5pbmNsdWRlcygnc2hvdycpXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBpdGVtIGZyb20gYXJyYXlcclxuXHRcdFx0XHRcdFx0XHRhcnJheS5zcGxpY2UoaSwgMSk7XHJcblx0XHRcdFx0XHRcdFx0aS0tO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIHJlbW92ZSBpdGVtIGZyb20gYXJyYXlcclxuXHRcdFx0XHRcdGFycmF5LnNwbGljZShpLCAxKTtcclxuXHRcdFx0XHRcdGktLTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBhcnJheTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHMgdGhhdCBhcmUgcmVxdWlyZWRcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50cyBhcnJheSBvZiBjb21wb25lbnRzXHJcblx0ICovXHJcblx0c3RhdGljIGdldFVuaXF1ZUNvbXBvbmVudHMoY29tcG9uZW50cykge1xyXG5cdFx0cmV0dXJuIEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50c0J5RmVhdHVyZShjb21wb25lbnRzLCBbRUZvcm1pb0tleS5VTklRVUVdLCB0cnVlKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHMgdGhhdCBhcmUgcmVxdWlyZWRcclxuXHQgKiBAcGFyYW0gY29tcG9uZW50cyBhcnJheSBvZiBjb21wb25lbnRzXHJcblx0ICovXHJcblx0c3RhdGljIGdldFJlcXVpcmVkQ29tcG9uZW50cyhjb21wb25lbnRzKSB7XHJcblx0XHRyZXR1cm4gRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzQnlGZWF0dXJlKFxyXG5cdFx0XHRjb21wb25lbnRzLFxyXG5cdFx0XHRbRUZvcm1pb0tleS5WQUxJREFURSwgRUZvcm1pb0tleS5SRVFVSVJFRF0sXHJcblx0XHRcdHRydWVcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzIHRoYXQgaGF2ZSBhIHNwZWNpZmljIGZlYXR1cmUgZGVmaW5lZCBieSBwcm9wZXJ0aWVzIGFuZCB2YWx1ZVxyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzIGFycmF5IG9mIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gcHJvcGVydGllcyBwYXRoIG9mIHByb3BlcnRpZXMgZXhhbXBsZSBbdmFsaWRhdGUsIHJlcXVpcmVkXSBvciBbdW5pcXVlXVxyXG5cdCAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCBzaG91bGQgaGF2ZSB0aGUgcHJvcGVydHlcclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXRpYyBnZXRDb21wb25lbnRzQnlGZWF0dXJlKGNvbXBvbmVudHM6IGFueVtdLCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSwgdmFsdWU6IGFueSkge1xyXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xyXG5cdFx0aWYgKHByb3BlcnRpZXMgJiYgcHJvcGVydGllcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdC8vIGdldCBjb21wb25lbnRzXHJcblx0XHRcdGNvbnN0IGZpZWxkczogYW55W10gPSBGb3JtaW9VdGlsLmdldENvbXBvbmVudHMoY29tcG9uZW50cyk7XHJcblxyXG5cdFx0XHQvLyBnZXQgZmlyc3QgYW5kIGxhc3QgcHJvcGVydHlcclxuXHRcdFx0Y29uc3QgZmlyc3RQcm9wZXJ0eSA9IHByb3BlcnRpZXNbMF07XHJcblx0XHRcdGNvbnN0IGxhc3RQcm9wZXJ0eSA9IHByb3BlcnRpZXNbcHJvcGVydGllcy5sZW5ndGggLSAxXTtcclxuXHJcblx0XHRcdGlmIChmaWVsZHMpIHtcclxuXHRcdFx0XHQvLyBpdGVyYXRlIHRoZSBmaWVsZHNcclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0Ly8gaXQgY29udGFpbnMgdGhlIGVudGlyZSBvYmplY3QgZmllbGRcclxuXHRcdFx0XHRcdGNvbnN0IGZpZWxkID0gZmllbGRzW2ldO1xyXG5cdFx0XHRcdFx0Ly8gaXQgY29udGFpbnMgdGhlIGN1cnJlbnQgY29tcG9uZW50IGFuZCBpdCBpcyBnb25uYSBiZSB0aGUgY29tcG9uZW50IG9mIGV2ZXJ5IHByb3BlcnR5XHJcblx0XHRcdFx0XHRsZXQgY29tcG9uZW50ID0gZmllbGQ7XHJcblx0XHRcdFx0XHRpZiAoZmllbGRbZmlyc3RQcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSBwcm9wZXJ0aWVzW2pdO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGlmIGNvbXBvbmVudC5wcm9wZXJ0eSBkb2VzbnQgZXhpc3QgdGhlbiBicmVha1xyXG5cdFx0XHRcdFx0XHRcdGlmICghY29tcG9uZW50W3Byb3BlcnR5XSkgYnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5ID09PSBsYXN0UHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGl0IGlzIHRoZSBsYXN0IHByb3BlcnR5IHNvIGlmIHRoZSB2YWx1ZSBpcyBlcXVhbHMgdG8gY29tcG9uZW50Lmxhc3Rwcm9wZXJ0eSB0aGVuIGl0IGlzIGFkZGVkIHRvIHJlc3VsdFxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudFtwcm9wZXJ0eV0gPT0gdmFsdWUpIHJlc3VsdC5wdXNoKGZpZWxkKTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIGNvbXBvbmVudCB3aWxsIGJlIGVxdWFsIHRvIHRoZSBjb21wb25lbnQucHJvcGVydHlcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudCA9IGNvbXBvbmVudFtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzXHJcblx0ICovXHJcblx0c3RhdGljIGdldENvbXBvbmVudHMoY29tcG9uZW50czogYW55W10pOiBhbnlbXSB7XHJcblx0XHRyZXR1cm4gRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzQnlSZWN1cnNpb24oY29tcG9uZW50cywgJycsIG51bGwpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50cyBhcnJheSBvZiB0aGUgZm9ybSBieSByZWN1cnNpb25cclxuXHQgKiBAcGFyYW0gY29tcG9uZW50cyBhcnJheSBvZiBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIHRpdGxlUGFuZWwgbmFtZSBvZiBwYXJlbnQgcGFuZWwsIHNvIGNoaWxkcmVuIGNvbXBvbmVudHMgd2lsbCBpbmhlcml0IHRoZSBwYW5lbE5hbWVcclxuXHQgKiBAcGFyYW0gY29uZGl0aW9uYWxPYmplY3QgY29uZGl0aW9uYWwgb2JqZWN0IGl0IHdpbGwgYmUgaW5oZXJpdGVkIGZyb20gcGFuZWwge2NvbmRpdGlvbmFsOiB7IGVxOiAsIHZhbHVlOiAsIHdoZW46ICwganNvbjogfSwgY3VzdG9tQ29uZGl0aW9uYWw6IH1cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXRpYyBnZXRDb21wb25lbnRzQnlSZWN1cnNpb24oXHJcblx0XHRjb21wb25lbnRzOiBhbnlbXSxcclxuXHRcdHRpdGxlUGFuZWw6IHN0cmluZyxcclxuXHRcdGNvbmRpdGlvbmFsUGFyZW50OiBhbnlcclxuXHQpOiBhbnlbXSB7XHJcblx0XHQvLyBpdCBjb250YWlucyB0aGUgcmVzdWx0IGFycmF5XHJcblx0XHRsZXQgcmVzdWx0ID0gW107XHJcblx0XHRpZiAoY29tcG9uZW50cykge1xyXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgY29tcG9uZW50c1xyXG5cdFx0XHRmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XHJcblx0XHRcdFx0Ly8gYXZvaWQgdGhlIGVkaXRncmlkIGNvbXBvbmVudCBvdCBpZiBpdCBoYXMgYSBkaWZmZXJlbnQgYmVoYXZpb3IgaXQgc2hvdWxkIGhhdmUgYW4gZWxzZSBzdGF0ZW1lbnRcclxuXHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuRURJVEdSSUQpIHtcclxuXHRcdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBpcyBwYW5lbCB0aGVuIHRpdGxlUGFuZWwgdmFyaWFibGUgaXMgY2hhbmdlZCwgYW5kIGl0IGlzIGdvbm5hIGJlIGluaGVyaXRlZFxyXG5cdFx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09PSBFRm9ybWlvS2V5LlBBTkVMKSB7XHJcblx0XHRcdFx0XHRcdHRpdGxlUGFuZWwgPSBjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV07XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQodHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdICE9PSAndW5kZWZpbmVkJyB8fFxyXG5cdFx0XHRcdFx0XHRcdHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT0xVTU5TXSAhPT0gJ3VuZGVmaW5lZCcpICYmXHJcblx0XHRcdFx0XHRcdCh0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT0gJ3VuZGVmaW5lZCcgfHxcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSAhPT0gRUZvcm1pb0tleS5UWVBFX0FERFJFU1MpXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudFsndHlwZSddICE9PSAnYWRkcmVzcycpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyByZXNvbHZlIGNvbmRpdGlvbmFsIHBhcmVudCBjb25kaXRpb25hbFxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0Ly8gY2hhbmdlIGNvbmRpdGlvblxyXG5cdFx0XHRcdFx0XHRcdGlmIChjb25kaXRpb25hbCkgY29uZGl0aW9uYWxQYXJlbnQgPSBjb25kaXRpb25hbDtcclxuXHRcdFx0XHRcdFx0XHQvLyBpdCBjb250YWlucyB0aGUgc3ViY29tcG9uZW50cyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGNvbXBvbmVudCBpZiBpdCBoYXMgY29tcG9uZW50cyBvciBjb2x1bW5zXHJcblx0XHRcdFx0XHRcdFx0bGV0IHN1YkNvbXBvbmVudHMgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdICE9PSAndW5kZWZpbmVkJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdXHJcblx0XHRcdFx0XHRcdFx0XHRcdDogY29tcG9uZW50W0VGb3JtaW9LZXkuQ09MVU1OU107XHJcblx0XHRcdFx0XHRcdFx0Ly8gaWYgY29tcG9uZW50IGhhcyBzdWJDb21wb25lbnRzLCB0aGVuIGV4ZWN1dGUgdGhlIHJlY3Vyc2lvbiBmdW5jdGlvbiB0byBnZXQgdGhlIHJlY3Vyc2lvbm5SZXN1bHRcclxuXHRcdFx0XHRcdFx0XHRjb25zdCByZWN1cnNpb25SZXN1bHQgPSBGb3JtaW9VdGlsLmdldENvbXBvbmVudHNCeVJlY3Vyc2lvbihcclxuXHRcdFx0XHRcdFx0XHRcdHN1YkNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZVBhbmVsLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnRcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGlmIHJlY3Vyc2lvbiByZXN1bHQgdGhlbiByZXN1bHQgY29uY2F0cyB0aGUgcmVjdXJzaW9uUmVzdWx0XHJcblx0XHRcdFx0XHRcdFx0aWYgKHJlY3Vyc2lvblJlc3VsdCkgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChyZWN1cnNpb25SZXN1bHQpO1xyXG5cdFx0XHRcdFx0XHRcdC8vIHJlc2V0IGNvbmRpdGlvbmFsIFBhcmVudFxyXG5cdFx0XHRcdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5JRF0gPT0gY29uZGl0aW9uYWxQYXJlbnQuaWQpXHJcblx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRyZXN1bHQucHVzaChjb21wb25lbnQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvLyBhdm9pZCB0aGUgY29tcG9uZW50IHR5cGUgYnV0dG9uXHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSAhPT0gRUZvcm1pb0tleS5CVVRUT04gJiZcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5LRVldICYmXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuTEFCRUxdXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIHJlc29sdmUgY29uZGl0aW9uYWwgY29uZGl0aW9uYWwgb2JqZWN0XHJcblx0XHRcdFx0XHRcdFx0bGV0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCFjb25kaXRpb25hbCkgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbFBhcmVudDtcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DT05ESVRJT05BTF0gPSBjb25kaXRpb25hbFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXTtcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DVVNUT01fQ09ORElUSU9OQUxdID1cclxuXHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXTtcclxuXHRcdFx0XHRcdFx0XHQvLyBhZGQgbmFtUGFuZWwgYXMgcHJvcGVydHlcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV9QQU5FTF0gPSB0aXRsZVBhbmVsO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGFkZCBjb21wb25lbnQgdG8gdGhlIHJlc3VsdFxyXG5cdFx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGNvbXBvbmVudCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09PSBFRm9ybWlvS2V5LkVESVRHUklEKSB7XHJcblx0XHRcdFx0XHRpZiAoY29tcG9uZW50LnZhbGlkYXRlLnJlcXVpcmVkKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGNvbXBvbmVudCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIGtlZXBFZGl0R3JpZHNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0Q29tcG9uZW50c1dpdGhFZGl0R3JpZHMoY29tcG9uZW50czogYW55W10pOiBhbnlbXSB7XHJcblx0XHRyZXR1cm4gRm9ybWlvVXRpbC5nZXRDb21wb25lbnRzQnlSZWN1cnNpb25XaXRoRWRpdEdyaWRzKGNvbXBvbmVudHMsICcnLCBudWxsKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJldHVybnMgdGhlIGNvbXBvbmVudHMgYXJyYXkgb2YgdGhlIGZvcm0gYnkgcmVjdXJzaW9uXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHMgYXJyYXkgb2YgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSB0aXRsZVBhbmVsIG5hbWUgb2YgcGFyZW50IHBhbmVsLCBzbyBjaGlsZHJlbiBjb21wb25lbnRzIHdpbGwgaW5oZXJpdCB0aGUgcGFuZWxOYW1lXHJcblx0ICogQHBhcmFtIGNvbmRpdGlvbmFsT2JqZWN0IGNvbmRpdGlvbmFsIG9iamVjdCBpdCB3aWxsIGJlIGluaGVyaXRlZCBmcm9tIHBhbmVsIHtjb25kaXRpb25hbDogeyBlcTogLCB2YWx1ZTogLCB3aGVuOiAsIGpzb246IH0sIGN1c3RvbUNvbmRpdGlvbmFsOiB9XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzdGF0aWMgZ2V0Q29tcG9uZW50c0J5UmVjdXJzaW9uV2l0aEVkaXRHcmlkcyhcclxuXHRcdGNvbXBvbmVudHM6IGFueVtdLFxyXG5cdFx0dGl0bGVQYW5lbDogc3RyaW5nLFxyXG5cdFx0Y29uZGl0aW9uYWxQYXJlbnQ6IGFueVxyXG5cdCk6IGFueVtdIHtcclxuXHRcdC8vIGl0IGNvbnRhaW5zIHRoZSByZXN1bHQgYXJyYXlcclxuXHRcdGxldCByZXN1bHQgPSBbXTtcclxuXHRcdGlmIChjb21wb25lbnRzKSB7XHJcblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciBjb21wb25lbnRzXHJcblx0XHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHQvLyBhdm9pZCB0aGUgZWRpdGdyaWQgY29tcG9uZW50IG90IGlmIGl0IGhhcyBhIGRpZmZlcmVudCBiZWhhdmlvciBpdCBzaG91bGQgaGF2ZSBhbiBlbHNlIHN0YXRlbWVudFxyXG5cclxuXHRcdFx0XHQvLyBpZiBjb21wb25lbnQgaXMgcGFuZWwgdGhlbiB0aXRsZVBhbmVsIHZhcmlhYmxlIGlzIGNoYW5nZWQsIGFuZCBpdCBpcyBnb25uYSBiZSBpbmhlcml0ZWRcclxuXHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT09IEVGb3JtaW9LZXkuUEFORUwpIHtcclxuXHRcdFx0XHRcdHRpdGxlUGFuZWwgPSBjb21wb25lbnRbRUZvcm1pb0tleS5USVRMRV07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHQodHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdICE9PSAndW5kZWZpbmVkJyB8fFxyXG5cdFx0XHRcdFx0XHR0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuQ09MVU1OU10gIT09ICd1bmRlZmluZWQnKSAmJlxyXG5cdFx0XHRcdFx0KHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PSAndW5kZWZpbmVkJyB8fFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSAhPT0gRUZvcm1pb0tleS5UWVBFX0FERFJFU1MpXHJcblx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHQvLyByZXNvbHZlIGNvbmRpdGlvbmFsIHBhcmVudCBjb25kaXRpb25hbFxyXG5cdFx0XHRcdFx0Y29uc3QgY29uZGl0aW9uYWwgPSB0aGlzLnJlc29sdmVJbmhlcml0YW5jZUNvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCxcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DVVNUT01fQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5JRF1cclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHQvLyBjaGFuZ2UgY29uZGl0aW9uXHJcblx0XHRcdFx0XHRpZiAoY29uZGl0aW9uYWwpIGNvbmRpdGlvbmFsUGFyZW50ID0gY29uZGl0aW9uYWw7XHJcblx0XHRcdFx0XHQvLyBpdCBjb250YWlucyB0aGUgc3ViY29tcG9uZW50cyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGNvbXBvbmVudCBpZiBpdCBoYXMgY29tcG9uZW50cyBvciBjb2x1bW5zXHJcblx0XHRcdFx0XHRsZXQgc3ViQ29tcG9uZW50cyA9XHJcblx0XHRcdFx0XHRcdHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXSAhPT0gJ3VuZGVmaW5lZCdcclxuXHRcdFx0XHRcdFx0XHQ/IGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdXHJcblx0XHRcdFx0XHRcdFx0OiBjb21wb25lbnRbRUZvcm1pb0tleS5DT0xVTU5TXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT09IEVGb3JtaW9LZXkuRURJVEdSSUQpIHtcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVfUEFORUxdID0gdGl0bGVQYW5lbDtcclxuXHRcdFx0XHRcdFx0cmVzdWx0LnB1c2goY29tcG9uZW50KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBoYXMgc3ViQ29tcG9uZW50cywgdGhlbiBleGVjdXRlIHRoZSByZWN1cnNpb24gZnVuY3Rpb24gdG8gZ2V0IHRoZSByZWN1cnNpb25uUmVzdWx0XHJcblx0XHRcdFx0XHRjb25zdCByZWN1cnNpb25SZXN1bHQgPSBGb3JtaW9VdGlsLmdldENvbXBvbmVudHNCeVJlY3Vyc2lvbldpdGhFZGl0R3JpZHMoXHJcblx0XHRcdFx0XHRcdHN1YkNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdHRpdGxlUGFuZWwsXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50XHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0Ly8gaWYgcmVjdXJzaW9uIHJlc3VsdCB0aGVuIHJlc3VsdCBjb25jYXRzIHRoZSByZWN1cnNpb25SZXN1bHRcclxuXHRcdFx0XHRcdGlmIChyZWN1cnNpb25SZXN1bHQpIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQocmVjdXJzaW9uUmVzdWx0KTtcclxuXHRcdFx0XHRcdC8vIHJlc2V0IGNvbmRpdGlvbmFsIFBhcmVudFxyXG5cdFx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXSA9PSBjb25kaXRpb25hbFBhcmVudC5pZClcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQgPSB1bmRlZmluZWQ7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIGF2b2lkIHRoZSBjb21wb25lbnQgdHlwZSBidXR0b25cclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuQlVUVE9OICYmXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LktFWV0gJiZcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuTEFCRUxdXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gcmVzb2x2ZSBjb25kaXRpb25hbCBjb25kaXRpb25hbCBvYmplY3RcclxuXHRcdFx0XHRcdFx0bGV0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCxcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5JRF1cclxuXHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0aWYgKCFjb25kaXRpb25hbCkgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbFBhcmVudDtcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdID0gY29uZGl0aW9uYWxbRUZvcm1pb0tleS5DT05ESVRJT05BTF07XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF0gPVxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXTtcclxuXHRcdFx0XHRcdFx0Ly8gYWRkIG5hbVBhbmVsIGFzIHByb3BlcnR5XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRJVExFX1BBTkVMXSA9IHRpdGxlUGFuZWw7XHJcblx0XHRcdFx0XHRcdC8vIGFkZCBjb21wb25lbnQgdG8gdGhlIHJlc3VsdFxyXG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChjb21wb25lbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHJlc29sdmUgdGhlIGluaGVyaXRhbmNlIGNvbmRpdGlvbmFsXHJcblx0ICogQHBhcmFtIGNvbmRpdGlvbmFsT2JqZWN0XHJcblx0ICogQHBhcmFtIGNvbmRpdGlvbmFsXHJcblx0ICogQHBhcmFtIGN1c3RvbUNvbmRpdGlvbmFsXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzdGF0aWMgcmVzb2x2ZUluaGVyaXRhbmNlQ29uZGl0aW9uYWwoXHJcblx0XHRjb25kaXRpb25hbE9iamVjdCxcclxuXHRcdGNvbmRpdGlvbmFsLFxyXG5cdFx0Y3VzdG9tQ29uZGl0aW9uYWwsXHJcblx0XHRwYXJlbnRJZFxyXG5cdCk6IGFueSB7XHJcblx0XHQvLyB2YWxpZGF0ZSBpZiB0aGVyZSBpcyBhIGNvbmRpdGlvbiB3aXRoIHRoZSBuZXcgZmllbGRzXHJcblx0XHRpZiAoXHJcblx0XHRcdCFjb25kaXRpb25hbE9iamVjdCB8fFxyXG5cdFx0XHRjdXN0b21Db25kaXRpb25hbCB8fFxyXG5cdFx0XHQoY29uZGl0aW9uYWwgJiYgY29uZGl0aW9uYWxbRUZvcm1pb0tleS5XSEVOXSAmJiBjb25kaXRpb25hbFtFRm9ybWlvS2V5LkVRXSkgfHxcclxuXHRcdFx0KGNvbmRpdGlvbmFsICYmIGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuSlNPTl0pXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuIHsgY29uZGl0aW9uYWw6IGNvbmRpdGlvbmFsLCBjdXN0b21Db25kaXRpb25hbDogY3VzdG9tQ29uZGl0aW9uYWwsIGlkOiBwYXJlbnRJZCB9O1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBlZGl0IGdyaWQgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzXHJcblx0ICovXHJcblx0c3RhdGljIGdldEVkaXRHcmlkS2V5TGFiZWxzKGNvbXBvbmVudHM6IGFueVtdKTogYW55W10ge1xyXG5cdFx0cmV0dXJuIEZvcm1pb1V0aWwuZ2V0RWRpdEdyaWRLZXlMYWJlbHNCeVJlY3Vyc2lvbihjb21wb25lbnRzLCAnJywgbnVsbCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzIGVkaXQgZ3JpZCBhcnJheSBvZiB0aGUgZm9ybSBieSByZWN1cnNpb25cclxuXHQgKiBAcGFyYW0gY29tcG9uZW50cyBhcnJheSBvZiBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIHRpdGxlUGFuZWwgbmFtZSBvZiBwYXJlbnQgcGFuZWwsIHNvIGNoaWxkcmVuIGNvbXBvbmVudHMgd2lsbCBpbmhlcml0IHRoZSBwYW5lbE5hbWVcclxuXHQgKiBAcGFyYW0gY29uZGl0aW9uYWxPYmplY3QgY29uZGl0aW9uYWwgb2JqZWN0IGl0IHdpbGwgYmUgaW5oZXJpdGVkIGZyb20gcGFuZWwge2NvbmRpdGlvbmFsOiB7IGVxOiAsIHZhbHVlOiAsIHdoZW46ICwganNvbjogfSwgY3VzdG9tQ29uZGl0aW9uYWw6IH1cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXRpYyBnZXRFZGl0R3JpZEtleUxhYmVsc0J5UmVjdXJzaW9uKFxyXG5cdFx0Y29tcG9uZW50czogYW55W10sXHJcblx0XHR0aXRsZVBhbmVsOiBzdHJpbmcsXHJcblx0XHRjb25kaXRpb25hbFBhcmVudDogYW55XHJcblx0KTogYW55W10ge1xyXG5cdFx0Ly8gaXQgY29udGFpbnMgdGhlIHJlc3VsdCBhcnJheVxyXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xyXG5cdFx0aWYgKGNvbXBvbmVudHMpIHtcclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGNvbXBvbmVudHNcclxuXHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xyXG5cdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBpcyBwYW5lbCB0aGVuIHRpdGxlUGFuZWwgdmFyaWFibGUgaXMgY2hhbmdlZCwgYW5kIGl0IGlzIGdvbm5hIGJlIGluaGVyaXRlZFxyXG5cdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PT0gRUZvcm1pb0tleS5QQU5FTCkge1xyXG5cdFx0XHRcdFx0dGl0bGVQYW5lbCA9IGNvbXBvbmVudFtFRm9ybWlvS2V5LlRJVExFXTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdCh0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuQ09NUE9ORU5UU10gIT09ICd1bmRlZmluZWQnIHx8XHJcblx0XHRcdFx0XHRcdHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT0xVTU5TXSAhPT0gJ3VuZGVmaW5lZCcpICYmXHJcblx0XHRcdFx0XHQodHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09ICd1bmRlZmluZWQnIHx8XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdICE9PSBFRm9ybWlvS2V5LlRZUEVfQUREUkVTUylcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdC8vIHJlc29sdmUgY29uZGl0aW9uYWwgcGFyZW50IGNvbmRpdGlvbmFsXHJcblx0XHRcdFx0XHRjb25zdCBjb25kaXRpb25hbCA9IHRoaXMucmVzb2x2ZUluaGVyaXRhbmNlQ29uZGl0aW9uYWwoXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNVU1RPTV9DT05ESVRJT05BTF0sXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdC8vIGNoYW5nZSBjb25kaXRpb25cclxuXHRcdFx0XHRcdGlmIChjb25kaXRpb25hbCkgY29uZGl0aW9uYWxQYXJlbnQgPSBjb25kaXRpb25hbDtcclxuXHRcdFx0XHRcdC8vIGl0IGNvbnRhaW5zIHRoZSBzdWJjb21wb25lbnRzIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgY29tcG9uZW50IGlmIGl0IGhhcyBjb21wb25lbnRzIG9yIGNvbHVtbnNcclxuXHRcdFx0XHRcdGxldCBzdWJDb21wb25lbnRzID1cclxuXHRcdFx0XHRcdFx0dHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdICE9PSAndW5kZWZpbmVkJ1xyXG5cdFx0XHRcdFx0XHRcdD8gY29tcG9uZW50W0VGb3JtaW9LZXkuQ09NUE9ORU5UU11cclxuXHRcdFx0XHRcdFx0XHQ6IGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTFVNTlNdO1xyXG5cdFx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09IEVGb3JtaW9LZXkuRURJVEdSSUQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gYWRkIG5hbVBhbmVsIGFzIHByb3BlcnR5XHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRJVExFX1BBTkVMXSA9IHRpdGxlUGFuZWw7XHJcblx0XHRcdFx0XHRcdC8vIGFkZCBjb21wb25lbnQgdG8gdGhlIHJlc3VsdFxyXG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChjb21wb25lbnQpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Ly8gaWYgY29tcG9uZW50IGhhcyBzdWJDb21wb25lbnRzLCB0aGVuIGV4ZWN1dGUgdGhlIHJlY3Vyc2lvbiBmdW5jdGlvbiB0byBnZXQgdGhlIHJlY3Vyc2lvbm5SZXN1bHRcclxuXHRcdFx0XHRcdFx0Y29uc3QgcmVjdXJzaW9uUmVzdWx0ID0gRm9ybWlvVXRpbC5nZXRFZGl0R3JpZEtleUxhYmVsc0J5UmVjdXJzaW9uKFxyXG5cdFx0XHRcdFx0XHRcdHN1YkNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdFx0dGl0bGVQYW5lbCxcclxuXHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudFxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHQvLyBpZiByZWN1cnNpb24gcmVzdWx0IHRoZW4gcmVzdWx0IGNvbmNhdHMgdGhlIHJlY3Vyc2lvblJlc3VsdFxyXG5cdFx0XHRcdFx0XHRpZiAocmVjdXJzaW9uUmVzdWx0KSByZXN1bHQgPSByZXN1bHQuY29uY2F0KHJlY3Vyc2lvblJlc3VsdCk7XHJcblx0XHRcdFx0XHRcdC8vIHJlc2V0IGNvbmRpdGlvbmFsIFBhcmVudFxyXG5cdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuSURdID09IGNvbmRpdGlvbmFsUGFyZW50LmlkKVxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50ID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV0dXJucyB0aGUgY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIGtlZXBFZGl0R3JpZHNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0Q29tcG9uZW50c0ludG9FZGl0R3JpZHMoY29tcG9uZW50czogYW55W10sIGVkaXRHcmlkTmFtZTogc3RyaW5nKTogYW55W10ge1xyXG5cdFx0cmV0dXJuIEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50c0J5UmVjdXJzaW9uSW50b0VkaXRHcmlkcyhcclxuXHRcdFx0Y29tcG9uZW50cyxcclxuXHRcdFx0JycsXHJcblx0XHRcdG51bGwsXHJcblx0XHRcdGVkaXRHcmlkTmFtZSxcclxuXHRcdFx0ZmFsc2VcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzIGFycmF5IG9mIHRoZSBmb3JtIGJ5IHJlY3Vyc2lvblxyXG5cdCAqIEBwYXJhbSBjb21wb25lbnRzIGFycmF5IG9mIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gdGl0bGVQYW5lbCBuYW1lIG9mIHBhcmVudCBwYW5lbCwgc28gY2hpbGRyZW4gY29tcG9uZW50cyB3aWxsIGluaGVyaXQgdGhlIHBhbmVsTmFtZVxyXG5cdCAqIEBwYXJhbSBjb25kaXRpb25hbE9iamVjdCBjb25kaXRpb25hbCBvYmplY3QgaXQgd2lsbCBiZSBpbmhlcml0ZWQgZnJvbSBwYW5lbCB7Y29uZGl0aW9uYWw6IHsgZXE6ICwgdmFsdWU6ICwgd2hlbjogLCBqc29uOiB9LCBjdXN0b21Db25kaXRpb25hbDogfVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RhdGljIGdldENvbXBvbmVudHNCeVJlY3Vyc2lvbkludG9FZGl0R3JpZHMoXHJcblx0XHRjb21wb25lbnRzOiBhbnlbXSxcclxuXHRcdHRpdGxlUGFuZWw6IHN0cmluZyxcclxuXHRcdGNvbmRpdGlvbmFsUGFyZW50OiBhbnksXHJcblx0XHRlZGl0R3JpZE5hbWU6IHN0cmluZyxcclxuXHRcdGV4aXN0RWRpdEdyaWQ6IGJvb2xlYW5cclxuXHQpOiBhbnlbXSB7XHJcblx0XHQvLyBpdCBjb250YWlucyB0aGUgcmVzdWx0IGFycmF5XHJcblx0XHRsZXQgcmVzdWx0ID0gW107XHJcblx0XHRpZiAoY29tcG9uZW50cykge1xyXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgY29tcG9uZW50c1xyXG5cdFx0XHRmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XHJcblx0XHRcdFx0Ly8gYXZvaWQgdGhlIGVkaXRncmlkIGNvbXBvbmVudCBvdCBpZiBpdCBoYXMgYSBkaWZmZXJlbnQgYmVoYXZpb3IgaXQgc2hvdWxkIGhhdmUgYW4gZWxzZSBzdGF0ZW1lbnRcclxuXHJcblx0XHRcdFx0Ly8gaWYgY29tcG9uZW50IGlzIHBhbmVsIHRoZW4gdGl0bGVQYW5lbCB2YXJpYWJsZSBpcyBjaGFuZ2VkLCBhbmQgaXQgaXMgZ29ubmEgYmUgaW5oZXJpdGVkXHJcblx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdID09PSBFRm9ybWlvS2V5LlBBTkVMKSB7XHJcblx0XHRcdFx0XHR0aXRsZVBhbmVsID0gY29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVdO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0KHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXSAhPT0gJ3VuZGVmaW5lZCcgfHxcclxuXHRcdFx0XHRcdFx0dHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTFVNTlNdICE9PSAndW5kZWZpbmVkJykgJiZcclxuXHRcdFx0XHRcdCh0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gPT0gJ3VuZGVmaW5lZCcgfHxcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuVFlQRV9BRERSRVNTKVxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0Ly8gcmVzb2x2ZSBjb25kaXRpb25hbCBwYXJlbnQgY29uZGl0aW9uYWxcclxuXHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQsXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuSURdXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0Ly8gY2hhbmdlIGNvbmRpdGlvblxyXG5cdFx0XHRcdFx0aWYgKGNvbmRpdGlvbmFsKSBjb25kaXRpb25hbFBhcmVudCA9IGNvbmRpdGlvbmFsO1xyXG5cdFx0XHRcdFx0Ly8gaXQgY29udGFpbnMgdGhlIHN1YmNvbXBvbmVudHMgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBjb21wb25lbnQgaWYgaXQgaGFzIGNvbXBvbmVudHMgb3IgY29sdW1uc1xyXG5cdFx0XHRcdFx0bGV0IHN1YkNvbXBvbmVudHMgPVxyXG5cdFx0XHRcdFx0XHR0eXBlb2YgY29tcG9uZW50W0VGb3JtaW9LZXkuQ09NUE9ORU5UU10gIT09ICd1bmRlZmluZWQnXHJcblx0XHRcdFx0XHRcdFx0PyBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXVxyXG5cdFx0XHRcdFx0XHRcdDogY29tcG9uZW50W0VGb3JtaW9LZXkuQ09MVU1OU107XHJcblxyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PT0gRUZvcm1pb0tleS5FRElUR1JJRCAmJlxyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbJ2tleSddID09IGVkaXRHcmlkTmFtZVxyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdGV4aXN0RWRpdEdyaWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdFx0KHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT01QT05FTlRTXSAhPT0gJ3VuZGVmaW5lZCcgfHxcclxuXHRcdFx0XHRcdFx0XHRcdHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5DT0xVTU5TXSAhPT0gJ3VuZGVmaW5lZCcpICYmXHJcblx0XHRcdFx0XHRcdFx0KHR5cGVvZiBjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PSAndW5kZWZpbmVkJyB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuVFlQRV9BRERSRVNTKVxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyByZXNvbHZlIGNvbmRpdGlvbmFsIHBhcmVudCBjb25kaXRpb25hbFxyXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0Ly8gY2hhbmdlIGNvbmRpdGlvblxyXG5cdFx0XHRcdFx0XHRcdGlmIChjb25kaXRpb25hbCkgY29uZGl0aW9uYWxQYXJlbnQgPSBjb25kaXRpb25hbDtcclxuXHRcdFx0XHRcdFx0XHQvLyBpdCBjb250YWlucyB0aGUgc3ViY29tcG9uZW50cyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGNvbXBvbmVudCBpZiBpdCBoYXMgY29tcG9uZW50cyBvciBjb2x1bW5zXHJcblx0XHRcdFx0XHRcdFx0bGV0IHN1YkNvbXBvbmVudHMgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dHlwZW9mIGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdICE9PSAndW5kZWZpbmVkJ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTVBPTkVOVFNdXHJcblx0XHRcdFx0XHRcdFx0XHRcdDogY29tcG9uZW50W0VGb3JtaW9LZXkuQ09MVU1OU107XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBoYXMgc3ViQ29tcG9uZW50cywgdGhlbiBleGVjdXRlIHRoZSByZWN1cnNpb24gZnVuY3Rpb24gdG8gZ2V0IHRoZSByZWN1cnNpb25uUmVzdWx0XHJcblx0XHRcdFx0XHRcdFx0Y29uc3QgcmVjdXJzaW9uUmVzdWx0ID1cclxuXHRcdFx0XHRcdFx0XHRcdEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50c0J5UmVjdXJzaW9uSW50b0VkaXRHcmlkcyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3ViQ29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGl0bGVQYW5lbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGVkaXRHcmlkTmFtZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZXhpc3RFZGl0R3JpZFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHQvLyBpZiByZWN1cnNpb24gcmVzdWx0IHRoZW4gcmVzdWx0IGNvbmNhdHMgdGhlIHJlY3Vyc2lvblJlc3VsdFxyXG5cdFx0XHRcdFx0XHRcdGlmIChyZWN1cnNpb25SZXN1bHQpIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQocmVjdXJzaW9uUmVzdWx0KTtcclxuXHRcdFx0XHRcdFx0XHQvLyByZXNldCBjb25kaXRpb25hbCBQYXJlbnRcclxuXHRcdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50ICYmIGNvbmRpdGlvbmFsUGFyZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50W0VGb3JtaW9LZXkuSURdID09IGNvbmRpdGlvbmFsUGFyZW50LmlkKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25kaXRpb25hbFBhcmVudCA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gYXZvaWQgdGhlIGNvbXBvbmVudCB0eXBlIGJ1dHRvblxyXG5cdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdICE9PSBFRm9ybWlvS2V5LkJVVFRPTiAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuS0VZXSAmJlxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuTEFCRUxdICYmXHJcblx0XHRcdFx0XHRcdFx0XHRleGlzdEVkaXRHcmlkXHJcblx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyByZXNvbHZlIGNvbmRpdGlvbmFsIGNvbmRpdGlvbmFsIG9iamVjdFxyXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGNvbmRpdGlvbmFsID0gdGhpcy5yZXNvbHZlSW5oZXJpdGFuY2VDb25kaXRpb25hbChcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuSURdXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFjb25kaXRpb25hbCkgY29uZGl0aW9uYWwgPSBjb25kaXRpb25hbFBhcmVudDtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuQ09ORElUSU9OQUxdO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSA9XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsW0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXTtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGFkZCBuYW1QYW5lbCBhcyBwcm9wZXJ0eVxyXG5cdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVfUEFORUxdID0gdGl0bGVQYW5lbDtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGFkZCBjb21wb25lbnQgdG8gdGhlIHJlc3VsdFxyXG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0LnB1c2goY29tcG9uZW50KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vIGlmIGNvbXBvbmVudCBoYXMgc3ViQ29tcG9uZW50cywgdGhlbiBleGVjdXRlIHRoZSByZWN1cnNpb24gZnVuY3Rpb24gdG8gZ2V0IHRoZSByZWN1cnNpb25uUmVzdWx0XHJcblx0XHRcdFx0XHRjb25zdCByZWN1cnNpb25SZXN1bHQgPSBGb3JtaW9VdGlsLmdldENvbXBvbmVudHNCeVJlY3Vyc2lvbkludG9FZGl0R3JpZHMoXHJcblx0XHRcdFx0XHRcdHN1YkNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdHRpdGxlUGFuZWwsXHJcblx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRlZGl0R3JpZE5hbWUsXHJcblx0XHRcdFx0XHRcdGV4aXN0RWRpdEdyaWRcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHQvLyBpZiByZWN1cnNpb24gcmVzdWx0IHRoZW4gcmVzdWx0IGNvbmNhdHMgdGhlIHJlY3Vyc2lvblJlc3VsdFxyXG5cdFx0XHRcdFx0aWYgKHJlY3Vyc2lvblJlc3VsdCkgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChyZWN1cnNpb25SZXN1bHQpO1xyXG5cdFx0XHRcdFx0Ly8gcmVzZXQgY29uZGl0aW9uYWwgUGFyZW50XHJcblx0XHRcdFx0XHRpZiAoY29tcG9uZW50ICYmIGNvbmRpdGlvbmFsUGFyZW50KSB7XHJcblx0XHRcdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5JRF0gPT0gY29uZGl0aW9uYWxQYXJlbnQuaWQpXHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxQYXJlbnQgPSB1bmRlZmluZWQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIGF2b2lkIHRoZSBjb21wb25lbnQgdHlwZSBidXR0b25cclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVFlQRV0gIT09IEVGb3JtaW9LZXkuQlVUVE9OICYmXHJcblx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LktFWV0gJiZcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuTEFCRUxdICYmXHJcblx0XHRcdFx0XHRcdGV4aXN0RWRpdEdyaWRcclxuXHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHQvLyByZXNvbHZlIGNvbmRpdGlvbmFsIGNvbmRpdGlvbmFsIG9iamVjdFxyXG5cdFx0XHRcdFx0XHRsZXQgY29uZGl0aW9uYWwgPSB0aGlzLnJlc29sdmVJbmhlcml0YW5jZUNvbmRpdGlvbmFsKFxyXG5cdFx0XHRcdFx0XHRcdGNvbmRpdGlvbmFsUGFyZW50LFxyXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXSxcclxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DVVNUT01fQ09ORElUSU9OQUxdLFxyXG5cdFx0XHRcdFx0XHRcdGNvbXBvbmVudFtFRm9ybWlvS2V5LklEXVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRpZiAoIWNvbmRpdGlvbmFsKSBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsUGFyZW50O1xyXG5cdFx0XHRcdFx0XHRjb21wb25lbnRbRUZvcm1pb0tleS5DT05ESVRJT05BTF0gPSBjb25kaXRpb25hbFtFRm9ybWlvS2V5LkNPTkRJVElPTkFMXTtcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuQ1VTVE9NX0NPTkRJVElPTkFMXSA9XHJcblx0XHRcdFx0XHRcdFx0Y29uZGl0aW9uYWxbRUZvcm1pb0tleS5DVVNUT01fQ09ORElUSU9OQUxdO1xyXG5cdFx0XHRcdFx0XHQvLyBhZGQgbmFtUGFuZWwgYXMgcHJvcGVydHlcclxuXHRcdFx0XHRcdFx0Y29tcG9uZW50W0VGb3JtaW9LZXkuVElUTEVfUEFORUxdID0gdGl0bGVQYW5lbDtcclxuXHRcdFx0XHRcdFx0Ly8gYWRkIGNvbXBvbmVudCB0byB0aGUgcmVzdWx0XHJcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGNvbXBvbmVudCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlIDIgamFzb24gb2JqZWN0cyBvZiBkYXRhIGZvcm0gYnkgY29tcG9uZW50IGtleSBhbmQgb3RoZXIgYnkgY29tcG9uZW50IGtleSBhbmQgdGl0bGUgZm9ybSBrZXlcclxuXHQgKiBAcGFyYW0gZGF0YUZvcm0gZGF0YUZvcm0gbW9kZWwgb2JqZWN0XHJcblx0ICogQHJldHVybnMgT2JqZWN0IG9mIDIgZWxlbWVudFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBjcmVhdGVMaXN0RGF0YUJ5RGF0YUZvcm1MaXN0KGRhdGFGb3JtOiBhbnksIGxpc3RGb3JtOiBhbnlbXSk6IGFueSB7XHJcblx0XHRsZXQgbGlzdERhdGE6IGFueSA9IHt9O1xyXG5cdFx0bGV0IGxpc3REYXRhQnlGb3JtOiBhbnkgPSB7fTtcclxuXHRcdGlmIChkYXRhRm9ybSAmJiBkYXRhRm9ybS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGxpc3REYXRhID0ge307XHJcblx0XHRcdGxpc3REYXRhQnlGb3JtID0ge307XHJcblx0XHRcdGxldCBkRm9ybTogYW55O1xyXG5cdFx0XHRmb3IgKGRGb3JtIG9mIGRhdGFGb3JtKSB7XHJcblx0XHRcdFx0aWYgKCFkRm9ybS5kYXRhKSB7XHJcblx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29uc3QgZm9ybSA9IGxpc3RGb3JtLmZpbmQoZnVuY3Rpb24gKGZvcm1UbXApIHtcclxuXHRcdFx0XHRcdHJldHVybiBmb3JtVG1wLmlkID09IGRGb3JtLmZvcm1JZDtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRpZiAoIWZvcm0pIHtcclxuXHRcdFx0XHRcdC8vY29uc29sZS5lcnJvcignTm8gc2UgZW5jb250csOzIGVsIGZvcm11bGFyaW8gY29uIGlkICcgKyBkRm9ybS5mb3JtSWQpO1xyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbnN0IGtleUZvcm1UaXRsZSA9IFRva2VuU2VydmljZS5nZXRLZXlGb3JtdWxhcmlvKGZvcm0udGl0bGUpICsgJ18nO1xyXG5cdFx0XHRcdGZvciAoY29uc3Qga2V5IGluIGRGb3JtLmRhdGEpIHtcclxuXHRcdFx0XHRcdGxpc3REYXRhW2tleV0gPSBkRm9ybS5kYXRhW2tleV07XHJcblx0XHRcdFx0XHRsaXN0RGF0YUJ5Rm9ybVtrZXlGb3JtVGl0bGUgKyBrZXldID0gZEZvcm0uZGF0YVtrZXldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0bGlzdERhdGE6IGxpc3REYXRhLFxyXG5cdFx0XHRsaXN0RGF0YUJ5Rm9ybTogbGlzdERhdGFCeUZvcm1cclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0UGFuZWxDb21wb25lbnRzKGNvbXBvbmVudHM6IGFueVtdKTogYW55W10ge1xyXG5cdFx0cmV0dXJuIEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50c0J5UGFuZWwoY29tcG9uZW50cyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCByZXR1cm5zIHRoZSBjb21wb25lbnRzIGFycmF5IG9mIHRoZSBmb3JtXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHMgYXJyYXkgb2YgY29tcG9uZW50c1xyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RhdGljIGdldENvbXBvbmVudHNCeVBhbmVsKGNvbXBvbmVudHM6IGFueVtdKTogYW55W10ge1xyXG5cdFx0Ly8gaXQgY29udGFpbnMgdGhlIHJlc3VsdCBhcnJheVxyXG5cdFx0bGV0IHJlc3VsdCA9IFtdO1xyXG5cdFx0aWYgKGNvbXBvbmVudHMpIHtcclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGNvbXBvbmVudHNcclxuXHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xyXG5cdFx0XHRcdC8vIGF2b2lkIHRoZSBlZGl0Z3JpZCBjb21wb25lbnQgb3QgaWYgaXQgaGFzIGEgZGlmZmVyZW50IGJlaGF2aW9yIGl0IHNob3VsZCBoYXZlIGFuIGVsc2Ugc3RhdGVtZW50XHJcblx0XHRcdFx0aWYgKGNvbXBvbmVudFtFRm9ybWlvS2V5LlRZUEVdICE9PSBFRm9ybWlvS2V5LkVESVRHUklEKSB7XHJcblx0XHRcdFx0XHQvLyBpZiBjb21wb25lbnQgaXMgcGFuZWwgdGhlbiB0aXRsZVBhbmVsIHZhcmlhYmxlIGlzIGNoYW5nZWQsIGFuZCBpdCBpcyBnb25uYSBiZSBpbmhlcml0ZWRcclxuXHRcdFx0XHRcdGlmIChjb21wb25lbnRbRUZvcm1pb0tleS5UWVBFXSA9PT0gRUZvcm1pb0tleS5QQU5FTCkge1xyXG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChjb21wb25lbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9XHJcbn1cclxuIl19