angular-odata 0.122.0 → 0.124.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.
- package/esm2022/lib/api.mjs +373 -0
- package/esm2022/lib/cache/cache.mjs +175 -0
- package/{esm2020 → esm2022}/lib/cache/storage.mjs +1 -1
- package/esm2022/lib/client.mjs +252 -0
- package/{esm2020 → esm2022}/lib/helper.mjs +1 -1
- package/{esm2020 → esm2022}/lib/loaders.mjs +1 -1
- package/esm2022/lib/models/collection.mjs +865 -0
- package/esm2022/lib/models/model.mjs +535 -0
- package/esm2022/lib/models/options.mjs +1117 -0
- package/{esm2020 → esm2022}/lib/module.mjs +5 -5
- package/esm2022/lib/resources/path/segments.mjs +124 -0
- package/esm2022/lib/resources/query/builder.mjs +624 -0
- package/esm2022/lib/resources/query/expressions/base.mjs +20 -0
- package/esm2022/lib/resources/query/expressions/compute.mjs +39 -0
- package/esm2022/lib/resources/query/expressions/count.mjs +99 -0
- package/esm2022/lib/resources/query/expressions/expand.mjs +125 -0
- package/esm2022/lib/resources/query/expressions/filter.mjs +161 -0
- package/esm2022/lib/resources/query/expressions/orderby.mjs +56 -0
- package/esm2022/lib/resources/query/expressions/search.mjs +122 -0
- package/esm2022/lib/resources/query/expressions/select.mjs +31 -0
- package/esm2022/lib/resources/query/expressions/syntax.mjs +444 -0
- package/{esm2020 → esm2022}/lib/resources/query/handlers.mjs +1 -1
- package/esm2022/lib/resources/query/options.mjs +115 -0
- package/{esm2020 → esm2022}/lib/resources/request.mjs +1 -1
- package/esm2022/lib/resources/resource.mjs +257 -0
- package/{esm2020 → esm2022}/lib/resources/responses/annotations.mjs +1 -1
- package/esm2022/lib/resources/responses/csdl/csdl-annotation.mjs +33 -0
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-entity-container.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-entity-set.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-enum-type.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-function-action.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-reference.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-schema.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-singleton.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-structural-property.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-structured-type.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-type-definition.mjs +1 -1
- package/esm2022/lib/resources/responses/metadata.mjs +547 -0
- package/{esm2020 → esm2022}/lib/resources/responses/response.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/action.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/batch.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/count.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/entity-set.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/entity.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/function.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/media.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/navigation-property.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/property.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/reference.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/singleton.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/value.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/annotation.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/callable.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/element.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/entity-container.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/enum-type.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/parsers/callable.mjs +1 -1
- package/esm2022/lib/schema/parsers/edm.mjs +99 -0
- package/{esm2020 → esm2022}/lib/schema/parsers/enum-type.mjs +2 -2
- package/esm2022/lib/schema/parsers/structured-type.mjs +502 -0
- package/{esm2020 → esm2022}/lib/schema/schema.mjs +1 -1
- package/esm2022/lib/schema/structured-type.mjs +207 -0
- package/esm2022/lib/services/base.mjs +29 -0
- package/{esm2020 → esm2022}/lib/services/entity-set.mjs +1 -1
- package/{esm2020 → esm2022}/lib/services/factory.mjs +4 -4
- package/{esm2020 → esm2022}/lib/services/singleton.mjs +1 -1
- package/{esm2020 → esm2022}/lib/settings.mjs +1 -1
- package/{esm2020 → esm2022}/lib/types.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/arrays.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/durations.mjs +1 -1
- package/esm2022/lib/utils/enums.mjs +61 -0
- package/{esm2020 → esm2022}/lib/utils/http.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/objects.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/odata.mjs +1 -1
- package/esm2022/lib/utils/types.mjs +136 -0
- package/{fesm2020 → fesm2022}/angular-odata.mjs +544 -373
- package/fesm2022/angular-odata.mjs.map +1 -0
- package/lib/helper.d.ts +1 -1
- package/lib/models/model.d.ts +4 -2
- package/lib/models/options.d.ts +7 -8
- package/lib/resources/path/segments.d.ts +15 -6
- package/lib/resources/query/builder.d.ts +21 -20
- package/lib/resources/query/expressions/base.d.ts +6 -4
- package/lib/resources/query/expressions/compute.d.ts +10 -8
- package/lib/resources/query/expressions/count.d.ts +14 -11
- package/lib/resources/query/expressions/expand.d.ts +23 -19
- package/lib/resources/query/expressions/filter.d.ts +22 -20
- package/lib/resources/query/expressions/orderby.d.ts +12 -9
- package/lib/resources/query/expressions/search.d.ts +12 -9
- package/lib/resources/query/expressions/select.d.ts +9 -7
- package/lib/resources/query/expressions/syntax.d.ts +75 -71
- package/lib/resources/query/handlers.d.ts +2 -2
- package/lib/resources/query/options.d.ts +15 -6
- package/lib/resources/resource.d.ts +2 -2
- package/lib/resources/responses/types.d.ts +3 -3
- package/lib/resources/types/options.d.ts +7 -7
- package/lib/schema/parsers/structured-type.d.ts +8 -5
- package/lib/schema/structured-type.d.ts +2 -1
- package/lib/types.d.ts +15 -15
- package/lib/utils/durations.d.ts +1 -1
- package/lib/utils/enums.d.ts +3 -0
- package/lib/utils/types.d.ts +1 -0
- package/package.json +9 -15
- package/esm2020/lib/api.mjs +0 -373
- package/esm2020/lib/cache/cache.mjs +0 -173
- package/esm2020/lib/client.mjs +0 -252
- package/esm2020/lib/models/collection.mjs +0 -861
- package/esm2020/lib/models/model.mjs +0 -507
- package/esm2020/lib/models/options.mjs +0 -1110
- package/esm2020/lib/resources/path/segments.mjs +0 -124
- package/esm2020/lib/resources/query/builder.mjs +0 -588
- package/esm2020/lib/resources/query/expressions/base.mjs +0 -20
- package/esm2020/lib/resources/query/expressions/compute.mjs +0 -39
- package/esm2020/lib/resources/query/expressions/count.mjs +0 -89
- package/esm2020/lib/resources/query/expressions/expand.mjs +0 -115
- package/esm2020/lib/resources/query/expressions/filter.mjs +0 -161
- package/esm2020/lib/resources/query/expressions/orderby.mjs +0 -56
- package/esm2020/lib/resources/query/expressions/search.mjs +0 -122
- package/esm2020/lib/resources/query/expressions/select.mjs +0 -31
- package/esm2020/lib/resources/query/expressions/syntax.mjs +0 -409
- package/esm2020/lib/resources/query/options.mjs +0 -115
- package/esm2020/lib/resources/resource.mjs +0 -251
- package/esm2020/lib/resources/responses/csdl/csdl-annotation.mjs +0 -33
- package/esm2020/lib/resources/responses/metadata.mjs +0 -547
- package/esm2020/lib/schema/parsers/edm.mjs +0 -104
- package/esm2020/lib/schema/parsers/structured-type.mjs +0 -490
- package/esm2020/lib/schema/structured-type.mjs +0 -202
- package/esm2020/lib/services/base.mjs +0 -29
- package/esm2020/lib/utils/enums.mjs +0 -45
- package/esm2020/lib/utils/types.mjs +0 -133
- package/fesm2015/angular-odata.mjs +0 -11811
- package/fesm2015/angular-odata.mjs.map +0 -1
- package/fesm2020/angular-odata.mjs.map +0 -1
- /package/{esm2020 → esm2022}/angular-odata.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/cache/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/cache/memory.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/constants.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/path/handlers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/path/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/query/expressions/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/query/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/types.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/metadata.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/entity-set.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/parsers/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/entity.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/arraybuffers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/dates.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/strings.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/urls.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
package/esm2020/lib/api.mjs
DELETED
|
@@ -1,373 +0,0 @@
|
|
|
1
|
-
import { HttpEventType } from '@angular/common/http';
|
|
2
|
-
import { NEVER } from 'rxjs';
|
|
3
|
-
import { catchError, map } from 'rxjs/operators';
|
|
4
|
-
import { ODataInMemoryCache } from './cache/index';
|
|
5
|
-
import { DEFAULT_VERSION } from './constants';
|
|
6
|
-
import { ODataCollection, ODataModel } from './models/index';
|
|
7
|
-
import { ODataApiOptions } from './options';
|
|
8
|
-
import { ODataActionResource, ODataBatchResource, ODataEntityResource, ODataEntitySetResource, ODataFunctionResource, ODataMetadataResource, ODataNavigationPropertyResource, ODataPathSegments, ODataQueryOptions, ODataRequest, ODataResponse, ODataSingletonResource, } from './resources/index';
|
|
9
|
-
import { EDM_PARSERS, ODataSchema, } from './schema';
|
|
10
|
-
import { NONE_PARSER, PathSegment, } from './types';
|
|
11
|
-
/**
|
|
12
|
-
* Api abstraction for consuming OData services.
|
|
13
|
-
*/
|
|
14
|
-
export class ODataApi {
|
|
15
|
-
constructor(config) {
|
|
16
|
-
//# region Find by Type
|
|
17
|
-
// Memoize
|
|
18
|
-
this.memo = {
|
|
19
|
-
forType: {
|
|
20
|
-
enum: new Map(),
|
|
21
|
-
structured: new Map(),
|
|
22
|
-
callable: new Map(),
|
|
23
|
-
entitySet: new Map(),
|
|
24
|
-
parser: new Map(),
|
|
25
|
-
options: new Map(),
|
|
26
|
-
},
|
|
27
|
-
byName: {
|
|
28
|
-
enum: new Map(),
|
|
29
|
-
structured: new Map(),
|
|
30
|
-
callable: new Map(),
|
|
31
|
-
entitySet: new Map(),
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
this.serviceRootUrl = config.serviceRootUrl;
|
|
35
|
-
if (this.serviceRootUrl.indexOf('?') != -1)
|
|
36
|
-
throw new Error("The 'serviceRootUrl' should not contain query string. Please use 'params' to add extra parameters");
|
|
37
|
-
if (!this.serviceRootUrl.endsWith('/'))
|
|
38
|
-
this.serviceRootUrl += '/';
|
|
39
|
-
this.metadataUrl = `${this.serviceRootUrl}$metadata`;
|
|
40
|
-
this.name = config.name;
|
|
41
|
-
this.version = config.version || DEFAULT_VERSION;
|
|
42
|
-
this.default = config.default || false;
|
|
43
|
-
this.creation = config.creation || new Date();
|
|
44
|
-
this.options = new ODataApiOptions(Object.assign({ version: this.version }, config.options || {}));
|
|
45
|
-
this.cache = config.cache || new ODataInMemoryCache();
|
|
46
|
-
this.errorHandler = config.errorHandler;
|
|
47
|
-
this.parsers = new Map(Object.entries(config.parsers || EDM_PARSERS));
|
|
48
|
-
this.schemas = (config.schemas || []).map((schema) => new ODataSchema(schema, this));
|
|
49
|
-
}
|
|
50
|
-
configure(settings = {}) {
|
|
51
|
-
this.requester = settings.requester;
|
|
52
|
-
this.schemas.forEach((schema) => {
|
|
53
|
-
schema.configure({
|
|
54
|
-
options: this.options.parserOptions,
|
|
55
|
-
parserForType: (type) => this.parserForType(type),
|
|
56
|
-
findOptionsForType: (type) => this.findOptionsForType(type),
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
fromJSON(json) {
|
|
61
|
-
const segments = new ODataPathSegments(json.segments);
|
|
62
|
-
const query = new ODataQueryOptions(json.options);
|
|
63
|
-
switch (segments.last()?.name) {
|
|
64
|
-
case PathSegment.entitySet:
|
|
65
|
-
if (segments.last()?.hasKey()) {
|
|
66
|
-
return new ODataEntityResource(this, { segments, query });
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
return new ODataEntitySetResource(this, { segments, query });
|
|
70
|
-
}
|
|
71
|
-
case PathSegment.navigationProperty:
|
|
72
|
-
return new ODataNavigationPropertyResource(this, { segments, query });
|
|
73
|
-
case PathSegment.singleton:
|
|
74
|
-
return new ODataSingletonResource(this, { segments, query });
|
|
75
|
-
case PathSegment.action:
|
|
76
|
-
return new ODataActionResource(this, { segments, query });
|
|
77
|
-
case PathSegment.function:
|
|
78
|
-
return new ODataFunctionResource(this, { segments, query });
|
|
79
|
-
}
|
|
80
|
-
throw new Error('No Resource for json');
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Build a metadata resource.
|
|
84
|
-
* @returns ODataMetadataResource
|
|
85
|
-
*/
|
|
86
|
-
metadata() {
|
|
87
|
-
return ODataMetadataResource.factory(this);
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Build a batch resource.
|
|
91
|
-
* @returns ODataBatchResource
|
|
92
|
-
*/
|
|
93
|
-
batch() {
|
|
94
|
-
return ODataBatchResource.factory(this);
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Build a singleton resource.
|
|
98
|
-
* @param path Name of the singleton
|
|
99
|
-
* @returns
|
|
100
|
-
*/
|
|
101
|
-
singleton(path) {
|
|
102
|
-
const entitySet = this.findEntitySetByName(path);
|
|
103
|
-
const schema = entitySet !== undefined
|
|
104
|
-
? this.findStructuredTypeForType(entitySet.entityType)
|
|
105
|
-
: undefined;
|
|
106
|
-
return ODataSingletonResource.factory(this, { path, schema });
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Build an entity set resource.
|
|
110
|
-
* @param path Name of the entity set
|
|
111
|
-
* @returns
|
|
112
|
-
*/
|
|
113
|
-
entitySet(path) {
|
|
114
|
-
const entitySet = this.findEntitySetByName(path);
|
|
115
|
-
const schema = entitySet !== undefined
|
|
116
|
-
? this.findStructuredTypeForType(entitySet.entityType)
|
|
117
|
-
: undefined;
|
|
118
|
-
return ODataEntitySetResource.factory(this, { path, schema });
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Unbound Action
|
|
122
|
-
* @param {string} path?
|
|
123
|
-
* @returns ODataActionResource
|
|
124
|
-
*/
|
|
125
|
-
action(path) {
|
|
126
|
-
const schema = this.findCallableForType(path);
|
|
127
|
-
return ODataActionResource.factory(this, { path, schema });
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Unbound Function
|
|
131
|
-
* @param {string} path?
|
|
132
|
-
* @returns ODataFunctionResource
|
|
133
|
-
*/
|
|
134
|
-
function(path) {
|
|
135
|
-
const schema = this.findCallableForType(path);
|
|
136
|
-
return ODataFunctionResource.factory(this, { path, schema });
|
|
137
|
-
}
|
|
138
|
-
//request(req: ODataRequest<any>): Observable<any> {
|
|
139
|
-
request(method, resource, options) {
|
|
140
|
-
let req = ODataRequest.factory(this, method, resource, {
|
|
141
|
-
body: options.body,
|
|
142
|
-
etag: options.etag,
|
|
143
|
-
context: options.context,
|
|
144
|
-
headers: options.headers,
|
|
145
|
-
params: options.params,
|
|
146
|
-
responseType: options.responseType,
|
|
147
|
-
observe: (options.observe === 'events' ? 'events' : 'response'),
|
|
148
|
-
withCount: options.withCount,
|
|
149
|
-
bodyQueryOptions: options.bodyQueryOptions,
|
|
150
|
-
reportProgress: options.reportProgress,
|
|
151
|
-
fetchPolicy: options.fetchPolicy,
|
|
152
|
-
withCredentials: options.withCredentials,
|
|
153
|
-
});
|
|
154
|
-
let res$ = this.requester !== undefined ? this.requester(req) : NEVER;
|
|
155
|
-
res$ = res$.pipe(map((res) => res.type === HttpEventType.Response
|
|
156
|
-
? ODataResponse.fromHttpResponse(req, res)
|
|
157
|
-
: res));
|
|
158
|
-
if (this.errorHandler !== undefined)
|
|
159
|
-
res$ = res$.pipe(catchError(this.errorHandler));
|
|
160
|
-
if (options.observe === 'events') {
|
|
161
|
-
return res$;
|
|
162
|
-
}
|
|
163
|
-
res$ = this.cache.handleRequest(req, res$);
|
|
164
|
-
switch (options.observe || 'body') {
|
|
165
|
-
case 'body':
|
|
166
|
-
switch (options.responseType) {
|
|
167
|
-
case 'entities':
|
|
168
|
-
return res$.pipe(map((res) => res.entities()));
|
|
169
|
-
case 'entity':
|
|
170
|
-
return res$.pipe(map((res) => res.entity()));
|
|
171
|
-
case 'property':
|
|
172
|
-
return res$.pipe(map((res) => res.property()));
|
|
173
|
-
case 'value':
|
|
174
|
-
return res$.pipe(map((res) => res.value()));
|
|
175
|
-
default:
|
|
176
|
-
// Other responseTypes (arraybuffer, blob, json, text) return body
|
|
177
|
-
return res$.pipe(map((res) => res.body));
|
|
178
|
-
}
|
|
179
|
-
case 'response':
|
|
180
|
-
// The response stream was requested directly, so return it.
|
|
181
|
-
return res$;
|
|
182
|
-
default:
|
|
183
|
-
// Guard against new future observe types being added.
|
|
184
|
-
throw new Error(`Unreachable: unhandled observe type ${options.observe}}`);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
findSchemaForType(type) {
|
|
188
|
-
const schemas = this.schemas.filter((s) => s.isNamespaceOf(type));
|
|
189
|
-
if (schemas.length === 0)
|
|
190
|
-
return undefined;
|
|
191
|
-
if (schemas.length === 1)
|
|
192
|
-
return schemas[0];
|
|
193
|
-
return schemas
|
|
194
|
-
.sort((s1, s2) => s1.namespace.length - s2.namespace.length)
|
|
195
|
-
.pop();
|
|
196
|
-
}
|
|
197
|
-
findEnumTypeForType(type) {
|
|
198
|
-
if (this.memo.forType.enum.has(type)) {
|
|
199
|
-
return this.memo.forType.enum.get(type);
|
|
200
|
-
}
|
|
201
|
-
const enumType = this.findSchemaForType(type)?.findEnumTypeForType(type);
|
|
202
|
-
this.memo.forType.enum.set(type, enumType);
|
|
203
|
-
return enumType;
|
|
204
|
-
}
|
|
205
|
-
findStructuredTypeForType(type) {
|
|
206
|
-
if (this.memo.forType.structured.has(type)) {
|
|
207
|
-
return this.memo.forType.structured.get(type);
|
|
208
|
-
}
|
|
209
|
-
const structuredType = this.findSchemaForType(type)?.findStructuredTypeForType(type);
|
|
210
|
-
this.memo.forType.structured.set(type, structuredType);
|
|
211
|
-
return structuredType;
|
|
212
|
-
}
|
|
213
|
-
findCallableForType(type, bindingType) {
|
|
214
|
-
const key = bindingType !== undefined ? `${bindingType}/${type}` : type;
|
|
215
|
-
if (this.memo.forType.callable.has(key)) {
|
|
216
|
-
return this.memo.forType.callable.get(key);
|
|
217
|
-
}
|
|
218
|
-
const callable = this.findSchemaForType(type)?.findCallableForType(type, bindingType);
|
|
219
|
-
this.memo.forType.callable.set(key, callable);
|
|
220
|
-
return callable;
|
|
221
|
-
}
|
|
222
|
-
findEntitySetForType(type) {
|
|
223
|
-
if (this.memo.forType.entitySet.has(type)) {
|
|
224
|
-
return this.memo.forType.entitySet.get(type);
|
|
225
|
-
}
|
|
226
|
-
const entitySet = this.findSchemaForType(type)?.findEntitySetForType(type);
|
|
227
|
-
this.memo.forType.entitySet.set(type, entitySet);
|
|
228
|
-
return entitySet;
|
|
229
|
-
}
|
|
230
|
-
findModelForType(type) {
|
|
231
|
-
return this.findStructuredTypeForType(type)?.model;
|
|
232
|
-
}
|
|
233
|
-
modelForType(type) {
|
|
234
|
-
let Model = this.findModelForType(type);
|
|
235
|
-
if (Model === undefined) {
|
|
236
|
-
// Build Ad-hoc model
|
|
237
|
-
let schema = this.findStructuredTypeForType(type);
|
|
238
|
-
if (schema === undefined)
|
|
239
|
-
throw Error(`No schema for ${type}`);
|
|
240
|
-
Model = class extends ODataModel {
|
|
241
|
-
};
|
|
242
|
-
// Build Meta
|
|
243
|
-
Model.buildMeta({ schema });
|
|
244
|
-
// Configure
|
|
245
|
-
Model.meta.configure({
|
|
246
|
-
options: this.options.parserOptions,
|
|
247
|
-
parserForType: (type) => this.parserForType(type),
|
|
248
|
-
findOptionsForType: (type) => this.findOptionsForType(type),
|
|
249
|
-
});
|
|
250
|
-
// Store New Model for next time
|
|
251
|
-
schema.model = Model;
|
|
252
|
-
}
|
|
253
|
-
return Model;
|
|
254
|
-
}
|
|
255
|
-
findCollectionForType(type) {
|
|
256
|
-
return this.findStructuredTypeForType(type)?.collection;
|
|
257
|
-
}
|
|
258
|
-
collectionForType(type) {
|
|
259
|
-
let Collection = this.findCollectionForType(type);
|
|
260
|
-
if (Collection === undefined) {
|
|
261
|
-
let schema = this.findStructuredTypeForType(type);
|
|
262
|
-
if (schema === undefined)
|
|
263
|
-
throw Error('');
|
|
264
|
-
Collection = class extends ODataCollection {
|
|
265
|
-
};
|
|
266
|
-
Collection.model = this.modelForType(type);
|
|
267
|
-
// Store New Collection for next time
|
|
268
|
-
schema.collection = Collection;
|
|
269
|
-
}
|
|
270
|
-
return Collection;
|
|
271
|
-
}
|
|
272
|
-
findServiceForType(type) {
|
|
273
|
-
return this.findEntitySetForType(type)?.service;
|
|
274
|
-
}
|
|
275
|
-
findEntitySetForEntityType(entityType) {
|
|
276
|
-
if (this.memo.forType.entitySet.has(entityType)) {
|
|
277
|
-
return this.memo.forType.entitySet.get(entityType);
|
|
278
|
-
}
|
|
279
|
-
const entitySet = this.schemas
|
|
280
|
-
.reduce((acc, schema) => [...acc, ...schema.entitySets], [])
|
|
281
|
-
.find((e) => e.entityType === entityType);
|
|
282
|
-
this.memo.forType.entitySet.set(entityType, entitySet);
|
|
283
|
-
return entitySet;
|
|
284
|
-
}
|
|
285
|
-
findServiceForEntityType(entityType) {
|
|
286
|
-
return this.findEntitySetForEntityType(entityType)?.service;
|
|
287
|
-
}
|
|
288
|
-
findEnumTypeByName(name) {
|
|
289
|
-
if (this.memo.byName.enum.has(name)) {
|
|
290
|
-
return this.memo.byName.enum.get(name);
|
|
291
|
-
}
|
|
292
|
-
const enumType = this.schemas
|
|
293
|
-
.reduce((acc, schema) => [...acc, ...schema.enums], [])
|
|
294
|
-
.find((e) => e.name === name);
|
|
295
|
-
this.memo.byName.enum.set(name, enumType);
|
|
296
|
-
return enumType;
|
|
297
|
-
}
|
|
298
|
-
findStructuredTypeByName(name) {
|
|
299
|
-
if (this.memo.byName.structured.has(name)) {
|
|
300
|
-
return this.memo.byName.structured.get(name);
|
|
301
|
-
}
|
|
302
|
-
const structuredType = this.schemas
|
|
303
|
-
.reduce((acc, schema) => [...acc, ...schema.entities], [])
|
|
304
|
-
.find((e) => e.name === name);
|
|
305
|
-
this.memo.byName.structured.set(name, structuredType);
|
|
306
|
-
return structuredType;
|
|
307
|
-
}
|
|
308
|
-
findCallableByName(name, bindingType) {
|
|
309
|
-
const key = bindingType !== undefined ? `${bindingType}/${name}` : name;
|
|
310
|
-
if (this.memo.byName.callable.has(key)) {
|
|
311
|
-
return this.memo.byName.callable.get(key);
|
|
312
|
-
}
|
|
313
|
-
const callable = this.schemas
|
|
314
|
-
.reduce((acc, schema) => [...acc, ...schema.callables], [])
|
|
315
|
-
.find((c) => c.name === name &&
|
|
316
|
-
(bindingType === undefined || c.binding()?.type === bindingType));
|
|
317
|
-
this.memo.byName.callable.set(key, callable);
|
|
318
|
-
return callable;
|
|
319
|
-
}
|
|
320
|
-
findEntitySetByName(name) {
|
|
321
|
-
if (this.memo.byName.entitySet.has(name)) {
|
|
322
|
-
return this.memo.byName.entitySet.get(name);
|
|
323
|
-
}
|
|
324
|
-
const schema = this.schemas
|
|
325
|
-
.reduce((acc, schema) => [...acc, ...schema.entitySets], [])
|
|
326
|
-
.find((e) => e.name === name);
|
|
327
|
-
this.memo.byName.entitySet.set(name, schema);
|
|
328
|
-
return schema;
|
|
329
|
-
}
|
|
330
|
-
findModelByName(name) {
|
|
331
|
-
return this.findStructuredTypeByName(name)?.model;
|
|
332
|
-
}
|
|
333
|
-
findCollectionByName(name) {
|
|
334
|
-
return this.findStructuredTypeByName(name)?.collection;
|
|
335
|
-
}
|
|
336
|
-
findServiceByName(name) {
|
|
337
|
-
return this.findEntitySetByName(name)?.service;
|
|
338
|
-
}
|
|
339
|
-
parserForType(type, bindingType) {
|
|
340
|
-
const key = bindingType !== undefined ? `${bindingType}/${type}` : type;
|
|
341
|
-
if (this.memo.forType.parser.has(key)) {
|
|
342
|
-
return this.memo.forType.parser.get(key);
|
|
343
|
-
}
|
|
344
|
-
// None Parser by default
|
|
345
|
-
let parser = NONE_PARSER;
|
|
346
|
-
if (this.parsers.has(type)) {
|
|
347
|
-
// Edm, Base Parsers
|
|
348
|
-
parser = this.parsers.get(type);
|
|
349
|
-
}
|
|
350
|
-
else if (!type.startsWith('Edm.')) {
|
|
351
|
-
// EnumType, ComplexType and EntityType Parsers
|
|
352
|
-
let value = this.findCallableForType(type, bindingType) ||
|
|
353
|
-
this.findEnumTypeForType(type) ||
|
|
354
|
-
this.findStructuredTypeForType(type);
|
|
355
|
-
parser = value?.parser;
|
|
356
|
-
}
|
|
357
|
-
// Set Parser for next time
|
|
358
|
-
this.memo.forType.parser.set(key, parser);
|
|
359
|
-
return parser;
|
|
360
|
-
}
|
|
361
|
-
findOptionsForType(type) {
|
|
362
|
-
// Strucutred Options
|
|
363
|
-
if (this.memo.forType.options.has(type)) {
|
|
364
|
-
return this.memo.forType.options.get(type);
|
|
365
|
-
}
|
|
366
|
-
const st = this.findStructuredTypeForType(type);
|
|
367
|
-
const options = st?.model?.meta;
|
|
368
|
-
// Set Options for next time
|
|
369
|
-
this.memo.forType.options.set(type, options);
|
|
370
|
-
return options;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBYyxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFxQixNQUFNLGdCQUFnQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLCtCQUErQixFQUUvQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLFlBQVksRUFFWixhQUFhLEVBRWIsc0JBQXNCLEdBQ3ZCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLFdBQVcsRUFJWCxXQUFXLEdBRVosTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUlMLFdBQVcsRUFFWCxXQUFXLEdBRVosTUFBTSxTQUFTLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQW1CbkIsWUFBWSxNQUFpQjtRQWlPN0IsdUJBQXVCO1FBQ3ZCLFVBQVU7UUFDRixTQUFJLEdBZVI7WUFDRixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLElBQUksR0FBRyxFQUEwQztnQkFDdkQsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFn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TyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFdmVudCwgSHR0cEV2ZW50VHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE5FVkVSLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPRGF0YUNhY2hlLCBPRGF0YUluTWVtb3J5Q2FjaGUgfSBmcm9tICcuL2NhY2hlL2luZGV4JztcbmltcG9ydCB7IERFRkFVTFRfVkVSU0lPTiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE9EYXRhQ29sbGVjdGlvbiwgT0RhdGFNb2RlbCwgT0RhdGFNb2RlbE9wdGlvbnMgfSBmcm9tICcuL21vZGVscy9pbmRleCc7XG5pbXBvcnQgeyBPRGF0YUFwaU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHtcbiAgT0RhdGFBY3Rpb25SZXNvdXJjZSxcbiAgT0RhdGFCYXRjaFJlc291cmNlLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YUVudGl0eVNldFJlc291cmNlLFxuICBPRGF0YUZ1bmN0aW9uUmVzb3VyY2UsXG4gIE9EYXRhTWV0YWRhdGFSZXNvdXJjZSxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFPcHRpb25zLFxuICBPRGF0YVBhdGhTZWdtZW50cyxcbiAgT0RhdGFRdWVyeU9wdGlvbnMsXG4gIE9EYXRhUmVxdWVzdCxcbiAgT0RhdGFSZXNvdXJjZSxcbiAgT0RhdGFSZXNwb25zZSxcbiAgT0RhdGFTZWdtZW50LFxuICBPRGF0YVNpbmdsZXRvblJlc291cmNlLFxufSBmcm9tICcuL3Jlc291cmNlcy9pbmRleCc7XG5pbXBvcnQge1xuICBFRE1fUEFSU0VSUyxcbiAgT0RhdGFDYWxsYWJsZSxcbiAgT0RhdGFFbnRpdHlTZXQsXG4gIE9EYXRhRW51bVR5cGUsXG4gIE9EYXRhU2NoZW1hLFxuICBPRGF0YVN0cnVjdHVyZWRUeXBlLFxufSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBPRGF0YUVudGl0eVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2VudGl0eSc7XG5pbXBvcnQge1xuICBBcGlDb25maWcsXG4gIEFwaU9wdGlvbnMsXG4gIEVkbVR5cGUsXG4gIE5PTkVfUEFSU0VSLFxuICBQYXJzZXIsXG4gIFBhdGhTZWdtZW50LFxuICBRdWVyeU9wdGlvbixcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQXBpIGFic3RyYWN0aW9uIGZvciBjb25zdW1pbmcgT0RhdGEgc2VydmljZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPRGF0YUFwaSB7XG4gIHJlcXVlc3Rlcj86IChyZXF1ZXN0OiBPRGF0YVJlcXVlc3Q8YW55PikgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICBzZXJ2aWNlUm9vdFVybDogc3RyaW5nO1xuICBtZXRhZGF0YVVybDogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIGRlZmF1bHQ6IGJvb2xlYW47XG4gIGNyZWF0aW9uOiBEYXRlO1xuICAvLyBPcHRpb25zXG4gIG9wdGlvbnM6IE9EYXRhQXBpT3B0aW9ucztcbiAgLy8gQ2FjaGVcbiAgY2FjaGUhOiBPRGF0YUNhY2hlO1xuICAvLyBFcnJvciBIYW5kbGVyXG4gIGVycm9ySGFuZGxlcj86IChlcnJvcjogYW55LCBjYXVnaHQ6IE9ic2VydmFibGU8YW55PikgPT4gT2JzZXJ2YWJsZTxuZXZlcj47XG4gIC8vIEJhc2UgUGFyc2Vyc1xuICBwYXJzZXJzOiBNYXA8c3RyaW5nLCBQYXJzZXI8YW55Pj47XG4gIC8vIFNjaGVtYXNcbiAgc2NoZW1hczogT0RhdGFTY2hlbWFbXTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEFwaUNvbmZpZykge1xuICAgIHRoaXMuc2VydmljZVJvb3RVcmwgPSBjb25maWcuc2VydmljZVJvb3RVcmw7XG4gICAgaWYgKHRoaXMuc2VydmljZVJvb3RVcmwuaW5kZXhPZignPycpICE9IC0xKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSAnc2VydmljZVJvb3RVcmwnIHNob3VsZCBub3QgY29udGFpbiBxdWVyeSBzdHJpbmcuIFBsZWFzZSB1c2UgJ3BhcmFtcycgdG8gYWRkIGV4dHJhIHBhcmFtZXRlcnNcIlxuICAgICAgKTtcbiAgICBpZiAoIXRoaXMuc2VydmljZVJvb3RVcmwuZW5kc1dpdGgoJy8nKSkgdGhpcy5zZXJ2aWNlUm9vdFVybCArPSAnLyc7XG4gICAgdGhpcy5tZXRhZGF0YVVybCA9IGAke3RoaXMuc2VydmljZVJvb3RVcmx9JG1ldGFkYXRhYDtcbiAgICB0aGlzLm5hbWUgPSBjb25maWcubmFtZTtcbiAgICB0aGlzLnZlcnNpb24gPSBjb25maWcudmVyc2lvbiB8fCBERUZBVUxUX1ZFUlNJT047XG4gICAgdGhpcy5kZWZhdWx0ID0gY29uZmlnLmRlZmF1bHQgfHwgZmFsc2U7XG4gICAgdGhpcy5jcmVhdGlvbiA9IGNvbmZpZy5jcmVhdGlvbiB8fCBuZXcgRGF0ZSgpO1xuICAgIHRoaXMub3B0aW9ucyA9IG5ldyBPRGF0YUFwaU9wdGlvbnMoXG4gICAgICBPYmplY3QuYXNzaWduKDxBcGlPcHRpb25zPnsgdmVyc2lvbjogdGhpcy52ZXJzaW9uIH0sIGNvbmZpZy5vcHRpb25zIHx8IHt9KVxuICAgICk7XG5cbiAgICB0aGlzLmNhY2hlID0gKGNvbmZpZy5jYWNoZSBhcyBPRGF0YUNhY2hlKSB8fCBuZXcgT0RhdGFJbk1lbW9yeUNhY2hlKCk7XG4gICAgdGhpcy5lcnJvckhhbmRsZXIgPSBjb25maWcuZXJyb3JIYW5kbGVyO1xuXG4gICAgdGhpcy5wYXJzZXJzID0gbmV3IE1hcChPYmplY3QuZW50cmllcyhjb25maWcucGFyc2VycyB8fCBFRE1fUEFSU0VSUykpO1xuXG4gICAgdGhpcy5zY2hlbWFzID0gKGNvbmZpZy5zY2hlbWFzIHx8IFtdKS5tYXAoXG4gICAgICAoc2NoZW1hKSA9PiBuZXcgT0RhdGFTY2hlbWEoc2NoZW1hLCB0aGlzKVxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmUoXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIHJlcXVlc3Rlcj86IChyZXF1ZXN0OiBPRGF0YVJlcXVlc3Q8YW55PikgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICAgIH0gPSB7fVxuICApIHtcbiAgICB0aGlzLnJlcXVlc3RlciA9IHNldHRpbmdzLnJlcXVlc3RlcjtcbiAgICB0aGlzLnNjaGVtYXMuZm9yRWFjaCgoc2NoZW1hKSA9PiB7XG4gICAgICBzY2hlbWEuY29uZmlndXJlKHtcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLnBhcnNlck9wdGlvbnMsXG4gICAgICAgIHBhcnNlckZvclR5cGU6ICh0eXBlOiBzdHJpbmcgfCBFZG1UeXBlKSA9PiB0aGlzLnBhcnNlckZvclR5cGUodHlwZSksXG4gICAgICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gdGhpcy5maW5kT3B0aW9uc0ZvclR5cGUodHlwZSksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZyb21KU09OPFAsIFI+KGpzb246IHtcbiAgICBzZWdtZW50czogT0RhdGFTZWdtZW50W107XG4gICAgb3B0aW9uczogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0pOiBPRGF0YUFjdGlvblJlc291cmNlPFAsIFI+IHwgT0RhdGFGdW5jdGlvblJlc291cmNlPFAsIFI+O1xuICBmcm9tSlNPTjxFPihqc29uOiB7XG4gICAgc2VnbWVudHM6IE9EYXRhU2VnbWVudFtdO1xuICAgIG9wdGlvbnM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICB9KTpcbiAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8RT47XG4gIGZyb21KU09OKGpzb246IHtcbiAgICBzZWdtZW50czogT0RhdGFTZWdtZW50W107XG4gICAgb3B0aW9uczogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0pIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IG5ldyBPRGF0YVBhdGhTZWdtZW50cyhqc29uLnNlZ21lbnRzKTtcbiAgICBjb25zdCBxdWVyeSA9IG5ldyBPRGF0YVF1ZXJ5T3B0aW9ucyhqc29uLm9wdGlvbnMpO1xuICAgIHN3aXRjaCAoc2VnbWVudHMubGFzdCgpPy5uYW1lIGFzIFBhdGhTZWdtZW50KSB7XG4gICAgICBjYXNlIFBhdGhTZWdtZW50LmVudGl0eVNldDpcbiAgICAgICAgaWYgKHNlZ21lbnRzLmxhc3QoKT8uaGFzS2V5KCkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IE9EYXRhRW50aXR5UmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBPRGF0YUVudGl0eVNldFJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgICAgICB9XG4gICAgICBjYXNlIFBhdGhTZWdtZW50Lm5hdmlnYXRpb25Qcm9wZXJ0eTpcbiAgICAgICAgcmV0dXJuIG5ldyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgICAgY2FzZSBQYXRoU2VnbWVudC5zaW5nbGV0b246XG4gICAgICAgIHJldHVybiBuZXcgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICAgIGNhc2UgUGF0aFNlZ21lbnQuYWN0aW9uOlxuICAgICAgICByZXR1cm4gbmV3IE9EYXRhQWN0aW9uUmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICBjYXNlIFBhdGhTZWdtZW50LmZ1bmN0aW9uOlxuICAgICAgICByZXR1cm4gbmV3IE9EYXRhRnVuY3Rpb25SZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBSZXNvdXJjZSBmb3IganNvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgbWV0YWRhdGEgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIE9EYXRhTWV0YWRhdGFSZXNvdXJjZVxuICAgKi9cbiAgbWV0YWRhdGEoKTogT0RhdGFNZXRhZGF0YVJlc291cmNlIHtcbiAgICByZXR1cm4gT0RhdGFNZXRhZGF0YVJlc291cmNlLmZhY3RvcnkodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBiYXRjaCByZXNvdXJjZS5cbiAgICogQHJldHVybnMgT0RhdGFCYXRjaFJlc291cmNlXG4gICAqL1xuICBiYXRjaCgpOiBPRGF0YUJhdGNoUmVzb3VyY2Uge1xuICAgIHJldHVybiBPRGF0YUJhdGNoUmVzb3VyY2UuZmFjdG9yeSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIHNpbmdsZXRvbiByZXNvdXJjZS5cbiAgICogQHBhcmFtIHBhdGggTmFtZSBvZiB0aGUgc2luZ2xldG9uXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzaW5nbGV0b248VD4ocGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgZW50aXR5U2V0ID0gdGhpcy5maW5kRW50aXR5U2V0QnlOYW1lKHBhdGgpO1xuICAgIGNvbnN0IHNjaGVtYSA9XG4gICAgICBlbnRpdHlTZXQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPihlbnRpdHlTZXQuZW50aXR5VHlwZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UuZmFjdG9yeTxUPih0aGlzLCB7IHBhdGgsIHNjaGVtYSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBlbnRpdHkgc2V0IHJlc291cmNlLlxuICAgKiBAcGFyYW0gcGF0aCBOYW1lIG9mIHRoZSBlbnRpdHkgc2V0XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBlbnRpdHlTZXQ8VD4ocGF0aDogc3RyaW5nKTogT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPiB7XG4gICAgY29uc3QgZW50aXR5U2V0ID0gdGhpcy5maW5kRW50aXR5U2V0QnlOYW1lKHBhdGgpO1xuICAgIGNvbnN0IHNjaGVtYSA9XG4gICAgICBlbnRpdHlTZXQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPihlbnRpdHlTZXQuZW50aXR5VHlwZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UuZmFjdG9yeTxUPih0aGlzLCB7IHBhdGgsIHNjaGVtYSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmJvdW5kIEFjdGlvblxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHBhdGg/XG4gICAqIEByZXR1cm5zIE9EYXRhQWN0aW9uUmVzb3VyY2VcbiAgICovXG4gIGFjdGlvbjxQLCBSPihwYXRoOiBzdHJpbmcpOiBPRGF0YUFjdGlvblJlc291cmNlPFAsIFI+IHtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmZpbmRDYWxsYWJsZUZvclR5cGU8Uj4ocGF0aCk7XG4gICAgcmV0dXJuIE9EYXRhQWN0aW9uUmVzb3VyY2UuZmFjdG9yeTxQLCBSPih0aGlzLCB7IHBhdGgsIHNjaGVtYSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmJvdW5kIEZ1bmN0aW9uXG4gICAqIEBwYXJhbSAge3N0cmluZ30gcGF0aD9cbiAgICogQHJldHVybnMgT0RhdGFGdW5jdGlvblJlc291cmNlXG4gICAqL1xuICBmdW5jdGlvbjxQLCBSPihwYXRoOiBzdHJpbmcpOiBPRGF0YUZ1bmN0aW9uUmVzb3VyY2U8UCwgUj4ge1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZmluZENhbGxhYmxlRm9yVHlwZTxSPihwYXRoKTtcbiAgICByZXR1cm4gT0RhdGFGdW5jdGlvblJlc291cmNlLmZhY3Rvcnk8UCwgUj4odGhpcywgeyBwYXRoLCBzY2hlbWEgfSk7XG4gIH1cblxuICAvL3JlcXVlc3QocmVxOiBPRGF0YVJlcXVlc3Q8YW55Pik6IE9ic2VydmFibGU8YW55PiB7XG4gIHJlcXVlc3Q8VD4oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PixcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgICBib2R5PzogYW55O1xuICAgICAgZXRhZz86IHN0cmluZztcbiAgICAgIHJlc3BvbnNlVHlwZT86XG4gICAgICAgIHwgJ2FycmF5YnVmZmVyJ1xuICAgICAgICB8ICdibG9iJ1xuICAgICAgICB8ICdqc29uJ1xuICAgICAgICB8ICd0ZXh0J1xuICAgICAgICB8ICd2YWx1ZSdcbiAgICAgICAgfCAncHJvcGVydHknXG4gICAgICAgIHwgJ2VudGl0eSdcbiAgICAgICAgfCAnZW50aXRpZXMnO1xuICAgICAgb2JzZXJ2ZT86ICdib2R5JyB8ICdldmVudHMnIHwgJ3Jlc3BvbnNlJztcbiAgICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gICAgICBib2R5UXVlcnlPcHRpb25zPzogUXVlcnlPcHRpb25bXTtcbiAgICB9XG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHJlcSA9IE9EYXRhUmVxdWVzdC5mYWN0b3J5KHRoaXMsIG1ldGhvZCwgcmVzb3VyY2UsIHtcbiAgICAgIGJvZHk6IG9wdGlvbnMuYm9keSxcbiAgICAgIGV0YWc6IG9wdGlvbnMuZXRhZyxcbiAgICAgIGNvbnRleHQ6IG9wdGlvbnMuY29udGV4dCxcbiAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMsXG4gICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlLFxuICAgICAgb2JzZXJ2ZTogKG9wdGlvbnMub2JzZXJ2ZSA9PT0gJ2V2ZW50cycgPyAnZXZlbnRzJyA6ICdyZXNwb25zZScpIGFzXG4gICAgICAgIHwgJ2V2ZW50cydcbiAgICAgICAgfCAncmVzcG9uc2UnLFxuICAgICAgd2l0aENvdW50OiBvcHRpb25zLndpdGhDb3VudCxcbiAgICAgIGJvZHlRdWVyeU9wdGlvbnM6IG9wdGlvbnMuYm9keVF1ZXJ5T3B0aW9ucyxcbiAgICAgIHJlcG9ydFByb2dyZXNzOiBvcHRpb25zLnJlcG9ydFByb2dyZXNzLFxuICAgICAgZmV0Y2hQb2xpY3k6IG9wdGlvbnMuZmV0Y2hQb2xpY3ksXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IG9wdGlvbnMud2l0aENyZWRlbnRpYWxzLFxuICAgIH0pO1xuXG4gICAgbGV0IHJlcyQgPSB0aGlzLnJlcXVlc3RlciAhPT0gdW5kZWZpbmVkID8gdGhpcy5yZXF1ZXN0ZXIocmVxKSA6IE5FVkVSO1xuXG4gICAgcmVzJCA9IHJlcyQucGlwZShcbiAgICAgIG1hcCgocmVzOiBIdHRwRXZlbnQ8YW55PikgPT5cbiAgICAgICAgcmVzLnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2VcbiAgICAgICAgICA/IE9EYXRhUmVzcG9uc2UuZnJvbUh0dHBSZXNwb25zZTxhbnk+KHJlcSwgcmVzKVxuICAgICAgICAgIDogcmVzXG4gICAgICApXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmVycm9ySGFuZGxlciAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmVzJCA9IHJlcyQucGlwZShjYXRjaEVycm9yKHRoaXMuZXJyb3JIYW5kbGVyKSk7XG5cbiAgICBpZiAob3B0aW9ucy5vYnNlcnZlID09PSAnZXZlbnRzJykge1xuICAgICAgcmV0dXJuIHJlcyQ7XG4gICAgfVxuXG4gICAgcmVzJCA9IHRoaXMuY2FjaGUuaGFuZGxlUmVxdWVzdChyZXEsIHJlcyQpO1xuXG4gICAgc3dpdGNoIChvcHRpb25zLm9ic2VydmUgfHwgJ2JvZHknKSB7XG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnJlc3BvbnNlVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2VudGl0aWVzJzpcbiAgICAgICAgICAgIHJldHVybiByZXMkLnBpcGUobWFwKChyZXM6IE9EYXRhUmVzcG9uc2U8VD4pID0+IHJlcy5lbnRpdGllcygpKSk7XG4gICAgICAgICAgY2FzZSAnZW50aXR5JzpcbiAgICAgICAgICAgIHJldHVybiByZXMkLnBpcGUobWFwKChyZXM6IE9EYXRhUmVzcG9uc2U8VD4pID0+IHJlcy5lbnRpdHkoKSkpO1xuICAgICAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgICAgIHJldHVybiByZXMkLnBpcGUobWFwKChyZXM6IE9EYXRhUmVzcG9uc2U8VD4pID0+IHJlcy5wcm9wZXJ0eSgpKSk7XG4gICAgICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLnZhbHVlKCkgYXMgVCkpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBPdGhlciByZXNwb25zZVR5cGVzIChhcnJheWJ1ZmZlciwgYmxvYiwganNvbiwgdGV4dCkgcmV0dXJuIGJvZHlcbiAgICAgICAgICAgIHJldHVybiByZXMkLnBpcGUobWFwKChyZXM6IE9EYXRhUmVzcG9uc2U8VD4pID0+IHJlcy5ib2R5KSk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3Jlc3BvbnNlJzpcbiAgICAgICAgLy8gVGhlIHJlc3BvbnNlIHN0cmVhbSB3YXMgcmVxdWVzdGVkIGRpcmVjdGx5LCBzbyByZXR1cm4gaXQuXG4gICAgICAgIHJldHVybiByZXMkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBuZXcgZnV0dXJlIG9ic2VydmUgdHlwZXMgYmVpbmcgYWRkZWQuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVW5yZWFjaGFibGU6IHVuaGFuZGxlZCBvYnNlcnZlIHR5cGUgJHtvcHRpb25zLm9ic2VydmV9fWBcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyMgcmVnaW9uIEZpbmQgYnkgVHlwZVxuICAvLyBNZW1vaXplXG4gIHByaXZhdGUgbWVtbzoge1xuICAgIGZvclR5cGU6IHtcbiAgICAgIGVudW06IE1hcDxzdHJpbmcsIE9EYXRhRW51bVR5cGU8YW55PiB8IHVuZGVmaW5lZD47XG4gICAgICBzdHJ1Y3R1cmVkOiBNYXA8c3RyaW5nLCBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4gfCB1bmRlZmluZWQ+O1xuICAgICAgY2FsbGFibGU6IE1hcDxzdHJpbmcsIE9EYXRhQ2FsbGFibGU8YW55PiB8IHVuZGVmaW5lZD47XG4gICAgICBlbnRpdHlTZXQ6IE1hcDxzdHJpbmcsIE9EYXRhRW50aXR5U2V0IHwgdW5kZWZpbmVkPjtcbiAgICAgIHBhcnNlcjogTWFwPHN0cmluZywgUGFyc2VyPGFueT4+O1xuICAgICAgb3B0aW9uczogTWFwPHN0cmluZywgT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZD47XG4gICAgfTtcbiAgICBieU5hbWU6IHtcbiAgICAgIGVudW06IE1hcDxzdHJpbmcsIE9EYXRhRW51bVR5cGU8YW55PiB8IHVuZGVmaW5lZD47XG4gICAgICBzdHJ1Y3R1cmVkOiBNYXA8c3RyaW5nLCBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4gfCB1bmRlZmluZWQ+O1xuICAgICAgY2FsbGFibGU6IE1hcDxzdHJpbmcsIE9EYXRhQ2FsbGFibGU8YW55PiB8IHVuZGVmaW5lZD47XG4gICAgICBlbnRpdHlTZXQ6IE1hcDxzdHJpbmcsIE9EYXRhRW50aXR5U2V0IHwgdW5kZWZpbmVkPjtcbiAgICB9O1xuICB9ID0ge1xuICAgIGZvclR5cGU6IHtcbiAgICAgIGVudW06IG5ldyBNYXA8c3RyaW5nLCBPRGF0YUVudW1UeXBlPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gICAgICBzdHJ1Y3R1cmVkOiBuZXcgTWFwPHN0cmluZywgT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+IHwgdW5kZWZpbmVkPigpLFxuICAgICAgY2FsbGFibGU6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YUNhbGxhYmxlPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gICAgICBlbnRpdHlTZXQ6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YUVudGl0eVNldCB8IHVuZGVmaW5lZD4oKSxcbiAgICAgIHBhcnNlcjogbmV3IE1hcDxzdHJpbmcsIFBhcnNlcjxhbnk+PigpLFxuICAgICAgb3B0aW9uczogbmV3IE1hcDxzdHJpbmcsIE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gICAgfSxcbiAgICBieU5hbWU6IHtcbiAgICAgIGVudW06IG5ldyBNYXA8c3RyaW5nLCBPRGF0YUVudW1UeXBlPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gICAgICBzdHJ1Y3R1cmVkOiBuZXcgTWFwPHN0cmluZywgT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+IHwgdW5kZWZpbmVkPigpLFxuICAgICAgY2FsbGFibGU6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YUNhbGxhYmxlPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gICAgICBlbnRpdHlTZXQ6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YUVudGl0eVNldCB8IHVuZGVmaW5lZD4oKSxcbiAgICB9LFxuICB9O1xuXG4gIHByaXZhdGUgZmluZFNjaGVtYUZvclR5cGUodHlwZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2NoZW1hcyA9IHRoaXMuc2NoZW1hcy5maWx0ZXIoKHMpID0+IHMuaXNOYW1lc3BhY2VPZih0eXBlKSk7XG4gICAgaWYgKHNjaGVtYXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChzY2hlbWFzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHNjaGVtYXNbMF07XG4gICAgcmV0dXJuIHNjaGVtYXNcbiAgICAgIC5zb3J0KChzMSwgczIpID0+IHMxLm5hbWVzcGFjZS5sZW5ndGggLSBzMi5uYW1lc3BhY2UubGVuZ3RoKVxuICAgICAgLnBvcCgpO1xuICB9XG5cbiAgcHVibGljIGZpbmRFbnVtVHlwZUZvclR5cGU8VD4odHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWVtby5mb3JUeXBlLmVudW0uaGFzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmZvclR5cGUuZW51bS5nZXQodHlwZSkgYXMgT0RhdGFFbnVtVHlwZTxUPiB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZW51bVR5cGUgPSB0aGlzLmZpbmRTY2hlbWFGb3JUeXBlKHR5cGUpPy5maW5kRW51bVR5cGVGb3JUeXBlPFQ+KHR5cGUpO1xuICAgIHRoaXMubWVtby5mb3JUeXBlLmVudW0uc2V0KHR5cGUsIGVudW1UeXBlKTtcbiAgICByZXR1cm4gZW51bVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmZvclR5cGUuc3RydWN0dXJlZC5oYXModHlwZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uZm9yVHlwZS5zdHJ1Y3R1cmVkLmdldCh0eXBlKSBhc1xuICAgICAgICB8IE9EYXRhU3RydWN0dXJlZFR5cGU8VD5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0cnVjdHVyZWRUeXBlID1cbiAgICAgIHRoaXMuZmluZFNjaGVtYUZvclR5cGUodHlwZSk/LmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8VD4odHlwZSk7XG4gICAgdGhpcy5tZW1vLmZvclR5cGUuc3RydWN0dXJlZC5zZXQodHlwZSwgc3RydWN0dXJlZFR5cGUpO1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kQ2FsbGFibGVGb3JUeXBlPFQ+KHR5cGU6IHN0cmluZywgYmluZGluZ1R5cGU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXkgPSBiaW5kaW5nVHlwZSAhPT0gdW5kZWZpbmVkID8gYCR7YmluZGluZ1R5cGV9LyR7dHlwZX1gIDogdHlwZTtcbiAgICBpZiAodGhpcy5tZW1vLmZvclR5cGUuY2FsbGFibGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uZm9yVHlwZS5jYWxsYWJsZS5nZXQoa2V5KSBhc1xuICAgICAgICB8IE9EYXRhQ2FsbGFibGU8VD5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNhbGxhYmxlID0gdGhpcy5maW5kU2NoZW1hRm9yVHlwZSh0eXBlKT8uZmluZENhbGxhYmxlRm9yVHlwZTxUPihcbiAgICAgIHR5cGUsXG4gICAgICBiaW5kaW5nVHlwZVxuICAgICk7XG4gICAgdGhpcy5tZW1vLmZvclR5cGUuY2FsbGFibGUuc2V0KGtleSwgY2FsbGFibGUpO1xuICAgIHJldHVybiBjYWxsYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kRW50aXR5U2V0Rm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmZvclR5cGUuZW50aXR5U2V0Lmhhcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5mb3JUeXBlLmVudGl0eVNldC5nZXQodHlwZSkgYXNcbiAgICAgICAgfCBPRGF0YUVudGl0eVNldFxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZW50aXR5U2V0ID0gdGhpcy5maW5kU2NoZW1hRm9yVHlwZSh0eXBlKT8uZmluZEVudGl0eVNldEZvclR5cGUodHlwZSk7XG4gICAgdGhpcy5tZW1vLmZvclR5cGUuZW50aXR5U2V0LnNldCh0eXBlLCBlbnRpdHlTZXQpO1xuICAgIHJldHVybiBlbnRpdHlTZXQ7XG4gIH1cblxuICBwdWJsaWMgZmluZE1vZGVsRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPGFueT4odHlwZSk/Lm1vZGVsO1xuICB9XG5cbiAgcHVibGljIG1vZGVsRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBsZXQgTW9kZWwgPSB0aGlzLmZpbmRNb2RlbEZvclR5cGUodHlwZSk7XG4gICAgaWYgKE1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEJ1aWxkIEFkLWhvYyBtb2RlbFxuICAgICAgbGV0IHNjaGVtYSA9IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxhbnk+KHR5cGUpO1xuICAgICAgaWYgKHNjaGVtYSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBFcnJvcihgTm8gc2NoZW1hIGZvciAke3R5cGV9YCk7XG4gICAgICBNb2RlbCA9IGNsYXNzIGV4dGVuZHMgT0RhdGFNb2RlbDxhbnk+IHt9IGFzIHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgICAgLy8gQnVpbGQgTWV0YVxuICAgICAgTW9kZWwuYnVpbGRNZXRhKHsgc2NoZW1hIH0pO1xuICAgICAgLy8gQ29uZmlndXJlXG4gICAgICBNb2RlbC5tZXRhLmNvbmZpZ3VyZSh7XG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucy5wYXJzZXJPcHRpb25zLFxuICAgICAgICBwYXJzZXJGb3JUeXBlOiAodHlwZTogc3RyaW5nIHwgRWRtVHlwZSkgPT4gdGhpcy5wYXJzZXJGb3JUeXBlKHR5cGUpLFxuICAgICAgICBmaW5kT3B0aW9uc0ZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IHRoaXMuZmluZE9wdGlvbnNGb3JUeXBlKHR5cGUpLFxuICAgICAgfSk7XG4gICAgICAvLyBTdG9yZSBOZXcgTW9kZWwgZm9yIG5leHQgdGltZVxuICAgICAgc2NoZW1hLm1vZGVsID0gTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBNb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kQ29sbGVjdGlvbkZvclR5cGUodHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxhbnk+KHR5cGUpPy5jb2xsZWN0aW9uO1xuICB9XG5cbiAgcHVibGljIGNvbGxlY3Rpb25Gb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGxldCBDb2xsZWN0aW9uID0gdGhpcy5maW5kQ29sbGVjdGlvbkZvclR5cGUodHlwZSk7XG4gICAgaWYgKENvbGxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IHNjaGVtYSA9IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxhbnk+KHR5cGUpO1xuICAgICAgaWYgKHNjaGVtYSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBFcnJvcignJyk7XG4gICAgICBDb2xsZWN0aW9uID0gY2xhc3MgZXh0ZW5kcyBPRGF0YUNvbGxlY3Rpb248XG4gICAgICAgIGFueSxcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+XG4gICAgICA+IHt9IGFzIHR5cGVvZiBPRGF0YUNvbGxlY3Rpb247XG4gICAgICBDb2xsZWN0aW9uLm1vZGVsID0gdGhpcy5tb2RlbEZvclR5cGUodHlwZSk7XG4gICAgICAvLyBTdG9yZSBOZXcgQ29sbGVjdGlvbiBmb3IgbmV4dCB0aW1lXG4gICAgICBzY2hlbWEuY29sbGVjdGlvbiA9IENvbGxlY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBDb2xsZWN0aW9uO1xuICB9XG5cbiAgcHVibGljIGZpbmRTZXJ2aWNlRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kRW50aXR5U2V0Rm9yVHlwZSh0eXBlKT8uc2VydmljZSBhc1xuICAgICAgfCB0eXBlb2YgT0RhdGFFbnRpdHlTZXJ2aWNlXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kRW50aXR5U2V0Rm9yRW50aXR5VHlwZShlbnRpdHlUeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmZvclR5cGUuZW50aXR5U2V0LmhhcyhlbnRpdHlUeXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5mb3JUeXBlLmVudGl0eVNldC5nZXQoZW50aXR5VHlwZSkgYXNcbiAgICAgICAgfCBPRGF0YUVudGl0eVNldFxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZW50aXR5U2V0ID0gdGhpcy5zY2hlbWFzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5lbnRpdHlTZXRzXSxcbiAgICAgICAgPE9EYXRhRW50aXR5U2V0W10+W11cbiAgICAgIClcbiAgICAgIC5maW5kKChlKSA9PiBlLmVudGl0eVR5cGUgPT09IGVudGl0eVR5cGUpO1xuICAgIHRoaXMubWVtby5mb3JUeXBlLmVudGl0eVNldC5zZXQoZW50aXR5VHlwZSwgZW50aXR5U2V0KTtcbiAgICByZXR1cm4gZW50aXR5U2V0O1xuICB9XG5cbiAgcHVibGljIGZpbmRTZXJ2aWNlRm9yRW50aXR5VHlwZShlbnRpdHlUeXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kRW50aXR5U2V0Rm9yRW50aXR5VHlwZShlbnRpdHlUeXBlKT8uc2VydmljZSBhc1xuICAgICAgfCB0eXBlb2YgT0RhdGFFbnRpdHlTZXJ2aWNlXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kRW51bVR5cGVCeU5hbWU8VD4obmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWVtby5ieU5hbWUuZW51bS5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uYnlOYW1lLmVudW0uZ2V0KG5hbWUpIGFzIE9EYXRhRW51bVR5cGU8VD4gfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGVudW1UeXBlID0gdGhpcy5zY2hlbWFzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5lbnVtc10sXG4gICAgICAgIDxPRGF0YUVudW1UeXBlPFQ+W10+W11cbiAgICAgIClcbiAgICAgIC5maW5kKChlKSA9PiBlLm5hbWUgPT09IG5hbWUpO1xuICAgIHRoaXMubWVtby5ieU5hbWUuZW51bS5zZXQobmFtZSwgZW51bVR5cGUpO1xuICAgIHJldHVybiBlbnVtVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kU3RydWN0dXJlZFR5cGVCeU5hbWU8VD4obmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWVtby5ieU5hbWUuc3RydWN0dXJlZC5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uYnlOYW1lLnN0cnVjdHVyZWQuZ2V0KG5hbWUpIGFzXG4gICAgICAgIHwgT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc3RydWN0dXJlZFR5cGUgPSB0aGlzLnNjaGVtYXNcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHNjaGVtYSkgPT4gWy4uLmFjYywgLi4uc2NoZW1hLmVudGl0aWVzXSxcbiAgICAgICAgPE9EYXRhU3RydWN0dXJlZFR5cGU8VD5bXT5bXVxuICAgICAgKVxuICAgICAgLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gbmFtZSk7XG4gICAgdGhpcy5tZW1vLmJ5TmFtZS5zdHJ1Y3R1cmVkLnNldChuYW1lLCBzdHJ1Y3R1cmVkVHlwZSk7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRUeXBlO1xuICB9XG5cbiAgcHVibGljIGZpbmRDYWxsYWJsZUJ5TmFtZTxUPihuYW1lOiBzdHJpbmcsIGJpbmRpbmdUeXBlPzogc3RyaW5nKSB7XG4gICAgY29uc3Qga2V5ID0gYmluZGluZ1R5cGUgIT09IHVuZGVmaW5lZCA/IGAke2JpbmRpbmdUeXBlfS8ke25hbWV9YCA6IG5hbWU7XG4gICAgaWYgKHRoaXMubWVtby5ieU5hbWUuY2FsbGFibGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uYnlOYW1lLmNhbGxhYmxlLmdldChrZXkpIGFzIE9EYXRhQ2FsbGFibGU8VD4gfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNhbGxhYmxlID0gdGhpcy5zY2hlbWFzXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5jYWxsYWJsZXNdLFxuICAgICAgICA8T0RhdGFDYWxsYWJsZTxUPltdPltdXG4gICAgICApXG4gICAgICAuZmluZChcbiAgICAgICAgKGMpID0+XG4gICAgICAgICAgYy5uYW1lID09PSBuYW1lICYmXG4gICAgICAgICAgKGJpbmRpbmdUeXBlID09PSB1bmRlZmluZWQgfHwgYy5iaW5kaW5nKCk/LnR5cGUgPT09IGJpbmRpbmdUeXBlKVxuICAgICAgKTtcbiAgICB0aGlzLm1lbW8uYnlOYW1lLmNhbGxhYmxlLnNldChrZXksIGNhbGxhYmxlKTtcbiAgICByZXR1cm4gY2FsbGFibGU7XG4gIH1cblxuICBwdWJsaWMgZmluZEVudGl0eVNldEJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmJ5TmFtZS5lbnRpdHlTZXQuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmJ5TmFtZS5lbnRpdHlTZXQuZ2V0KG5hbWUpIGFzIE9EYXRhRW50aXR5U2V0IHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLnNjaGVtYXNcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHNjaGVtYSkgPT4gWy4uLmFjYywgLi4uc2NoZW1hLmVudGl0eVNldHNdLFxuICAgICAgICA8T0RhdGFFbnRpdHlTZXRbXT5bXVxuICAgICAgKVxuICAgICAgLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gbmFtZSk7XG4gICAgdGhpcy5tZW1vLmJ5TmFtZS5lbnRpdHlTZXQuc2V0KG5hbWUsIHNjaGVtYSk7XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kTW9kZWxCeU5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlQnlOYW1lPGFueT4obmFtZSk/Lm1vZGVsIGFzXG4gICAgICB8IHR5cGVvZiBPRGF0YU1vZGVsXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kQ29sbGVjdGlvbkJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVCeU5hbWU8YW55PihuYW1lKT8uY29sbGVjdGlvbiBhc1xuICAgICAgfCB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kU2VydmljZUJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kRW50aXR5U2V0QnlOYW1lKG5hbWUpPy5zZXJ2aWNlIGFzXG4gICAgICB8IHR5cGVvZiBPRGF0YUVudGl0eVNlcnZpY2VcbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHBhcnNlckZvclR5cGU8VD4odHlwZTogc3RyaW5nIHwgRWRtVHlwZSwgYmluZGluZ1R5cGU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXkgPSBiaW5kaW5nVHlwZSAhPT0gdW5kZWZpbmVkID8gYCR7YmluZGluZ1R5cGV9LyR7dHlwZX1gIDogdHlwZTtcbiAgICBpZiAodGhpcy5tZW1vLmZvclR5cGUucGFyc2VyLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmZvclR5cGUucGFyc2VyLmdldChrZXkpIGFzIFBhcnNlcjxUPjtcbiAgICB9XG4gICAgLy8gTm9uZSBQYXJzZXIgYnkgZGVmYXVsdFxuICAgIGxldCBwYXJzZXI6IFBhcnNlcjxUPiA9IE5PTkVfUEFSU0VSO1xuICAgIGlmICh0aGlzLnBhcnNlcnMuaGFzKHR5cGUpKSB7XG4gICAgICAvLyBFZG0sIEJhc2UgUGFyc2Vyc1xuICAgICAgcGFyc2VyID0gdGhpcy5wYXJzZXJzLmdldCh0eXBlKSBhcyBQYXJzZXI8VD47XG4gICAgfSBlbHNlIGlmICghdHlwZS5zdGFydHNXaXRoKCdFZG0uJykpIHtcbiAgICAgIC8vIEVudW1UeXBlLCBDb21wbGV4VHlwZSBhbmQgRW50aXR5VHlwZSBQYXJzZXJzXG4gICAgICBsZXQgdmFsdWUgPVxuICAgICAgICB0aGlzLmZpbmRDYWxsYWJsZUZvclR5cGU8VD4odHlwZSwgYmluZGluZ1R5cGUpIHx8XG4gICAgICAgIHRoaXMuZmluZEVudW1UeXBlRm9yVHlwZTxUPih0eXBlKSB8fFxuICAgICAgICB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8VD4odHlwZSk7XG4gICAgICBwYXJzZXIgPSB2YWx1ZT8ucGFyc2VyIGFzIFBhcnNlcjxUPjtcbiAgICB9XG4gICAgLy8gU2V0IFBhcnNlciBmb3IgbmV4dCB0aW1lXG4gICAgdGhpcy5tZW1vLmZvclR5cGUucGFyc2VyLnNldChrZXksIHBhcnNlcik7XG4gICAgcmV0dXJuIHBhcnNlcjtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kT3B0aW9uc0ZvclR5cGU8VD4odHlwZTogc3RyaW5nKSB7XG4gICAgLy8gU3RydWN1dHJlZCBPcHRpb25zXG4gICAgaWYgKHRoaXMubWVtby5mb3JUeXBlLm9wdGlvbnMuaGFzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmZvclR5cGUub3B0aW9ucy5nZXQodHlwZSkgYXNcbiAgICAgICAgfCBPRGF0YU1vZGVsT3B0aW9uczxUPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc3QgPSB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8VD4odHlwZSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHN0Py5tb2RlbD8ubWV0YTtcbiAgICAvLyBTZXQgT3B0aW9ucyBmb3IgbmV4dCB0aW1lXG4gICAgdGhpcy5tZW1vLmZvclR5cGUub3B0aW9ucy5zZXQodHlwZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cbn1cbiJdfQ==
|