angular-odata 0.90.0 → 0.99.2

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 (223) hide show
  1. package/README.md +31 -25
  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 +757 -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 +956 -0
  16. package/{esm2015/lib/module.js → esm2020/lib/module.mjs} +7 -7
  17. package/esm2020/lib/options.mjs +32 -0
  18. package/{esm2015/lib/resources/index.js → esm2020/lib/resources/index.mjs} +0 -0
  19. package/{esm2015/lib/resources/path/handlers.js → esm2020/lib/resources/path/handlers.mjs} +1 -1
  20. package/{esm2015/lib/resources/path/index.js → esm2020/lib/resources/path/index.mjs} +0 -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/{esm2015/lib/resources/query/index.js → esm2020/lib/resources/query/index.mjs} +0 -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 +318 -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 +104 -0
  56. package/esm2020/lib/resources/types/batch.mjs +314 -0
  57. package/esm2020/lib/resources/types/count.mjs +30 -0
  58. package/esm2020/lib/resources/types/entity-set.mjs +97 -0
  59. package/esm2020/lib/resources/types/entity.mjs +109 -0
  60. package/esm2020/lib/resources/types/function.mjs +140 -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 +44 -0
  63. package/esm2020/lib/resources/types/metadata.mjs +33 -0
  64. package/esm2020/lib/resources/types/navigation-property.mjs +229 -0
  65. package/esm2020/lib/resources/types/options.mjs +2 -0
  66. package/esm2020/lib/resources/types/property.mjs +186 -0
  67. package/esm2020/lib/resources/types/reference.mjs +88 -0
  68. package/esm2020/lib/resources/types/singleton.mjs +129 -0
  69. package/esm2020/lib/resources/types/value.mjs +44 -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 +61 -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 +207 -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/{esm2015/lib/services/singleton.js → esm2020/lib/services/singleton.mjs} +1 -1
  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/{esm2015/lib/utils/arraybuffers.js → esm2020/lib/utils/arraybuffers.mjs} +0 -0
  94. package/{esm2015/lib/utils/dates.js → esm2020/lib/utils/dates.mjs} +0 -0
  95. package/{esm2015/lib/utils/durations.js → esm2020/lib/utils/durations.mjs} +0 -0
  96. package/{esm2015/lib/utils/enums.js → esm2020/lib/utils/enums.mjs} +0 -0
  97. package/{esm2015/lib/utils/http.js → esm2020/lib/utils/http.mjs} +0 -0
  98. package/{esm2015/lib/utils/index.js → esm2020/lib/utils/index.mjs} +0 -0
  99. package/{esm2015/lib/utils/objects.js → esm2020/lib/utils/objects.mjs} +13 -13
  100. package/esm2020/lib/utils/odata.mjs +22 -0
  101. package/esm2020/lib/utils/strings.mjs +20 -0
  102. package/{esm2015/lib/utils/types.js → esm2020/lib/utils/types.mjs} +0 -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} +3427 -2872
  106. package/fesm2015/angular-odata.mjs.map +1 -0
  107. package/fesm2020/angular-odata.mjs +10589 -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 +3 -3
  113. package/lib/constants.d.ts +5 -2
  114. package/lib/index.d.ts +0 -1
  115. package/lib/models/collection.d.ts +21 -21
  116. package/lib/models/model.d.ts +34 -22
  117. package/lib/models/options.d.ts +26 -29
  118. package/lib/module.d.ts +1 -1
  119. package/lib/options.d.ts +1 -0
  120. package/lib/resources/path/segments.d.ts +2 -2
  121. package/lib/resources/query/builder.d.ts +7 -3
  122. package/lib/resources/query/expressions/base.d.ts +19 -0
  123. package/lib/resources/query/expressions/compute.d.ts +26 -0
  124. package/lib/resources/query/expressions/expand.d.ts +40 -0
  125. package/lib/resources/query/expressions/filter.d.ts +58 -0
  126. package/lib/resources/query/expressions/index.d.ts +6 -0
  127. package/lib/resources/query/expressions/orderby.d.ts +37 -0
  128. package/lib/resources/query/expressions/search.d.ts +47 -0
  129. package/lib/resources/query/expressions/select.d.ts +21 -0
  130. package/lib/resources/query/{syntax.d.ts → expressions/syntax.d.ts} +74 -55
  131. package/lib/resources/query/handlers.d.ts +30 -19
  132. package/lib/resources/query/options.d.ts +3 -3
  133. package/lib/resources/request.d.ts +1 -1
  134. package/lib/resources/resource.d.ts +30 -12
  135. package/lib/resources/types/action.d.ts +12 -18
  136. package/lib/resources/types/batch.d.ts +10 -2
  137. package/lib/resources/types/count.d.ts +6 -4
  138. package/lib/resources/types/entity-set.d.ts +11 -14
  139. package/lib/resources/types/entity.d.ts +13 -15
  140. package/lib/resources/types/function.d.ts +11 -17
  141. package/lib/resources/types/media.d.ts +8 -6
  142. package/lib/resources/types/metadata.d.ts +3 -4
  143. package/lib/resources/types/navigation-property.d.ts +17 -22
  144. package/lib/resources/types/property.d.ts +13 -18
  145. package/lib/resources/types/reference.d.ts +41 -7
  146. package/lib/resources/types/singleton.d.ts +12 -15
  147. package/lib/resources/types/value.d.ts +9 -4
  148. package/lib/schema/annotation.d.ts +18 -0
  149. package/lib/schema/callable.d.ts +4 -20
  150. package/lib/schema/element.d.ts +45 -0
  151. package/lib/schema/entity-container.d.ts +2 -12
  152. package/lib/schema/entity-set.d.ts +2 -18
  153. package/lib/schema/enum-type.d.ts +3 -34
  154. package/lib/schema/index.d.ts +1 -0
  155. package/lib/{parsers → schema/parsers}/callable.d.ts +1 -1
  156. package/lib/{parsers → schema/parsers}/edm.d.ts +1 -1
  157. package/lib/{parsers → schema/parsers}/enum-type.d.ts +12 -11
  158. package/lib/{parsers → schema/parsers}/index.d.ts +0 -0
  159. package/lib/{parsers → schema/parsers}/structured-type.d.ts +12 -12
  160. package/lib/schema/schema.d.ts +3 -10
  161. package/lib/schema/structured-type.d.ts +12 -24
  162. package/lib/services/base.d.ts +2 -2
  163. package/lib/services/entity-set.d.ts +2 -2
  164. package/lib/services/entity.d.ts +1 -1
  165. package/lib/services/singleton.d.ts +2 -2
  166. package/lib/settings.d.ts +5 -5
  167. package/lib/types.d.ts +1 -0
  168. package/lib/utils/strings.d.ts +1 -0
  169. package/package.json +21 -8
  170. package/bundles/angular-odata.umd.js +0 -11694
  171. package/bundles/angular-odata.umd.js.map +0 -1
  172. package/esm2015/lib/api.js +0 -297
  173. package/esm2015/lib/client.js +0 -272
  174. package/esm2015/lib/helper.js +0 -271
  175. package/esm2015/lib/index.js +0 -21
  176. package/esm2015/lib/models/collection.js +0 -717
  177. package/esm2015/lib/models/model.js +0 -419
  178. package/esm2015/lib/models/options.js +0 -924
  179. package/esm2015/lib/options.js +0 -31
  180. package/esm2015/lib/parsers/callable.js +0 -107
  181. package/esm2015/lib/parsers/edm.js +0 -95
  182. package/esm2015/lib/parsers/enum-type.js +0 -102
  183. package/esm2015/lib/parsers/index.js +0 -5
  184. package/esm2015/lib/parsers/structured-type.js +0 -388
  185. package/esm2015/lib/resources/path/segments.js +0 -121
  186. package/esm2015/lib/resources/query/builder.js +0 -544
  187. package/esm2015/lib/resources/query/expressions.js +0 -194
  188. package/esm2015/lib/resources/query/handlers.js +0 -192
  189. package/esm2015/lib/resources/query/options.js +0 -103
  190. package/esm2015/lib/resources/query/syntax.js +0 -349
  191. package/esm2015/lib/resources/request.js +0 -168
  192. package/esm2015/lib/resources/resource.js +0 -243
  193. package/esm2015/lib/resources/responses/annotations.js +0 -121
  194. package/esm2015/lib/resources/responses/metadata.js +0 -548
  195. package/esm2015/lib/resources/types/action.js +0 -105
  196. package/esm2015/lib/resources/types/batch.js +0 -294
  197. package/esm2015/lib/resources/types/count.js +0 -33
  198. package/esm2015/lib/resources/types/entity-set.js +0 -101
  199. package/esm2015/lib/resources/types/entity.js +0 -137
  200. package/esm2015/lib/resources/types/function.js +0 -130
  201. package/esm2015/lib/resources/types/media.js +0 -47
  202. package/esm2015/lib/resources/types/metadata.js +0 -36
  203. package/esm2015/lib/resources/types/navigation-property.js +0 -205
  204. package/esm2015/lib/resources/types/options.js +0 -2
  205. package/esm2015/lib/resources/types/property.js +0 -151
  206. package/esm2015/lib/resources/types/reference.js +0 -73
  207. package/esm2015/lib/resources/types/singleton.js +0 -167
  208. package/esm2015/lib/resources/types/value.js +0 -35
  209. package/esm2015/lib/schema/annotation.js +0 -7
  210. package/esm2015/lib/schema/callable.js +0 -82
  211. package/esm2015/lib/schema/entity-container.js +0 -22
  212. package/esm2015/lib/schema/entity-set.js +0 -33
  213. package/esm2015/lib/schema/enum-type.js +0 -126
  214. package/esm2015/lib/schema/schema.js +0 -60
  215. package/esm2015/lib/schema/structured-type.js +0 -217
  216. package/esm2015/lib/services/base.js +0 -23
  217. package/esm2015/lib/services/entity-set.js +0 -146
  218. package/esm2015/lib/services/entity.js +0 -12
  219. package/esm2015/lib/types.js +0 -37
  220. package/esm2015/lib/utils/odata.js +0 -21
  221. package/esm2015/lib/utils/strings.js +0 -13
  222. package/fesm2015/angular-odata.js.map +0 -1
  223. package/lib/resources/query/expressions.d.ts +0 -50
@@ -0,0 +1,757 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { forkJoin, Observable, of, throwError } from 'rxjs';
3
+ import { finalize, map, switchMap } from 'rxjs/operators';
4
+ import { DEFAULT_VERSION } from '../constants';
5
+ import { ODataHelper } from '../helper';
6
+ import { ODataEntitiesAnnotations, ODataEntityAnnotations, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPropertyResource, } from '../resources';
7
+ import { Types } from '../utils/types';
8
+ import { BUBBLING, INCLUDE_DEEP, INCLUDE_SHALLOW, ODataModelEvent, ODataModelOptions, ODataModelState, } from './options';
9
+ export class ODataCollection {
10
+ constructor(entities = [], { parent, resource, annots, model, reset = false, } = {}) {
11
+ this._parent = null;
12
+ this._resource = null;
13
+ this._entries = [];
14
+ //Events
15
+ this.events$ = new EventEmitter();
16
+ this._sortBy = null;
17
+ const Klass = this.constructor;
18
+ if (model === undefined && Klass.model !== null)
19
+ model = Klass.model;
20
+ if (model === undefined)
21
+ throw new Error('Collection need model');
22
+ this._model = model;
23
+ // Parent
24
+ if (parent !== undefined) {
25
+ this._parent = parent;
26
+ }
27
+ // Resource
28
+ if (this._parent === null && resource === undefined)
29
+ resource = this._model.meta.collectionResourceFactory();
30
+ if (resource !== undefined) {
31
+ this.attach(resource);
32
+ }
33
+ // Annotations
34
+ this._annotations =
35
+ annots ||
36
+ new ODataEntitiesAnnotations(resource?.api.options.helper || ODataHelper[DEFAULT_VERSION]);
37
+ entities = entities || [];
38
+ this.assign(entities, { reset });
39
+ }
40
+ models() {
41
+ return this._entries
42
+ .filter((e) => e.state !== ODataModelState.Removed)
43
+ .map((e) => e.model);
44
+ }
45
+ get length() {
46
+ return this.models().length;
47
+ }
48
+ isParentOf(child) {
49
+ return (child !== this &&
50
+ ODataModelOptions.chain(child).some((p) => p[0] === this));
51
+ }
52
+ resource() {
53
+ return ODataModelOptions.resource(this);
54
+ }
55
+ attach(resource) {
56
+ if (this._resource !== null &&
57
+ this._resource.type() !== resource.type() &&
58
+ !this._resource.isSubtypeOf(resource))
59
+ throw new Error(`Can't reattach ${this._resource.type()} to ${resource.type()}`);
60
+ this._entries.forEach(({ model }) => {
61
+ const mr = this._model.meta.modelResourceFactory(resource.cloneQuery());
62
+ model.attach(mr);
63
+ });
64
+ const current = this._resource;
65
+ if (current === null || !current.isEqualTo(resource)) {
66
+ this._resource = resource;
67
+ this.events$.emit(new ODataModelEvent('attach', {
68
+ collection: this,
69
+ previous: current,
70
+ value: resource,
71
+ }));
72
+ }
73
+ }
74
+ asEntitySet(func) {
75
+ // Build new resource
76
+ const query = this.resource().cloneQuery();
77
+ let resource = this._model.meta.collectionResourceFactory(query);
78
+ if (resource === undefined)
79
+ throw new Error('Collection does not have associated EntitySet endpoint');
80
+ // Store parent and resource
81
+ const store = { parent: this._parent, resource: this._resource };
82
+ // Replace parent and resource
83
+ this._parent = null;
84
+ this._resource = resource;
85
+ // Execute
86
+ const result = func(this);
87
+ if (result instanceof Observable) {
88
+ return result.pipe(finalize(() => {
89
+ // Restore
90
+ this._parent = store.parent;
91
+ this._resource = store.resource;
92
+ }));
93
+ }
94
+ else {
95
+ // Restore
96
+ this._parent = store.parent;
97
+ this._resource = store.resource;
98
+ return result;
99
+ }
100
+ }
101
+ annots() {
102
+ return this._annotations;
103
+ }
104
+ modelFactory(data, { reset = false } = {}) {
105
+ let Model = this._model;
106
+ const helper = this._annotations.helper;
107
+ const annots = new ODataEntityAnnotations(helper, helper.annotations(data) || {});
108
+ if (annots?.type !== undefined && Model.meta !== null) {
109
+ let schema = Model.meta.findChildOptions((o) => o.isTypeOf(annots.type))?.schema;
110
+ if (schema !== undefined && schema.model !== undefined)
111
+ // Change to child model
112
+ Model = schema.model;
113
+ }
114
+ return new Model(data, {
115
+ annots,
116
+ reset,
117
+ parent: [this, null],
118
+ });
119
+ }
120
+ toEntities({ client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
121
+ return this._entries
122
+ .filter(({ model, state }) => state !== ODataModelState.Removed && chain.every((c) => c !== model))
123
+ .map(({ model, state }) => {
124
+ var changesOnly = changes_only && state !== ODataModelState.Added;
125
+ return model.toEntity({
126
+ client_id,
127
+ include_navigation,
128
+ include_concurrency,
129
+ include_computed,
130
+ include_key,
131
+ include_non_field,
132
+ field_mapping,
133
+ changes_only: changesOnly,
134
+ chain: [this, ...chain],
135
+ });
136
+ });
137
+ }
138
+ toJSON() {
139
+ return this.toEntities();
140
+ }
141
+ hasChanged({ include_navigation } = {}) {
142
+ return (this._entries.some((e) => e.state !== ODataModelState.Unchanged) ||
143
+ this.models().some((m) => m.hasChanged({ include_navigation })));
144
+ }
145
+ clone() {
146
+ let Ctor = this.constructor;
147
+ return new Ctor(this.toEntities(INCLUDE_SHALLOW), {
148
+ resource: this.resource(),
149
+ annots: this.annots(),
150
+ });
151
+ }
152
+ fetch({ withCount, ...options } = {}) {
153
+ const resource = this.resource();
154
+ if (resource === undefined)
155
+ return throwError('fetch: Resource is undefined');
156
+ let obs$;
157
+ if (resource instanceof ODataEntitySetResource) {
158
+ obs$ = resource.fetch({ withCount, ...options });
159
+ }
160
+ else if (resource instanceof ODataNavigationPropertyResource) {
161
+ obs$ = resource.fetch({
162
+ responseType: 'entities',
163
+ withCount,
164
+ ...options,
165
+ });
166
+ }
167
+ else {
168
+ obs$ = resource.fetch({
169
+ responseType: 'entities',
170
+ withCount,
171
+ ...options,
172
+ });
173
+ }
174
+ this.events$.emit(new ODataModelEvent('request', { collection: this, value: obs$ }));
175
+ return obs$.pipe(map(({ entities, annots }) => {
176
+ this._annotations = annots;
177
+ this.assign(entities || [], { reset: true });
178
+ this.events$.emit(new ODataModelEvent('sync', { collection: this }));
179
+ return this;
180
+ }));
181
+ }
182
+ fetchAll(options) {
183
+ const resource = this.resource();
184
+ if (resource === undefined)
185
+ return throwError('fetchAll: Resource is undefined');
186
+ if (resource instanceof ODataPropertyResource)
187
+ return throwError('fetchAll: Resource is ODataPropertyResource');
188
+ const obs$ = resource.fetchAll(options);
189
+ this.events$.emit(new ODataModelEvent('request', {
190
+ collection: this,
191
+ options: { observable: obs$ },
192
+ }));
193
+ return obs$.pipe(map((entities) => {
194
+ this._annotations = new ODataEntitiesAnnotations(resource?.api.options.helper);
195
+ this.assign(entities || [], { reset: true });
196
+ this.events$.emit(new ODataModelEvent('sync', {
197
+ collection: this,
198
+ options: { entities },
199
+ }));
200
+ return this;
201
+ }));
202
+ }
203
+ /**
204
+ * Save all models in the collection
205
+ * @param relModel The model is relationship
206
+ * @param method The method to use
207
+ * @param options HttpOptions
208
+ */
209
+ save({ relModel = false, method, ...options } = {}) {
210
+ const resource = this.resource();
211
+ if (resource === undefined)
212
+ return throwError('saveAll: Resource is undefined');
213
+ if (resource instanceof ODataPropertyResource)
214
+ return throwError('fetchAll: Resource is ODataPropertyResource');
215
+ let toDestroyEntity = [];
216
+ let toRemoveReference = [];
217
+ let toDestroyContained = [];
218
+ let toCreateEntity = [];
219
+ let toAddReference = [];
220
+ let toCreateContained = [];
221
+ let toUpdateEntity = [];
222
+ let toUpdateContained = [];
223
+ this._entries.forEach(({ model, state }) => {
224
+ if (state === ODataModelState.Removed) {
225
+ if (relModel) {
226
+ toDestroyEntity.push(model);
227
+ }
228
+ else if (!model.isNew()) {
229
+ toRemoveReference.push(model);
230
+ }
231
+ else {
232
+ toDestroyContained.push(model);
233
+ }
234
+ }
235
+ else if (state === ODataModelState.Added) {
236
+ if (relModel) {
237
+ toCreateEntity.push(model);
238
+ }
239
+ else if (!model.isNew()) {
240
+ toAddReference.push(model);
241
+ }
242
+ else {
243
+ toCreateContained.push(model);
244
+ }
245
+ }
246
+ else if (model.hasChanged()) {
247
+ toUpdateEntity.push(model);
248
+ }
249
+ });
250
+ if (toDestroyEntity.length > 0 ||
251
+ toRemoveReference.length > 0 ||
252
+ toDestroyContained.length > 0 ||
253
+ toCreateEntity.length > 0 ||
254
+ toAddReference.length > 0 ||
255
+ toCreateContained.length > 0 ||
256
+ toUpdateEntity.length > 0 ||
257
+ toUpdateContained.length > 0) {
258
+ const obs$ = forkJoin([
259
+ ...toDestroyEntity.map((m) => m.asEntity((e) => e.destroy(options))),
260
+ ...toRemoveReference.map((m) => this.removeReference(m, options)),
261
+ ...toDestroyContained.map((m) => m.destroy(options)),
262
+ ...toCreateEntity.map((m) => m.asEntity((e) => e.save({ method: 'create', ...options }))),
263
+ ...toAddReference.map((m) => this.addReference(m, options)),
264
+ ...toCreateContained.map((m) => m.save({ method: 'create', ...options })),
265
+ ...toUpdateEntity.map((m) => m.asEntity((e) => e.save({ method, ...options }))),
266
+ ...toUpdateContained.map((m) => m.save({ method, ...options })),
267
+ ]);
268
+ this.events$.emit(new ODataModelEvent('request', {
269
+ collection: this,
270
+ options: { observable: obs$ },
271
+ }));
272
+ return obs$.pipe(map(() => {
273
+ this._entries = this._entries
274
+ .filter((entry) => entry.state !== ODataModelState.Removed)
275
+ .map((entry) => ({ ...entry, state: ODataModelState.Unchanged }));
276
+ this.events$.emit(new ODataModelEvent('sync', { collection: this }));
277
+ return this;
278
+ }));
279
+ }
280
+ return of(this);
281
+ }
282
+ addReference(model, options) {
283
+ const resource = this.resource();
284
+ if (!model.isNew() && resource instanceof ODataNavigationPropertyResource) {
285
+ return resource
286
+ .reference()
287
+ .add(model._meta.entityResource(model), options)
288
+ .pipe(map(() => model));
289
+ }
290
+ return of(model);
291
+ }
292
+ _addModel(model, { silent = false, reset = false, reparent = false, position = -1, } = {}) {
293
+ const key = model.key();
294
+ let entry = this._findEntry({
295
+ model,
296
+ key,
297
+ cid: model[this._model.meta.cid],
298
+ });
299
+ if (entry !== undefined && entry.state !== ODataModelState.Removed) {
300
+ return undefined;
301
+ }
302
+ if (entry !== undefined && entry.state === ODataModelState.Removed) {
303
+ const index = this._entries.indexOf(entry);
304
+ this._entries.splice(index, 1);
305
+ }
306
+ // Create Entry
307
+ entry = {
308
+ state: reset ? ODataModelState.Unchanged : ODataModelState.Added,
309
+ model,
310
+ key: model.key(),
311
+ };
312
+ // Set Parent
313
+ if (reparent)
314
+ model._parent = [this, null];
315
+ // Subscribe
316
+ this._subscribe(entry);
317
+ // Now add
318
+ if (position >= 0)
319
+ this._entries.splice(position, 0, entry);
320
+ else
321
+ this._entries.push(entry);
322
+ if (!silent) {
323
+ model.events$.emit(new ODataModelEvent('add', { model, collection: this }));
324
+ }
325
+ return entry.model;
326
+ }
327
+ addModel(model, { silent = false, reset = false, reparent = false, position = -1, } = {}) {
328
+ if (position < 0)
329
+ position = this._bisect(model);
330
+ const added = this._addModel(model, { silent, reset, position, reparent });
331
+ if (!silent && added !== undefined) {
332
+ this.events$.emit(new ODataModelEvent('update', {
333
+ collection: this,
334
+ options: { added: [added], removed: [], merged: [] },
335
+ }));
336
+ }
337
+ }
338
+ add(model, { silent = false, reparent = false, server = true, position = -1, } = {}) {
339
+ if (server) {
340
+ return this.addReference(model).pipe(map((model) => {
341
+ this.addModel(model, { silent, position, reparent, reset: true });
342
+ return this;
343
+ }));
344
+ }
345
+ else {
346
+ this.addModel(model, { silent, position, reparent });
347
+ return of(this);
348
+ }
349
+ }
350
+ removeReference(model, options) {
351
+ let resource = this.resource();
352
+ if (!model.isNew() && resource instanceof ODataNavigationPropertyResource) {
353
+ let target = this._model.meta.api.options.deleteRefBy === 'id'
354
+ ? model._meta.entityResource(model)
355
+ : undefined;
356
+ if (this._model.meta.api.options.deleteRefBy === 'path') {
357
+ resource = resource.key(model.key());
358
+ }
359
+ return resource
360
+ .reference()
361
+ .remove(target, options)
362
+ .pipe(map(() => model));
363
+ }
364
+ return of(model);
365
+ }
366
+ _removeModel(model, { silent = false, reset = false, } = {}) {
367
+ const key = model.key();
368
+ let entry = this._findEntry({
369
+ model,
370
+ key,
371
+ cid: model[this._model.meta.cid],
372
+ });
373
+ if (entry === undefined || entry.state === ODataModelState.Removed) {
374
+ return undefined;
375
+ }
376
+ // Emit Event
377
+ if (!silent)
378
+ model.events$.emit(new ODataModelEvent('remove', { model, collection: this }));
379
+ // Now remove
380
+ const index = this._entries.indexOf(entry);
381
+ this._entries.splice(index, 1);
382
+ if (!(reset || entry.state === ODataModelState.Added)) {
383
+ // Move to end of array and mark as removed
384
+ entry.state = ODataModelState.Removed;
385
+ this._entries.push(entry);
386
+ }
387
+ this._unsubscribe(entry);
388
+ return entry.model;
389
+ }
390
+ removeModel(model, { silent = false, reset = false, } = {}) {
391
+ const removed = this._removeModel(model, { silent, reset });
392
+ if (!silent && removed !== undefined) {
393
+ this.events$.emit(new ODataModelEvent('update', {
394
+ collection: this,
395
+ options: { added: [], removed: [removed], merged: [] },
396
+ }));
397
+ }
398
+ }
399
+ remove(model, { silent = false, server = true, } = {}) {
400
+ if (server) {
401
+ return this.removeReference(model).pipe(map((model) => {
402
+ this.removeModel(model, { silent, reset: true });
403
+ return this;
404
+ }));
405
+ }
406
+ else {
407
+ this.removeModel(model, { silent });
408
+ return of(this);
409
+ }
410
+ }
411
+ create(attrs = {}, { silent = false, server = true, } = {}) {
412
+ const model = this.modelFactory(attrs);
413
+ return (model.isValid() && server ? model.save() : of(model)).pipe(switchMap((model) => this.add(model, { silent, server })), map(() => model));
414
+ }
415
+ set(path, value) {
416
+ const Model = this._model;
417
+ const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
418
+ if (pathArray.length === 0)
419
+ return undefined;
420
+ if (pathArray.length > 1) {
421
+ const model = this._entries[Number(pathArray[0])].model;
422
+ return model.set(pathArray.slice(1), value);
423
+ }
424
+ if (pathArray.length === 1 && ODataModelOptions.isModel(value)) {
425
+ let toAdd = [];
426
+ let toMerge = [];
427
+ let toRemove = [];
428
+ let index = Number(pathArray[0]);
429
+ const model = this.models()[index];
430
+ const entry = this._findEntry({ model });
431
+ if (entry !== undefined) {
432
+ //TODO: Remove/Add or Merge?
433
+ // Merge
434
+ entry.model.assign(value.toEntity({ client_id: true, ...INCLUDE_DEEP }));
435
+ if (entry.model.hasChanged())
436
+ toMerge.push(model);
437
+ }
438
+ else {
439
+ // Add
440
+ this._addModel(value, { reparent: true });
441
+ toAdd.push(model);
442
+ }
443
+ this.events$.emit(new ODataModelEvent('update', {
444
+ collection: this,
445
+ options: { added: toAdd, removed: toRemove, merged: toMerge },
446
+ }));
447
+ return value;
448
+ }
449
+ }
450
+ get(path) {
451
+ const Model = this._model;
452
+ const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
453
+ if (pathArray.length === 0)
454
+ return undefined;
455
+ const value = this.models()[Number(pathArray[0])];
456
+ if (pathArray.length > 1 && ODataModelOptions.isModel(value)) {
457
+ return value.get(pathArray.slice(1));
458
+ }
459
+ return value;
460
+ }
461
+ reset({ path, silent = false, } = {}) {
462
+ if (Types.isEmpty(path)) {
463
+ this.models().forEach((m) => m.reset({ silent }));
464
+ }
465
+ else {
466
+ const Model = this._model;
467
+ const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
468
+ const value = this.models()[Number(pathArray[0])];
469
+ if (ODataModelOptions.isModel(value)) {
470
+ value.reset({ path: pathArray.slice(1), silent });
471
+ }
472
+ }
473
+ }
474
+ assign(objects, { reset = false, reparent = false, silent = false, } = {}) {
475
+ const Model = this._model;
476
+ let toAdd = [];
477
+ let toMerge = [];
478
+ let toRemove = [];
479
+ let toSort = [];
480
+ let modelMap = [];
481
+ objects.forEach((obj, index) => {
482
+ const isModel = ODataModelOptions.isModel(obj);
483
+ const key = Model !== null && Model.meta ? Model.meta.resolveKey(obj) : undefined;
484
+ const cid = Model.meta.cid in obj ? obj[Model.meta.cid] : undefined;
485
+ // Try find entry
486
+ const entry = isModel
487
+ ? this._findEntry({ model: obj }) // By Model
488
+ : this._findEntry({ cid, key }); // By Cid or Key
489
+ let model;
490
+ if (entry !== undefined) {
491
+ // Merge
492
+ model = entry.model;
493
+ if (model !== obj) {
494
+ // Get entity from model
495
+ if (isModel) {
496
+ const entity = obj.toEntity({
497
+ client_id: true,
498
+ ...INCLUDE_DEEP,
499
+ });
500
+ model.assign(entity, { reset, silent });
501
+ }
502
+ else {
503
+ const helper = this._annotations.helper;
504
+ const annots = new ODataEntityAnnotations(helper, helper.annotations(obj) || {});
505
+ const entity = annots.attributes(obj, 'full');
506
+ model._annotations = annots;
507
+ model.assign(entity, { reset, silent });
508
+ }
509
+ // Model Change?
510
+ if (model.hasChanged())
511
+ toMerge.push(model);
512
+ }
513
+ // Has Sort or Index Change?
514
+ if (toSort.length > 0 || index !== this.models().indexOf(model)) {
515
+ toSort.push([model, index]);
516
+ }
517
+ }
518
+ else {
519
+ // Add
520
+ model = isModel
521
+ ? obj
522
+ : this.modelFactory(obj, {
523
+ reset,
524
+ });
525
+ toAdd.push(model);
526
+ }
527
+ modelMap.push(model[Model.meta.cid]);
528
+ });
529
+ this._entries
530
+ .filter((e) => modelMap.indexOf(e.model[Model.meta.cid]) === -1)
531
+ .forEach((entry) => {
532
+ toRemove.push(entry.model);
533
+ });
534
+ toRemove.forEach((m) => {
535
+ this._removeModel(m, { silent, reset });
536
+ });
537
+ toAdd.forEach((m) => {
538
+ this._addModel(m, { silent, reset, reparent });
539
+ });
540
+ toSort.forEach((m) => {
541
+ this._removeModel(m[0], { silent: true, reset });
542
+ this._addModel(m[0], { silent: true, reset, position: m[1], reparent });
543
+ });
544
+ if ((!silent &&
545
+ (toAdd.length > 0 ||
546
+ toRemove.length > 0 ||
547
+ toMerge.length > 0 ||
548
+ toSort.length > 0)) ||
549
+ reset) {
550
+ this._sortBy = null;
551
+ this.events$.emit(new ODataModelEvent(reset ? 'reset' : 'update', {
552
+ collection: this,
553
+ options: {
554
+ added: toAdd,
555
+ removed: toRemove,
556
+ merged: toMerge,
557
+ sorted: toSort,
558
+ },
559
+ }));
560
+ }
561
+ }
562
+ query(func) {
563
+ const resource = this.resource();
564
+ resource.query(func);
565
+ this.attach(resource);
566
+ return this;
567
+ }
568
+ callFunction(name, params, responseType, { ...options } = {}) {
569
+ const resource = this.resource();
570
+ if (resource instanceof ODataEntitySetResource) {
571
+ const func = resource.function(name);
572
+ func.query((q) => q.apply(options));
573
+ switch (responseType) {
574
+ case 'property':
575
+ return func.callProperty(params, options);
576
+ case 'model':
577
+ return func.callModel(params, options);
578
+ case 'collection':
579
+ return func.callCollection(params, options);
580
+ default:
581
+ return func.call(params, { responseType, ...options });
582
+ }
583
+ }
584
+ return throwError(`Can't function without ODataEntitySetResource`);
585
+ }
586
+ callAction(name, params, responseType, { ...options } = {}) {
587
+ const resource = this.resource();
588
+ if (resource instanceof ODataEntitySetResource) {
589
+ const action = resource.action(name);
590
+ action.query((q) => q.apply(options));
591
+ switch (responseType) {
592
+ case 'property':
593
+ return action.callProperty(params, options);
594
+ case 'model':
595
+ return action.callModel(params, options);
596
+ case 'collection':
597
+ return action.callCollection(params, options);
598
+ default:
599
+ return action.call(params, { responseType, ...options });
600
+ }
601
+ }
602
+ return throwError(`Can't action without ODataEntitySetResource`);
603
+ }
604
+ _unsubscribe(entry) {
605
+ if (entry.subscription) {
606
+ entry.subscription.unsubscribe();
607
+ delete entry.subscription;
608
+ }
609
+ }
610
+ _subscribe(entry) {
611
+ if (entry.subscription) {
612
+ throw new Error('Subscription already exists');
613
+ }
614
+ entry.subscription = entry.model.events$.subscribe((event) => {
615
+ if (BUBBLING.indexOf(event.name) !== -1 &&
616
+ event.bubbling &&
617
+ !event.visited(this)) {
618
+ if (event.model === entry.model) {
619
+ if (event.name === 'destroy') {
620
+ this.removeModel(entry.model, { reset: true });
621
+ }
622
+ else if (event.name === 'change' && event.options?.key) {
623
+ entry.key = entry.model.key();
624
+ }
625
+ }
626
+ const index = this.models().indexOf(entry.model);
627
+ event.push(this, index);
628
+ this.events$.emit(event);
629
+ }
630
+ });
631
+ }
632
+ _findEntry({ model, cid, key, } = {}) {
633
+ return this._entries.find((entry) => {
634
+ const byModel = model !== undefined && entry.model.equals(model);
635
+ const byCid = cid !== undefined && entry.model[this._model.meta.cid] === cid;
636
+ const byKey = key !== undefined &&
637
+ entry.key !== undefined &&
638
+ Types.isEqual(entry.key, key);
639
+ return byModel || byCid || byKey;
640
+ });
641
+ }
642
+ // Collection functions
643
+ equals(other) {
644
+ return this === other;
645
+ }
646
+ get [Symbol.toStringTag]() {
647
+ return 'Collection';
648
+ }
649
+ [Symbol.iterator]() {
650
+ let pointer = 0;
651
+ let models = this.models();
652
+ return {
653
+ next() {
654
+ return {
655
+ done: pointer === models.length,
656
+ value: models[pointer++],
657
+ };
658
+ },
659
+ };
660
+ }
661
+ filter(predicate) {
662
+ return this.models().filter(predicate);
663
+ }
664
+ find(predicate) {
665
+ return this.models().find(predicate);
666
+ }
667
+ first() {
668
+ return this.models()[0];
669
+ }
670
+ last() {
671
+ const models = this.models();
672
+ return models[models.length - 1];
673
+ }
674
+ next(model) {
675
+ const index = this.indexOf(model);
676
+ if (index === -1 || index === this.length - 1) {
677
+ return undefined;
678
+ }
679
+ return this.get(index + 1);
680
+ }
681
+ prev(model) {
682
+ const index = this.indexOf(model);
683
+ if (index <= 0) {
684
+ return undefined;
685
+ }
686
+ return this.get(index - 1);
687
+ }
688
+ every(predicate) {
689
+ return this.models().every(predicate);
690
+ }
691
+ some(predicate) {
692
+ return this.models().some(predicate);
693
+ }
694
+ contains(model) {
695
+ return this.some((m) => m.equals(model));
696
+ }
697
+ indexOf(model) {
698
+ const models = this.models();
699
+ const m = models.find((m) => m.equals(model));
700
+ return m === undefined ? -1 : models.indexOf(m);
701
+ }
702
+ //#region Sort
703
+ _bisect(model) {
704
+ let index = -1;
705
+ if (this._sortBy !== null) {
706
+ for (index = 0; index < this._entries.length; index++) {
707
+ if (this._compare(model, this._entries[index], this._sortBy, 0) < 0) {
708
+ return index;
709
+ }
710
+ }
711
+ }
712
+ return index;
713
+ }
714
+ _compare(e1, e2, by, index) {
715
+ let m1 = ODataModelOptions.isModel(e1)
716
+ ? e1
717
+ : e1.model;
718
+ let m2 = ODataModelOptions.isModel(e2)
719
+ ? e2
720
+ : e2.model;
721
+ let value1 = m1.get(by[index].field);
722
+ let value2 = m2.get(by[index].field);
723
+ let result = 0;
724
+ if (value1 == null && value2 != null)
725
+ result = -1;
726
+ else if (value1 != null && value2 == null)
727
+ result = 1;
728
+ else if (value1 == null && value2 == null)
729
+ result = 0;
730
+ else if (typeof value1 == 'string' || value1 instanceof String) {
731
+ if (value1.localeCompare && value1 != value2) {
732
+ return (by[index].order || 1) * value1.localeCompare(value2);
733
+ }
734
+ }
735
+ else {
736
+ result = value1 < value2 ? -1 : 1;
737
+ }
738
+ if (value1 == value2) {
739
+ return by.length - 1 > index ? this._compare(e1, e2, by, index + 1) : 0;
740
+ }
741
+ return (by[index].order || 1) * result;
742
+ }
743
+ isSorted() {
744
+ return this._sortBy !== null;
745
+ }
746
+ sort(by, { silent } = {}) {
747
+ this._sortBy = by;
748
+ this._entries = this._entries.sort((e1, e2) => this._compare(e1, e2, by, 0));
749
+ if (!silent) {
750
+ this.events$.emit(new ODataModelEvent('update', {
751
+ collection: this,
752
+ }));
753
+ }
754
+ }
755
+ }
756
+ ODataCollection.model = null;
757
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFHTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBRXRCLHNCQUFzQixFQUN0QiwrQkFBK0IsRUFFL0IscUJBQXFCLEdBSXRCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFDWixlQUFlLEVBRWYsZUFBZSxFQUVmLGlCQUFpQixFQUNqQixlQUFlLEdBQ2hCLE1BQU0sV0FBVyxDQUFDO0FBRW5CLE1BQU0sT0FBTyxlQUFlO0lBK0IxQixZQUNFLFdBQXFELEVBQUUsRUFDdkQsRUFDRSxNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxHQUFHLEtBQUssTUFPWCxFQUFFO1FBekNSLFlBQU8sR0FLSSxJQUFJLENBQUM7UUFDaEIsY0FBUyxHQUlFLElBQUksQ0FBQztRQUVoQixhQUFRLEdBQTRCLEVBQUUsQ0FBQztRQWF2QyxRQUFRO1FBQ1IsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBbWdDakQs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bmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBERUZBVUxUX1ZFUlNJT04gfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHtcbiAgRW50aXR5S2V5LFxuICBPRGF0YUVudGl0aWVzLFxuICBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMsXG4gIE9EYXRhRW50aXR5QW5ub3RhdGlvbnMsXG4gIE9EYXRhRW50aXR5UmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UsXG4gIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhT3B0aW9ucyxcbiAgT0RhdGFQcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YVF1ZXJ5QXJndW1lbnRzT3B0aW9ucyxcbiAgT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyLFxuICBPRGF0YVJlc291cmNlLFxufSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgVHlwZXMgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XG5pbXBvcnQgeyBPRGF0YU1vZGVsIH0gZnJvbSAnLi9tb2RlbCc7XG5pbXBvcnQge1xuICBCVUJCTElORyxcbiAgSU5DTFVERV9ERUVQLFxuICBJTkNMVURFX1NIQUxMT1csXG4gIE9EYXRhTW9kZWxFbnRyeSxcbiAgT0RhdGFNb2RlbEV2ZW50LFxuICBPRGF0YU1vZGVsRmllbGQsXG4gIE9EYXRhTW9kZWxPcHRpb25zLFxuICBPRGF0YU1vZGVsU3RhdGUsXG59IGZyb20gJy4vb3B0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUNvbGxlY3Rpb248VCwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+XG4gIGltcGxlbWVudHMgSXRlcmFibGU8TT5cbntcbiAgc3RhdGljIG1vZGVsOiB0eXBlb2YgT0RhdGFNb2RlbCB8IG51bGwgPSBudWxsO1xuICBfcGFyZW50OlxuICAgIHwgW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF1cbiAgICB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2U6XG4gICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IG51bGwgPSBudWxsO1xuICBfYW5ub3RhdGlvbnMhOiBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM7XG4gIF9lbnRyaWVzOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuICBfbW9kZWw6IHR5cGVvZiBPRGF0YU1vZGVsO1xuXG4gIG1vZGVscygpIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllc1xuICAgICAgLmZpbHRlcigoZSkgPT4gZS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpXG4gICAgICAubWFwKChlKSA9PiBlLm1vZGVsKTtcbiAgfVxuXG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5sZW5ndGg7XG4gIH1cblxuICAvL0V2ZW50c1xuICBldmVudHMkID0gbmV3IEV2ZW50RW1pdHRlcjxPRGF0YU1vZGVsRXZlbnQ8VD4+KCk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGVudGl0aWVzOiBQYXJ0aWFsPFQ+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdID0gW10sXG4gICAge1xuICAgICAgcGFyZW50LFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBhbm5vdHMsXG4gICAgICBtb2RlbCxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgcGFyZW50PzogW09EYXRhTW9kZWw8YW55PiwgT0RhdGFNb2RlbEZpZWxkPGFueT5dO1xuICAgICAgcmVzb3VyY2U/OiBPRGF0YVJlc291cmNlPFQ+O1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zO1xuICAgICAgbW9kZWw/OiB0eXBlb2YgT0RhdGFNb2RlbDtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgY29uc3QgS2xhc3MgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPRGF0YUNvbGxlY3Rpb247XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQgJiYgS2xhc3MubW9kZWwgIT09IG51bGwpIG1vZGVsID0gS2xhc3MubW9kZWw7XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbiBuZWVkIG1vZGVsJyk7XG4gICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcblxuICAgIC8vIFBhcmVudFxuICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIC8vIFJlc291cmNlXG4gICAgaWYgKHRoaXMuX3BhcmVudCA9PT0gbnVsbCAmJiByZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmVzb3VyY2UgPSB0aGlzLl9tb2RlbC5tZXRhLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoKSBhc1xuICAgICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmF0dGFjaChcbiAgICAgICAgcmVzb3VyY2UgYXNcbiAgICAgICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBbm5vdGF0aW9uc1xuICAgIHRoaXMuX2Fubm90YXRpb25zID1cbiAgICAgIGFubm90cyB8fFxuICAgICAgbmV3IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyhcbiAgICAgICAgcmVzb3VyY2U/LmFwaS5vcHRpb25zLmhlbHBlciB8fCBPRGF0YUhlbHBlcltERUZBVUxUX1ZFUlNJT05dXG4gICAgICApO1xuXG4gICAgZW50aXRpZXMgPSBlbnRpdGllcyB8fCBbXTtcbiAgICB0aGlzLmFzc2lnbihlbnRpdGllcywgeyByZXNldCB9KTtcbiAgfVxuXG4gIGlzUGFyZW50T2YoXG4gICAgY2hpbGQ6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj5cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoaWxkICE9PSB0aGlzICYmXG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5jaGFpbihjaGlsZCkuc29tZSgocCkgPT4gcFswXSA9PT0gdGhpcylcbiAgICApO1xuICB9XG5cbiAgcmVzb3VyY2UoKTpcbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPiB7XG4gICAgcmV0dXJuIE9EYXRhTW9kZWxPcHRpb25zLnJlc291cmNlPFQ+KHRoaXMpIGFzXG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD47XG4gIH1cblxuICBhdHRhY2goXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fcmVzb3VyY2UgIT09IG51bGwgJiZcbiAgICAgIHRoaXMuX3Jlc291cmNlLnR5cGUoKSAhPT0gcmVzb3VyY2UudHlwZSgpICYmXG4gICAgICAhdGhpcy5fcmVzb3VyY2UuaXNTdWJ0eXBlT2YocmVzb3VyY2UpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2FuJ3QgcmVhdHRhY2ggJHt0aGlzLl9yZXNvdXJjZS50eXBlKCl9IHRvICR7cmVzb3VyY2UudHlwZSgpfWBcbiAgICAgICk7XG5cbiAgICB0aGlzLl9lbnRyaWVzLmZvckVhY2goKHsgbW9kZWwgfSkgPT4ge1xuICAgICAgY29uc3QgbXIgPSB0aGlzLl9tb2RlbC5tZXRhLm1vZGVsUmVzb3VyY2VGYWN0b3J5KFxuICAgICAgICByZXNvdXJjZS5jbG9uZVF1ZXJ5PFQ+KClcbiAgICAgICkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPjtcbiAgICAgIG1vZGVsLmF0dGFjaChtcik7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fcmVzb3VyY2U7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgIWN1cnJlbnQuaXNFcXVhbFRvKHJlc291cmNlKSkge1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdhdHRhY2gnLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICBwcmV2aW91czogY3VycmVudCxcbiAgICAgICAgICB2YWx1ZTogcmVzb3VyY2UsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzRW50aXR5U2V0PFI+KGZ1bmM6IChjb2xsZWN0aW9uOiB0aGlzKSA9PiBSKTogUiB7XG4gICAgLy8gQnVpbGQgbmV3IHJlc291cmNlXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnJlc291cmNlKCkuY2xvbmVRdWVyeTxUPigpO1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMuX21vZGVsLm1ldGEuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeShxdWVyeSk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb24gZG9lcyBub3QgaGF2ZSBhc3NvY2lhdGVkIEVudGl0eVNldCBlbmRwb2ludCcpO1xuICAgIC8vIFN0b3JlIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICBjb25zdCBzdG9yZSA9IHsgcGFyZW50OiB0aGlzLl9wYXJlbnQsIHJlc291cmNlOiB0aGlzLl9yZXNvdXJjZSB9O1xuICAgIC8vIFJlcGxhY2UgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgICAvLyBFeGVjdXRlXG4gICAgY29uc3QgcmVzdWx0ID0gZnVuYyh0aGlzKTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIChyZXN1bHQgYXMgYW55KS5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgLy8gUmVzdG9yZVxuICAgICAgICAgIHRoaXMuX3BhcmVudCA9IHN0b3JlLnBhcmVudDtcbiAgICAgICAgICB0aGlzLl9yZXNvdXJjZSA9IHN0b3JlLnJlc291cmNlO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVzdG9yZVxuICAgICAgdGhpcy5fcGFyZW50ID0gc3RvcmUucGFyZW50O1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSBzdG9yZS5yZXNvdXJjZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgYW5ub3RzKCkge1xuICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgbW9kZWxGYWN0b3J5KFxuICAgIGRhdGE6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7IHJlc2V0ID0gZmFsc2UgfTogeyByZXNldD86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE0ge1xuICAgIGxldCBNb2RlbCA9IHRoaXMuX21vZGVsO1xuICAgIGNvbnN0IGhlbHBlciA9IHRoaXMuX2Fubm90YXRpb25zLmhlbHBlcjtcbiAgICBjb25zdCBhbm5vdHMgPSBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyhcbiAgICAgIGhlbHBlcixcbiAgICAgIGhlbHBlci5hbm5vdGF0aW9ucyhkYXRhKSB8fCB7fVxuICAgICk7XG5cbiAgICBpZiAoYW5ub3RzPy50eXBlICE9PSB1bmRlZmluZWQgJiYgTW9kZWwubWV0YSAhPT0gbnVsbCkge1xuICAgICAgbGV0IHNjaGVtYSA9IE1vZGVsLm1ldGEuZmluZENoaWxkT3B0aW9ucygobykgPT5cbiAgICAgICAgby5pc1R5cGVPZihhbm5vdHMudHlwZSBhcyBzdHJpbmcpXG4gICAgICApPy5zY2hlbWE7XG4gICAgICBpZiAoc2NoZW1hICE9PSB1bmRlZmluZWQgJiYgc2NoZW1hLm1vZGVsICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC8vIENoYW5nZSB0byBjaGlsZCBtb2RlbFxuICAgICAgICBNb2RlbCA9IHNjaGVtYS5tb2RlbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1vZGVsKGRhdGEsIHtcbiAgICAgIGFubm90cyxcbiAgICAgIHJlc2V0LFxuICAgICAgcGFyZW50OiBbdGhpcywgbnVsbF0sXG4gICAgfSkgYXMgTTtcbiAgfVxuXG4gIHRvRW50aXRpZXMoe1xuICAgIGNsaWVudF9pZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgIGluY2x1ZGVfbm9uX2ZpZWxkID0gZmFsc2UsXG4gICAgY2hhbmdlc19vbmx5ID0gZmFsc2UsXG4gICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgIGNoYWluID0gW10sXG4gIH06IHtcbiAgICBjbGllbnRfaWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9rZXk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgIGNoYWluPzogKE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pW107XG4gIH0gPSB7fSk6IChUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pW10ge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoeyBtb2RlbCwgc3RhdGUgfSkgPT5cbiAgICAgICAgICBzdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQgJiYgY2hhaW4uZXZlcnkoKGMpID0+IGMgIT09IG1vZGVsKVxuICAgICAgKVxuICAgICAgLm1hcCgoeyBtb2RlbCwgc3RhdGUgfSkgPT4ge1xuICAgICAgICB2YXIgY2hhbmdlc09ubHkgPSBjaGFuZ2VzX29ubHkgJiYgc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZDtcbiAgICAgICAgcmV0dXJuIG1vZGVsLnRvRW50aXR5KHtcbiAgICAgICAgICBjbGllbnRfaWQsXG4gICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICAgICAgaW5jbHVkZV9jb21wdXRlZCxcbiAgICAgICAgICBpbmNsdWRlX2tleSxcbiAgICAgICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgICAgIGNoYW5nZXNfb25seTogY2hhbmdlc09ubHksXG4gICAgICAgICAgY2hhaW46IFt0aGlzLCAuLi5jaGFpbl0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9FbnRpdGllcygpO1xuICB9XG5cbiAgaGFzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9OiB7IGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2VudHJpZXMuc29tZSgoZSkgPT4gZS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCkgfHxcbiAgICAgIHRoaXMubW9kZWxzKCkuc29tZSgobSkgPT4gbS5oYXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pKVxuICAgICk7XG4gIH1cblxuICBjbG9uZTxDIGV4dGVuZHMgT0RhdGFDb2xsZWN0aW9uPFQsIE0+PigpIHtcbiAgICBsZXQgQ3RvciA9IDx0eXBlb2YgT0RhdGFDb2xsZWN0aW9uPnRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIG5ldyBDdG9yKHRoaXMudG9FbnRpdGllcyhJTkNMVURFX1NIQUxMT1cpLCB7XG4gICAgICByZXNvdXJjZTogdGhpcy5yZXNvdXJjZSgpLFxuICAgICAgYW5ub3RzOiB0aGlzLmFubm90cygpLFxuICAgIH0pIGFzIEM7XG4gIH1cblxuICBmZXRjaCh7XG4gICAgd2l0aENvdW50LFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ2ZldGNoOiBSZXNvdXJjZSBpcyB1bmRlZmluZWQnKTtcblxuICAgIGxldCBvYnMkOiBPYnNlcnZhYmxlPE9EYXRhRW50aXRpZXM8YW55Pj47XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkge1xuICAgICAgb2JzJCA9IHJlc291cmNlLmZldGNoKHsgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pO1xuICAgIH0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKSB7XG4gICAgICBvYnMkID0gcmVzb3VyY2UuZmV0Y2goe1xuICAgICAgICByZXNwb25zZVR5cGU6ICdlbnRpdGllcycsXG4gICAgICAgIHdpdGhDb3VudCxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYnMkID0gcmVzb3VyY2UuZmV0Y2goe1xuICAgICAgICByZXNwb25zZVR5cGU6ICdlbnRpdGllcycsXG4gICAgICAgIHdpdGhDb3VudCxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3JlcXVlc3QnLCB7IGNvbGxlY3Rpb246IHRoaXMsIHZhbHVlOiBvYnMkIH0pXG4gICAgKTtcbiAgICByZXR1cm4gb2JzJC5waXBlKFxuICAgICAgbWFwKCh7IGVudGl0aWVzLCBhbm5vdHMgfSkgPT4ge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90cztcbiAgICAgICAgdGhpcy5hc3NpZ24oZW50aXRpZXMgfHwgW10sIHsgcmVzZXQ6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3N5bmMnLCB7IGNvbGxlY3Rpb246IHRoaXMgfSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoQWxsKG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMpOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCdmZXRjaEFsbDogUmVzb3VyY2UgaXMgdW5kZWZpbmVkJyk7XG5cbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YVByb3BlcnR5UmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcignZmV0Y2hBbGw6IFJlc291cmNlIGlzIE9EYXRhUHJvcGVydHlSZXNvdXJjZScpO1xuXG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlLmZldGNoQWxsKG9wdGlvbnMpO1xuICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgncmVxdWVzdCcsIHtcbiAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgb3B0aW9uczogeyBvYnNlcnZhYmxlOiBvYnMkIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgoZW50aXRpZXMpID0+IHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBuZXcgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zKFxuICAgICAgICAgIHJlc291cmNlPy5hcGkub3B0aW9ucy5oZWxwZXJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hc3NpZ24oZW50aXRpZXMgfHwgW10sIHsgcmVzZXQ6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3N5bmMnLCB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgICAgb3B0aW9uczogeyBlbnRpdGllcyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYWxsIG1vZGVscyBpbiB0aGUgY29sbGVjdGlvblxuICAgKiBAcGFyYW0gcmVsTW9kZWwgVGhlIG1vZGVsIGlzIHJlbGF0aW9uc2hpcFxuICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gdXNlXG4gICAqIEBwYXJhbSBvcHRpb25zIEh0dHBPcHRpb25zXG4gICAqL1xuICBzYXZlKHtcbiAgICByZWxNb2RlbCA9IGZhbHNlLFxuICAgIG1ldGhvZCxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICByZWxNb2RlbD86IGJvb2xlYW47XG4gICAgbWV0aG9kPzogJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcignc2F2ZUFsbDogUmVzb3VyY2UgaXMgdW5kZWZpbmVkJyk7XG5cbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YVByb3BlcnR5UmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcignZmV0Y2hBbGw6IFJlc291cmNlIGlzIE9EYXRhUHJvcGVydHlSZXNvdXJjZScpO1xuXG4gICAgbGV0IHRvRGVzdHJveUVudGl0eTogTVtdID0gW107XG4gICAgbGV0IHRvUmVtb3ZlUmVmZXJlbmNlOiBNW10gPSBbXTtcbiAgICBsZXQgdG9EZXN0cm95Q29udGFpbmVkOiBNW10gPSBbXTtcbiAgICBsZXQgdG9DcmVhdGVFbnRpdHk6IE1bXSA9IFtdO1xuICAgIGxldCB0b0FkZFJlZmVyZW5jZTogTVtdID0gW107XG4gICAgbGV0IHRvQ3JlYXRlQ29udGFpbmVkOiBNW10gPSBbXTtcbiAgICBsZXQgdG9VcGRhdGVFbnRpdHk6IE1bXSA9IFtdO1xuICAgIGxldCB0b1VwZGF0ZUNvbnRhaW5lZDogTVtdID0gW107XG5cbiAgICB0aGlzLl9lbnRyaWVzLmZvckVhY2goKHsgbW9kZWwsIHN0YXRlIH0pID0+IHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgICAgaWYgKHJlbE1vZGVsKSB7XG4gICAgICAgICAgdG9EZXN0cm95RW50aXR5LnB1c2gobW9kZWwpO1xuICAgICAgICB9IGVsc2UgaWYgKCFtb2RlbC5pc05ldygpKSB7XG4gICAgICAgICAgdG9SZW1vdmVSZWZlcmVuY2UucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9EZXN0cm95Q29udGFpbmVkLnB1c2gobW9kZWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQWRkZWQpIHtcbiAgICAgICAgaWYgKHJlbE1vZGVsKSB7XG4gICAgICAgICAgdG9DcmVhdGVFbnRpdHkucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1vZGVsLmlzTmV3KCkpIHtcbiAgICAgICAgICB0b0FkZFJlZmVyZW5jZS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b0NyZWF0ZUNvbnRhaW5lZC5wdXNoKG1vZGVsKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChtb2RlbC5oYXNDaGFuZ2VkKCkpIHtcbiAgICAgICAgdG9VcGRhdGVFbnRpdHkucHVzaChtb2RlbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgdG9EZXN0cm95RW50aXR5Lmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvUmVtb3ZlUmVmZXJlbmNlLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvRGVzdHJveUNvbnRhaW5lZC5sZW5ndGggPiAwIHx8XG4gICAgICB0b0NyZWF0ZUVudGl0eS5sZW5ndGggPiAwIHx8XG4gICAgICB0b0FkZFJlZmVyZW5jZS5sZW5ndGggPiAwIHx8XG4gICAgICB0b0NyZWF0ZUNvbnRhaW5lZC5sZW5ndGggPiAwIHx8XG4gICAgICB0b1VwZGF0ZUVudGl0eS5sZW5ndGggPiAwIHx8XG4gICAgICB0b1VwZGF0ZUNvbnRhaW5lZC5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBjb25zdCBvYnMkID0gZm9ya0pvaW4oW1xuICAgICAgICAuLi50b0Rlc3Ryb3lFbnRpdHkubWFwKChtKSA9PiBtLmFzRW50aXR5KChlKSA9PiBlLmRlc3Ryb3kob3B0aW9ucykpKSxcbiAgICAgICAgLi4udG9SZW1vdmVSZWZlcmVuY2UubWFwKChtKSA9PiB0aGlzLnJlbW92ZVJlZmVyZW5jZShtLCBvcHRpb25zKSksXG4gICAgICAgIC4uLnRvRGVzdHJveUNvbnRhaW5lZC5tYXAoKG0pID0+IG0uZGVzdHJveShvcHRpb25zKSksXG4gICAgICAgIC4uLnRvQ3JlYXRlRW50aXR5Lm1hcCgobSkgPT5cbiAgICAgICAgICBtLmFzRW50aXR5KChlKSA9PiBlLnNhdmUoeyBtZXRob2Q6ICdjcmVhdGUnLCAuLi5vcHRpb25zIH0pKVxuICAgICAgICApLFxuICAgICAgICAuLi50b0FkZFJlZmVyZW5jZS5tYXAoKG0pID0+IHRoaXMuYWRkUmVmZXJlbmNlKG0sIG9wdGlvbnMpKSxcbiAgICAgICAgLi4udG9DcmVhdGVDb250YWluZWQubWFwKChtKSA9PlxuICAgICAgICAgIG0uc2F2ZSh7IG1ldGhvZDogJ2NyZWF0ZScsIC4uLm9wdGlvbnMgfSlcbiAgICAgICAgKSxcbiAgICAgICAgLi4udG9VcGRhdGVFbnRpdHkubWFwKChtKSA9PlxuICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUuc2F2ZSh7IG1ldGhvZCwgLi4ub3B0aW9ucyB9KSlcbiAgICAgICAgKSxcbiAgICAgICAgLi4udG9VcGRhdGVDb250YWluZWQubWFwKChtKSA9PiBtLnNhdmUoeyBtZXRob2QsIC4uLm9wdGlvbnMgfSkpLFxuICAgICAgXSk7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgncmVxdWVzdCcsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgb2JzZXJ2YWJsZTogb2JzJCB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZW50cmllcyA9IHRoaXMuX2VudHJpZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpXG4gICAgICAgICAgICAubWFwKChlbnRyeSkgPT4gKHsgLi4uZW50cnksIHN0YXRlOiBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkIH0pKTtcbiAgICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChuZXcgT0RhdGFNb2RlbEV2ZW50KCdzeW5jJywgeyBjb2xsZWN0aW9uOiB0aGlzIH0pKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVmZXJlbmNlKG1vZGVsOiBNLCBvcHRpb25zPzogT0RhdGFPcHRpb25zKTogT2JzZXJ2YWJsZTxNPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFtb2RlbC5pc05ldygpICYmIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSkge1xuICAgICAgcmV0dXJuIHJlc291cmNlXG4gICAgICAgIC5yZWZlcmVuY2UoKVxuICAgICAgICAuYWRkKFxuICAgICAgICAgIG1vZGVsLl9tZXRhLmVudGl0eVJlc291cmNlKG1vZGVsKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+LFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKVxuICAgICAgICAucGlwZShtYXAoKCkgPT4gbW9kZWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG9mKG1vZGVsKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZE1vZGVsKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBwb3NpdGlvbiA9IC0xLFxuICAgIH06IHtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBwb3NpdGlvbj86IG51bWJlcjtcbiAgICB9ID0ge31cbiAgKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga2V5ID0gbW9kZWwua2V5KCk7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KHtcbiAgICAgIG1vZGVsLFxuICAgICAga2V5LFxuICAgICAgY2lkOiAoPGFueT5tb2RlbClbdGhpcy5fbW9kZWwubWV0YS5jaWRdLFxuICAgIH0pO1xuICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5LnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCAmJiBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgRW50cnlcbiAgICBlbnRyeSA9IHtcbiAgICAgIHN0YXRlOiByZXNldCA/IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQgOiBPRGF0YU1vZGVsU3RhdGUuQWRkZWQsXG4gICAgICBtb2RlbCxcbiAgICAgIGtleTogbW9kZWwua2V5KCksXG4gICAgfTtcbiAgICAvLyBTZXQgUGFyZW50XG4gICAgaWYgKHJlcGFyZW50KSBtb2RlbC5fcGFyZW50ID0gW3RoaXMsIG51bGxdO1xuICAgIC8vIFN1YnNjcmliZVxuICAgIHRoaXMuX3N1YnNjcmliZShlbnRyeSk7XG4gICAgLy8gTm93IGFkZFxuICAgIGlmIChwb3NpdGlvbiA+PSAwKSB0aGlzLl9lbnRyaWVzLnNwbGljZShwb3NpdGlvbiwgMCwgZW50cnkpO1xuICAgIGVsc2UgdGhpcy5fZW50cmllcy5wdXNoKGVudHJ5KTtcblxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBtb2RlbC5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2FkZCcsIHsgbW9kZWwsIGNvbGxlY3Rpb246IHRoaXMgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeS5tb2RlbDtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIHBvc2l0aW9uID0gLTEsXG4gICAgfToge1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIHBvc2l0aW9uPzogbnVtYmVyO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICBpZiAocG9zaXRpb24gPCAwKSBwb3NpdGlvbiA9IHRoaXMuX2Jpc2VjdChtb2RlbCk7XG4gICAgY29uc3QgYWRkZWQgPSB0aGlzLl9hZGRNb2RlbChtb2RlbCwgeyBzaWxlbnQsIHJlc2V0LCBwb3NpdGlvbiwgcmVwYXJlbnQgfSk7XG4gICAgaWYgKCFzaWxlbnQgJiYgYWRkZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3VwZGF0ZScsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IFthZGRlZF0sIHJlbW92ZWQ6IFtdLCBtZXJnZWQ6IFtdIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFkZChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzZXJ2ZXIgPSB0cnVlLFxuICAgICAgcG9zaXRpb24gPSAtMSxcbiAgICB9OiB7XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgc2VydmVyPzogYm9vbGVhbjtcbiAgICAgIHBvc2l0aW9uPzogbnVtYmVyO1xuICAgIH0gPSB7fVxuICApOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBpZiAoc2VydmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRSZWZlcmVuY2UobW9kZWwpLnBpcGUoXG4gICAgICAgIG1hcCgobW9kZWwpID0+IHtcbiAgICAgICAgICB0aGlzLmFkZE1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcG9zaXRpb24sIHJlcGFyZW50LCByZXNldDogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkTW9kZWwobW9kZWwsIHsgc2lsZW50LCBwb3NpdGlvbiwgcmVwYXJlbnQgfSk7XG4gICAgICByZXR1cm4gb2YodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSZWZlcmVuY2UobW9kZWw6IE0sIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMpOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFtb2RlbC5pc05ldygpICYmIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSkge1xuICAgICAgbGV0IHRhcmdldCA9XG4gICAgICAgIHRoaXMuX21vZGVsLm1ldGEuYXBpLm9wdGlvbnMuZGVsZXRlUmVmQnkgPT09ICdpZCdcbiAgICAgICAgICA/IChtb2RlbC5fbWV0YS5lbnRpdHlSZXNvdXJjZShtb2RlbCkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPilcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLl9tb2RlbC5tZXRhLmFwaS5vcHRpb25zLmRlbGV0ZVJlZkJ5ID09PSAncGF0aCcpIHtcbiAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZS5rZXkobW9kZWwua2V5KCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc291cmNlXG4gICAgICAgIC5yZWZlcmVuY2UoKVxuICAgICAgICAucmVtb3ZlKHRhcmdldCwgb3B0aW9ucylcbiAgICAgICAgLnBpcGUobWFwKCgpID0+IG1vZGVsKSk7XG4gICAgfVxuICAgIHJldHVybiBvZihtb2RlbCk7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyByZXNldD86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsLmtleSgpO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7XG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIGNpZDogKDxhbnk+bW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSxcbiAgICB9KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBFdmVudFxuICAgIGlmICghc2lsZW50KVxuICAgICAgbW9kZWwuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdyZW1vdmUnLCB7IG1vZGVsLCBjb2xsZWN0aW9uOiB0aGlzIH0pXG4gICAgICApO1xuXG4gICAgLy8gTm93IHJlbW92ZVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKCEocmVzZXQgfHwgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCkpIHtcbiAgICAgIC8vIE1vdmUgdG8gZW5kIG9mIGFycmF5IGFuZCBtYXJrIGFzIHJlbW92ZWRcbiAgICAgIGVudHJ5LnN0YXRlID0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQ7XG4gICAgICB0aGlzLl9lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cbiAgICB0aGlzLl91bnN1YnNjcmliZShlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyByZXNldD86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLl9yZW1vdmVNb2RlbChtb2RlbCwgeyBzaWxlbnQsIHJlc2V0IH0pO1xuICAgIGlmICghc2lsZW50ICYmIHJlbW92ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3VwZGF0ZScsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IFtdLCByZW1vdmVkOiBbcmVtb3ZlZF0sIG1lcmdlZDogW10gfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgc2VydmVyID0gdHJ1ZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHNlcnZlcj86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZVJlZmVyZW5jZShtb2RlbCkucGlwZShcbiAgICAgICAgbWFwKChtb2RlbCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVtb3ZlTW9kZWwobW9kZWwsIHsgc2lsZW50LCByZXNldDogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlTW9kZWwobW9kZWwsIHsgc2lsZW50IH0pO1xuICAgICAgcmV0dXJuIG9mKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZShcbiAgICBhdHRyczogVCA9IHt9IGFzIFQsXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICBzZXJ2ZXIgPSB0cnVlLFxuICAgIH06IHsgc2lsZW50PzogYm9vbGVhbjsgc2VydmVyPzogYm9vbGVhbiB9ID0ge31cbiAgKSB7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsRmFjdG9yeShhdHRycyk7XG4gICAgcmV0dXJuIChtb2RlbC5pc1ZhbGlkKCkgJiYgc2VydmVyID8gbW9kZWwuc2F2ZSgpIDogb2YobW9kZWwpKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChtb2RlbCkgPT4gdGhpcy5hZGQobW9kZWwsIHsgc2lsZW50LCBzZXJ2ZXIgfSkpLFxuICAgICAgbWFwKCgpID0+IG1vZGVsKVxuICAgICk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nIHwgc3RyaW5nW10sIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBNb2RlbCA9IHRoaXMuX21vZGVsO1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9lbnRyaWVzW051bWJlcihwYXRoQXJyYXlbMF0pXS5tb2RlbDtcbiAgICAgIHJldHVybiBtb2RlbC5zZXQocGF0aEFycmF5LnNsaWNlKDEpLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAxICYmIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICBsZXQgdG9BZGQ6IE1bXSA9IFtdO1xuICAgICAgbGV0IHRvTWVyZ2U6IE1bXSA9IFtdO1xuICAgICAgbGV0IHRvUmVtb3ZlOiBNW10gPSBbXTtcbiAgICAgIGxldCBpbmRleCA9IE51bWJlcihwYXRoQXJyYXlbMF0pO1xuICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVscygpW2luZGV4XTtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KHsgbW9kZWwgfSk7XG4gICAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvL1RPRE86IFJlbW92ZS9BZGQgb3IgTWVyZ2U/XG4gICAgICAgIC8vIE1lcmdlXG4gICAgICAgIGVudHJ5Lm1vZGVsLmFzc2lnbihcbiAgICAgICAgICB2YWx1ZS50b0VudGl0eSh7IGNsaWVudF9pZDogdHJ1ZSwgLi4uSU5DTFVERV9ERUVQIH0pXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlbnRyeS5tb2RlbC5oYXNDaGFuZ2VkKCkpIHRvTWVyZ2UucHVzaChtb2RlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBZGRcbiAgICAgICAgdGhpcy5fYWRkTW9kZWwodmFsdWUsIHsgcmVwYXJlbnQ6IHRydWUgfSk7XG4gICAgICAgIHRvQWRkLnB1c2gobW9kZWwpO1xuICAgICAgfVxuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3VwZGF0ZScsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IHRvQWRkLCByZW1vdmVkOiB0b1JlbW92ZSwgbWVyZ2VkOiB0b01lcmdlIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldChwYXRoOiBudW1iZXIpOiBNIHwgdW5kZWZpbmVkO1xuICBnZXQocGF0aDogc3RyaW5nIHwgc3RyaW5nW10pOiBhbnk7XG4gIGdldChwYXRoOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IE1vZGVsID0gdGhpcy5fbW9kZWw7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiBgJHtwYXRofWAubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubW9kZWxzKClbTnVtYmVyKHBhdGhBcnJheVswXSldO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLmdldChwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXNldCh7XG4gICAgcGF0aCxcbiAgICBzaWxlbnQgPSBmYWxzZSxcbiAgfTogeyBwYXRoPzogc3RyaW5nIHwgc3RyaW5nW107IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgaWYgKFR5cGVzLmlzRW1wdHkocGF0aCkpIHtcbiAgICAgIHRoaXMubW9kZWxzKCkuZm9yRWFjaCgobSkgPT4gbS5yZXNldCh7IHNpbGVudCB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IE1vZGVsID0gdGhpcy5fbW9kZWw7XG4gICAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogYCR7cGF0aH1gLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICAgKSBhcyBhbnlbXTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tb2RlbHMoKVtOdW1iZXIocGF0aEFycmF5WzBdKV07XG4gICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUucmVzZXQoeyBwYXRoOiBwYXRoQXJyYXkuc2xpY2UoMSksIHNpbGVudCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3NpZ24oXG4gICAgb2JqZWN0czogUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSB8IE1bXSxcbiAgICB7XG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgIH06IHsgcmVzZXQ/OiBib29sZWFuOyByZXBhcmVudD86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIGNvbnN0IE1vZGVsID0gdGhpcy5fbW9kZWw7XG5cbiAgICBsZXQgdG9BZGQ6IE1bXSA9IFtdO1xuICAgIGxldCB0b01lcmdlOiBNW10gPSBbXTtcbiAgICBsZXQgdG9SZW1vdmU6IE1bXSA9IFtdO1xuICAgIGxldCB0b1NvcnQ6IFtNLCBudW1iZXJdW10gPSBbXTtcbiAgICBsZXQgbW9kZWxNYXA6IHN0cmluZ1tdID0gW107XG4gICAgb2JqZWN0cy5mb3JFYWNoKChvYmosIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpc01vZGVsID0gT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChvYmopO1xuICAgICAgY29uc3Qga2V5ID1cbiAgICAgICAgTW9kZWwgIT09IG51bGwgJiYgTW9kZWwubWV0YSA/IE1vZGVsLm1ldGEucmVzb2x2ZUtleShvYmopIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgY2lkID1cbiAgICAgICAgTW9kZWwubWV0YS5jaWQgaW4gb2JqID8gKDxhbnk+b2JqKVtNb2RlbC5tZXRhLmNpZF0gOiB1bmRlZmluZWQ7XG4gICAgICAvLyBUcnkgZmluZCBlbnRyeVxuICAgICAgY29uc3QgZW50cnkgPSBpc01vZGVsXG4gICAgICAgID8gdGhpcy5fZmluZEVudHJ5KHsgbW9kZWw6IG9iaiBhcyBNIH0pIC8vIEJ5IE1vZGVsXG4gICAgICAgIDogdGhpcy5fZmluZEVudHJ5KHsgY2lkLCBrZXkgfSk7IC8vIEJ5IENpZCBvciBLZXlcblxuICAgICAgbGV0IG1vZGVsOiBNO1xuICAgICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTWVyZ2VcbiAgICAgICAgbW9kZWwgPSBlbnRyeS5tb2RlbDtcbiAgICAgICAgaWYgKG1vZGVsICE9PSBvYmopIHtcbiAgICAgICAgICAvLyBHZXQgZW50aXR5IGZyb20gbW9kZWxcbiAgICAgICAgICBpZiAoaXNNb2RlbCkge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gKG9iaiBhcyBNKS50b0VudGl0eSh7XG4gICAgICAgICAgICAgIGNsaWVudF9pZDogdHJ1ZSxcbiAgICAgICAgICAgICAgLi4uSU5DTFVERV9ERUVQLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtb2RlbC5hc3NpZ24oZW50aXR5LCB7IHJlc2V0LCBzaWxlbnQgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGhlbHBlciA9IHRoaXMuX2Fubm90YXRpb25zLmhlbHBlcjtcbiAgICAgICAgICAgIGNvbnN0IGFubm90cyA9IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zKFxuICAgICAgICAgICAgICBoZWxwZXIsXG4gICAgICAgICAgICAgIGhlbHBlci5hbm5vdGF0aW9ucyhvYmopIHx8IHt9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gYW5ub3RzLmF0dHJpYnV0ZXM8VD4ob2JqLCAnZnVsbCcpO1xuICAgICAgICAgICAgbW9kZWwuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgICAgICAgbW9kZWwuYXNzaWduKGVudGl0eSwgeyByZXNldCwgc2lsZW50IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBNb2RlbCBDaGFuZ2U/XG4gICAgICAgICAgaWYgKG1vZGVsLmhhc0NoYW5nZWQoKSkgdG9NZXJnZS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBIYXMgU29ydCBvciBJbmRleCBDaGFuZ2U/XG4gICAgICAgIGlmICh0b1NvcnQubGVuZ3RoID4gMCB8fCBpbmRleCAhPT0gdGhpcy5tb2RlbHMoKS5pbmRleE9mKG1vZGVsKSkge1xuICAgICAgICAgIHRvU29ydC5wdXNoKFttb2RlbCwgaW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWRkXG4gICAgICAgIG1vZGVsID0gaXNNb2RlbFxuICAgICAgICAgID8gKG9iaiBhcyBNKVxuICAgICAgICAgIDogdGhpcy5tb2RlbEZhY3Rvcnkob2JqIGFzIFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSwge1xuICAgICAgICAgICAgICByZXNldCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0b0FkZC5wdXNoKG1vZGVsKTtcbiAgICAgIH1cbiAgICAgIG1vZGVsTWFwLnB1c2goKDxhbnk+bW9kZWwpW01vZGVsLm1ldGEuY2lkXSk7XG4gICAgfSk7XG4gICAgdGhpcy5fZW50cmllc1xuICAgICAgLmZpbHRlcigoZSkgPT4gbW9kZWxNYXAuaW5kZXhPZigoPGFueT5lLm1vZGVsKVtNb2RlbC5tZXRhLmNpZF0pID09PSAtMSlcbiAgICAgIC5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICB0b1JlbW92ZS5wdXNoKGVudHJ5Lm1vZGVsKTtcbiAgICAgIH0pO1xuXG4gICAgdG9SZW1vdmUuZm9yRWFjaCgobSkgPT4ge1xuICAgICAgdGhpcy5fcmVtb3ZlTW9kZWwobSwgeyBzaWxlbnQsIHJlc2V0IH0pO1xuICAgIH0pO1xuICAgIHRvQWRkLmZvckVhY2goKG0pID0+IHtcbiAgICAgIHRoaXMuX2FkZE1vZGVsKG0sIHsgc2lsZW50LCByZXNldCwgcmVwYXJlbnQgfSk7XG4gICAgfSk7XG4gICAgdG9Tb3J0LmZvckVhY2goKG0pID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG1bMF0sIHsgc2lsZW50OiB0cnVlLCByZXNldCB9KTtcbiAgICAgIHRoaXMuX2FkZE1vZGVsKG1bMF0sIHsgc2lsZW50OiB0cnVlLCByZXNldCwgcG9zaXRpb246IG1bMV0sIHJlcGFyZW50IH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgKCFzaWxlbnQgJiZcbiAgICAgICAgKHRvQWRkLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICB0b1JlbW92ZS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgdG9NZXJnZS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgdG9Tb3J0Lmxlbmd0aCA+IDApKSB8fFxuICAgICAgcmVzZXRcbiAgICApIHtcbiAgICAgIHRoaXMuX3NvcnRCeSA9IG51bGw7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChyZXNldCA/ICdyZXNldCcgOiAndXBkYXRlJywge1xuICAgICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgYWRkZWQ6IHRvQWRkLFxuICAgICAgICAgICAgcmVtb3ZlZDogdG9SZW1vdmUsXG4gICAgICAgICAgICBtZXJnZWQ6IHRvTWVyZ2UsXG4gICAgICAgICAgICBzb3J0ZWQ6IHRvU29ydCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBxdWVyeShmdW5jOiAocTogT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyPFQ+KSA9PiB2b2lkKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgcmVzb3VyY2UucXVlcnkoZnVuYyk7XG4gICAgdGhpcy5hdHRhY2gocmVzb3VyY2UpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY2FsbEZ1bmN0aW9uPFAsIFI+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHJlc3BvbnNlVHlwZTogJ3Byb3BlcnR5JyB8ICdtb2RlbCcgfCAnY29sbGVjdGlvbicgfCAnbm9uZScsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnM8Uj4gPSB7fVxuICApOiBPYnNlcnZhYmxlPFIgfCBPRGF0YU1vZGVsPFI+IHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UpIHtcbiAgICAgIGNvbnN0IGZ1bmMgPSByZXNvdXJjZS5mdW5jdGlvbjxQLCBSPihuYW1lKTtcbiAgICAgIGZ1bmMucXVlcnkoKHEpID0+IHEuYXBwbHkob3B0aW9ucykpO1xuICAgICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGxQcm9wZXJ0eShwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlLCAuLi5vcHRpb25zIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhyb3dFcnJvcihgQ2FuJ3QgZnVuY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVNldFJlc291cmNlYCk7XG4gIH1cblxuICBjYWxsQWN0aW9uPFAsIFI+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHJlc3BvbnNlVHlwZTogJ3Byb3BlcnR5JyB8ICdtb2RlbCcgfCAnY29sbGVjdGlvbicgfCAnbm9uZScsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnM8Uj4gPSB7fVxuICApOiBPYnNlcnZhYmxlPFIgfCBPRGF0YU1vZGVsPFI+IHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHJlc291cmNlLmFjdGlvbjxQLCBSPihuYW1lKTtcbiAgICAgIGFjdGlvbi5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICAgIHJldHVybiBhY3Rpb24uY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBhY3Rpb24uY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRocm93RXJyb3IoYENhbid0IGFjdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5U2V0UmVzb3VyY2VgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Vuc3Vic2NyaWJlKGVudHJ5OiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pIHtcbiAgICBpZiAoZW50cnkuc3Vic2NyaXB0aW9uKSB7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIGRlbGV0ZSBlbnRyeS5zdWJzY3JpcHRpb247XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3Vic2NyaWJlKGVudHJ5OiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pIHtcbiAgICBpZiAoZW50cnkuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1YnNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cycpO1xuICAgIH1cbiAgICBlbnRyeS5zdWJzY3JpcHRpb24gPSBlbnRyeS5tb2RlbC5ldmVudHMkLnN1YnNjcmliZShcbiAgICAgIChldmVudDogT0RhdGFNb2RlbEV2ZW50PFQ+KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBCVUJCTElORy5pbmRleE9mKGV2ZW50Lm5hbWUpICE9PSAtMSAmJlxuICAgICAgICAgIGV2ZW50LmJ1YmJsaW5nICYmXG4gICAgICAgICAgIWV2ZW50LnZpc2l0ZWQodGhpcylcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGV2ZW50Lm1vZGVsID09PSBlbnRyeS5tb2RlbCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50Lm5hbWUgPT09ICdkZXN0cm95Jykge1xuICAgICAgICAgICAgICB0aGlzLnJlbW92ZU1vZGVsKGVudHJ5Lm1vZGVsLCB7IHJlc2V0OiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5uYW1lID09PSAnY2hhbmdlJyAmJiBldmVudC5vcHRpb25zPy5rZXkpIHtcbiAgICAgICAgICAgICAgZW50cnkua2V5ID0gZW50cnkubW9kZWwua2V5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1vZGVscygpLmluZGV4T2YoZW50cnkubW9kZWwpO1xuICAgICAgICAgIGV2ZW50LnB1c2godGhpcywgaW5kZXgpO1xuICAgICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9maW5kRW50cnkoe1xuICAgIG1vZGVsLFxuICAgIGNpZCxcbiAgICBrZXksXG4gIH06IHtcbiAgICBtb2RlbD86IE9EYXRhTW9kZWw8VD47XG4gICAgY2lkPzogc3RyaW5nO1xuICAgIGtleT86IEVudGl0eUtleTxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllcy5maW5kKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgYnlNb2RlbCA9IG1vZGVsICE9PSB1bmRlZmluZWQgJiYgZW50cnkubW9kZWwuZXF1YWxzKG1vZGVsKTtcbiAgICAgIGNvbnN0IGJ5Q2lkID1cbiAgICAgICAgY2lkICE9PSB1bmRlZmluZWQgJiYgKDxhbnk+ZW50cnkubW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSA9PT0gY2lkO1xuICAgICAgY29uc3QgYnlLZXkgPVxuICAgICAgICBrZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBlbnRyeS5rZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBUeXBlcy5pc0VxdWFsKGVudHJ5LmtleSwga2V5KTtcbiAgICAgIHJldHVybiBieU1vZGVsIHx8IGJ5Q2lkIHx8IGJ5S2V5O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQ29sbGVjdGlvbiBmdW5jdGlvbnNcbiAgZXF1YWxzKG90aGVyOiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4pIHtcbiAgICByZXR1cm4gdGhpcyA9PT0gb3RoZXI7XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdDb2xsZWN0aW9uJztcbiAgfVxuXG4gIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICBsZXQgcG9pbnRlciA9IDA7XG4gICAgbGV0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQoKTogSXRlcmF0b3JSZXN1bHQ8TT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRvbmU6IHBvaW50ZXIgPT09IG1vZGVscy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWU6IG1vZGVsc1twb2ludGVyKytdLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZmlsdGVyKHByZWRpY2F0ZTogKG06IE0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBNW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgZmluZChwcmVkaWNhdGU6IChtOiBNLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuZmluZChwcmVkaWNhdGUpO1xuICB9XG5cbiAgZmlyc3QoKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKClbMF07XG4gIH1cblxuICBsYXN0KCk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgcmV0dXJuIG1vZGVsc1ttb2RlbHMubGVuZ3RoIC0gMV07XG4gIH1cblxuICBuZXh0KG1vZGVsOiBNKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgIGlmIChpbmRleCA9PT0gLTEgfHwgaW5kZXggPT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGluZGV4ICsgMSk7XG4gIH1cblxuICBwcmV2KG1vZGVsOiBNKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgIGlmIChpbmRleCA8PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXQoaW5kZXggLSAxKTtcbiAgfVxuXG4gIGV2ZXJ5KHByZWRpY2F0ZTogKG06IE0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5ldmVyeShwcmVkaWNhdGUpO1xuICB9XG5cbiAgc29tZShwcmVkaWNhdGU6IChtOiBNLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuc29tZShwcmVkaWNhdGUpO1xuICB9XG5cbiAgY29udGFpbnMobW9kZWw6IE0pIHtcbiAgICByZXR1cm4gdGhpcy5zb21lKChtKSA9PiBtLmVxdWFscyhtb2RlbCkpO1xuICB9XG5cbiAgaW5kZXhPZihtb2RlbDogTSk6IG51bWJlciB7XG4gICAgY29uc3QgbW9kZWxzID0gdGhpcy5tb2RlbHMoKTtcbiAgICBjb25zdCBtID0gbW9kZWxzLmZpbmQoKG0pID0+IG0uZXF1YWxzKG1vZGVsKSk7XG4gICAgcmV0dXJuIG0gPT09IHVuZGVmaW5lZCA/IC0xIDogbW9kZWxzLmluZGV4T2YobSk7XG4gIH1cblxuICAvLyNyZWdpb24gU29ydFxuICBwcml2YXRlIF9iaXNlY3QobW9kZWw6IE0pIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBpZiAodGhpcy5fc29ydEJ5ICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9lbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBpZiAodGhpcy5fY29tcGFyZShtb2RlbCwgdGhpcy5fZW50cmllc1tpbmRleF0sIHRoaXMuX3NvcnRCeSwgMCkgPCAwKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBhcmUoXG4gICAgZTE6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiB8IE0sXG4gICAgZTI6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiB8IE0sXG4gICAgYnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSxcbiAgICBpbmRleDogbnVtYmVyXG4gICk6IG51bWJlciB7XG4gICAgbGV0IG0xID0gT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChlMSlcbiAgICAgID8gKGUxIGFzIE0pXG4gICAgICA6IChlMSBhcyBPRGF0YU1vZGVsRW50cnk8VCwgTT4pLm1vZGVsO1xuICAgIGxldCBtMiA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoZTIpXG4gICAgICA/IChlMiBhcyBNKVxuICAgICAgOiAoZTIgYXMgT0RhdGFNb2RlbEVudHJ5PFQsIE0+KS5tb2RlbDtcbiAgICBsZXQgdmFsdWUxID0gbTEuZ2V0KGJ5W2luZGV4XS5maWVsZCBhcyBzdHJpbmcpO1xuICAgIGxldCB2YWx1ZTIgPSBtMi5nZXQoYnlbaW5kZXhdLmZpZWxkIGFzIHN0cmluZyk7XG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gMDtcblxuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgIT0gbnVsbCkgcmVzdWx0ID0gLTE7XG4gICAgZWxzZSBpZiAodmFsdWUxICE9IG51bGwgJiYgdmFsdWUyID09IG51bGwpIHJlc3VsdCA9IDE7XG4gICAgZWxzZSBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyID09IG51bGwpIHJlc3VsdCA9IDA7XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlMSA9PSAnc3RyaW5nJyB8fCB2YWx1ZTEgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgIGlmICh2YWx1ZTEubG9jYWxlQ29tcGFyZSAmJiB2YWx1ZTEgIT0gdmFsdWUyKSB7XG4gICAgICAgIHJldHVybiAoYnlbaW5kZXhdLm9yZGVyIHx8IDEpICogdmFsdWUxLmxvY2FsZUNvbXBhcmUodmFsdWUyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdmFsdWUxIDwgdmFsdWUyID8gLTEgOiAxO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZTEgPT0gdmFsdWUyKSB7XG4gICAgICByZXR1cm4gYnkubGVuZ3RoIC0gMSA+IGluZGV4ID8gdGhpcy5fY29tcGFyZShlMSwgZTIsIGJ5LCBpbmRleCArIDEpIDogMDtcbiAgICB9XG5cbiAgICByZXR1cm4gKGJ5W2luZGV4XS5vcmRlciB8fCAxKSAqIHJlc3VsdDtcbiAgfVxuXG4gIF9zb3J0Qnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSB8IG51bGwgPSBudWxsO1xuICBpc1NvcnRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydEJ5ICE9PSBudWxsO1xuICB9XG5cbiAgc29ydChcbiAgICBieTogeyBmaWVsZDogc3RyaW5nIHwga2V5b2YgVDsgb3JkZXI/OiAxIHwgLTEgfVtdLFxuICAgIHsgc2lsZW50IH06IHsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5fc29ydEJ5ID0gYnk7XG4gICAgdGhpcy5fZW50cmllcyA9IHRoaXMuX2VudHJpZXMuc29ydChcbiAgICAgIChlMTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+LCBlMjogT0RhdGFNb2RlbEVudHJ5PFQsIE0+KSA9PlxuICAgICAgICB0aGlzLl9jb21wYXJlKGUxLCBlMiwgYnksIDApXG4gICAgKTtcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3VwZGF0ZScsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG4iXX0=