angular-odata 0.80.0 → 0.99.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 (237) hide show
  1. package/README.md +69 -34
  2. package/{esm2015/angular-odata.js → esm2020/angular-odata.mjs} +0 -0
  3. package/esm2020/lib/api.mjs +303 -0
  4. package/{esm2015/lib/cache/cache.js → esm2020/lib/cache/cache.mjs} +3 -3
  5. package/{esm2015/lib/cache/index.js → esm2020/lib/cache/index.mjs} +0 -0
  6. package/{esm2015/lib/cache/memory.js → esm2020/lib/cache/memory.mjs} +1 -1
  7. package/{esm2015/lib/cache/storage.js → esm2020/lib/cache/storage.mjs} +2 -2
  8. package/esm2020/lib/client.mjs +271 -0
  9. package/{esm2015/lib/constants.js → esm2020/lib/constants.mjs} +8 -3
  10. package/esm2020/lib/helper.mjs +268 -0
  11. package/esm2020/lib/index.mjs +19 -0
  12. package/esm2020/lib/models/collection.mjs +741 -0
  13. package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
  14. package/esm2020/lib/models/model.mjs +453 -0
  15. package/esm2020/lib/models/options.mjs +945 -0
  16. package/{esm2015/lib/module.js → esm2020/lib/module.mjs} +7 -7
  17. package/esm2020/lib/options.mjs +32 -0
  18. package/esm2020/lib/resources/index.mjs +7 -0
  19. package/esm2020/lib/resources/path/handlers.mjs +69 -0
  20. package/esm2020/lib/resources/path/index.mjs +3 -0
  21. package/esm2020/lib/resources/path/segments.mjs +124 -0
  22. package/esm2020/lib/resources/query/builder.mjs +590 -0
  23. package/esm2020/lib/resources/query/expressions/base.mjs +20 -0
  24. package/esm2020/lib/resources/query/expressions/compute.mjs +38 -0
  25. package/esm2020/lib/resources/query/expressions/expand.mjs +57 -0
  26. package/esm2020/lib/resources/query/expressions/filter.mjs +154 -0
  27. package/esm2020/lib/resources/query/expressions/index.mjs +7 -0
  28. package/esm2020/lib/resources/query/expressions/orderby.mjs +54 -0
  29. package/esm2020/lib/resources/query/expressions/search.mjs +113 -0
  30. package/esm2020/lib/resources/query/expressions/select.mjs +32 -0
  31. package/esm2020/lib/resources/query/expressions/syntax.mjs +371 -0
  32. package/esm2020/lib/resources/query/handlers.mjs +188 -0
  33. package/esm2020/lib/resources/query/index.mjs +4 -0
  34. package/esm2020/lib/resources/query/options.mjs +103 -0
  35. package/esm2020/lib/resources/request.mjs +167 -0
  36. package/esm2020/lib/resources/resource.mjs +326 -0
  37. package/esm2020/lib/resources/responses/annotations.mjs +119 -0
  38. package/{esm2015/lib/resources/responses/csdl/csdl-annotation.js → esm2020/lib/resources/responses/csdl/csdl-annotation.mjs} +0 -0
  39. package/{esm2015/lib/resources/responses/csdl/csdl-entity-container.js → esm2020/lib/resources/responses/csdl/csdl-entity-container.mjs} +0 -0
  40. package/{esm2015/lib/resources/responses/csdl/csdl-entity-set.js → esm2020/lib/resources/responses/csdl/csdl-entity-set.mjs} +0 -0
  41. package/{esm2015/lib/resources/responses/csdl/csdl-enum-type.js → esm2020/lib/resources/responses/csdl/csdl-enum-type.mjs} +0 -0
  42. package/{esm2015/lib/resources/responses/csdl/csdl-function-action.js → esm2020/lib/resources/responses/csdl/csdl-function-action.mjs} +0 -0
  43. package/{esm2015/lib/resources/responses/csdl/csdl-navigation-property-binding.js → esm2020/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs} +0 -0
  44. package/{esm2015/lib/resources/responses/csdl/csdl-reference.js → esm2020/lib/resources/responses/csdl/csdl-reference.mjs} +0 -0
  45. package/{esm2015/lib/resources/responses/csdl/csdl-schema.js → esm2020/lib/resources/responses/csdl/csdl-schema.mjs} +0 -0
  46. package/{esm2015/lib/resources/responses/csdl/csdl-singleton.js → esm2020/lib/resources/responses/csdl/csdl-singleton.mjs} +0 -0
  47. package/{esm2015/lib/resources/responses/csdl/csdl-structural-property.js → esm2020/lib/resources/responses/csdl/csdl-structural-property.mjs} +0 -0
  48. package/{esm2015/lib/resources/responses/csdl/csdl-structured-type.js → esm2020/lib/resources/responses/csdl/csdl-structured-type.mjs} +0 -0
  49. package/{esm2015/lib/resources/responses/csdl/csdl-type-definition.js → esm2020/lib/resources/responses/csdl/csdl-type-definition.mjs} +0 -0
  50. package/{esm2015/lib/resources/responses/index.js → esm2020/lib/resources/responses/index.mjs} +0 -0
  51. package/esm2020/lib/resources/responses/metadata.mjs +547 -0
  52. package/{esm2015/lib/resources/responses/options.js → esm2020/lib/resources/responses/options.mjs} +0 -0
  53. package/{esm2015/lib/resources/responses/response.js → esm2020/lib/resources/responses/response.mjs} +0 -0
  54. package/{esm2015/lib/resources/responses/types.js → esm2020/lib/resources/responses/types.mjs} +0 -0
  55. package/esm2020/lib/resources/types/action.mjs +101 -0
  56. package/esm2020/lib/resources/types/batch.mjs +309 -0
  57. package/esm2020/lib/resources/types/count.mjs +27 -0
  58. package/esm2020/lib/resources/types/entity-set.mjs +94 -0
  59. package/esm2020/lib/resources/types/entity.mjs +106 -0
  60. package/esm2020/lib/resources/types/function.mjs +137 -0
  61. package/{esm2015/lib/resources/types/index.js → esm2020/lib/resources/types/index.mjs} +0 -0
  62. package/esm2020/lib/resources/types/media.mjs +41 -0
  63. package/esm2020/lib/resources/types/metadata.mjs +30 -0
  64. package/esm2020/lib/resources/types/navigation-property.mjs +226 -0
  65. package/esm2020/lib/resources/types/options.mjs +2 -0
  66. package/esm2020/lib/resources/types/property.mjs +183 -0
  67. package/esm2020/lib/resources/types/reference.mjs +85 -0
  68. package/esm2020/lib/resources/types/singleton.mjs +126 -0
  69. package/esm2020/lib/resources/types/value.mjs +41 -0
  70. package/esm2020/lib/schema/annotation.mjs +37 -0
  71. package/esm2020/lib/schema/callable.mjs +62 -0
  72. package/esm2020/lib/schema/element.mjs +51 -0
  73. package/esm2020/lib/schema/entity-container.mjs +9 -0
  74. package/esm2020/lib/schema/entity-set.mjs +9 -0
  75. package/esm2020/lib/schema/enum-type.mjs +71 -0
  76. package/{esm2015/lib/schema/index.js → esm2020/lib/schema/index.mjs} +2 -1
  77. package/esm2020/lib/schema/parsers/callable.mjs +113 -0
  78. package/esm2020/lib/schema/parsers/edm.mjs +95 -0
  79. package/esm2020/lib/schema/parsers/enum-type.mjs +107 -0
  80. package/esm2020/lib/schema/parsers/index.mjs +5 -0
  81. package/esm2020/lib/schema/parsers/structured-type.mjs +412 -0
  82. package/esm2020/lib/schema/schema.mjs +61 -0
  83. package/esm2020/lib/schema/structured-type.mjs +198 -0
  84. package/esm2020/lib/services/base.mjs +29 -0
  85. package/esm2020/lib/services/entity-set.mjs +143 -0
  86. package/esm2020/lib/services/entity.mjs +12 -0
  87. package/{esm2015/lib/services/factory.js → esm2020/lib/services/factory.mjs} +3 -3
  88. package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
  89. package/esm2020/lib/services/singleton.mjs +48 -0
  90. package/{esm2015/lib/settings.js → esm2020/lib/settings.mjs} +1 -1
  91. package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
  92. package/esm2020/lib/types.mjs +37 -0
  93. package/esm2020/lib/utils/arraybuffers.mjs +46 -0
  94. package/{esm2015/lib/utils/dates.js → esm2020/lib/utils/dates.mjs} +0 -0
  95. package/esm2020/lib/utils/durations.mjs +40 -0
  96. package/{esm2015/lib/utils/enums.js → esm2020/lib/utils/enums.mjs} +0 -0
  97. package/esm2020/lib/utils/http.mjs +93 -0
  98. package/esm2020/lib/utils/index.mjs +10 -0
  99. package/esm2020/lib/utils/objects.mjs +195 -0
  100. package/esm2020/lib/utils/odata.mjs +22 -0
  101. package/esm2020/lib/utils/strings.mjs +20 -0
  102. package/esm2020/lib/utils/types.mjs +134 -0
  103. package/{esm2015/lib/utils/urls.js → esm2020/lib/utils/urls.mjs} +0 -0
  104. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  105. package/fesm2015/{angular-odata.js → angular-odata.mjs} +4508 -3427
  106. package/fesm2015/angular-odata.mjs.map +1 -0
  107. package/fesm2020/angular-odata.mjs +10510 -0
  108. package/fesm2020/angular-odata.mjs.map +1 -0
  109. package/lib/api.d.ts +14 -14
  110. package/lib/cache/cache.d.ts +2 -2
  111. package/lib/cache/storage.d.ts +1 -1
  112. package/lib/client.d.ts +60 -9
  113. package/lib/constants.d.ts +5 -2
  114. package/lib/index.d.ts +0 -1
  115. package/lib/models/collection.d.ts +30 -42
  116. package/lib/models/model.d.ts +37 -30
  117. package/lib/models/options.d.ts +30 -38
  118. package/lib/module.d.ts +1 -1
  119. package/lib/options.d.ts +47 -0
  120. package/lib/resources/index.d.ts +2 -3
  121. package/lib/resources/path/handlers.d.ts +27 -0
  122. package/lib/resources/path/index.d.ts +2 -0
  123. package/lib/resources/{path-segments.d.ts → path/segments.d.ts} +4 -16
  124. package/lib/resources/{builder.d.ts → query/builder.d.ts} +12 -7
  125. package/lib/resources/query/expressions/base.d.ts +19 -0
  126. package/lib/resources/query/expressions/compute.d.ts +26 -0
  127. package/lib/resources/query/expressions/expand.d.ts +40 -0
  128. package/lib/resources/query/expressions/filter.d.ts +58 -0
  129. package/lib/resources/query/expressions/index.d.ts +6 -0
  130. package/lib/resources/query/expressions/orderby.d.ts +37 -0
  131. package/lib/resources/query/expressions/search.d.ts +47 -0
  132. package/lib/resources/query/expressions/select.d.ts +21 -0
  133. package/lib/resources/query/expressions/syntax.d.ts +177 -0
  134. package/lib/resources/query/handlers.d.ts +104 -0
  135. package/lib/resources/query/index.d.ts +3 -0
  136. package/lib/resources/query/options.d.ts +38 -0
  137. package/lib/resources/request.d.ts +4 -3
  138. package/lib/resources/resource.d.ts +42 -48
  139. package/lib/resources/types/action.d.ts +14 -61
  140. package/lib/resources/types/batch.d.ts +16 -3
  141. package/lib/resources/types/count.d.ts +9 -17
  142. package/lib/resources/types/entity-set.d.ts +12 -51
  143. package/lib/resources/types/entity.d.ts +13 -31
  144. package/lib/resources/types/function.d.ts +13 -60
  145. package/lib/resources/types/media.d.ts +9 -8
  146. package/lib/resources/types/metadata.d.ts +3 -5
  147. package/lib/resources/types/navigation-property.d.ts +74 -65
  148. package/lib/resources/types/options.d.ts +1 -1
  149. package/lib/resources/types/property.d.ts +49 -57
  150. package/lib/resources/types/reference.d.ts +65 -9
  151. package/lib/resources/types/singleton.d.ts +53 -31
  152. package/lib/resources/types/value.d.ts +16 -7
  153. package/lib/schema/annotation.d.ts +18 -0
  154. package/lib/schema/callable.d.ts +4 -20
  155. package/lib/schema/element.d.ts +39 -0
  156. package/lib/schema/entity-container.d.ts +2 -12
  157. package/lib/schema/entity-set.d.ts +2 -18
  158. package/lib/schema/enum-type.d.ts +19 -25
  159. package/lib/schema/index.d.ts +1 -0
  160. package/lib/{parsers → schema/parsers}/callable.d.ts +2 -2
  161. package/lib/schema/parsers/edm.d.ts +4 -0
  162. package/lib/{parsers → schema/parsers}/enum-type.d.ts +12 -11
  163. package/lib/{parsers → schema/parsers}/index.d.ts +0 -0
  164. package/lib/{parsers → schema/parsers}/structured-type.d.ts +12 -12
  165. package/lib/schema/schema.d.ts +3 -10
  166. package/lib/schema/structured-type.d.ts +65 -27
  167. package/lib/services/base.d.ts +2 -2
  168. package/lib/services/entity-set.d.ts +5 -2
  169. package/lib/services/entity.d.ts +4 -1
  170. package/lib/services/singleton.d.ts +5 -2
  171. package/lib/settings.d.ts +5 -5
  172. package/lib/types.d.ts +1 -0
  173. package/lib/utils/arraybuffers.d.ts +4 -0
  174. package/lib/{parsers/edm.d.ts → utils/durations.d.ts} +3 -3
  175. package/lib/utils/http.d.ts +1 -0
  176. package/lib/utils/index.d.ts +1 -0
  177. package/lib/utils/objects.d.ts +1 -0
  178. package/lib/utils/strings.d.ts +1 -0
  179. package/lib/utils/types.d.ts +2 -0
  180. package/package.json +21 -8
  181. package/bundles/angular-odata.umd.js +0 -11048
  182. package/bundles/angular-odata.umd.js.map +0 -1
  183. package/esm2015/lib/api.js +0 -297
  184. package/esm2015/lib/client.js +0 -221
  185. package/esm2015/lib/helper.js +0 -271
  186. package/esm2015/lib/index.js +0 -21
  187. package/esm2015/lib/models/collection.js +0 -687
  188. package/esm2015/lib/models/model.js +0 -423
  189. package/esm2015/lib/models/options.js +0 -909
  190. package/esm2015/lib/options.js +0 -31
  191. package/esm2015/lib/parsers/callable.js +0 -107
  192. package/esm2015/lib/parsers/edm.js +0 -192
  193. package/esm2015/lib/parsers/enum-type.js +0 -102
  194. package/esm2015/lib/parsers/index.js +0 -5
  195. package/esm2015/lib/parsers/structured-type.js +0 -389
  196. package/esm2015/lib/resources/builder.js +0 -537
  197. package/esm2015/lib/resources/index.js +0 -8
  198. package/esm2015/lib/resources/path-segments.js +0 -156
  199. package/esm2015/lib/resources/query-options.js +0 -157
  200. package/esm2015/lib/resources/request.js +0 -149
  201. package/esm2015/lib/resources/resource.js +0 -337
  202. package/esm2015/lib/resources/responses/annotations.js +0 -121
  203. package/esm2015/lib/resources/responses/metadata.js +0 -548
  204. package/esm2015/lib/resources/types/action.js +0 -180
  205. package/esm2015/lib/resources/types/batch.js +0 -288
  206. package/esm2015/lib/resources/types/count.js +0 -55
  207. package/esm2015/lib/resources/types/entity-set.js +0 -169
  208. package/esm2015/lib/resources/types/entity.js +0 -170
  209. package/esm2015/lib/resources/types/function.js +0 -205
  210. package/esm2015/lib/resources/types/media.js +0 -47
  211. package/esm2015/lib/resources/types/metadata.js +0 -36
  212. package/esm2015/lib/resources/types/navigation-property.js +0 -232
  213. package/esm2015/lib/resources/types/options.js +0 -2
  214. package/esm2015/lib/resources/types/property.js +0 -195
  215. package/esm2015/lib/resources/types/reference.js +0 -50
  216. package/esm2015/lib/resources/types/singleton.js +0 -159
  217. package/esm2015/lib/resources/types/value.js +0 -30
  218. package/esm2015/lib/schema/annotation.js +0 -7
  219. package/esm2015/lib/schema/callable.js +0 -82
  220. package/esm2015/lib/schema/entity-container.js +0 -22
  221. package/esm2015/lib/schema/entity-set.js +0 -33
  222. package/esm2015/lib/schema/enum-type.js +0 -101
  223. package/esm2015/lib/schema/schema.js +0 -60
  224. package/esm2015/lib/schema/structured-type.js +0 -148
  225. package/esm2015/lib/services/base.js +0 -23
  226. package/esm2015/lib/services/entity-set.js +0 -143
  227. package/esm2015/lib/services/entity.js +0 -10
  228. package/esm2015/lib/services/singleton.js +0 -46
  229. package/esm2015/lib/types.js +0 -37
  230. package/esm2015/lib/utils/http.js +0 -89
  231. package/esm2015/lib/utils/index.js +0 -9
  232. package/esm2015/lib/utils/objects.js +0 -139
  233. package/esm2015/lib/utils/odata.js +0 -21
  234. package/esm2015/lib/utils/strings.js +0 -13
  235. package/esm2015/lib/utils/types.js +0 -103
  236. package/fesm2015/angular-odata.js.map +0 -1
  237. package/lib/resources/query-options.d.ts +0 -57
@@ -1,389 +0,0 @@
1
- import { Objects, Types } from '../utils';
2
- import { NONE_PARSER, } from '../types';
3
- import { ODataEnumTypeParser } from './enum-type';
4
- import { COMPUTED } from '../constants';
5
- import { ODataAnnotation } from '../schema/annotation';
6
- import { raw } from '../resources/builder';
7
- import { ODataParserOptions } from '../options';
8
- export class ODataEntityTypeKey {
9
- constructor({ name, alias }) {
10
- this.name = name;
11
- this.alias = alias;
12
- }
13
- }
14
- export class ODataReferential {
15
- constructor({ property, referencedProperty, }) {
16
- this.property = property;
17
- this.referencedProperty = referencedProperty;
18
- }
19
- }
20
- export class ODataStructuredTypeFieldParser {
21
- constructor(name, structuredType, field) {
22
- this.name = name;
23
- this.structuredType = structuredType;
24
- this.type = field.type;
25
- this.parser = NONE_PARSER;
26
- this.annotations = (field.annotations || []).map((annot) => new ODataAnnotation(annot));
27
- this.referentials = (field.referentials || []).map((referential) => new ODataReferential(referential));
28
- this.default = field.default;
29
- this.maxLength = field.maxLength;
30
- this.collection = field.collection !== undefined ? field.collection : false;
31
- this.nullable = field.nullable !== undefined ? field.nullable : true;
32
- this.navigation = field.navigation !== undefined ? field.navigation : false;
33
- this.precision = field.precision;
34
- this.scale = field.scale;
35
- }
36
- /**
37
- * Find an annotation inside the structured field type.
38
- * @param predicate Function that returns true if the annotation match.
39
- * @returns The annotation that matches the predicate.
40
- */
41
- findAnnotation(predicate) {
42
- return this.annotations.find(predicate);
43
- }
44
- validate(value, { method, navigation = false, } = {}) {
45
- let errors;
46
- if (this.collection && Array.isArray(value)) {
47
- errors = value.map((v) => this.validate(v, { method, navigation }));
48
- }
49
- else if ((this.isStructuredType() &&
50
- typeof value === 'object' &&
51
- value !== null) ||
52
- (this.navigation && value !== undefined)) {
53
- errors =
54
- this.structured().validate(value, { method, navigation }) ||
55
- {};
56
- }
57
- else if (this.isEnumType() &&
58
- (typeof value === 'string' || typeof value === 'number')) {
59
- errors = this.enum().validate(value, { method, navigation });
60
- }
61
- else {
62
- // IsEdmType
63
- const computed = this.findAnnotation((a) => a.term === COMPUTED);
64
- errors = [];
65
- if (!this.nullable &&
66
- (value === null || (value === undefined && method !== 'modify')) && // Is null or undefined without patch?
67
- !((computed === null || computed === void 0 ? void 0 : computed.bool) && method === 'create') // Not (Is Computed field and create) ?
68
- ) {
69
- errors.push(`required`);
70
- }
71
- if (this.maxLength !== undefined &&
72
- typeof value === 'string' &&
73
- value.length > this.maxLength) {
74
- errors.push(`maxlength`);
75
- }
76
- }
77
- return !Types.isEmpty(errors) ? errors : undefined;
78
- }
79
- //#region Deserialize
80
- parse(parser, value, options) {
81
- const type = Types.isPlainObject(value)
82
- ? options === null || options === void 0 ? void 0 : options.helper.type(value)
83
- : undefined;
84
- if (type !== undefined) {
85
- return parser
86
- .childParser((c) => c.isTypeOf(type))
87
- .deserialize(value, options);
88
- }
89
- return parser.deserialize(value, options);
90
- }
91
- deserialize(value, options) {
92
- const parserOptions = options !== undefined
93
- ? new ODataParserOptions(options)
94
- : this.optionsHelper;
95
- if (this.parser instanceof ODataStructuredTypeParser) {
96
- const parser = this.parser;
97
- return Array.isArray(value)
98
- ? value.map((v) => this.parse(parser, v, parserOptions))
99
- : this.parse(parser, value, parserOptions);
100
- }
101
- return this.parser.deserialize(value, Object.assign({ field: this }, parserOptions));
102
- }
103
- //#endregion
104
- //#region Serialize
105
- toJson(parser, value, options) {
106
- const type = Types.isPlainObject(value)
107
- ? options === null || options === void 0 ? void 0 : options.helper.type(value)
108
- : undefined;
109
- if (type !== undefined) {
110
- return parser
111
- .childParser((c) => c.isTypeOf(type))
112
- .serialize(value, options);
113
- }
114
- return parser.serialize(value, options);
115
- }
116
- serialize(value, options) {
117
- const parserOptions = options !== undefined
118
- ? new ODataParserOptions(options)
119
- : this.optionsHelper;
120
- if (this.parser instanceof ODataStructuredTypeParser) {
121
- const parser = this.parser;
122
- return Array.isArray(value)
123
- ? value.map((v) => this.toJson(parser, v, parserOptions))
124
- : this.toJson(parser, value, parserOptions);
125
- }
126
- return this.parser.serialize(value, Object.assign({ field: this }, parserOptions));
127
- }
128
- //#endregion
129
- //#region Encode
130
- encode(value, options) {
131
- const parserOptions = options !== undefined
132
- ? new ODataParserOptions(options)
133
- : this.optionsHelper;
134
- return this.parser.encode(value, Object.assign({ field: this }, parserOptions));
135
- }
136
- //#endregion
137
- configure({ parserForType, options, }) {
138
- this.optionsHelper = options;
139
- this.parser = parserForType(this.type);
140
- if (this.default !== undefined)
141
- this.default = this.deserialize(this.default, options);
142
- }
143
- //#region Json Schema
144
- // https://json-schema.org/
145
- toJsonSchema(options = {}) {
146
- let schema = this.parser instanceof ODataStructuredTypeFieldParser ||
147
- this.parser instanceof ODataStructuredTypeParser ||
148
- this.parser instanceof ODataEnumTypeParser
149
- ? this.parser.toJsonSchema(options)
150
- : { title: this.name, type: 'object' };
151
- if ([
152
- 'Edm.String',
153
- 'Edm.Date',
154
- 'Edm.TimeOfDay',
155
- 'Edm.DateTimeOffset',
156
- 'Edm.Guid',
157
- 'Edm.Binary',
158
- ].indexOf(this.type) !== -1) {
159
- schema.type = 'string';
160
- if (this.type === 'Edm.Date')
161
- schema.format = 'date';
162
- else if (this.type === 'Edm.TimeOfDay')
163
- schema.format = 'time';
164
- else if (this.type === 'Edm.DateTimeOffset')
165
- schema.format = 'date-time';
166
- else if (this.type === 'Edm.Guid')
167
- schema.pattern =
168
- '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$';
169
- else if (this.type === 'Edm.Binary')
170
- schema.contentEncoding = 'base64';
171
- else if (this.type === 'Edm.String' && this.maxLength)
172
- schema.maxLength = this.maxLength;
173
- }
174
- else if (['Edm.Int64', 'Edm.Int32', 'Edm.Int16', 'Edm.Byte', 'Edm.SByte'].indexOf(this.type) !== -1) {
175
- //TODO: Range
176
- schema.type = 'integer';
177
- }
178
- else if (['Edm.Decimal', 'Edm.Double'].indexOf(this.type) !== -1) {
179
- schema.type = 'number';
180
- }
181
- else if (['Edm.Boolean'].indexOf(this.type) !== -1) {
182
- schema.type = 'boolean';
183
- }
184
- if (this.default)
185
- schema.default = this.default;
186
- if (this.nullable)
187
- schema.type = [schema.type, 'null'];
188
- if (this.collection)
189
- schema = {
190
- type: 'array',
191
- items: schema,
192
- additionalItems: false,
193
- };
194
- return schema;
195
- }
196
- //#endregion
197
- isKey() {
198
- var _a;
199
- return (((_a = this.structuredType.keys) === null || _a === void 0 ? void 0 : _a.find((k) => k.name === this.name)) !== undefined);
200
- }
201
- hasReferentials() {
202
- return this.referentials.length !== 0;
203
- }
204
- isEdmType() {
205
- return this.type.startsWith('Edm.');
206
- }
207
- isEnumType() {
208
- return this.parser instanceof ODataEnumTypeParser;
209
- }
210
- enum() {
211
- if (!this.isEnumType())
212
- throw new Error('Field are not EnumType');
213
- return this.parser;
214
- }
215
- isStructuredType() {
216
- return this.parser instanceof ODataStructuredTypeParser;
217
- }
218
- structured() {
219
- if (!this.isStructuredType())
220
- throw new Error('Field are not StrucuturedType');
221
- return this.parser;
222
- }
223
- }
224
- export class ODataStructuredTypeParser {
225
- constructor(config, namespace, alias) {
226
- this.children = [];
227
- this.name = config.name;
228
- this.base = config.base;
229
- this.open = config.open || false;
230
- this.namespace = namespace;
231
- this.alias = alias;
232
- if (Array.isArray(config.keys))
233
- this.keys = config.keys.map((key) => new ODataEntityTypeKey(key));
234
- this.fields = Object.entries(config.fields).map(([name, config]) => new ODataStructuredTypeFieldParser(name, this, config));
235
- }
236
- isTypeOf(type) {
237
- var names = [`${this.namespace}.${this.name}`];
238
- if (this.alias)
239
- names.push(`${this.alias}.${this.name}`);
240
- return names.indexOf(type) !== -1;
241
- }
242
- typeFor(name) {
243
- const field = this.fields.find((f) => f.name === name);
244
- if (field === undefined && this.parent !== undefined)
245
- return this.parent.typeFor(name);
246
- return field !== undefined ? field.type : undefined;
247
- }
248
- findChildParser(predicate) {
249
- if (predicate(this))
250
- return this;
251
- let match;
252
- for (let ch of this.children) {
253
- match = ch.findChildParser(predicate);
254
- if (match !== undefined)
255
- break;
256
- }
257
- return match;
258
- }
259
- childParser(predicate) {
260
- return this.findChildParser(predicate) || NONE_PARSER;
261
- }
262
- // Deserialize
263
- deserialize(value, options) {
264
- const parserOptions = options !== undefined
265
- ? new ODataParserOptions(options)
266
- : this.optionsHelper;
267
- if (this.parent !== undefined)
268
- value = this.parent.deserialize(value, parserOptions);
269
- const fields = this.fields.filter((f) => f.name in value && value[f.name] !== undefined && value[f.name] !== null);
270
- return Object.assign(Object.assign({}, value), fields.reduce((acc, f) => (Object.assign(Object.assign({}, acc), { [f.name]: f.deserialize(value[f.name], parserOptions) })), {}));
271
- }
272
- // Serialize
273
- serialize(value, options) {
274
- const parserOptions = options !== undefined
275
- ? new ODataParserOptions(options)
276
- : this.optionsHelper;
277
- if (this.parent !== undefined)
278
- value = this.parent.serialize(value, parserOptions);
279
- const fields = this.fields.filter((f) => f.name in value &&
280
- value[f.name] !== undefined &&
281
- value[f.name] !== null);
282
- return Object.assign(Object.assign({}, value), fields.reduce((acc, f) => (Object.assign(Object.assign({}, acc), { [f.name]: f.serialize(value[f.name], parserOptions) })), {}));
283
- }
284
- // Encode
285
- encode(value, options) {
286
- const parserOptions = options !== undefined
287
- ? new ODataParserOptions(options)
288
- : this.optionsHelper;
289
- return raw(JSON.stringify(this.serialize(value, parserOptions)));
290
- }
291
- configure({ parserForType, options, }) {
292
- this.optionsHelper = options;
293
- if (this.base) {
294
- const parent = parserForType(this.base);
295
- parent.children.push(this);
296
- this.parent = parent;
297
- }
298
- this.fields.forEach((f) => f.configure({ parserForType, options }));
299
- }
300
- resolveKey(value) {
301
- var _a;
302
- let key = ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.resolveKey(value)) || {};
303
- if (Array.isArray(this.keys) && this.keys.length > 0) {
304
- for (var k of this.keys) {
305
- let v = value;
306
- let structured = this;
307
- let field;
308
- for (let name of k.name.split('/')) {
309
- if (structured === undefined)
310
- break;
311
- field = structured.fields.find((f) => f.name === name);
312
- if (field !== undefined) {
313
- v = Types.isPlainObject(v) ? v[field.name] : v;
314
- structured = field.isStructuredType()
315
- ? field.structured()
316
- : undefined;
317
- }
318
- }
319
- if (field === undefined)
320
- return undefined;
321
- let name = k.alias || field.name;
322
- key[name] = field.encode(v);
323
- }
324
- }
325
- if (Types.isEmpty(key))
326
- return undefined;
327
- return Objects.resolveKey(key);
328
- }
329
- defaults() {
330
- var _a;
331
- let value = ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.defaults()) || {};
332
- let fields = this.fields.filter((f) => f.default !== undefined || f.isStructuredType());
333
- return Object.assign(Object.assign({}, value), fields.reduce((acc, f) => {
334
- let value = f.isStructuredType()
335
- ? f.structured().defaults()
336
- : f.default;
337
- return Types.isEmpty(value) ? acc : Object.assign(Object.assign({}, acc), { [f.name]: value });
338
- }, {}));
339
- }
340
- // Json Schema
341
- toJsonSchema(options = {}) {
342
- var _a;
343
- let schema = ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.toJsonSchema(options)) || {
344
- $schema: 'http://json-schema.org/draft-07/schema#',
345
- $id: `${this.namespace}.${this.name}`,
346
- title: this.name,
347
- type: 'object',
348
- properties: {},
349
- required: [],
350
- };
351
- const fields = this.fields.filter((f) => (!f.navigation || (options.expand && f.name in options.expand)) &&
352
- (!options.select || options.select.indexOf(f.name) !== -1));
353
- schema.properties = Object.assign({}, schema.properties, fields
354
- .map((f) => {
355
- let expand = options.expand && f.name in options.expand
356
- ? options.expand[f.name]
357
- : undefined;
358
- let schema = f.toJsonSchema(expand);
359
- if (options.custom && f.name in options.custom)
360
- schema = options.custom[f.name](schema, f);
361
- return { [f.name]: schema };
362
- })
363
- .reduce((acc, v) => Object.assign(acc, v), {}));
364
- schema.required = [
365
- ...schema.required,
366
- ...fields
367
- .filter((f) => options.required && f.name in options.required
368
- ? options.required[f.name]
369
- : !f.nullable)
370
- .map((f) => f.name),
371
- ];
372
- return schema;
373
- }
374
- validate(attrs, { method, navigation = false, } = {}) {
375
- var _a;
376
- const errors = (((_a = this.parent) === null || _a === void 0 ? void 0 : _a.validate(attrs, { method, navigation })) ||
377
- {});
378
- const fields = this.fields.filter((f) => !f.navigation || navigation);
379
- for (var field of fields) {
380
- const value = attrs[field.name];
381
- const errs = field.validate(value, { method, navigation });
382
- if (errs !== undefined) {
383
- errors[field.name] = errs;
384
- }
385
- }
386
- return !Types.isEmpty(errors) ? errors : undefined;
387
- }
388
- }
389
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlZC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3BhcnNlcnMvc3RydWN0dXJlZC10eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFDLE9BQU8sRUFLTCxXQUFXLEdBR1osTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFtQmhELE1BQU0sT0FBTyxrQkFBa0I7SUFHN0IsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQW9DO1FBQzNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFBWSxFQUNWLFFBQVEsRUFDUixrQkFBa0IsR0FJbkI7UUFDQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLDhCQUE4QjtJQWdCekMsWUFDRSxJQUFZLEVBQ1osY0FBOEMsRUFDOUMsS0FBZ0M7UUFFaEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFj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Q0FBQztTQUN0QixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELFFBQVEsQ0FDTixLQUFVLEVBQ1YsRUFDRSxNQUFNLEVBQ04sVUFBVSxHQUFHLEtBQUssTUFLaEIsRUFBRTs7UUFFTixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUEsTUFBQSxJQUFJLENBQUMsTUFBTSwwQ0FBRSxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ2xFLEVBQUUsQ0FBNEIsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxDQUFDO1FBQ3RFLEtBQUssSUFBSSxLQUFLLElBQUksTUFBTSxFQUFFO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBZSxDQUFDLENBQUM7WUFDM0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUMzRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQzNCO1NBQ0Y7UUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JqZWN0cywgVHlwZXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBQYXJzZXIsXG4gIFN0cnVjdHVyZWRUeXBlRmllbGRDb25maWcsXG4gIFN0cnVjdHVyZWRUeXBlQ29uZmlnLFxuICBPcHRpb25zSGVscGVyLFxuICBOT05FX1BBUlNFUixcbiAgU3RydWN0dXJlZFR5cGVGaWVsZE9wdGlvbnMsXG4gIE9wdGlvbnMsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE9EYXRhRW51bVR5cGVQYXJzZXIgfSBmcm9tICcuL2VudW0tdHlwZSc7XG5pbXBvcnQgeyBDT01QVVRFRCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPRGF0YUFubm90YXRpb24gfSBmcm9tICcuLi9zY2hlbWEvYW5ub3RhdGlvbic7XG5pbXBvcnQgeyByYXcgfSBmcm9tICcuLi9yZXNvdXJjZXMvYnVpbGRlcic7XG5pbXBvcnQgeyBPRGF0YVBhcnNlck9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zJztcblxuLy8gSlNPTiBTQ0hFTUFcbnR5cGUgSnNvblNjaGVtYVNlbGVjdDxUPiA9IEFycmF5PGtleW9mIFQ+O1xudHlwZSBKc29uU2NoZW1hQ3VzdG9tPFQ+ID0ge1xuICBbUCBpbiBrZXlvZiBUXT86IChcbiAgICBzY2hlbWE6IGFueSxcbiAgICBmaWVsZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPFRbUF0+XG4gICkgPT4gYW55O1xufTtcbnR5cGUgSnNvblNjaGVtYUV4cGFuZDxUPiA9IHsgW1AgaW4ga2V5b2YgVF0/OiBKc29uU2NoZW1hT3B0aW9uczxUW1BdPiB9O1xudHlwZSBKc29uU2NoZW1hUmVxdWlyZWQ8VD4gPSB7IFtQIGluIGtleW9mIFRdPzogYm9vbGVhbiB9O1xuZXhwb3J0IHR5cGUgSnNvblNjaGVtYU9wdGlvbnM8VD4gPSB7XG4gIHNlbGVjdD86IEpzb25TY2hlbWFTZWxlY3Q8VD47XG4gIGN1c3RvbT86IEpzb25TY2hlbWFDdXN0b208VD47XG4gIGV4cGFuZD86IEpzb25TY2hlbWFFeHBhbmQ8VD47XG4gIHJlcXVpcmVkPzogSnNvblNjaGVtYVJlcXVpcmVkPFQ+O1xufTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhRW50aXR5VHlwZUtleSB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWxpYXM/OiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHsgbmFtZSwgYWxpYXMgfTogeyBuYW1lOiBzdHJpbmc7IGFsaWFzPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFSZWZlcmVudGlhbCB7XG4gIHByb3BlcnR5OiBzdHJpbmc7XG4gIHJlZmVyZW5jZWRQcm9wZXJ0eTogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgcHJvcGVydHksXG4gICAgcmVmZXJlbmNlZFByb3BlcnR5LFxuICB9OiB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICByZWZlcmVuY2VkUHJvcGVydHk6IHN0cmluZztcbiAgfSkge1xuICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICB0aGlzLnJlZmVyZW5jZWRQcm9wZXJ0eSA9IHJlZmVyZW5jZWRQcm9wZXJ0eTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPFQ+IGltcGxlbWVudHMgUGFyc2VyPFQ+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHN0cnVjdHVyZWRUeXBlOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT47XG4gIHR5cGU6IHN0cmluZztcbiAgcHJpdmF0ZSBwYXJzZXI6IFBhcnNlcjxUPjtcbiAgZGVmYXVsdD86IGFueTtcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICBjb2xsZWN0aW9uOiBib29sZWFuO1xuICBudWxsYWJsZTogYm9vbGVhbjtcbiAgbmF2aWdhdGlvbjogYm9vbGVhbjtcbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xuICBzY2FsZT86IG51bWJlcjtcbiAgcmVmZXJlbnRpYWxzOiBPRGF0YVJlZmVyZW50aWFsW107XG4gIGFubm90YXRpb25zOiBPRGF0YUFubm90YXRpb25bXTtcbiAgb3B0aW9uc0hlbHBlcj86IE9wdGlvbnNIZWxwZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cnVjdHVyZWRUeXBlOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4sXG4gICAgZmllbGQ6IFN0cnVjdHVyZWRUeXBlRmllbGRDb25maWdcbiAgKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnN0cnVjdHVyZWRUeXBlID0gc3RydWN0dXJlZFR5cGU7XG4gICAgdGhpcy50eXBlID0gZmllbGQudHlwZTtcbiAgICB0aGlzLnBhcnNlciA9IE5PTkVfUEFSU0VSO1xuICAgIHRoaXMuYW5ub3RhdGlvbnMgPSAoZmllbGQuYW5ub3RhdGlvbnMgfHwgW10pLm1hcChcbiAgICAgIChhbm5vdCkgPT4gbmV3IE9EYXRhQW5ub3RhdGlvbihhbm5vdClcbiAgICApO1xuICAgIHRoaXMucmVmZXJlbnRpYWxzID0gKGZpZWxkLnJlZmVyZW50aWFscyB8fCBbXSkubWFwKFxuICAgICAgKHJlZmVyZW50aWFsKSA9PiBuZXcgT0RhdGFSZWZlcmVudGlhbChyZWZlcmVudGlhbClcbiAgICApO1xuICAgIHRoaXMuZGVmYXVsdCA9IGZpZWxkLmRlZmF1bHQ7XG4gICAgdGhpcy5tYXhMZW5ndGggPSBmaWVsZC5tYXhMZW5ndGg7XG4gICAgdGhpcy5jb2xsZWN0aW9uID0gZmllbGQuY29sbGVjdGlvbiAhPT0gdW5kZWZpbmVkID8gZmllbGQuY29sbGVjdGlvbiA6IGZhbHNlO1xuICAgIHRoaXMubnVsbGFibGUgPSBmaWVsZC5udWxsYWJsZSAhPT0gdW5kZWZpbmVkID8gZmllbGQubnVsbGFibGUgOiB0cnVlO1xuICAgIHRoaXMubmF2aWdhdGlvbiA9IGZpZWxkLm5hdmlnYXRpb24gIT09IHVuZGVmaW5lZCA/IGZpZWxkLm5hdmlnYXRpb24gOiBmYWxzZTtcbiAgICB0aGlzLnByZWNpc2lvbiA9IGZpZWxkLnByZWNpc2lvbjtcbiAgICB0aGlzLnNjYWxlID0gZmllbGQuc2NhbGU7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbiBhbm5vdGF0aW9uIGluc2lkZSB0aGUgc3RydWN0dXJlZCBmaWVsZCB0eXBlLlxuICAgKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIHRoZSBhbm5vdGF0aW9uIG1hdGNoLlxuICAgKiBAcmV0dXJucyBUaGUgYW5ub3RhdGlvbiB0aGF0IG1hdGNoZXMgdGhlIHByZWRpY2F0ZS5cbiAgICovXG4gIGZpbmRBbm5vdGF0aW9uKHByZWRpY2F0ZTogKGFubm90OiBPRGF0YUFubm90YXRpb24pID0+IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9ucy5maW5kKHByZWRpY2F0ZSk7XG4gIH1cblxuICB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTpcbiAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgfCBzdHJpbmdbXVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgZXJyb3JzO1xuICAgIGlmICh0aGlzLmNvbGxlY3Rpb24gJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGVycm9ycyA9IHZhbHVlLm1hcCgodikgPT4gdGhpcy52YWxpZGF0ZSh2LCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSkgYXMge1xuICAgICAgICBbbmFtZTogc3RyaW5nXTogYW55W107XG4gICAgICB9W107XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICh0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHZhbHVlICE9PSBudWxsKSB8fFxuICAgICAgKHRoaXMubmF2aWdhdGlvbiAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgZXJyb3JzID1cbiAgICAgICAgdGhpcy5zdHJ1Y3R1cmVkKCkudmFsaWRhdGUodmFsdWUsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pIHx8XG4gICAgICAgICh7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnlbXSB9KTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5pc0VudW1UeXBlKCkgJiZcbiAgICAgICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgKSB7XG4gICAgICBlcnJvcnMgPSB0aGlzLmVudW0oKS52YWxpZGF0ZSh2YWx1ZSwgeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElzRWRtVHlwZVxuICAgICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmZpbmRBbm5vdGF0aW9uKChhKSA9PiBhLnRlcm0gPT09IENPTVBVVEVEKTtcbiAgICAgIGVycm9ycyA9IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5udWxsYWJsZSAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWV0aG9kICE9PSAnbW9kaWZ5JykpICYmIC8vIElzIG51bGwgb3IgdW5kZWZpbmVkIHdpdGhvdXQgcGF0Y2g/XG4gICAgICAgICEoY29tcHV0ZWQ/LmJvb2wgJiYgbWV0aG9kID09PSAnY3JlYXRlJykgLy8gTm90IChJcyBDb21wdXRlZCBmaWVsZCBhbmQgY3JlYXRlKSA/XG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYHJlcXVpcmVkYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBtYXhsZW5ndGhgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICFUeXBlcy5pc0VtcHR5KGVycm9ycykgPyBlcnJvcnMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyNyZWdpb24gRGVzZXJpYWxpemVcbiAgcHJpdmF0ZSBwYXJzZShcbiAgICBwYXJzZXI6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD4sXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zPzogT3B0aW9uc0hlbHBlclxuICApOiBhbnkge1xuICAgIGNvbnN0IHR5cGUgPSBUeXBlcy5pc1BsYWluT2JqZWN0KHZhbHVlKVxuICAgICAgPyBvcHRpb25zPy5oZWxwZXIudHlwZSh2YWx1ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwYXJzZXJcbiAgICAgICAgLmNoaWxkUGFyc2VyKChjKSA9PiBjLmlzVHlwZU9mKHR5cGUpKVxuICAgICAgICAuZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VyLmRlc2VyaWFsaXplKHZhbHVlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGRlc2VyaWFsaXplKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBPcHRpb25zKTogVCB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBuZXcgT0RhdGFQYXJzZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgICAgIDogdGhpcy5vcHRpb25zSGVscGVyO1xuICAgIGlmICh0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXIpIHtcbiAgICAgIGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD47XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZS5tYXAoKHYpID0+IHRoaXMucGFyc2UocGFyc2VyLCB2LCBwYXJzZXJPcHRpb25zKSlcbiAgICAgICAgOiB0aGlzLnBhcnNlKHBhcnNlciwgdmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuZGVzZXJpYWxpemUodmFsdWUsIHtcbiAgICAgIGZpZWxkOiB0aGlzLFxuICAgICAgLi4ucGFyc2VyT3B0aW9ucyxcbiAgICB9IGFzIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU2VyaWFsaXplXG4gIHByaXZhdGUgdG9Kc29uKFxuICAgIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPixcbiAgICB2YWx1ZTogYW55LFxuICAgIG9wdGlvbnM/OiBPcHRpb25zSGVscGVyXG4gICk6IGFueSB7XG4gICAgY29uc3QgdHlwZSA9IFR5cGVzLmlzUGxhaW5PYmplY3QodmFsdWUpXG4gICAgICA/IG9wdGlvbnM/LmhlbHBlci50eXBlKHZhbHVlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBhcnNlclxuICAgICAgICAuY2hpbGRQYXJzZXIoKGMpID0+IGMuaXNUeXBlT2YodHlwZSkpXG4gICAgICAgIC5zZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VyLnNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICBzZXJpYWxpemUodmFsdWU6IFQsIG9wdGlvbnM/OiBPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLm9wdGlvbnNIZWxwZXI7XG4gICAgaWYgKHRoaXMucGFyc2VyIGluc3RhbmNlb2YgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcikge1xuICAgICAgY29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXIgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxUPjtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICA/ICh2YWx1ZSBhcyBhbnlbXSkubWFwKCh2KSA9PiB0aGlzLnRvSnNvbihwYXJzZXIsIHYsIHBhcnNlck9wdGlvbnMpKVxuICAgICAgICA6IHRoaXMudG9Kc29uKHBhcnNlciwgdmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuc2VyaWFsaXplKHZhbHVlLCB7XG4gICAgICBmaWVsZDogdGhpcyxcbiAgICAgIC4uLnBhcnNlck9wdGlvbnMsXG4gICAgfSBhcyBTdHJ1Y3R1cmVkVHlwZUZpZWxkT3B0aW9ucyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEVuY29kZVxuICBlbmNvZGUodmFsdWU6IFQsIG9wdGlvbnM/OiBPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLm9wdGlvbnNIZWxwZXI7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmVuY29kZSh2YWx1ZSwge1xuICAgICAgZmllbGQ6IHRoaXMsXG4gICAgICAuLi5wYXJzZXJPcHRpb25zLFxuICAgIH0gYXMgU3RydWN0dXJlZFR5cGVGaWVsZE9wdGlvbnMpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgcGFyc2VyRm9yVHlwZSxcbiAgICBvcHRpb25zLFxuICB9OiB7XG4gICAgcGFyc2VyRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gUGFyc2VyPGFueT47XG4gICAgb3B0aW9uczogT3B0aW9uc0hlbHBlcjtcbiAgfSkge1xuICAgIHRoaXMub3B0aW9uc0hlbHBlciA9IG9wdGlvbnM7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXJGb3JUeXBlKHRoaXMudHlwZSk7XG4gICAgaWYgKHRoaXMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgdGhpcy5kZWZhdWx0ID0gdGhpcy5kZXNlcmlhbGl6ZSh0aGlzLmRlZmF1bHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8jcmVnaW9uIEpzb24gU2NoZW1hXG4gIC8vIGh0dHBzOi8vanNvbi1zY2hlbWEub3JnL1xuICB0b0pzb25TY2hlbWEob3B0aW9uczogSnNvblNjaGVtYU9wdGlvbnM8VD4gPSB7fSkge1xuICAgIGxldCBzY2hlbWE6IGFueSA9XG4gICAgICB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlciB8fFxuICAgICAgdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyIHx8XG4gICAgICB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhRW51bVR5cGVQYXJzZXJcbiAgICAgICAgPyB0aGlzLnBhcnNlci50b0pzb25TY2hlbWEob3B0aW9ucylcbiAgICAgICAgOiAoeyB0aXRsZTogdGhpcy5uYW1lLCB0eXBlOiAnb2JqZWN0JyB9IGFzIGFueSk7XG5cbiAgICBpZiAoXG4gICAgICBbXG4gICAgICAgICdFZG0uU3RyaW5nJyxcbiAgICAgICAgJ0VkbS5EYXRlJyxcbiAgICAgICAgJ0VkbS5UaW1lT2ZEYXknLFxuICAgICAgICAnRWRtLkRhdGVUaW1lT2Zmc2V0JyxcbiAgICAgICAgJ0VkbS5HdWlkJyxcbiAgICAgICAgJ0VkbS5CaW5hcnknLFxuICAgICAgXS5pbmRleE9mKHRoaXMudHlwZSkgIT09IC0xXG4gICAgKSB7XG4gICAgICBzY2hlbWEudHlwZSA9ICdzdHJpbmcnO1xuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ0VkbS5EYXRlJykgc2NoZW1hLmZvcm1hdCA9ICdkYXRlJztcbiAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ0VkbS5UaW1lT2ZEYXknKSBzY2hlbWEuZm9ybWF0ID0gJ3RpbWUnO1xuICAgICAgZWxzZSBpZiAodGhpcy50eXBlID09PSAnRWRtLkRhdGVUaW1lT2Zmc2V0Jykgc2NoZW1hLmZvcm1hdCA9ICdkYXRlLXRpbWUnO1xuICAgICAgZWxzZSBpZiAodGhpcy50eXBlID09PSAnRWRtLkd1aWQnKVxuICAgICAgICBzY2hlbWEucGF0dGVybiA9XG4gICAgICAgICAgJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJztcbiAgICAgIGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ0VkbS5CaW5hcnknKSBzY2hlbWEuY29udGVudEVuY29kaW5nID0gJ2Jhc2U2NCc7XG4gICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdFZG0uU3RyaW5nJyAmJiB0aGlzLm1heExlbmd0aClcbiAgICAgICAgc2NoZW1hLm1heExlbmd0aCA9IHRoaXMubWF4TGVuZ3RoO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBbJ0VkbS5JbnQ2NCcsICdFZG0uSW50MzInLCAnRWRtLkludDE2JywgJ0VkbS5CeXRlJywgJ0VkbS5TQnl0ZSddLmluZGV4T2YoXG4gICAgICAgIHRoaXMudHlwZVxuICAgICAgKSAhPT0gLTFcbiAgICApIHtcbiAgICAgIC8vVE9ETzogUmFuZ2VcbiAgICAgIHNjaGVtYS50eXBlID0gJ2ludGVnZXInO1xuICAgIH0gZWxzZSBpZiAoWydFZG0uRGVjaW1hbCcsICdFZG0uRG91YmxlJ10uaW5kZXhPZih0aGlzLnR5cGUpICE9PSAtMSkge1xuICAgICAgc2NoZW1hLnR5cGUgPSAnbnVtYmVyJztcbiAgICB9IGVsc2UgaWYgKFsnRWRtLkJvb2xlYW4nXS5pbmRleE9mKHRoaXMudHlwZSkgIT09IC0xKSB7XG4gICAgICBzY2hlbWEudHlwZSA9ICdib29sZWFuJztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVmYXVsdCkgc2NoZW1hLmRlZmF1bHQgPSB0aGlzLmRlZmF1bHQ7XG4gICAgaWYgKHRoaXMubnVsbGFibGUpIHNjaGVtYS50eXBlID0gW3NjaGVtYS50eXBlLCAnbnVsbCddO1xuICAgIGlmICh0aGlzLmNvbGxlY3Rpb24pXG4gICAgICBzY2hlbWEgPSB7XG4gICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgIGl0ZW1zOiBzY2hlbWEsXG4gICAgICAgIGFkZGl0aW9uYWxJdGVtczogZmFsc2UsXG4gICAgICB9O1xuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgaXNLZXkoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc3RydWN0dXJlZFR5cGUua2V5cz8uZmluZCgoaykgPT4gay5uYW1lID09PSB0aGlzLm5hbWUpICE9PSB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgaGFzUmVmZXJlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLnJlZmVyZW50aWFscy5sZW5ndGggIT09IDA7XG4gIH1cblxuICBpc0VkbVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZS5zdGFydHNXaXRoKCdFZG0uJyk7XG4gIH1cblxuICBpc0VudW1UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhRW51bVR5cGVQYXJzZXI7XG4gIH1cblxuICBlbnVtKCkge1xuICAgIGlmICghdGhpcy5pc0VudW1UeXBlKCkpIHRocm93IG5ldyBFcnJvcignRmllbGQgYXJlIG5vdCBFbnVtVHlwZScpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlciBhcyBPRGF0YUVudW1UeXBlUGFyc2VyPFQ+O1xuICB9XG5cbiAgaXNTdHJ1Y3R1cmVkVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyO1xuICB9XG5cbiAgc3RydWN0dXJlZCgpIHtcbiAgICBpZiAoIXRoaXMuaXNTdHJ1Y3R1cmVkVHlwZSgpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWVsZCBhcmUgbm90IFN0cnVjdXR1cmVkVHlwZScpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlciBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+IGltcGxlbWVudHMgUGFyc2VyPFQ+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgb3BlbjogYm9vbGVhbjtcbiAgY2hpbGRyZW46IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PltdID0gW107XG4gIGFsaWFzPzogc3RyaW5nO1xuICBiYXNlPzogc3RyaW5nO1xuICBwYXJlbnQ/OiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT47XG4gIGtleXM/OiBPRGF0YUVudGl0eVR5cGVLZXlbXTtcbiAgZmllbGRzOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55PltdO1xuICBvcHRpb25zSGVscGVyPzogT3B0aW9uc0hlbHBlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb25maWc6IFN0cnVjdHVyZWRUeXBlQ29uZmlnPFQ+LFxuICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgIHRoaXMuYmFzZSA9IGNvbmZpZy5iYXNlO1xuICAgIHRoaXMub3BlbiA9IGNvbmZpZy5vcGVuIHx8IGZhbHNlO1xuICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcua2V5cykpXG4gICAgICB0aGlzLmtleXMgPSBjb25maWcua2V5cy5tYXAoKGtleSkgPT4gbmV3IE9EYXRhRW50aXR5VHlwZUtleShrZXkpKTtcbiAgICB0aGlzLmZpZWxkcyA9IE9iamVjdC5lbnRyaWVzPFN0cnVjdHVyZWRUeXBlRmllbGRDb25maWc+KFxuICAgICAgY29uZmlnLmZpZWxkcyBhcyB7IFtQIGluIGtleW9mIFRdOiBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnIH1cbiAgICApLm1hcChcbiAgICAgIChbbmFtZSwgY29uZmlnXSkgPT4gbmV3IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcihuYW1lLCB0aGlzLCBjb25maWcpXG4gICAgKTtcbiAgfVxuXG4gIGlzVHlwZU9mKHR5cGU6IHN0cmluZykge1xuICAgIHZhciBuYW1lcyA9IFtgJHt0aGlzLm5hbWVzcGFjZX0uJHt0aGlzLm5hbWV9YF07XG4gICAgaWYgKHRoaXMuYWxpYXMpIG5hbWVzLnB1c2goYCR7dGhpcy5hbGlhc30uJHt0aGlzLm5hbWV9YCk7XG4gICAgcmV0dXJuIG5hbWVzLmluZGV4T2YodHlwZSkgIT09IC0xO1xuICB9XG5cbiAgdHlwZUZvcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMuZmluZCgoZikgPT4gZi5uYW1lID09PSBuYW1lKTtcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnBhcmVudCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LnR5cGVGb3IobmFtZSk7XG4gICAgcmV0dXJuIGZpZWxkICE9PSB1bmRlZmluZWQgPyBmaWVsZC50eXBlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZmluZENoaWxkUGFyc2VyKFxuICAgIHByZWRpY2F0ZTogKHA6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PikgPT4gYm9vbGVhblxuICApOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4gfCB1bmRlZmluZWQge1xuICAgIGlmIChwcmVkaWNhdGUodGhpcykpIHJldHVybiB0aGlzO1xuICAgIGxldCBtYXRjaDogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IGNoIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIG1hdGNoID0gY2guZmluZENoaWxkUGFyc2VyKHByZWRpY2F0ZSk7XG4gICAgICBpZiAobWF0Y2ggIT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaDtcbiAgfVxuXG4gIGNoaWxkUGFyc2VyKFxuICAgIHByZWRpY2F0ZTogKHA6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PikgPT4gYm9vbGVhblxuICApOiBQYXJzZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZENoaWxkUGFyc2VyKHByZWRpY2F0ZSkgfHwgTk9ORV9QQVJTRVI7XG4gIH1cblxuICAvLyBEZXNlcmlhbGl6ZVxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55LCBvcHRpb25zPzogT3B0aW9ucyk6IFQge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMub3B0aW9uc0hlbHBlcjtcbiAgICBpZiAodGhpcy5wYXJlbnQgIT09IHVuZGVmaW5lZClcbiAgICAgIHZhbHVlID0gdGhpcy5wYXJlbnQuZGVzZXJpYWxpemUodmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzLmZpbHRlcihcbiAgICAgIChmKSA9PlxuICAgICAgICBmLm5hbWUgaW4gdmFsdWUgJiYgdmFsdWVbZi5uYW1lXSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlW2YubmFtZV0gIT09IG51bGxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIC4uLmZpZWxkcy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGYpID0+ICh7XG4gICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgIFtmLm5hbWVdOiBmLmRlc2VyaWFsaXplKHZhbHVlW2YubmFtZV0sIHBhcnNlck9wdGlvbnMpLFxuICAgICAgICB9KSxcbiAgICAgICAge31cbiAgICAgICksXG4gICAgfTtcbiAgfVxuXG4gIC8vIFNlcmlhbGl6ZVxuICBzZXJpYWxpemUodmFsdWU6IFQsIG9wdGlvbnM/OiBPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLm9wdGlvbnNIZWxwZXI7XG4gICAgaWYgKHRoaXMucGFyZW50ICE9PSB1bmRlZmluZWQpXG4gICAgICB2YWx1ZSA9IHRoaXMucGFyZW50LnNlcmlhbGl6ZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMuZmlsdGVyKFxuICAgICAgKGYpID0+XG4gICAgICAgIGYubmFtZSBpbiB2YWx1ZSAmJlxuICAgICAgICAodmFsdWUgYXMgYW55KVtmLm5hbWVdICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKHZhbHVlIGFzIGFueSlbZi5uYW1lXSAhPT0gbnVsbFxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgLi4uZmllbGRzLnJlZHVjZShcbiAgICAgICAgKGFjYywgZikgPT4gKHtcbiAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgW2YubmFtZV06IGYuc2VyaWFsaXplKCh2YWx1ZSBhcyBhbnkpW2YubmFtZV0sIHBhcnNlck9wdGlvbnMpLFxuICAgICAgICB9KSxcbiAgICAgICAge31cbiAgICAgICksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEVuY29kZVxuICBlbmNvZGUodmFsdWU6IFQsIG9wdGlvbnM/OiBPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLm9wdGlvbnNIZWxwZXI7XG4gICAgcmV0dXJuIHJhdyhKU09OLnN0cmluZ2lmeSh0aGlzLnNlcmlhbGl6ZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucykpKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgcGFyc2VyRm9yVHlwZSxcbiAgICBvcHRpb25zLFxuICB9OiB7XG4gICAgcGFyc2VyRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gUGFyc2VyPGFueT47XG4gICAgb3B0aW9uczogT3B0aW9uc0hlbHBlcjtcbiAgfSkge1xuICAgIHRoaXMub3B0aW9uc0hlbHBlciA9IG9wdGlvbnM7XG4gICAgaWYgKHRoaXMuYmFzZSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gcGFyc2VyRm9yVHlwZSh0aGlzLmJhc2UpIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PjtcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIHRoaXMuZmllbGRzLmZvckVhY2goKGYpID0+IGYuY29uZmlndXJlKHsgcGFyc2VyRm9yVHlwZSwgb3B0aW9ucyB9KSk7XG4gIH1cblxuICByZXNvbHZlS2V5KHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGxldCBrZXkgPSB0aGlzLnBhcmVudD8ucmVzb2x2ZUtleSh2YWx1ZSkgfHwge307XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5rZXlzKSAmJiB0aGlzLmtleXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yICh2YXIgayBvZiB0aGlzLmtleXMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWx1ZSBhcyBhbnk7XG4gICAgICAgIGxldCBzdHJ1Y3R1cmVkID0gdGhpcyBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBmaWVsZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IG5hbWUgb2Ygay5uYW1lLnNwbGl0KCcvJykpIHtcbiAgICAgICAgICBpZiAoc3RydWN0dXJlZCA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgICBmaWVsZCA9IHN0cnVjdHVyZWQuZmllbGRzLmZpbmQoKGYpID0+IGYubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKGZpZWxkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHYgPSBUeXBlcy5pc1BsYWluT2JqZWN0KHYpID8gdltmaWVsZC5uYW1lXSA6IHY7XG4gICAgICAgICAgICBzdHJ1Y3R1cmVkID0gZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpXG4gICAgICAgICAgICAgID8gZmllbGQuc3RydWN0dXJlZCgpXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IG5hbWUgPSBrLmFsaWFzIHx8IGZpZWxkLm5hbWU7XG4gICAgICAgIGtleVtuYW1lXSA9IGZpZWxkLmVuY29kZSh2KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFR5cGVzLmlzRW1wdHkoa2V5KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0cy5yZXNvbHZlS2V5KGtleSk7XG4gIH1cblxuICBkZWZhdWx0cygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5wYXJlbnQ/LmRlZmF1bHRzKCkgfHwge307XG4gICAgbGV0IGZpZWxkcyA9IHRoaXMuZmllbGRzLmZpbHRlcihcbiAgICAgIChmKSA9PiBmLmRlZmF1bHQgIT09IHVuZGVmaW5lZCB8fCBmLmlzU3RydWN0dXJlZFR5cGUoKVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgLi4uZmllbGRzLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGYuaXNTdHJ1Y3R1cmVkVHlwZSgpXG4gICAgICAgICAgPyBmLnN0cnVjdHVyZWQoKS5kZWZhdWx0cygpXG4gICAgICAgICAgOiBmLmRlZmF1bHQ7XG4gICAgICAgIHJldHVybiBUeXBlcy5pc0VtcHR5KHZhbHVlKSA/IGFjYyA6IHsgLi4uYWNjLCBbZi5uYW1lXTogdmFsdWUgfTtcbiAgICAgIH0sIHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLy8gSnNvbiBTY2hlbWFcbiAgdG9Kc29uU2NoZW1hKG9wdGlvbnM6IEpzb25TY2hlbWFPcHRpb25zPFQ+ID0ge30pIHtcbiAgICBsZXQgc2NoZW1hOiBhbnkgPSB0aGlzLnBhcmVudD8udG9Kc29uU2NoZW1hKG9wdGlvbnMpIHx8IHtcbiAgICAgICRzY2hlbWE6ICdodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMnLFxuICAgICAgJGlkOiBgJHt0aGlzLm5hbWVzcGFjZX0uJHt0aGlzLm5hbWV9YCxcbiAgICAgIHRpdGxlOiB0aGlzLm5hbWUsXG4gICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgcmVxdWlyZWQ6IFtdLFxuICAgIH07XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMuZmlsdGVyKFxuICAgICAgKGYpID0+XG4gICAgICAgICghZi5uYXZpZ2F0aW9uIHx8IChvcHRpb25zLmV4cGFuZCAmJiBmLm5hbWUgaW4gb3B0aW9ucy5leHBhbmQpKSAmJlxuICAgICAgICAoIW9wdGlvbnMuc2VsZWN0IHx8ICg8c3RyaW5nW10+b3B0aW9ucy5zZWxlY3QpLmluZGV4T2YoZi5uYW1lKSAhPT0gLTEpXG4gICAgKTtcbiAgICBzY2hlbWEucHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzLFxuICAgICAgZmllbGRzXG4gICAgICAgIC5tYXAoKGYpID0+IHtcbiAgICAgICAgICBsZXQgZXhwYW5kID1cbiAgICAgICAgICAgIG9wdGlvbnMuZXhwYW5kICYmIGYubmFtZSBpbiBvcHRpb25zLmV4cGFuZFxuICAgICAgICAgICAgICA/IChvcHRpb25zLmV4cGFuZCBhcyBhbnkpW2YubmFtZV1cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgbGV0IHNjaGVtYSA9IGYudG9Kc29uU2NoZW1hKGV4cGFuZCk7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuY3VzdG9tICYmIGYubmFtZSBpbiBvcHRpb25zLmN1c3RvbSlcbiAgICAgICAgICAgIHNjaGVtYSA9IChcbiAgICAgICAgICAgICAgb3B0aW9ucy5jdXN0b21bZi5uYW1lIGFzIGtleW9mIFRdIGFzIChcbiAgICAgICAgICAgICAgICBzY2hlbWE6IGFueSxcbiAgICAgICAgICAgICAgICBmaWVsZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPGFueT5cbiAgICAgICAgICAgICAgKSA9PiBhbnlcbiAgICAgICAgICAgICkoc2NoZW1hLCBmKTtcbiAgICAgICAgICByZXR1cm4geyBbZi5uYW1lXTogc2NoZW1hIH07XG4gICAgICAgIH0pXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgdikgPT4gT2JqZWN0LmFzc2lnbihhY2MsIHYpLCB7fSlcbiAgICApO1xuICAgIHNjaGVtYS5yZXF1aXJlZCA9IFtcbiAgICAgIC4uLnNjaGVtYS5yZXF1aXJlZCxcbiAgICAgIC4uLmZpZWxkc1xuICAgICAgICAuZmlsdGVyKChmKSA9PlxuICAgICAgICAgIG9wdGlvbnMucmVxdWlyZWQgJiYgZi5uYW1lIGluIG9wdGlvbnMucmVxdWlyZWRcbiAgICAgICAgICAgID8gb3B0aW9ucy5yZXF1aXJlZFtmLm5hbWUgYXMga2V5b2YgVF1cbiAgICAgICAgICAgIDogIWYubnVsbGFibGVcbiAgICAgICAgKVxuICAgICAgICAubWFwKChmKSA9PiBmLm5hbWUpLFxuICAgIF07XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIGF0dHJzOiBhbnksXG4gICAge1xuICAgICAgbWV0aG9kLFxuICAgICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIGNyZWF0ZT86IGJvb2xlYW47XG4gICAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVycm9ycyA9ICh0aGlzLnBhcmVudD8udmFsaWRhdGUoYXR0cnMsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pIHx8XG4gICAgICB7fSkgYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMuZmlsdGVyKChmKSA9PiAhZi5uYXZpZ2F0aW9uIHx8IG5hdmlnYXRpb24pO1xuICAgIGZvciAodmFyIGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgY29uc3QgdmFsdWUgPSBhdHRyc1tmaWVsZC5uYW1lIGFzIGtleW9mIFRdO1xuICAgICAgY29uc3QgZXJycyA9IGZpZWxkLnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KTtcbiAgICAgIGlmIChlcnJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzW2ZpZWxkLm5hbWVdID0gZXJycztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICFUeXBlcy5pc0VtcHR5KGVycm9ycykgPyBlcnJvcnMgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==