ts2famix 2.1.0-beta.2 → 3.1.0

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 (192) hide show
  1. package/.eslintrc.json +24 -24
  2. package/LICENSE +24 -24
  3. package/README.md +78 -78
  4. package/dist/analyze.js +3 -3
  5. package/dist/analyze_functions/process_functions.js +92 -62
  6. package/dist/famix_functions/EntityDictionary.js +674 -599
  7. package/dist/famix_functions/helpers_creation.js +18 -12
  8. package/dist/fqn.js +351 -18
  9. package/dist/lib/famix/famix_JSON_exporter.js +1 -1
  10. package/dist/lib/famix/famix_base_element.js +1 -1
  11. package/dist/lib/famix/famix_repository.js +14 -5
  12. package/dist/lib/famix/index.js +1 -1
  13. package/dist/lib/famix/model/famix/access.js +1 -1
  14. package/dist/lib/famix/model/famix/accessor.js +1 -1
  15. package/dist/lib/famix/model/famix/alias.js +1 -1
  16. package/dist/lib/famix/model/famix/arrow_function.js +1 -1
  17. package/dist/lib/famix/model/famix/behavioral_entity.js +1 -1
  18. package/dist/lib/famix/model/famix/class.js +1 -1
  19. package/dist/lib/famix/model/famix/comment.js +1 -1
  20. package/dist/lib/famix/model/famix/concretisation.js +1 -1
  21. package/dist/lib/famix/model/famix/container_entity.js +1 -1
  22. package/dist/lib/famix/model/famix/decorator.js +1 -1
  23. package/dist/lib/famix/model/famix/entity.js +1 -1
  24. package/dist/lib/famix/model/famix/enum.js +1 -1
  25. package/dist/lib/famix/model/famix/enum_value.js +1 -1
  26. package/dist/lib/famix/model/famix/function.js +1 -1
  27. package/dist/lib/famix/model/famix/import_clause.js +1 -1
  28. package/dist/lib/famix/model/famix/index.js +1 -1
  29. package/dist/lib/famix/model/famix/indexed_file_anchor.js +1 -1
  30. package/dist/lib/famix/model/famix/inheritance.js +1 -1
  31. package/dist/lib/famix/model/famix/interface.js +1 -1
  32. package/dist/lib/famix/model/famix/invocation.js +1 -1
  33. package/dist/lib/famix/model/famix/method.js +1 -1
  34. package/dist/lib/famix/model/famix/module.js +2 -2
  35. package/dist/lib/famix/model/famix/named_entity.js +1 -1
  36. package/dist/lib/famix/model/famix/parameter.js +1 -1
  37. package/dist/lib/famix/model/famix/parameter_concretisation.js +1 -1
  38. package/dist/lib/famix/model/famix/parameter_type.js +1 -1
  39. package/dist/lib/famix/model/famix/parametric_arrow_function.js +1 -1
  40. package/dist/lib/famix/model/famix/parametric_class.js +1 -1
  41. package/dist/lib/famix/model/famix/parametric_function.js +1 -1
  42. package/dist/lib/famix/model/famix/parametric_interface.js +1 -1
  43. package/dist/lib/famix/model/famix/parametric_method.js +1 -1
  44. package/dist/lib/famix/model/famix/primitive_type.js +1 -1
  45. package/dist/lib/famix/model/famix/property.js +1 -1
  46. package/dist/lib/famix/model/famix/reference.js +1 -1
  47. package/dist/lib/famix/model/famix/scoping_entity.js +1 -1
  48. package/dist/lib/famix/model/famix/script_entity.js +1 -1
  49. package/dist/lib/famix/model/famix/source_anchor.js +1 -1
  50. package/dist/lib/famix/model/famix/source_language.js +1 -1
  51. package/dist/lib/famix/model/famix/sourced_entity.js +1 -1
  52. package/dist/lib/famix/model/famix/structural_entity.js +1 -1
  53. package/dist/lib/famix/model/famix/type.js +1 -1
  54. package/dist/lib/famix/model/famix/variable.js +1 -1
  55. package/dist/lib/ts-complex/cyclomatic-service.js +1 -1
  56. package/dist/refactorer/refactor-getter-setter.js +1 -1
  57. package/dist/ts2famix-cli-wrapper.js +1 -1
  58. package/dist/ts2famix-cli.js +3 -1
  59. package/doc-uml/famix-typescript-model.puml +619 -607
  60. package/doc-uml/famix-typescript-model.svg +1 -1
  61. package/eslint.config.mjs +28 -28
  62. package/jest.config.json +1 -1
  63. package/package.json +70 -70
  64. package/src/analyze.ts +120 -120
  65. package/src/analyze_functions/process_functions.ts +1069 -1040
  66. package/src/famix_functions/EntityDictionary.ts +2061 -2016
  67. package/src/famix_functions/helpers_creation.ts +143 -135
  68. package/src/fqn.ts +416 -50
  69. package/src/generate_uml.sh +20 -20
  70. package/src/lib/famix/License.md +22 -22
  71. package/src/lib/famix/famix_JSON_exporter.ts +56 -56
  72. package/src/lib/famix/famix_base_element.ts +22 -22
  73. package/src/lib/famix/famix_repository.ts +288 -278
  74. package/src/lib/famix/index.ts +8 -8
  75. package/src/lib/famix/model/famix/access.ts +50 -50
  76. package/src/lib/famix/model/famix/accessor.ts +15 -15
  77. package/src/lib/famix/model/famix/alias.ts +39 -39
  78. package/src/lib/famix/model/famix/arrow_function.ts +15 -15
  79. package/src/lib/famix/model/famix/behavioral_entity.ts +97 -97
  80. package/src/lib/famix/model/famix/class.ts +85 -85
  81. package/src/lib/famix/model/famix/comment.ts +47 -47
  82. package/src/lib/famix/model/famix/concretisation.ts +40 -40
  83. package/src/lib/famix/model/famix/container_entity.ts +160 -160
  84. package/src/lib/famix/model/famix/decorator.ts +37 -37
  85. package/src/lib/famix/model/famix/entity.ts +15 -15
  86. package/src/lib/famix/model/famix/enum.ts +30 -30
  87. package/src/lib/famix/model/famix/enum_value.ts +28 -28
  88. package/src/lib/famix/model/famix/function.ts +15 -15
  89. package/src/lib/famix/model/famix/import_clause.ts +51 -51
  90. package/src/lib/famix/model/famix/index.ts +41 -41
  91. package/src/lib/famix/model/famix/indexed_file_anchor.ts +46 -46
  92. package/src/lib/famix/model/famix/inheritance.ts +40 -40
  93. package/src/lib/famix/model/famix/interface.ts +75 -75
  94. package/src/lib/famix/model/famix/invocation.ts +65 -65
  95. package/src/lib/famix/model/famix/method.ts +89 -89
  96. package/src/lib/famix/model/famix/module.ts +71 -71
  97. package/src/lib/famix/model/famix/named_entity.ts +95 -95
  98. package/src/lib/famix/model/famix/parameter.ts +28 -28
  99. package/src/lib/famix/model/famix/parameter_concretisation.ts +51 -51
  100. package/src/lib/famix/model/famix/parameter_type.ts +58 -58
  101. package/src/lib/famix/model/famix/parametric_arrow_function.ts +32 -32
  102. package/src/lib/famix/model/famix/parametric_class.ts +49 -49
  103. package/src/lib/famix/model/famix/parametric_function.ts +32 -32
  104. package/src/lib/famix/model/famix/parametric_interface.ts +49 -49
  105. package/src/lib/famix/model/famix/parametric_method.ts +32 -32
  106. package/src/lib/famix/model/famix/primitive_type.ts +15 -15
  107. package/src/lib/famix/model/famix/property.ts +94 -94
  108. package/src/lib/famix/model/famix/reference.ts +40 -40
  109. package/src/lib/famix/model/famix/scoping_entity.ts +35 -35
  110. package/src/lib/famix/model/famix/script_entity.ts +34 -34
  111. package/src/lib/famix/model/famix/source_anchor.ts +30 -30
  112. package/src/lib/famix/model/famix/source_language.ts +35 -35
  113. package/src/lib/famix/model/famix/sourced_entity.ts +70 -70
  114. package/src/lib/famix/model/famix/structural_entity.ts +43 -43
  115. package/src/lib/famix/model/famix/type.ts +87 -87
  116. package/src/lib/famix/model/famix/variable.ts +27 -27
  117. package/src/lib/famix/package.json +28 -28
  118. package/src/lib/ts-complex/cyclomatic-service.ts +83 -83
  119. package/src/refactorer/refactor-getter-setter.ts +140 -140
  120. package/src/ts2famix-cli-wrapper.ts +21 -21
  121. package/src/ts2famix-cli.ts +62 -60
  122. package/tsconfig.check-tests.json +14 -14
  123. package/tsconfig.json +73 -72
  124. package/.vscode/settings.json +0 -4
  125. package/TODO +0 -1
  126. package/arwea-fix.json +0 -1
  127. package/bogus.ts +0 -3
  128. package/class-diagram.puml +0 -792
  129. package/debug.txt +0 -13332
  130. package/debuglog.txt +0 -12073
  131. package/dist/famix2puml.js +0 -126
  132. package/dist/getClasses-arrow-body.js +0 -43
  133. package/dist/lib/famix/src/famix_JSON_exporter.js +0 -55
  134. package/dist/lib/famix/src/famix_base_element.js +0 -18
  135. package/dist/lib/famix/src/famix_repository.js +0 -224
  136. package/dist/lib/famix/src/index.js +0 -31
  137. package/dist/lib/famix/src/model/famix/access.js +0 -40
  138. package/dist/lib/famix/src/model/famix/accessor.js +0 -17
  139. package/dist/lib/famix/src/model/famix/alias.js +0 -33
  140. package/dist/lib/famix/src/model/famix/arrowFunction.js +0 -17
  141. package/dist/lib/famix/src/model/famix/arrow_function.js +0 -17
  142. package/dist/lib/famix/src/model/famix/behavioral_entity.js +0 -79
  143. package/dist/lib/famix/src/model/famix/class.js +0 -71
  144. package/dist/lib/famix/src/model/famix/comment.js +0 -39
  145. package/dist/lib/famix/src/model/famix/concretisation.js +0 -31
  146. package/dist/lib/famix/src/model/famix/container_entity.js +0 -126
  147. package/dist/lib/famix/src/model/famix/decorator.js +0 -32
  148. package/dist/lib/famix/src/model/famix/entity.js +0 -17
  149. package/dist/lib/famix/src/model/famix/enum.js +0 -31
  150. package/dist/lib/famix/src/model/famix/enum_value.js +0 -25
  151. package/dist/lib/famix/src/model/famix/function.js +0 -17
  152. package/dist/lib/famix/src/model/famix/implicit_variable.js +0 -17
  153. package/dist/lib/famix/src/model/famix/import_clause.js +0 -41
  154. package/dist/lib/famix/src/model/famix/index.js +0 -86
  155. package/dist/lib/famix/src/model/famix/indexed_file_anchor.js +0 -38
  156. package/dist/lib/famix/src/model/famix/inheritance.js +0 -33
  157. package/dist/lib/famix/src/model/famix/interface.js +0 -64
  158. package/dist/lib/famix/src/model/famix/invocation.js +0 -54
  159. package/dist/lib/famix/src/model/famix/method.js +0 -67
  160. package/dist/lib/famix/src/model/famix/module.js +0 -60
  161. package/dist/lib/famix/src/model/famix/named_entity.js +0 -78
  162. package/dist/lib/famix/src/model/famix/parameter.js +0 -25
  163. package/dist/lib/famix/src/model/famix/parameterConcretisation.js +0 -44
  164. package/dist/lib/famix/src/model/famix/parameter_concretisation.js +0 -44
  165. package/dist/lib/famix/src/model/famix/parameter_type.js +0 -45
  166. package/dist/lib/famix/src/model/famix/parametricArrowFunction.js +0 -29
  167. package/dist/lib/famix/src/model/famix/parametric_arrow_function.js +0 -31
  168. package/dist/lib/famix/src/model/famix/parametric_class.js +0 -44
  169. package/dist/lib/famix/src/model/famix/parametric_function.js +0 -31
  170. package/dist/lib/famix/src/model/famix/parametric_interface.js +0 -44
  171. package/dist/lib/famix/src/model/famix/parametric_method.js +0 -31
  172. package/dist/lib/famix/src/model/famix/primitive_type.js +0 -17
  173. package/dist/lib/famix/src/model/famix/property.js +0 -73
  174. package/dist/lib/famix/src/model/famix/reference.js +0 -33
  175. package/dist/lib/famix/src/model/famix/scoping_entity.js +0 -36
  176. package/dist/lib/famix/src/model/famix/script_entity.js +0 -29
  177. package/dist/lib/famix/src/model/famix/source_anchor.js +0 -27
  178. package/dist/lib/famix/src/model/famix/source_language.js +0 -35
  179. package/dist/lib/famix/src/model/famix/sourced_entity.js +0 -60
  180. package/dist/lib/famix/src/model/famix/structural_entity.js +0 -39
  181. package/dist/lib/famix/src/model/famix/text_anchor.js +0 -38
  182. package/dist/lib/famix/src/model/famix/type.js +0 -73
  183. package/dist/lib/famix/src/model/famix/variable.js +0 -24
  184. package/fqn-model.json +0 -1
  185. package/iterateGenericTypes.ts +0 -69
  186. package/out/class-diagram/class-diagram.svg +0 -1
  187. package/sample.json +0 -1
  188. package/sample.ts +0 -1
  189. package/stats.txt +0 -3091
  190. package/tabby-debug-output.txt +0 -19433
  191. package/ts2famix.log +0 -22656
  192. package/validate-references.js +0 -103
@@ -118,17 +118,23 @@ function findAncestor(node) {
118
118
  */
119
119
  function findTypeAncestor(element) {
120
120
  let ancestor;
121
- ancestor = element.getAncestors().find(a => a.getKind() === ts_morph_1.SyntaxKind.MethodDeclaration ||
122
- a.getKind() === ts_morph_1.SyntaxKind.Constructor ||
123
- a.getKind() === ts_morph_1.SyntaxKind.MethodSignature ||
124
- a.getKind() === ts_morph_1.SyntaxKind.FunctionDeclaration ||
125
- a.getKind() === ts_morph_1.SyntaxKind.FunctionExpression ||
126
- a.getKind() === ts_morph_1.SyntaxKind.ModuleDeclaration ||
127
- a.getKind() === ts_morph_1.SyntaxKind.SourceFile ||
128
- a.getKindName() === "GetAccessor" ||
129
- a.getKindName() === "SetAccessor" ||
130
- a.getKind() === ts_morph_1.SyntaxKind.ClassDeclaration ||
131
- a.getKind() === ts_morph_1.SyntaxKind.InterfaceDeclaration);
121
+ const ancestors = element.getAncestors();
122
+ console.log(`Ancestors count: ${ancestors.length}`);
123
+ ancestor = ancestors.find(a => {
124
+ const kind = a.getKind();
125
+ const kindName = a.getKindName();
126
+ return kind === ts_morph_1.SyntaxKind.MethodDeclaration ||
127
+ kind === ts_morph_1.SyntaxKind.Constructor ||
128
+ kind === ts_morph_1.SyntaxKind.MethodSignature ||
129
+ kind === ts_morph_1.SyntaxKind.FunctionDeclaration ||
130
+ kind === ts_morph_1.SyntaxKind.FunctionExpression ||
131
+ kind === ts_morph_1.SyntaxKind.ModuleDeclaration ||
132
+ kind === ts_morph_1.SyntaxKind.SourceFile ||
133
+ kindName === "GetAccessor" ||
134
+ kindName === "SetAccessor" ||
135
+ kind === ts_morph_1.SyntaxKind.ClassDeclaration ||
136
+ kind === ts_morph_1.SyntaxKind.InterfaceDeclaration;
137
+ });
132
138
  if (!ancestor) {
133
139
  throw new Error(`Type ancestor not found for ${element.getKindName()}`);
134
140
  }
@@ -155,4 +161,4 @@ function replaceLastBetweenTags(input, replacement) {
155
161
  const afterTag = input.substring(closingTagIndex); // Include '>'
156
162
  return beforeTag + replacement + afterTag;
157
163
  }
158
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyc19jcmVhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYW1peF9mdW5jdGlvbnMvaGVscGVyc19jcmVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWVBLDhDQWVDO0FBRUQsd0NBaUJDO0FBT0QsNENBR0M7QUFPRCxvQ0FnQkM7QUFPRCw0Q0FrQkM7QUFFRCx3Q0FNQztBQUVELHdEQWlCQztBQXRJRCxnRUFBa0Q7QUFDbEQsd0NBQW9DO0FBQ3BDLHVDQUFrVTtBQVNsVTs7O0dBR0c7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxNQUF3QjtJQUN0RCxNQUFNLEVBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3JELEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNwRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2QsTUFBTTtZQUNWLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNSLE9BQU8sQ0FBQyxDQUFDLENBQUMsb0RBQW9EO1FBQ2xFLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtFQUFrRTtBQUNqRixDQUFDO0FBRUQsU0FB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TyxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0RyxDQUFDO1NBQU0sQ0FBQztRQUNKLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBZ0Isc0JBQXNCLENBQUMsS0FBYSxFQUFFLFdBQW1CO0lBQ3JFLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFNUMsSUFBSSxZQUFZLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0QixPQUFPLEtBQUssQ0FBQyxDQUFDLGtEQUFrRDtJQUNwRSxDQUFDO0lBRUQsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFekQsSUFBSSxlQUFlLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxDQUFDLHdEQUF3RDtJQUMxRSxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYztJQUN0RSxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsY0FBYztJQUVqRSxPQUFPLFNBQVMsR0FBRyxXQUFXLEdBQUcsUUFBUSxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBGYW1peCBmcm9tIFwiLi4vbGliL2ZhbWl4L21vZGVsL2ZhbWl4XCI7XHJcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuLi9hbmFseXplXCI7XHJcbmltcG9ydCB7IENvbnN0cnVjdG9yRGVjbGFyYXRpb24sIElkZW50aWZpZXIsIEZ1bmN0aW9uRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uLCBNZXRob2RTaWduYXR1cmUsIFByb3BlcnR5RGVjbGFyYXRpb24sIFByb3BlcnR5U2lnbmF0dXJlLCBWYXJpYWJsZURlY2xhcmF0aW9uLCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiwgRW51bU1lbWJlciwgVHlwZUFsaWFzRGVjbGFyYXRpb24sIE5vZGUsIFN5bnRheEtpbmQsIEZ1bmN0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJ0cy1tb3JwaFwiO1xyXG5pbXBvcnQgeyBUU01vcnBoVHlwZURlY2xhcmF0aW9uIH0gZnJvbSBcIi4vRW50aXR5RGljdGlvbmFyeVwiO1xyXG5cclxuaW50ZXJmYWNlIFNlYXJjaFBhcmFtZXRlcnMge1xyXG4gICAgc2VhcmNoQXJyYXk6IHN0cmluZ1tdO1xyXG4gICAgdGFyZ2V0QXJyYXk6IHN0cmluZ1tdO1xyXG4gICAgc3RhcnQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGlzIGZ1bmN0aW9uIHdvcmtzIGxpa2UgaW5kZXhPZiwgYnV0IGl0IHdvcmtzIHdpdGggYXJyYXlzIG9mIGdyYXBoZW1lIGNsdXN0ZXJzLlxyXG4gKiBAcGFyYW0gdGFyZ2V0QXJyYXlcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpbmRleE9mU3BsaXRBcnJheShwYXJhbXM6IFNlYXJjaFBhcmFtZXRlcnMpOiBudW1iZXIge1xyXG4gICAgY29uc3Qge3NlYXJjaEFycmF5LCB0YXJnZXRBcnJheSwgc3RhcnQgPSAwfSA9IHBhcmFtcztcclxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBzZWFyY2hBcnJheS5sZW5ndGggLSB0YXJnZXRBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0YXJnZXRBcnJheS5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBpZiAoc2VhcmNoQXJyYXlbaSArIGpdICE9PSB0YXJnZXRBcnJheVtqXSkge1xyXG4gICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaTsgLy8gUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0aGUgdGFyZ2V0IGFycmF5IHdhcyBmb3VuZFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAtMTsgLy8gUmV0dXJuIC0xIGlmIHRoZSB0YXJnZXQgYXJyYXkgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VhcmNoIGFycmF5XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWJUeXBlTmFtZShmbXhOYW1lZEVudGl0eTogRmFtaXguTmFtZWRFbnRpdHkpIHtcclxuICAgIGNvbnN0IG5hbWUgPSBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkNsYXNzID8gJ0NsYXNzJyA6XHJcbiAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5JbnRlcmZhY2UgPyAnSW50ZXJmYWNlJyA6XHJcbiAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguRnVuY3Rpb24gPyAnRnVuY3Rpb24nIDpcclxuICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguRW51bSA/ICdFbnVtJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5FbnVtVmFsdWUgPyAnRW51bVZhbHVlJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguQWxpYXMgPyAnQWxpYXMnIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguVmFyaWFibGUgPyAnVmFyaWFibGUnIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LlR5cGUgPyAnVHlwZScgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4Lk1ldGhvZCA/ICdNZXRob2QnIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguRGVjb3JhdG9yID8gJ0RlY29yYXRvcicgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguQWNjZXNzb3IgPyAnQWNjZXNzb3InIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0ZXIgPyAnUGFyYW1ldGVyJyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LlByb3BlcnR5ID8gJ1Byb3BlcnR5JyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05hbWVkRW50aXR5JztcclxuICAgIGxvZ2dlci5kZWJ1ZyhgJHtmbXhOYW1lZEVudGl0eS5uYW1lfSBpcyBvZiB0eXBlICR7bmFtZX1gKTtcclxuICAgIHJldHVybiBuYW1lO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgc2lnbmF0dXJlIG9mIGEgbWV0aG9kIG9yIGEgZnVuY3Rpb25cclxuICogQHBhcmFtIHRleHQgQSBtZXRob2Qgb3IgYSBmdW5jdGlvbiBzb3VyY2UgY29kZVxyXG4gKiBAcmV0dXJucyBUaGUgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2Qgb3IgdGhlIGZ1bmN0aW9uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNpZ25hdHVyZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZW5kU2lnbmF0dXJlVGV4dCA9IHRleHQuaW5kZXhPZihcIntcIik7XHJcbiAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgZW5kU2lnbmF0dXJlVGV4dCkudHJpbSgpO1xyXG59XHJcblxyXG4vKipcclxuICogRmluZHMgdGhlIGFuY2VzdG9yIG9mIGEgbm9kZVxyXG4gKiBAcGFyYW0gbm9kZSBBIG5vZGVcclxuICogQHJldHVybnMgVGhlIGFuY2VzdG9yIG9mIHRoZSBub2RlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmluZEFuY2VzdG9yKG5vZGU6IElkZW50aWZpZXIpOiBOb2RlIHtcclxuICAgIGxldCBhbmNlc3RvcjogTm9kZSB8IHVuZGVmaW5lZDtcclxuICAgIGFuY2VzdG9yID0gbm9kZS5nZXRBbmNlc3RvcnMoKS5maW5kKGEgPT4gXHJcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuTWV0aG9kRGVjbGFyYXRpb24gfHwgXHJcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuQ29uc3RydWN0b3IgfHwgXHJcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuRnVuY3Rpb25EZWNsYXJhdGlvbiB8fCBcclxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5GdW5jdGlvbkV4cHJlc3Npb24gfHwgXHJcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuTW9kdWxlRGVjbGFyYXRpb24gfHwgXHJcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuU291cmNlRmlsZSB8fCBcclxuICAgICAgICBhLmdldEtpbmROYW1lKCkgPT09IFwiR2V0QWNjZXNzb3JcIiB8fCBcclxuICAgICAgICBhLmdldEtpbmROYW1lKCkgPT09IFwiU2V0QWNjZXNzb3JcIiB8fCBcclxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uKTtcclxuICAgIGlmICghYW5jZXN0b3IpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuY2VzdG9yIG5vdCBmb3VuZCBmb3IgJHtub2RlLmdldFRleHQoKX1gKTtcclxuICAgIH1cclxuICAgIHJldHVybiBhbmNlc3RvclxyXG59XHJcblxyXG4vKipcclxuICogRmluZHMgdGhlIGFuY2VzdG9yIG9mIGEgdHMtbW9ycGggZWxlbWVudFxyXG4gKiBAcGFyYW0gZWxlbWVudCBBIHRzLW1vcnBoIGVsZW1lbnRcclxuICogQHJldHVybnMgVGhlIGFuY2VzdG9yIG9mIHRoZSB0cy1tb3JwaCBlbGVtZW50XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmluZFR5cGVBbmNlc3RvcihlbGVtZW50OiBUU01vcnBoVHlwZURlY2xhcmF0aW9uKTogTm9kZSB7XHJcbiAgICBsZXQgYW5jZXN0b3I6IE5vZGUgfCB1bmRlZmluZWQ7XHJcbiAgICBhbmNlc3RvciA9IGVsZW1lbnQuZ2V0QW5jZXN0b3JzKCkuZmluZChhID0+IFxyXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLk1ldGhvZERlY2xhcmF0aW9uIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLkNvbnN0cnVjdG9yIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLk1ldGhvZFNpZ25hdHVyZSB8fCBcclxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5GdW5jdGlvbkRlY2xhcmF0aW9uIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLkZ1bmN0aW9uRXhwcmVzc2lvbiB8fCBcclxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5Nb2R1bGVEZWNsYXJhdGlvbiB8fCBcclxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5Tb3VyY2VGaWxlIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZE5hbWUoKSA9PT0gXCJHZXRBY2Nlc3NvclwiIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZE5hbWUoKSA9PT0gXCJTZXRBY2Nlc3NvclwiIHx8IFxyXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLkNsYXNzRGVjbGFyYXRpb24gfHwgXHJcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuSW50ZXJmYWNlRGVjbGFyYXRpb24pO1xyXG4gICAgaWYgKCFhbmNlc3Rvcikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZSBhbmNlc3RvciBub3QgZm91bmQgZm9yICR7ZWxlbWVudC5nZXRLaW5kTmFtZSgpfWApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFuY2VzdG9yO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlzQXJlRXF1YWwoYXJyYXkxOiBzdHJpbmdbXSwgYXJyYXkyOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGFycmF5MSAmJiBhcnJheTIgKSB7XHJcbiAgICAgICAgcmV0dXJuIGFycmF5MS5sZW5ndGggPT09IGFycmF5Mi5sZW5ndGggJiYgYXJyYXkxLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSBhcnJheTJbaW5kZXhdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUxhc3RCZXR3ZWVuVGFncyhpbnB1dDogc3RyaW5nLCByZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGxhc3RUYWdJbmRleCA9IGlucHV0Lmxhc3RJbmRleE9mKCc8Jyk7XHJcbiAgICBcclxuICAgIGlmIChsYXN0VGFnSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIGlucHV0OyAvLyBSZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyBpZiBubyB0YWdzIGFyZSBmb3VuZFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNsb3NpbmdUYWdJbmRleCA9IGlucHV0LmluZGV4T2YoJz4nLCBsYXN0VGFnSW5kZXgpO1xyXG4gICAgXHJcbiAgICBpZiAoY2xvc2luZ1RhZ0luZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHJldHVybiBpbnB1dDsgLy8gUmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgaWYgbm8gY2xvc2luZyB0YWcgaXMgZm91bmRcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiZWZvcmVUYWcgPSBpbnB1dC5zdWJzdHJpbmcoMCwgbGFzdFRhZ0luZGV4ICsgMSk7IC8vIEluY2x1ZGUgJzwnXHJcbiAgICBjb25zdCBhZnRlclRhZyA9IGlucHV0LnN1YnN0cmluZyhjbG9zaW5nVGFnSW5kZXgpOyAvLyBJbmNsdWRlICc+J1xyXG5cclxuICAgIHJldHVybiBiZWZvcmVUYWcgKyByZXBsYWNlbWVudCArIGFmdGVyVGFnO1xyXG59XHJcbiJdfQ==
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyc19jcmVhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYW1peF9mdW5jdGlvbnMvaGVscGVyc19jcmVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWVBLDhDQWVDO0FBRUQsd0NBaUJDO0FBT0QsNENBR0M7QUFPRCxvQ0FnQkM7QUFPRCw0Q0EwQkM7QUFFRCx3Q0FNQztBQUVELHdEQWlCQztBQTlJRCxnRUFBa0Q7QUFDbEQsd0NBQW9DO0FBQ3BDLHVDQUFrVTtBQVNsVTs7O0dBR0c7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxNQUF3QjtJQUN0RCxNQUFNLEVBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3JELEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNwRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2QsTUFBTTtZQUNWLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNSLE9BQU8sQ0FBQyxDQUFDLENBQUMsb0RBQW9EO1FBQ2xFLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtFQUFrRTtBQUNqRixDQUFDO0FBRUQsU0FB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LElBQUksTUFBTSxJQUFJLE1BQU0sRUFBRyxDQUFDO1FBQ3BCLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdEcsQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQWdCLHNCQUFzQixDQUFDLEtBQWEsRUFBRSxXQUFtQjtJQUNyRSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTVDLElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxLQUFLLENBQUMsQ0FBQyxrREFBa0Q7SUFDcEUsQ0FBQztJQUVELE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRXpELElBQUksZUFBZSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUMsQ0FBQyx3REFBd0Q7SUFDMUUsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWM7SUFDdEUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGNBQWM7SUFFakUsT0FBTyxTQUFTLEdBQUcsV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgRmFtaXggZnJvbSBcIi4uL2xpYi9mYW1peC9tb2RlbC9mYW1peFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2FuYWx5emVcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yRGVjbGFyYXRpb24sIElkZW50aWZpZXIsIEZ1bmN0aW9uRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uLCBNZXRob2RTaWduYXR1cmUsIFByb3BlcnR5RGVjbGFyYXRpb24sIFByb3BlcnR5U2lnbmF0dXJlLCBWYXJpYWJsZURlY2xhcmF0aW9uLCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiwgRW51bU1lbWJlciwgVHlwZUFsaWFzRGVjbGFyYXRpb24sIE5vZGUsIFN5bnRheEtpbmQsIEZ1bmN0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCJ0cy1tb3JwaFwiO1xuaW1wb3J0IHsgVFNNb3JwaFR5cGVEZWNsYXJhdGlvbiB9IGZyb20gXCIuL0VudGl0eURpY3Rpb25hcnlcIjtcblxuaW50ZXJmYWNlIFNlYXJjaFBhcmFtZXRlcnMge1xuICAgIHNlYXJjaEFycmF5OiBzdHJpbmdbXTtcbiAgICB0YXJnZXRBcnJheTogc3RyaW5nW107XG4gICAgc3RhcnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3b3JrcyBsaWtlIGluZGV4T2YsIGJ1dCBpdCB3b3JrcyB3aXRoIGFycmF5cyBvZiBncmFwaGVtZSBjbHVzdGVycy5cbiAqIEBwYXJhbSB0YXJnZXRBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZlNwbGl0QXJyYXkocGFyYW1zOiBTZWFyY2hQYXJhbWV0ZXJzKTogbnVtYmVyIHtcbiAgICBjb25zdCB7c2VhcmNoQXJyYXksIHRhcmdldEFycmF5LCBzdGFydCA9IDB9ID0gcGFyYW1zO1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBzZWFyY2hBcnJheS5sZW5ndGggLSB0YXJnZXRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZm91bmQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRhcmdldEFycmF5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoc2VhcmNoQXJyYXlbaSArIGpdICE9PSB0YXJnZXRBcnJheVtqXSkge1xuICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gaTsgLy8gUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0aGUgdGFyZ2V0IGFycmF5IHdhcyBmb3VuZFxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTsgLy8gUmV0dXJuIC0xIGlmIHRoZSB0YXJnZXQgYXJyYXkgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VhcmNoIGFycmF5XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWJUeXBlTmFtZShmbXhOYW1lZEVudGl0eTogRmFtaXguTmFtZWRFbnRpdHkpIHtcbiAgICBjb25zdCBuYW1lID0gZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5DbGFzcyA/ICdDbGFzcycgOlxuICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkludGVyZmFjZSA/ICdJbnRlcmZhY2UnIDpcbiAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguRnVuY3Rpb24gPyAnRnVuY3Rpb24nIDpcbiAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkVudW0gPyAnRW51bScgOlxuICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkVudW1WYWx1ZSA/ICdFbnVtVmFsdWUnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguQWxpYXMgPyAnQWxpYXMnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LlZhcmlhYmxlID8gJ1ZhcmlhYmxlJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZteE5hbWVkRW50aXR5IGluc3RhbmNlb2YgRmFtaXguVHlwZSA/ICdUeXBlJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4Lk1ldGhvZCA/ICdNZXRob2QnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXhOYW1lZEVudGl0eSBpbnN0YW5jZW9mIEZhbWl4LkRlY29yYXRvciA/ICdEZWNvcmF0b3InIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5BY2Nlc3NvciA/ICdBY2Nlc3NvcicgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0ZXIgPyAnUGFyYW1ldGVyJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm14TmFtZWRFbnRpdHkgaW5zdGFuY2VvZiBGYW1peC5Qcm9wZXJ0eSA/ICdQcm9wZXJ0eScgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTmFtZWRFbnRpdHknO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHtmbXhOYW1lZEVudGl0eS5uYW1lfSBpcyBvZiB0eXBlICR7bmFtZX1gKTtcbiAgICByZXR1cm4gbmFtZTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzaWduYXR1cmUgb2YgYSBtZXRob2Qgb3IgYSBmdW5jdGlvblxuICogQHBhcmFtIHRleHQgQSBtZXRob2Qgb3IgYSBmdW5jdGlvbiBzb3VyY2UgY29kZVxuICogQHJldHVybnMgVGhlIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kIG9yIHRoZSBmdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNpZ25hdHVyZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVuZFNpZ25hdHVyZVRleHQgPSB0ZXh0LmluZGV4T2YoXCJ7XCIpO1xuICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygwLCBlbmRTaWduYXR1cmVUZXh0KS50cmltKCk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGFuY2VzdG9yIG9mIGEgbm9kZVxuICogQHBhcmFtIG5vZGUgQSBub2RlXG4gKiBAcmV0dXJucyBUaGUgYW5jZXN0b3Igb2YgdGhlIG5vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBbmNlc3Rvcihub2RlOiBJZGVudGlmaWVyKTogTm9kZSB7XG4gICAgbGV0IGFuY2VzdG9yOiBOb2RlIHwgdW5kZWZpbmVkO1xuICAgIGFuY2VzdG9yID0gbm9kZS5nZXRBbmNlc3RvcnMoKS5maW5kKGEgPT4gXG4gICAgICAgIGEuZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLk1ldGhvZERlY2xhcmF0aW9uIHx8IFxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5Db25zdHJ1Y3RvciB8fCBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuRnVuY3Rpb25EZWNsYXJhdGlvbiB8fCBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuRnVuY3Rpb25FeHByZXNzaW9uIHx8IFxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5Nb2R1bGVEZWNsYXJhdGlvbiB8fCBcbiAgICAgICAgYS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuU291cmNlRmlsZSB8fCBcbiAgICAgICAgYS5nZXRLaW5kTmFtZSgpID09PSBcIkdldEFjY2Vzc29yXCIgfHwgXG4gICAgICAgIGEuZ2V0S2luZE5hbWUoKSA9PT0gXCJTZXRBY2Nlc3NvclwiIHx8IFxuICAgICAgICBhLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uKTtcbiAgICBpZiAoIWFuY2VzdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQW5jZXN0b3Igbm90IGZvdW5kIGZvciAke25vZGUuZ2V0VGV4dCgpfWApO1xuICAgIH1cbiAgICByZXR1cm4gYW5jZXN0b3Jcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgYW5jZXN0b3Igb2YgYSB0cy1tb3JwaCBlbGVtZW50XG4gKiBAcGFyYW0gZWxlbWVudCBBIHRzLW1vcnBoIGVsZW1lbnRcbiAqIEByZXR1cm5zIFRoZSBhbmNlc3RvciBvZiB0aGUgdHMtbW9ycGggZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFR5cGVBbmNlc3RvcihlbGVtZW50OiBOb2RlKTogTm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGFuY2VzdG9yOiBOb2RlIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGVsZW1lbnQuZ2V0QW5jZXN0b3JzKCk7XG4gICAgY29uc29sZS5sb2coYEFuY2VzdG9ycyBjb3VudDogJHthbmNlc3RvcnMubGVuZ3RofWApO1xuXG4gICAgYW5jZXN0b3IgPSBhbmNlc3RvcnMuZmluZChhID0+IHtcbiAgICAgICAgY29uc3Qga2luZCA9IGEuZ2V0S2luZCgpO1xuICAgICAgICBjb25zdCBraW5kTmFtZSA9IGEuZ2V0S2luZE5hbWUoKTtcbiAgICAgICAgcmV0dXJuIGtpbmQgPT09IFN5bnRheEtpbmQuTWV0aG9kRGVjbGFyYXRpb24gfHxcbiAgICAgICAgICAgICAgIGtpbmQgPT09IFN5bnRheEtpbmQuQ29uc3RydWN0b3IgfHxcbiAgICAgICAgICAgICAgIGtpbmQgPT09IFN5bnRheEtpbmQuTWV0aG9kU2lnbmF0dXJlIHx8XG4gICAgICAgICAgICAgICBraW5kID09PSBTeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb24gfHxcbiAgICAgICAgICAgICAgIGtpbmQgPT09IFN5bnRheEtpbmQuRnVuY3Rpb25FeHByZXNzaW9uIHx8XG4gICAgICAgICAgICAgICBraW5kID09PSBTeW50YXhLaW5kLk1vZHVsZURlY2xhcmF0aW9uIHx8XG4gICAgICAgICAgICAgICBraW5kID09PSBTeW50YXhLaW5kLlNvdXJjZUZpbGUgfHxcbiAgICAgICAgICAgICAgIGtpbmROYW1lID09PSBcIkdldEFjY2Vzc29yXCIgfHxcbiAgICAgICAgICAgICAgIGtpbmROYW1lID09PSBcIlNldEFjY2Vzc29yXCIgfHxcbiAgICAgICAgICAgICAgIGtpbmQgPT09IFN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbiB8fFxuICAgICAgICAgICAgICAga2luZCA9PT0gU3ludGF4S2luZC5JbnRlcmZhY2VEZWNsYXJhdGlvbjtcbiAgICB9KTtcblxuICAgIGlmICghYW5jZXN0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeXBlIGFuY2VzdG9yIG5vdCBmb3VuZCBmb3IgJHtlbGVtZW50LmdldEtpbmROYW1lKCl9YCk7XG4gICAgfSBcblxuICAgIHJldHVybiBhbmNlc3Rvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5c0FyZUVxdWFsKGFycmF5MTogc3RyaW5nW10sIGFycmF5Mjogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoYXJyYXkxICYmIGFycmF5MiApIHtcbiAgICAgICAgcmV0dXJuIGFycmF5MS5sZW5ndGggPT09IGFycmF5Mi5sZW5ndGggJiYgYXJyYXkxLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSBhcnJheTJbaW5kZXhdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUxhc3RCZXR3ZWVuVGFncyhpbnB1dDogc3RyaW5nLCByZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0VGFnSW5kZXggPSBpbnB1dC5sYXN0SW5kZXhPZignPCcpO1xuICAgIFxuICAgIGlmIChsYXN0VGFnSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDsgLy8gUmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgaWYgbm8gdGFncyBhcmUgZm91bmRcbiAgICB9XG5cbiAgICBjb25zdCBjbG9zaW5nVGFnSW5kZXggPSBpbnB1dC5pbmRleE9mKCc+JywgbGFzdFRhZ0luZGV4KTtcbiAgICBcbiAgICBpZiAoY2xvc2luZ1RhZ0luZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7IC8vIFJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nIGlmIG5vIGNsb3NpbmcgdGFnIGlzIGZvdW5kXG4gICAgfVxuXG4gICAgY29uc3QgYmVmb3JlVGFnID0gaW5wdXQuc3Vic3RyaW5nKDAsIGxhc3RUYWdJbmRleCArIDEpOyAvLyBJbmNsdWRlICc8J1xuICAgIGNvbnN0IGFmdGVyVGFnID0gaW5wdXQuc3Vic3RyaW5nKGNsb3NpbmdUYWdJbmRleCk7IC8vIEluY2x1ZGUgJz4nXG5cbiAgICByZXR1cm4gYmVmb3JlVGFnICsgcmVwbGFjZW1lbnQgKyBhZnRlclRhZztcbn1cbiJdfQ==