angular-odata 0.128.0 → 0.131.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/README.md +27 -244
- package/fesm2022/angular-odata.mjs +2320 -1118
- package/fesm2022/angular-odata.mjs.map +1 -1
- package/lib/api.d.ts +10 -11
- package/lib/cache/cache.d.ts +2 -2
- package/lib/cache/memory.d.ts +2 -2
- package/lib/cache/storage.d.ts +2 -2
- package/lib/index.d.ts +1 -0
- package/lib/loaders.d.ts +8 -8
- package/lib/metadata/csdl/csdl-annotation.d.ts +62 -26
- package/lib/metadata/csdl/csdl-entity-container.d.ts +8 -3
- package/lib/metadata/csdl/csdl-entity-set.d.ts +7 -2
- package/lib/metadata/csdl/csdl-enum-type.d.ts +11 -3
- package/lib/metadata/csdl/csdl-function-action.d.ts +54 -11
- package/lib/metadata/csdl/csdl-navigation-property-binding.d.ts +4 -0
- package/lib/metadata/csdl/csdl-reference.d.ts +26 -3
- package/lib/metadata/csdl/csdl-schema.d.ts +5 -2
- package/lib/metadata/csdl/csdl-singleton.d.ts +5 -0
- package/lib/metadata/csdl/csdl-structural-property.d.ts +19 -3
- package/lib/metadata/csdl/csdl-structured-type.d.ts +28 -7
- package/lib/metadata/csdl/csdl-type-definition.d.ts +3 -0
- package/lib/metadata/metadata.d.ts +16 -3
- package/lib/models/collection.d.ts +2 -1
- package/lib/models/model.d.ts +6 -5
- package/lib/models/options.d.ts +11 -4
- package/lib/module.d.ts +3 -3
- package/lib/options.d.ts +3 -3
- package/lib/resources/path/segments.d.ts +3 -3
- package/lib/resources/query/builder.d.ts +3 -2
- package/lib/resources/query/expressions/apply.d.ts +1 -1
- package/lib/resources/query/expressions/compute.d.ts +1 -1
- package/lib/resources/query/expressions/count.d.ts +1 -1
- package/lib/resources/query/expressions/expand.d.ts +5 -2
- package/lib/resources/query/expressions/filter.d.ts +2 -1
- package/lib/resources/query/expressions/orderby.d.ts +2 -1
- package/lib/resources/query/expressions/search.d.ts +2 -1
- package/lib/resources/query/expressions/select.d.ts +2 -1
- package/lib/resources/query/expressions/syntax.d.ts +2 -2
- package/lib/resources/query/handlers.d.ts +17 -5
- package/lib/resources/query/options.d.ts +3 -3
- package/lib/resources/resource.d.ts +36 -8
- package/lib/resources/types/action.d.ts +4 -4
- package/lib/resources/types/entity-set.d.ts +15 -8
- package/lib/resources/types/entity.d.ts +5 -1
- package/lib/resources/types/function.d.ts +4 -4
- package/lib/resources/types/navigation-property.d.ts +12 -3
- package/lib/resources/types/property.d.ts +14 -3
- package/lib/resources/types/singleton.d.ts +5 -1
- package/lib/schema/annotation.d.ts +3 -3
- package/lib/schema/callable.d.ts +3 -3
- package/lib/schema/element.d.ts +3 -3
- package/lib/schema/entity-container.d.ts +2 -2
- package/lib/schema/entity-set.d.ts +2 -2
- package/lib/schema/enum-type.d.ts +10 -10
- package/lib/schema/parsers/callable.d.ts +4 -4
- package/lib/schema/parsers/enum-type.d.ts +15 -15
- package/lib/schema/parsers/structured-type.d.ts +8 -5
- package/lib/schema/schema.d.ts +3 -3
- package/lib/schema/singleton.d.ts +2 -2
- package/lib/schema/structured-type.d.ts +7 -4
- package/lib/services/entity-set.d.ts +9 -6
- package/lib/services/entity.d.ts +1 -1
- package/lib/services/singleton.d.ts +1 -1
- package/lib/settings.d.ts +2 -2
- package/lib/types.d.ts +82 -69
- package/lib/utils/enums.d.ts +12 -12
- package/lib/utils/http.d.ts +1 -1
- package/lib/utils/objects.d.ts +1 -1
- package/lib/utils/odata.d.ts +2 -2
- package/lib/utils/strings.d.ts +2 -2
- package/package.json +3 -5
- package/schematics/apigen/angular/api-config.js +7 -1
- package/schematics/apigen/angular/api-config.js.map +1 -1
- package/schematics/apigen/angular/base.d.ts +22 -2
- package/schematics/apigen/angular/base.js +82 -42
- package/schematics/apigen/angular/base.js.map +1 -1
- package/schematics/apigen/angular/entity.js +7 -1
- package/schematics/apigen/angular/entity.js.map +1 -1
- package/schematics/apigen/angular/enum.js +1 -0
- package/schematics/apigen/angular/enum.js.map +1 -1
- package/schematics/apigen/angular/module.js.map +1 -1
- package/schematics/apigen/angular/service.js +3 -2
- package/schematics/apigen/angular/service.js.map +1 -1
- package/schematics/apigen/files/api-config/__fileName__.ts +8 -6
- package/schematics/apigen/files/entity/__fileName__.ts +2 -2
- package/schematics/apigen/files/entitycontainer-service/__fileName__.ts +1 -1
- package/schematics/apigen/files/entityset-service/__fileName__.ts +1 -1
- package/schematics/apigen/files/enum/__fileName__.ts +1 -1
- package/schematics/apigen/files/metadata/metadata.json +1 -0
- package/schematics/apigen/files/singleton-service/__fileName__.ts +1 -1
- package/schematics/apigen/index.js +56 -12
- package/schematics/apigen/index.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-annotation.d.ts +56 -23
- package/schematics/apigen/metadata/csdl/csdl-annotation.js +143 -13
- package/schematics/apigen/metadata/csdl/csdl-annotation.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-entity-container.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.js +19 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-entity-set.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.js +11 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-enum-type.d.ts +6 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.js +17 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-function-action.d.ts +37 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.js +52 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.d.ts +4 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js +6 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-reference.d.ts +15 -3
- package/schematics/apigen/metadata/csdl/csdl-reference.js +26 -2
- package/schematics/apigen/metadata/csdl/csdl-reference.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-schema.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.js +37 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-singleton.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.js +8 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-structural-property.d.ts +16 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.js +53 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-structured-type.d.ts +22 -3
- package/schematics/apigen/metadata/csdl/csdl-structured-type.js +47 -2
- package/schematics/apigen/metadata/csdl/csdl-structured-type.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-type-definition.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.js +19 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.js.map +1 -1
- package/schematics/apigen/metadata/metadata.d.ts +10 -0
- package/schematics/apigen/metadata/metadata.js +12 -6
- package/schematics/apigen/metadata/metadata.js.map +1 -1
- package/schematics/apigen/metadata/parser.js.map +1 -1
- package/schematics/apigen/schema.d.ts +2 -1
- package/schematics/apigen/schema.json +15 -14
- package/schematics/apigen/utils.d.ts +1 -0
- package/schematics/apigen/utils.js +25 -1
- package/schematics/apigen/utils.js.map +1 -1
- package/schematics/ng-add/index.js +1 -2
- package/schematics/ng-add/index.js.map +1 -1
- package/esm2022/angular-odata.mjs +0 -5
- package/esm2022/lib/annotations.mjs +0 -140
- package/esm2022/lib/api.mjs +0 -419
- package/esm2022/lib/cache/cache.mjs +0 -175
- package/esm2022/lib/cache/index.mjs +0 -4
- package/esm2022/lib/cache/memory.mjs +0 -30
- package/esm2022/lib/cache/storage.mjs +0 -55
- package/esm2022/lib/client.mjs +0 -212
- package/esm2022/lib/constants.mjs +0 -95
- package/esm2022/lib/helper.mjs +0 -280
- package/esm2022/lib/index.mjs +0 -21
- package/esm2022/lib/loaders.mjs +0 -39
- package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -95
- package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -27
- package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -24
- package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -37
- package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -94
- package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -7
- package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -23
- package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -39
- package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -15
- package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -70
- package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -92
- package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -15
- package/esm2022/lib/metadata/index.mjs +0 -3
- package/esm2022/lib/metadata/metadata.mjs +0 -14
- package/esm2022/lib/metadata/parser.mjs +0 -563
- package/esm2022/lib/models/collection.mjs +0 -814
- package/esm2022/lib/models/index.mjs +0 -4
- package/esm2022/lib/models/model.mjs +0 -553
- package/esm2022/lib/models/options.mjs +0 -1179
- package/esm2022/lib/module.mjs +0 -55
- package/esm2022/lib/options.mjs +0 -36
- package/esm2022/lib/resources/index.mjs +0 -7
- package/esm2022/lib/resources/options.mjs +0 -56
- package/esm2022/lib/resources/path/handlers.mjs +0 -79
- package/esm2022/lib/resources/path/index.mjs +0 -3
- package/esm2022/lib/resources/path/segments.mjs +0 -148
- package/esm2022/lib/resources/query/builder.mjs +0 -636
- package/esm2022/lib/resources/query/expressions/apply.mjs +0 -236
- package/esm2022/lib/resources/query/expressions/base.mjs +0 -25
- package/esm2022/lib/resources/query/expressions/compute.mjs +0 -54
- package/esm2022/lib/resources/query/expressions/count.mjs +0 -116
- package/esm2022/lib/resources/query/expressions/expand.mjs +0 -147
- package/esm2022/lib/resources/query/expressions/filter.mjs +0 -178
- package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
- package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -79
- package/esm2022/lib/resources/query/expressions/search.mjs +0 -141
- package/esm2022/lib/resources/query/expressions/select.mjs +0 -47
- package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -751
- package/esm2022/lib/resources/query/handlers.mjs +0 -420
- package/esm2022/lib/resources/query/index.mjs +0 -5
- package/esm2022/lib/resources/query/options.mjs +0 -139
- package/esm2022/lib/resources/request.mjs +0 -196
- package/esm2022/lib/resources/resource.mjs +0 -311
- package/esm2022/lib/resources/response.mjs +0 -174
- package/esm2022/lib/resources/types/action.mjs +0 -116
- package/esm2022/lib/resources/types/batch.mjs +0 -428
- package/esm2022/lib/resources/types/count.mjs +0 -33
- package/esm2022/lib/resources/types/entity-set.mjs +0 -131
- package/esm2022/lib/resources/types/entity.mjs +0 -112
- package/esm2022/lib/resources/types/function.mjs +0 -146
- package/esm2022/lib/resources/types/index.mjs +0 -15
- package/esm2022/lib/resources/types/media.mjs +0 -44
- package/esm2022/lib/resources/types/metadata.mjs +0 -35
- package/esm2022/lib/resources/types/navigation-property.mjs +0 -256
- package/esm2022/lib/resources/types/options.mjs +0 -2
- package/esm2022/lib/resources/types/property.mjs +0 -197
- package/esm2022/lib/resources/types/reference.mjs +0 -87
- package/esm2022/lib/resources/types/singleton.mjs +0 -130
- package/esm2022/lib/resources/types/value.mjs +0 -48
- package/esm2022/lib/schema/annotation.mjs +0 -37
- package/esm2022/lib/schema/callable.mjs +0 -66
- package/esm2022/lib/schema/element.mjs +0 -67
- package/esm2022/lib/schema/entity-container.mjs +0 -11
- package/esm2022/lib/schema/entity-set.mjs +0 -9
- package/esm2022/lib/schema/enum-type.mjs +0 -68
- package/esm2022/lib/schema/index.mjs +0 -9
- package/esm2022/lib/schema/parsers/callable.mjs +0 -110
- package/esm2022/lib/schema/parsers/edm.mjs +0 -101
- package/esm2022/lib/schema/parsers/enum-type.mjs +0 -130
- package/esm2022/lib/schema/parsers/index.mjs +0 -5
- package/esm2022/lib/schema/parsers/structured-type.mjs +0 -514
- package/esm2022/lib/schema/schema.mjs +0 -45
- package/esm2022/lib/schema/singleton.mjs +0 -9
- package/esm2022/lib/schema/structured-type.mjs +0 -213
- package/esm2022/lib/services/base.mjs +0 -29
- package/esm2022/lib/services/entity-set.mjs +0 -155
- package/esm2022/lib/services/entity.mjs +0 -12
- package/esm2022/lib/services/factory.mjs +0 -44
- package/esm2022/lib/services/index.mjs +0 -5
- package/esm2022/lib/services/singleton.mjs +0 -54
- package/esm2022/lib/settings.mjs +0 -112
- package/esm2022/lib/types.mjs +0 -118
- package/esm2022/lib/utils/arraybuffers.mjs +0 -46
- package/esm2022/lib/utils/arrays.mjs +0 -10
- package/esm2022/lib/utils/dates.mjs +0 -18
- package/esm2022/lib/utils/durations.mjs +0 -40
- package/esm2022/lib/utils/enums.mjs +0 -61
- package/esm2022/lib/utils/http.mjs +0 -95
- package/esm2022/lib/utils/index.mjs +0 -10
- package/esm2022/lib/utils/objects.mjs +0 -204
- package/esm2022/lib/utils/odata.mjs +0 -22
- package/esm2022/lib/utils/strings.mjs +0 -20
- package/esm2022/lib/utils/types.mjs +0 -136
- package/esm2022/lib/utils/urls.mjs +0 -24
- package/esm2022/public-api.mjs +0 -5
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { map } from 'rxjs/operators';
|
|
2
|
-
import { PathSegment } from '../../types';
|
|
3
|
-
import { ODataPathSegments } from '../path';
|
|
4
|
-
import { ODataResource } from '../resource';
|
|
5
|
-
export class ODataActionResource extends ODataResource {
|
|
6
|
-
//#region Factory
|
|
7
|
-
static factory(api, { path, outgoingType, incomingType, bindingType, segments, }) {
|
|
8
|
-
segments = segments ?? new ODataPathSegments();
|
|
9
|
-
const segment = segments.add(PathSegment.action, path);
|
|
10
|
-
if (outgoingType !== undefined) {
|
|
11
|
-
segment.outgoingType(outgoingType);
|
|
12
|
-
}
|
|
13
|
-
if (incomingType !== undefined) {
|
|
14
|
-
segment.incomingType(incomingType);
|
|
15
|
-
}
|
|
16
|
-
if (bindingType !== undefined) {
|
|
17
|
-
segment.bindingType(bindingType);
|
|
18
|
-
}
|
|
19
|
-
return new ODataActionResource(api, { segments });
|
|
20
|
-
}
|
|
21
|
-
static fromResource(resource, path) {
|
|
22
|
-
const baseType = resource.outgoingType();
|
|
23
|
-
const callable = resource.api.findCallable(path, baseType);
|
|
24
|
-
const bindingType = callable?.binding()?.type;
|
|
25
|
-
const action = ODataActionResource.factory(resource.api, {
|
|
26
|
-
path,
|
|
27
|
-
outgoingType: callable?.type(),
|
|
28
|
-
incomingType: callable?.returnType(),
|
|
29
|
-
bindingType: bindingType,
|
|
30
|
-
segments: resource.cloneSegments(),
|
|
31
|
-
});
|
|
32
|
-
// Switch entitySet to binding type if available
|
|
33
|
-
if (bindingType !== undefined && bindingType !== baseType) {
|
|
34
|
-
let entitySet = resource.api.findEntitySet(bindingType);
|
|
35
|
-
if (entitySet !== undefined) {
|
|
36
|
-
action.segment((s) => s.entitySet().path(entitySet.name));
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return action;
|
|
40
|
-
}
|
|
41
|
-
clone() {
|
|
42
|
-
return super.clone();
|
|
43
|
-
}
|
|
44
|
-
//#endregion
|
|
45
|
-
//#region Requests
|
|
46
|
-
post(params, options) {
|
|
47
|
-
return super.post(params, options);
|
|
48
|
-
}
|
|
49
|
-
call(params, options = {}) {
|
|
50
|
-
return this.clone().post(params, options);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Execute the action and return the result as a property
|
|
54
|
-
* @param params Parameters for the action
|
|
55
|
-
* @param options Options for the request
|
|
56
|
-
* @returns Observable of the result of the action
|
|
57
|
-
*/
|
|
58
|
-
callProperty(params, options = {}) {
|
|
59
|
-
return this.call(params, { responseType: 'property', ...options }).pipe(map(({ property }) => property));
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Execute the action and return the result as a entity
|
|
63
|
-
* @param params Parameters for the action
|
|
64
|
-
* @param options Options for the request
|
|
65
|
-
* @returns Observable of the result of the action
|
|
66
|
-
*/
|
|
67
|
-
callEntity(params, options = {}) {
|
|
68
|
-
return this.call(params, { responseType: 'entity', ...options }).pipe(map(({ entity }) => entity));
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Execute the action and return the result as a model
|
|
72
|
-
* @param params Parameters for the action
|
|
73
|
-
* @param options Options for the request
|
|
74
|
-
* @returns Observable of the result of the action
|
|
75
|
-
*/
|
|
76
|
-
callModel(params, options = {}) {
|
|
77
|
-
return this.call(params, { responseType: 'entity', ...options }).pipe(map(({ entity, annots }) => entity
|
|
78
|
-
? this.asModel(entity, { annots, ModelType: options?.ModelType })
|
|
79
|
-
: null));
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Execute the action and return the result as a entities
|
|
83
|
-
* @param params Parameters for the action
|
|
84
|
-
* @param options Options for the request
|
|
85
|
-
* @returns Observable of the result of the action
|
|
86
|
-
*/
|
|
87
|
-
callEntities(params, options = {}) {
|
|
88
|
-
return this.call(params, { responseType: 'entities', ...options }).pipe(map(({ entities }) => entities));
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Execute the action and return the result as a collection
|
|
92
|
-
* @param params Parameters for the action
|
|
93
|
-
* @param options Options for the request
|
|
94
|
-
* @returns Observable of the result of the action
|
|
95
|
-
*/
|
|
96
|
-
callCollection(params, options = {}) {
|
|
97
|
-
return this.call(params, { responseType: 'entities', ...options }).pipe(map(({ entities, annots }) => entities
|
|
98
|
-
? this.asCollection(entities, {
|
|
99
|
-
annots,
|
|
100
|
-
CollectionType: options?.CollectionType,
|
|
101
|
-
})
|
|
102
|
-
: null));
|
|
103
|
-
}
|
|
104
|
-
//#endregion
|
|
105
|
-
callArraybuffer(params, { alias, ...options } = {}) {
|
|
106
|
-
return this.call(params, {
|
|
107
|
-
responseType: 'arraybuffer',
|
|
108
|
-
alias,
|
|
109
|
-
...options,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
callBlob(params, { alias, ...options } = {}) {
|
|
113
|
-
return this.call(params, { responseType: 'blob', alias, ...options });
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3Jlc291cmNlcy90eXBlcy9hY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFTNUMsTUFBTSxPQUFPLG1CQUEwQixTQUFRLGFBQWdCO0lBQzdELGlCQUFpQjtJQUNqQixNQUFNLENBQUMsT0FBTyxDQUNaLEdBQWEsRUFDYixFQUNFLElBQUksRUFDSixZQUFZLEVBQ1osWUFBWSxFQUNaLFdBQVcsRUFDWCxRQUFRLEdBT1Q7UUFFRCxRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUUvQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7WUFDOUIsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNwQztRQUNELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUM3QixPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxJQUFJLG1CQUFtQixDQUFPLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELE1B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QUFFO1FBRTlELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT0RhdGFBcGkgfSBmcm9tICcuLi8uLi9hcGknO1xuaW1wb3J0IHsgT0RhdGFDb2xsZWN0aW9uLCBPRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IFBhdGhTZWdtZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgT0RhdGFQYXRoU2VnbWVudHMgfSBmcm9tICcuLi9wYXRoJztcbmltcG9ydCB7IE9EYXRhUmVzb3VyY2UgfSBmcm9tICcuLi9yZXNvdXJjZSc7XG5pbXBvcnQge1xuICBPRGF0YUVudGl0aWVzT3B0aW9ucyxcbiAgT0RhdGFFbnRpdHlPcHRpb25zLFxuICBPRGF0YU9wdGlvbnMsXG4gIE9EYXRhUHJvcGVydHlPcHRpb25zLFxufSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgT0RhdGFFbnRpdGllcywgT0RhdGFFbnRpdHksIE9EYXRhUHJvcGVydHkgfSBmcm9tICcuLi9yZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUFjdGlvblJlc291cmNlPFAsIFI+IGV4dGVuZHMgT0RhdGFSZXNvdXJjZTxSPiB7XG4gIC8vI3JlZ2lvbiBGYWN0b3J5XG4gIHN0YXRpYyBmYWN0b3J5PFAsIFI+KFxuICAgIGFwaTogT0RhdGFBcGksXG4gICAge1xuICAgICAgcGF0aCxcbiAgICAgIG91dGdvaW5nVHlwZSxcbiAgICAgIGluY29taW5nVHlwZSxcbiAgICAgIGJpbmRpbmdUeXBlLFxuICAgICAgc2VnbWVudHMsXG4gICAgfToge1xuICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgb3V0Z29pbmdUeXBlPzogc3RyaW5nO1xuICAgICAgaW5jb21pbmdUeXBlPzogc3RyaW5nO1xuICAgICAgYmluZGluZ1R5cGU/OiBzdHJpbmc7XG4gICAgICBzZWdtZW50cz86IE9EYXRhUGF0aFNlZ21lbnRzO1xuICAgIH0sXG4gICkge1xuICAgIHNlZ21lbnRzID0gc2VnbWVudHMgPz8gbmV3IE9EYXRhUGF0aFNlZ21lbnRzKCk7XG5cbiAgICBjb25zdCBzZWdtZW50ID0gc2VnbWVudHMuYWRkKFBhdGhTZWdtZW50LmFjdGlvbiwgcGF0aCk7XG4gICAgaWYgKG91dGdvaW5nVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWdtZW50Lm91dGdvaW5nVHlwZShvdXRnb2luZ1R5cGUpO1xuICAgIH1cbiAgICBpZiAoaW5jb21pbmdUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlZ21lbnQuaW5jb21pbmdUeXBlKGluY29taW5nVHlwZSk7XG4gICAgfVxuICAgIGlmIChiaW5kaW5nVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWdtZW50LmJpbmRpbmdUeXBlKGJpbmRpbmdUeXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPRGF0YUFjdGlvblJlc291cmNlPFAsIFI+KGFwaSwgeyBzZWdtZW50cyB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tUmVzb3VyY2U8UCwgUj4ocmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8YW55PiwgcGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZVR5cGUgPSByZXNvdXJjZS5vdXRnb2luZ1R5cGUoKTtcbiAgICBjb25zdCBjYWxsYWJsZSA9IHJlc291cmNlLmFwaS5maW5kQ2FsbGFibGU8Uj4ocGF0aCwgYmFzZVR5cGUpO1xuICAgIGNvbnN0IGJpbmRpbmdUeXBlID0gY2FsbGFibGU/LmJpbmRpbmcoKT8udHlwZTtcblxuICAgIGNvbnN0IGFjdGlvbiA9IE9EYXRhQWN0aW9uUmVzb3VyY2UuZmFjdG9yeTxQLCBSPihyZXNvdXJjZS5hcGksIHtcbiAgICAgIHBhdGgsXG4gICAgICBvdXRnb2luZ1R5cGU6IGNhbGxhYmxlPy50eXBlKCksXG4gICAgICBpbmNvbWluZ1R5cGU6IGNhbGxhYmxlPy5yZXR1cm5UeXBlKCksXG4gICAgICBiaW5kaW5nVHlwZTogYmluZGluZ1R5cGUsXG4gICAgICBzZWdtZW50czogcmVzb3VyY2UuY2xvbmVTZWdtZW50cygpLFxuICAgIH0pO1xuXG4gICAgLy8gU3dpdGNoIGVudGl0eVNldCB0byBiaW5kaW5nIHR5cGUgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWQgJiYgYmluZGluZ1R5cGUgIT09IGJhc2VUeXBlKSB7XG4gICAgICBsZXQgZW50aXR5U2V0ID0gcmVzb3VyY2UuYXBpLmZpbmRFbnRpdHlTZXQoYmluZGluZ1R5cGUpO1xuICAgICAgaWYgKGVudGl0eVNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjdGlvbi5zZWdtZW50KChzKSA9PiBzLmVudGl0eVNldCgpLnBhdGgoZW50aXR5U2V0IS5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IE9EYXRhQWN0aW9uUmVzb3VyY2U8UCwgUj4ge1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIE9EYXRhQWN0aW9uUmVzb3VyY2U8UCwgUj47XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFJlcXVlc3RzXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwb3N0KFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IE9EYXRhRW50aXR5T3B0aW9ucyAmIE9EYXRhRW50aXRpZXNPcHRpb25zICYgT0RhdGFQcm9wZXJ0eU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHN1cGVyLnBvc3QocGFyYW1zLCBvcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU2hvcnRjdXRzXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIHRvIGJlIHNlbnQgdG8gdGhlIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKi9cbiAgY2FsbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM/OiBPRGF0YUVudGl0eU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8T0RhdGFFbnRpdHk8Uj4+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IE9EYXRhRW50aXRpZXNPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPE9EYXRhRW50aXRpZXM8Uj4+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IE9EYXRhUHJvcGVydHlPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUHJvcGVydHk8Uj4+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IHsgYWxpYXM/OiBib29sZWFuOyByZXNwb25zZVR5cGU/OiAnYmxvYicgfSAmIE9EYXRhT3B0aW9ucyxcbiAgKTogT2JzZXJ2YWJsZTxCbG9iPjtcbiAgY2FsbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM/OiB7IGFsaWFzPzogYm9vbGVhbjsgcmVzcG9uc2VUeXBlPzogJ2FycmF5YnVmZmVyJyB9ICYgT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPjtcbiAgY2FsbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM/OiB7IGFsaWFzPzogYm9vbGVhbjsgcmVzcG9uc2VUeXBlPzogJ25vbmUnIH0gJiBPRGF0YU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8bnVsbD47XG4gIGNhbGwoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YUVudGl0eU9wdGlvbnMgJlxuICAgICAgT0RhdGFFbnRpdGllc09wdGlvbnMgJlxuICAgICAgT0RhdGFQcm9wZXJ0eU9wdGlvbnMgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLnBvc3QocGFyYW1zLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBhY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgcHJvcGVydHlcbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uXG4gICAqL1xuICBjYWxsUHJvcGVydHkoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YU9wdGlvbnMgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxSIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZTogJ3Byb3BlcnR5JywgLi4ub3B0aW9ucyB9KS5waXBlKFxuICAgICAgbWFwKCh7IHByb3BlcnR5IH0pID0+IHByb3BlcnR5KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGFjdGlvbiBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBlbnRpdHlcbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uXG4gICAqL1xuICBjYWxsRW50aXR5KFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zID0ge30sXG4gICk6IE9ic2VydmFibGU8UiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGU6ICdlbnRpdHknLCAuLi5vcHRpb25zIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXR5IH0pID0+IGVudGl0eSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBhY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgbW9kZWxcbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uXG4gICAqL1xuICBjYWxsTW9kZWw8TSBleHRlbmRzIE9EYXRhTW9kZWw8Uj4+KFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYgeyBNb2RlbFR5cGU/OiB0eXBlb2YgT0RhdGFNb2RlbCB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8TSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGU6ICdlbnRpdHknLCAuLi5vcHRpb25zIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXR5LCBhbm5vdHMgfSkgPT5cbiAgICAgICAgZW50aXR5XG4gICAgICAgICAgPyB0aGlzLmFzTW9kZWw8TT4oZW50aXR5LCB7IGFubm90cywgTW9kZWxUeXBlOiBvcHRpb25zPy5Nb2RlbFR5cGUgfSlcbiAgICAgICAgICA6IG51bGwsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgYWN0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhIGVudGl0aWVzXG4gICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHRoZSByZXN1bHQgb2YgdGhlIGFjdGlvblxuICAgKi9cbiAgY2FsbEVudGl0aWVzKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zID0ge30sXG4gICk6IE9ic2VydmFibGU8UltdIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZTogJ2VudGl0aWVzJywgLi4ub3B0aW9ucyB9KS5waXBlKFxuICAgICAgbWFwKCh7IGVudGl0aWVzIH0pID0+IGVudGl0aWVzKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGFjdGlvbiBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHRoZSByZXN1bHQgb2YgdGhlIGFjdGlvblxuICAgKi9cbiAgY2FsbENvbGxlY3Rpb248TSBleHRlbmRzIE9EYXRhTW9kZWw8Uj4sIEMgZXh0ZW5kcyBPRGF0YUNvbGxlY3Rpb248UiwgTT4+KFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYgeyBDb2xsZWN0aW9uVHlwZT86IHR5cGVvZiBPRGF0YUNvbGxlY3Rpb24gfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPEMgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLCAuLi5vcHRpb25zIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXRpZXMsIGFubm90cyB9KSA9PlxuICAgICAgICBlbnRpdGllc1xuICAgICAgICAgID8gdGhpcy5hc0NvbGxlY3Rpb248TSwgQz4oZW50aXRpZXMsIHtcbiAgICAgICAgICAgICAgYW5ub3RzLFxuICAgICAgICAgICAgICBDb2xsZWN0aW9uVHlwZTogb3B0aW9ucz8uQ29sbGVjdGlvblR5cGUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBjYWxsQXJyYXlidWZmZXIoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICB7IGFsaWFzLCAuLi5vcHRpb25zIH06IHsgYWxpYXM/OiBib29sZWFuIH0gJiBPRGF0YU9wdGlvbnMgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxBcnJheUJ1ZmZlcj4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXG4gICAgICBhbGlhcyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBjYWxsQmxvYihcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHsgYWxpYXMsIC4uLm9wdGlvbnMgfTogeyBhbGlhcz86IGJvb2xlYW4gfSAmIE9EYXRhT3B0aW9ucyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPEJsb2I+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGU6ICdibG9iJywgYWxpYXMsIC4uLm9wdGlvbnMgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,428 +0,0 @@
|
|
|
1
|
-
import { HttpErrorResponse, HttpHeaders, HttpResponse, } from '@angular/common/http';
|
|
2
|
-
import { map, Subject } from 'rxjs';
|
|
3
|
-
import { $BATCH, ACCEPT, APPLICATION_HTTP, APPLICATION_JSON, BATCH_PREFIX, BINARY, BOUNDARY_PREFIX_SUFFIX, CHANGESET_PREFIX, CONTENT_ID, CONTENT_TRANSFER_ENCODING, CONTENT_TYPE, HTTP11, MULTIPART_MIXED, MULTIPART_MIXED_BOUNDARY, NEWLINE, NEWLINE_REGEXP, ODATA_VERSION, VERSION_4_0, XSSI_PREFIX, } from '../../constants';
|
|
4
|
-
import { PathSegment } from '../../types';
|
|
5
|
-
import { Arrays } from '../../utils/arrays';
|
|
6
|
-
import { Http } from '../../utils/http';
|
|
7
|
-
import { Strings } from '../../utils/strings';
|
|
8
|
-
import { ODataPathSegments } from '../path';
|
|
9
|
-
import { ODataResource } from '../resource';
|
|
10
|
-
export class ODataBatchRequest extends Subject {
|
|
11
|
-
constructor(request) {
|
|
12
|
-
super();
|
|
13
|
-
this.request = request;
|
|
14
|
-
this.id = Strings.uniqueId({ prefix: 'r' });
|
|
15
|
-
this.group = Strings.uniqueId({ prefix: 'g' });
|
|
16
|
-
}
|
|
17
|
-
toString() {
|
|
18
|
-
return this.toLegacy();
|
|
19
|
-
}
|
|
20
|
-
toLegacy({ relativeUrls } = {}) {
|
|
21
|
-
//TODO: Relative or Absolute url ?
|
|
22
|
-
let res = [
|
|
23
|
-
`${this.request.method} ${relativeUrls ? this.request.pathWithParams : this.request.urlWithParams} ${HTTP11}`,
|
|
24
|
-
];
|
|
25
|
-
if (this.request.method === 'POST' ||
|
|
26
|
-
this.request.method === 'PATCH' ||
|
|
27
|
-
this.request.method === 'PUT') {
|
|
28
|
-
res.push(`${CONTENT_TYPE}: ${APPLICATION_JSON}`);
|
|
29
|
-
}
|
|
30
|
-
if (this.request.headers instanceof HttpHeaders) {
|
|
31
|
-
let headers = this.request.headers;
|
|
32
|
-
res = [
|
|
33
|
-
...res,
|
|
34
|
-
...headers
|
|
35
|
-
.keys()
|
|
36
|
-
.map((key) => `${key}: ${(headers.getAll(key) || []).join(',')}`),
|
|
37
|
-
];
|
|
38
|
-
}
|
|
39
|
-
if (this.request.method === 'GET' || this.request.method === 'DELETE') {
|
|
40
|
-
res.push(NEWLINE);
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
res.push(`${NEWLINE}${JSON.stringify(this.request.body)}`);
|
|
44
|
-
}
|
|
45
|
-
return res.join(NEWLINE);
|
|
46
|
-
}
|
|
47
|
-
toJson({ relativeUrls } = {}) {
|
|
48
|
-
let res = {
|
|
49
|
-
id: this.id,
|
|
50
|
-
method: this.request.method,
|
|
51
|
-
url: relativeUrls
|
|
52
|
-
? this.request.pathWithParams
|
|
53
|
-
: this.request.urlWithParams,
|
|
54
|
-
//'atomicityGroup': this.group
|
|
55
|
-
//"dependsOn": ["g1", "g2", "r2"]
|
|
56
|
-
};
|
|
57
|
-
if (this.request.headers instanceof HttpHeaders) {
|
|
58
|
-
let headers = this.request.headers;
|
|
59
|
-
res['headers'] = headers
|
|
60
|
-
.keys()
|
|
61
|
-
.map((key) => `${key}: ${(headers.getAll(key) || []).join(',')}`);
|
|
62
|
-
}
|
|
63
|
-
if (!(this.request.method === 'GET' || this.request.method === 'DELETE')) {
|
|
64
|
-
res['body'] = this.request.body;
|
|
65
|
-
}
|
|
66
|
-
return res;
|
|
67
|
-
}
|
|
68
|
-
onLoad(response) {
|
|
69
|
-
if (response.ok) {
|
|
70
|
-
this.next(response);
|
|
71
|
-
this.complete();
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
// An unsuccessful request is delivered on the error channel.
|
|
75
|
-
this.error(response);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
onError(response) {
|
|
79
|
-
this.error(response);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* OData Batch Resource
|
|
84
|
-
* https://www.odata.org/getting-started/advanced-tutorial/#batch
|
|
85
|
-
*/
|
|
86
|
-
export class ODataBatchResource extends ODataResource {
|
|
87
|
-
constructor() {
|
|
88
|
-
super(...arguments);
|
|
89
|
-
// VARIABLES
|
|
90
|
-
this._requests = [];
|
|
91
|
-
this._responses = null;
|
|
92
|
-
}
|
|
93
|
-
requests() {
|
|
94
|
-
return this._requests.map((r) => r.request);
|
|
95
|
-
}
|
|
96
|
-
responses() {
|
|
97
|
-
return this._responses;
|
|
98
|
-
}
|
|
99
|
-
//#region Factory
|
|
100
|
-
static factory(api) {
|
|
101
|
-
let segments = new ODataPathSegments();
|
|
102
|
-
segments.add(PathSegment.batch, $BATCH);
|
|
103
|
-
return new ODataBatchResource(api, { segments });
|
|
104
|
-
}
|
|
105
|
-
clone() {
|
|
106
|
-
const batch = super.clone();
|
|
107
|
-
batch._requests = [...this._requests];
|
|
108
|
-
return batch;
|
|
109
|
-
}
|
|
110
|
-
//#endregion
|
|
111
|
-
storeRequester() {
|
|
112
|
-
const current = this.api.requester;
|
|
113
|
-
// Switch to the batch requester
|
|
114
|
-
this.api.requester = (req) => {
|
|
115
|
-
if (req.api !== this.api)
|
|
116
|
-
throw new Error('Batch Request are for the same api.');
|
|
117
|
-
if (req.observe === 'events')
|
|
118
|
-
throw new Error("Batch Request does not allows observe == 'events'.");
|
|
119
|
-
this._requests.push(new ODataBatchRequest(req));
|
|
120
|
-
return this._requests[this._requests.length - 1];
|
|
121
|
-
};
|
|
122
|
-
return current;
|
|
123
|
-
}
|
|
124
|
-
restoreRequester(handler) {
|
|
125
|
-
this.api.requester = handler;
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Add to batch request
|
|
129
|
-
* @param ctx The context for the request
|
|
130
|
-
* @returns The result of execute the context
|
|
131
|
-
*/
|
|
132
|
-
add(ctx) {
|
|
133
|
-
// Store original requester
|
|
134
|
-
var handler = this.storeRequester();
|
|
135
|
-
// Execute the context
|
|
136
|
-
const result = ctx(this);
|
|
137
|
-
// Restore original requester
|
|
138
|
-
this.restoreRequester(handler);
|
|
139
|
-
return result;
|
|
140
|
-
}
|
|
141
|
-
send(options) {
|
|
142
|
-
if (this.api.options.jsonBatchFormat) {
|
|
143
|
-
return this.sendJson(options);
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
return this.sendLegacy(options);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
sendJson(options) {
|
|
150
|
-
const headers = Http.mergeHttpHeaders((options && options.headers) || {}, {
|
|
151
|
-
[ODATA_VERSION]: VERSION_4_0,
|
|
152
|
-
});
|
|
153
|
-
return this.api
|
|
154
|
-
.request('POST', this, {
|
|
155
|
-
body: ODataBatchResource.buildJsonBody(this._requests, this.api.options),
|
|
156
|
-
responseType: 'json',
|
|
157
|
-
observe: 'response',
|
|
158
|
-
headers: headers,
|
|
159
|
-
params: options ? options.params : undefined,
|
|
160
|
-
withCredentials: options ? options.withCredentials : undefined,
|
|
161
|
-
})
|
|
162
|
-
.pipe(map((response) => {
|
|
163
|
-
if (this._responses == null) {
|
|
164
|
-
this._responses = [];
|
|
165
|
-
}
|
|
166
|
-
this._responses = [
|
|
167
|
-
...this._responses,
|
|
168
|
-
...ODataBatchResource.parseJsonResponse(this._requests, response),
|
|
169
|
-
];
|
|
170
|
-
//HACK: tuple[1] === undefined
|
|
171
|
-
Arrays.zip(this._requests, this._responses).forEach((tuple) => {
|
|
172
|
-
if (!tuple[0].isStopped && tuple[1])
|
|
173
|
-
tuple[0].onLoad(tuple[1]);
|
|
174
|
-
});
|
|
175
|
-
return response;
|
|
176
|
-
}));
|
|
177
|
-
}
|
|
178
|
-
sendLegacy(options) {
|
|
179
|
-
const bound = Strings.uniqueId({ prefix: BATCH_PREFIX });
|
|
180
|
-
const headers = Http.mergeHttpHeaders((options && options.headers) || {}, {
|
|
181
|
-
[ODATA_VERSION]: VERSION_4_0,
|
|
182
|
-
[CONTENT_TYPE]: MULTIPART_MIXED_BOUNDARY + bound,
|
|
183
|
-
[ACCEPT]: MULTIPART_MIXED,
|
|
184
|
-
});
|
|
185
|
-
return this.api
|
|
186
|
-
.request('POST', this, {
|
|
187
|
-
body: ODataBatchResource.buildLegacyBody(bound, this._requests, this.api.options),
|
|
188
|
-
responseType: 'text',
|
|
189
|
-
observe: 'response',
|
|
190
|
-
headers: headers,
|
|
191
|
-
params: options ? options.params : undefined,
|
|
192
|
-
withCredentials: options ? options.withCredentials : undefined,
|
|
193
|
-
})
|
|
194
|
-
.pipe(map((response) => {
|
|
195
|
-
if (this._responses == null) {
|
|
196
|
-
this._responses = [];
|
|
197
|
-
}
|
|
198
|
-
this._responses = [
|
|
199
|
-
...this._responses,
|
|
200
|
-
...ODataBatchResource.parseLegacyResponse(this._requests, response),
|
|
201
|
-
];
|
|
202
|
-
Arrays.zip(this._requests, this._responses).forEach((tuple) => {
|
|
203
|
-
if (!tuple[0].isStopped && tuple[1])
|
|
204
|
-
tuple[0].onLoad(tuple[1]);
|
|
205
|
-
});
|
|
206
|
-
return response;
|
|
207
|
-
}));
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Execute the batch request
|
|
211
|
-
* @param ctx The context for the request
|
|
212
|
-
* @param options The options of the batch request
|
|
213
|
-
* @returns The result of execute the context
|
|
214
|
-
*/
|
|
215
|
-
exec(ctx, options) {
|
|
216
|
-
let result = this.add(ctx);
|
|
217
|
-
return this.send(options).pipe(map((response) => [result, response]));
|
|
218
|
-
}
|
|
219
|
-
body() {
|
|
220
|
-
return ODataBatchResource.buildLegacyBody(Strings.uniqueId({ prefix: BATCH_PREFIX }), this._requests, this.api.options);
|
|
221
|
-
}
|
|
222
|
-
json() {
|
|
223
|
-
return ODataBatchResource.buildJsonBody(this._requests, this.api.options);
|
|
224
|
-
}
|
|
225
|
-
static buildLegacyBody(batchBoundary, requests, options) {
|
|
226
|
-
let res = [];
|
|
227
|
-
let changesetBoundary = null;
|
|
228
|
-
let changesetId = 1;
|
|
229
|
-
for (const request of requests) {
|
|
230
|
-
// if method is GET and there is a changeset boundary open then close it
|
|
231
|
-
if (request.request.method === 'GET' && changesetBoundary !== null) {
|
|
232
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${changesetBoundary}${BOUNDARY_PREFIX_SUFFIX}`);
|
|
233
|
-
changesetBoundary = null;
|
|
234
|
-
}
|
|
235
|
-
// if there is no changeset boundary open then open a batch boundary
|
|
236
|
-
if (changesetBoundary === null) {
|
|
237
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${batchBoundary}`);
|
|
238
|
-
}
|
|
239
|
-
// if method is not GET and there is no changeset boundary open then open a changeset boundary
|
|
240
|
-
if (request.request.method !== 'GET') {
|
|
241
|
-
if (changesetBoundary === null) {
|
|
242
|
-
changesetBoundary = Strings.uniqueId({ prefix: CHANGESET_PREFIX });
|
|
243
|
-
res.push(`${CONTENT_TYPE}: ${MULTIPART_MIXED_BOUNDARY}${changesetBoundary}`);
|
|
244
|
-
res.push(NEWLINE);
|
|
245
|
-
}
|
|
246
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${changesetBoundary}`);
|
|
247
|
-
}
|
|
248
|
-
res.push(`${CONTENT_TYPE}: ${APPLICATION_HTTP}`);
|
|
249
|
-
res.push(`${CONTENT_TRANSFER_ENCODING}: ${BINARY}`);
|
|
250
|
-
if (request.request.method !== 'GET') {
|
|
251
|
-
res.push(`${CONTENT_ID}: ${changesetId++}`);
|
|
252
|
-
}
|
|
253
|
-
res.push(NEWLINE);
|
|
254
|
-
res.push(`${request.toLegacy(options)}`);
|
|
255
|
-
}
|
|
256
|
-
if (res.length) {
|
|
257
|
-
if (changesetBoundary !== null) {
|
|
258
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${changesetBoundary}${BOUNDARY_PREFIX_SUFFIX}`);
|
|
259
|
-
changesetBoundary = null;
|
|
260
|
-
}
|
|
261
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${batchBoundary}${BOUNDARY_PREFIX_SUFFIX}`);
|
|
262
|
-
}
|
|
263
|
-
return res.join(NEWLINE);
|
|
264
|
-
}
|
|
265
|
-
static buildJsonBody(requests, options) {
|
|
266
|
-
return {
|
|
267
|
-
requests: requests.map((request) => request.toJson(options)),
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
static parseLegacyResponse(requests, response) {
|
|
271
|
-
let chunks = [];
|
|
272
|
-
const contentType = response.headers.get(CONTENT_TYPE) || '';
|
|
273
|
-
const batchBoundary = Http.boundaryDelimiter(contentType);
|
|
274
|
-
const endLine = Http.boundaryEnd(batchBoundary);
|
|
275
|
-
const lines = (response.body || '').split(NEWLINE_REGEXP);
|
|
276
|
-
let changesetResponses = null;
|
|
277
|
-
let contentId = null;
|
|
278
|
-
let changesetBoundary = null;
|
|
279
|
-
let changesetEndLine = null;
|
|
280
|
-
let startIndex = null;
|
|
281
|
-
for (let index = 0; index < lines.length; index++) {
|
|
282
|
-
const line = lines[index];
|
|
283
|
-
if (line.startsWith(CONTENT_TYPE)) {
|
|
284
|
-
const contentTypeValue = Http.headerValue(line);
|
|
285
|
-
if (contentTypeValue === MULTIPART_MIXED) {
|
|
286
|
-
changesetResponses = [];
|
|
287
|
-
contentId = null;
|
|
288
|
-
changesetBoundary = Http.boundaryDelimiter(line);
|
|
289
|
-
changesetEndLine = Http.boundaryEnd(changesetBoundary);
|
|
290
|
-
startIndex = null;
|
|
291
|
-
}
|
|
292
|
-
continue;
|
|
293
|
-
}
|
|
294
|
-
else if (changesetResponses !== null && line.startsWith(CONTENT_ID)) {
|
|
295
|
-
contentId = Number(Http.headerValue(line));
|
|
296
|
-
}
|
|
297
|
-
else if (line.startsWith(HTTP11)) {
|
|
298
|
-
startIndex = index;
|
|
299
|
-
}
|
|
300
|
-
else if (line === batchBoundary ||
|
|
301
|
-
line === changesetBoundary ||
|
|
302
|
-
line === endLine ||
|
|
303
|
-
line === changesetEndLine) {
|
|
304
|
-
if (!startIndex) {
|
|
305
|
-
continue;
|
|
306
|
-
}
|
|
307
|
-
const chunk = lines.slice(startIndex, index);
|
|
308
|
-
if (changesetResponses !== null && contentId !== null) {
|
|
309
|
-
changesetResponses[contentId] = chunk;
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
chunks.push(chunk);
|
|
313
|
-
}
|
|
314
|
-
if (line === batchBoundary || line === changesetBoundary) {
|
|
315
|
-
startIndex = index + 1;
|
|
316
|
-
}
|
|
317
|
-
else if (line === endLine || line === changesetEndLine) {
|
|
318
|
-
if (changesetResponses !== null) {
|
|
319
|
-
for (const response of changesetResponses) {
|
|
320
|
-
if (response) {
|
|
321
|
-
chunks.push(response);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
changesetResponses = null;
|
|
326
|
-
changesetBoundary = null;
|
|
327
|
-
changesetEndLine = null;
|
|
328
|
-
startIndex = null;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
return chunks.map((chunk, index) => {
|
|
333
|
-
let request = requests[index].request;
|
|
334
|
-
let { code, message } = Http.parseResponseStatus(chunk[0]);
|
|
335
|
-
chunk = chunk.slice(1);
|
|
336
|
-
let headers = new HttpHeaders();
|
|
337
|
-
var index = 1;
|
|
338
|
-
for (; index < chunk.length; index++) {
|
|
339
|
-
const batchBodyLine = chunk[index];
|
|
340
|
-
if (batchBodyLine === '') {
|
|
341
|
-
break;
|
|
342
|
-
}
|
|
343
|
-
const batchBodyLineParts = batchBodyLine.split(': ');
|
|
344
|
-
headers = headers.append(batchBodyLineParts[0].trim(), batchBodyLineParts[1].trim());
|
|
345
|
-
}
|
|
346
|
-
let body = '';
|
|
347
|
-
for (; index < chunk.length; index++) {
|
|
348
|
-
body += chunk[index];
|
|
349
|
-
}
|
|
350
|
-
if (code === 0) {
|
|
351
|
-
code = !!body ? 200 : 0;
|
|
352
|
-
}
|
|
353
|
-
let ok = code >= 200 && code < 300;
|
|
354
|
-
if (request.responseType === 'json' && typeof body === 'string') {
|
|
355
|
-
const originalBody = body;
|
|
356
|
-
body = body.replace(XSSI_PREFIX, '');
|
|
357
|
-
try {
|
|
358
|
-
body = body !== '' ? JSON.parse(body) : null;
|
|
359
|
-
}
|
|
360
|
-
catch (error) {
|
|
361
|
-
body = originalBody;
|
|
362
|
-
if (ok) {
|
|
363
|
-
ok = false;
|
|
364
|
-
body = { error, text: body };
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
return ok
|
|
369
|
-
? new HttpResponse({
|
|
370
|
-
body,
|
|
371
|
-
headers,
|
|
372
|
-
status: code,
|
|
373
|
-
statusText: message,
|
|
374
|
-
url: request.urlWithParams,
|
|
375
|
-
})
|
|
376
|
-
: new HttpErrorResponse({
|
|
377
|
-
// The error in this case is the response body (error from the server).
|
|
378
|
-
error: body,
|
|
379
|
-
headers,
|
|
380
|
-
status: code,
|
|
381
|
-
statusText: message,
|
|
382
|
-
url: request.urlWithParams,
|
|
383
|
-
});
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
|
-
static parseJsonResponse(requests, response) {
|
|
387
|
-
const responses = (response.body ? response.body : {})['responses'] ?? [];
|
|
388
|
-
return responses.map((response, index) => {
|
|
389
|
-
let request = requests[index].request;
|
|
390
|
-
let code = response['status'];
|
|
391
|
-
let headers = new HttpHeaders(response['headers']);
|
|
392
|
-
let body = response['body'];
|
|
393
|
-
if (code === 0) {
|
|
394
|
-
code = !!body ? 200 : 0;
|
|
395
|
-
}
|
|
396
|
-
let ok = code >= 200 && code < 300;
|
|
397
|
-
if (request.responseType === 'json' && typeof body === 'string') {
|
|
398
|
-
const originalBody = body;
|
|
399
|
-
body = body.replace(XSSI_PREFIX, '');
|
|
400
|
-
try {
|
|
401
|
-
body = body !== '' ? JSON.parse(body) : null;
|
|
402
|
-
}
|
|
403
|
-
catch (error) {
|
|
404
|
-
body = originalBody;
|
|
405
|
-
if (ok) {
|
|
406
|
-
ok = false;
|
|
407
|
-
body = { error, text: body };
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
return ok
|
|
412
|
-
? new HttpResponse({
|
|
413
|
-
body,
|
|
414
|
-
headers,
|
|
415
|
-
status: code,
|
|
416
|
-
url: request.urlWithParams,
|
|
417
|
-
})
|
|
418
|
-
: new HttpErrorResponse({
|
|
419
|
-
// The error in this case is the response body (error from the server).
|
|
420
|
-
error: body,
|
|
421
|
-
headers,
|
|
422
|
-
status: code,
|
|
423
|
-
url: request.urlWithParams,
|
|
424
|
-
});
|
|
425
|
-
});
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3R5cGVzL2JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsV0FBVyxFQUNYLFlBQVksR0FFYixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLE1BQU0sRUFDTixzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsWUFBWSxFQUNaLE1BQU0sRUFDTixlQUFlLEVBQ2Ysd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxjQUFjLEVBQ2QsYUFBYSxFQUNiLFdBQVcsRUFDWCxXQUFXLEdBQ1osTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSzVDLE1BQU0sT0FBTyxpQkFBcUIsU0FBUSxPQUF5QjtJQUdqRSxZQUFtQixPQUEwQjtRQUMzQyxLQUFLLEVBQUUsQ0FBQztRQURTLFlBQU8sR0FBUCxPQUFPLENBQW1CO1FBRTNDLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFUSxRQUFRO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFFBQVEsQ0FBQyxFQUFFLFlBQVksS0FBaUMsRUFBRTtRQUN4RCxrQ0FBa0M7UUFDbEMsSUFBSSxHQUFHLEdBQUc7WUFDUixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUNwQixZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQzVELElBQUksTUFBTSxFQUFFO1NBQ2IsQ0FBQztRQUNGLElBQ0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssTUFBTTtZQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxPQUFPO1lBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLEtBQUssRUFDN0I7WUFDQSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxLQUFLLGdCQUFnQixFQUFFLENBQUMsQ0FBQztTQUNsRDtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLFlBQVksV0FBVyxFQUFFO1lBQy9DLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ25DLEdBQUcsR0FBRztnQkFDSixHQUFHLEdBQUc7Z0JBQ04sR0FBRyxPQUFPO3FCQUNQLElBQUksRUFBRTtxQkFDTixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzthQUNwRSxDQUFDO1NBQ0g7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDckUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNuQjthQUFNO1lBQ0wsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzVEO1FBRUQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBRSxZQUFZLEtBQWlDLEVBQUU7UUFDdEQsSUFBSSxHQUFHLEdBQTRCO1lBQ2pDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDM0IsR0FBRyxFQUFFLFlBQVk7Z0JBQ2YsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYztnQkFDN0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYTtZQUM5Qiw4QkFBOEI7WUFDOUIsaUNBQWlDO1NBQ2xDLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxZQUFZLFdBQVcsRUFBRTtZQUMvQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUNuQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTztpQkFDckIsSUFBSSxFQUFFO2lCQUNOLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDckU7UUFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLEVBQUU7WUFDeEUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1NBQ2pDO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQTBCO1FBQy9CLElBQUksUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2pCO2FBQU07WUFDTCw2REFBNkQ7WUFDN0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUE2QixDQUFDLENBQUM7U0FDM0M7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQTJCO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkIsQ0FBQztDQUNGO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGFBQWtCO0lBQTFEOztRQUNFLFlBQVk7UUFDSixjQUFTLEdBQTZCLEVBQUUsQ0FBQztRQUt6QyxlQUFVLEdBQThCLElBQUksQ0FBQztJQTJadkQsQ0FBQztJQS9aQyxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFHRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxpQkFBaUI7SUFDakIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFhO1FBQzFCLElBQUksUUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN2QyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDeEMsT0FBTyxJQUFJLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVRLEtBQUs7UUFDWixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxFQUF3QixDQUFDO1FBQ2xELEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxZQUFZO0lBRUosY0FBYztRQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUNuQyxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFzQixFQUFtQixFQUFFO1lBQy9ELElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRztnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ3pELElBQUksR0FBRyxDQUFDLE9BQU8sS0FBSyxRQUFRO2dCQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxpQkFBaUIsQ0FBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sZ0JBQWdCLENBQ3RCLE9BQWtFO1FBRWxFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBSSxHQUF1QjtRQUM1QiwyQkFBMkI7UUFDM0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BDLHNCQUFzQjtRQUN0QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQXNCO1FBQ3pCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMvQjthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVPLFFBQVEsQ0FBQyxPQUFzQjtRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN4RSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFdBQVc7U0FDN0IsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsR0FBRzthQUNaLE9BQU8sQ0FBUyxNQUFNLEVBQUUsSUFBSSxFQUFFO1lBQzdCLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxhQUFhLENBQ3BDLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQ2pCO1lBQ0QsWUFBWSxFQUFFLE1BQU07WUFDcEIsT0FBTyxFQUFFLFVBQVU7WUFDbkIsT0FBTyxFQUFFLE9BQU87WUFDaEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM1QyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQy9ELENBQUM7YUFDRCxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBK0IsRUFBRSxFQUFFO1lBQ3RDLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2FBQ3RCO1lBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRztnQkFDaEIsR0FBRyxJQUFJLENBQUMsVUFBVTtnQkFDbEIsR0FBRyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQzthQUNsRSxDQUFDO1lBQ0YsOEJBQThCO1lBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRSxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDO0lBRU8sVUFBVSxDQUNoQixPQUFzQjtRQUV0QixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDekQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDeEUsQ0FBQyxhQUFhLENBQUMsRUFBRSxXQUFXO1lBQzVCLENBQUMsWUFBWSxDQUFDLEVBQUUsd0JBQXdCLEdBQUcsS0FBSztZQUNoRCxDQUFDLE1BQU0sQ0FBQyxFQUFFLGVBQWU7U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsR0FBRzthQUNaLE9BQU8sQ0FBd0IsTUFBTSxFQUFFLElBQUksRUFBRTtZQUM1QyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsZUFBZSxDQUN0QyxLQUFLLEVBQ0wsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FDakI7WUFDRCxZQUFZLEVBQUUsTUFBTTtZQUNwQixPQUFPLEVBQUUsVUFBVTtZQUNuQixPQUFPLEVBQUUsT0FBTztZQUNoQixNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzVDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDL0QsQ0FBQzthQUNELElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxRQUErQixFQUFFLEVBQUU7WUFDdEMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTtnQkFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7YUFDdEI7WUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHO2dCQUNoQixHQUFHLElBQUksQ0FBQyxVQUFVO2dCQUNsQixHQUFHLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDO2FBQ3BFLENBQUM7WUFDRixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUM1RCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakUsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBSSxDQUNGLEdBQXVCLEVBQ3ZCLE9BQXNCO1FBRXRCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsSUFBSTtRQUNGLE9BQU8sa0JBQWtCLENBQUMsZUFBZSxDQUN2QyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQzFDLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQ2pCLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSTtRQUNGLE9BQU8sa0JBQWtCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FDcEIsYUFBcUIsRUFDckIsUUFBa0MsRUFDbEMsT0FBd0I7UUFFeEIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxpQkFBaUIsR0FBa0IsSUFBSSxDQUFDO1FBQzVDLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUVwQixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRTtZQUM5Qix3RUFBd0U7WUFDeEUsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxLQUFLLElBQUksaUJBQWlCLEtBQUssSUFBSSxFQUFFO2dCQUNsRSxHQUFHLENBQUMsSUFBSSxDQUNOLEdBQUcsc0JBQXNCLEdBQUcsaUJBQWlCLEdBQUcsc0JBQXNCLEVBQUUsQ0FDekUsQ0FBQztnQkFDRixpQkFBaUIsR0FBRyxJQUFJLENBQUM7YUFDMUI7WUFFRCxvRUFBb0U7WUFDcEUsSUFBSSxpQkFBaUIsS0FBSyxJQUFJLEVBQUU7Z0JBQzlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxzQkFBc0IsR0FBRyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2FBQ3ZEO1lBRUQsOEZBQThGO1lBQzlGLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFO2dCQUNwQyxJQUFJLGlCQUFpQixLQUFLLElBQUksRUFBRTtvQkFDOUIsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7b0JBQ25FLEdBQUcsQ0FBQyxJQUFJLENBQ04sR0FBRyxZQUFZLEtBQUssd0JBQXdCLEdBQUcsaUJBQWlCLEVBQUUsQ0FDbkUsQ0FBQztvQkFDRixHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNuQjtnQkFDRCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsc0JBQXNCLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO2FBQzNEO1lBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksS0FBSyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDakQsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLHlCQUF5QixLQUFLLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFcEQsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUU7Z0JBQ3BDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLEtBQUssV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQzdDO1lBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNsQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDMUM7UUFFRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7WUFDZCxJQUFJLGlCQUFpQixLQUFLLElBQUksRUFBRTtnQkFDOUIsR0FBRyxDQUFDLElBQUksQ0FDTixHQUFHLHNCQUFzQixHQUFHLGlCQUFpQixHQUFHLHNCQUFzQixFQUFFLENBQ3pFLENBQUM7Z0JBQ0YsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2FBQzFCO1lBQ0QsR0FBRyxDQUFDLElBQUksQ0FDTixHQUFHLHNCQUFzQixHQUFHLGFBQWEsR0FBRyxzQkFBc0IsRUFBRSxDQUNyRSxDQUFDO1NBQ0g7UUFDRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxhQUFhLENBQ2xCLFFBQWtDLEVBQ2xDLE9BQXdCO1FBRXhCLE9BQU87WUFDTCxRQUFRLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3RCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxtQkFBbUIsQ0FDeEIsUUFBa0MsRUFDbEMsUUFBK0I7UUFFL0IsSUFBSSxNQUFNLEdBQWUsRUFBRSxDQUFDO1FBQzVCLE1BQU0sV0FBVyxHQUFXLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyRSxNQUFNLGFBQWEsR0FBVyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEUsTUFBTSxPQUFPLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV4RCxNQUFNLEtBQUssR0FBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXBFLElBQUksa0JBQWtCLEdBQXNCLElBQUksQ0FBQztRQUNqRCxJQUFJLFNBQVMsR0FBa0IsSUFBSSxDQUFDO1FBQ3BDLElBQUksaUJBQWlCLEdBQWtCLElBQUksQ0FBQztRQUM1QyxJQUFJLGdCQUFnQixHQUFrQixJQUFJLENBQUM7UUFDM0MsSUFBSSxVQUFVLEdBQWtCLElBQUksQ0FBQztRQUNyQyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNqRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFMUIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNqQyxNQUFNLGdCQUFnQixHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3hELElBQUksZ0JBQWdCLEtBQUssZUFBZSxFQUFFO29CQUN4QyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7b0JBQ3hCLFNBQVMsR0FBRyxJQUFJLENBQUM7b0JBQ2pCLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDakQsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUN2RCxVQUFVLEdBQUcsSUFBSSxDQUFDO2lCQUNuQjtnQkFDRCxTQUFTO2FBQ1Y7aUJBQU0sSUFBSSxrQkFBa0IsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDckUsU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDNUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNsQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2FBQ3BCO2lCQUFNLElBQ0wsSUFBSSxLQUFLLGFBQWE7Z0JBQ3RCLElBQUksS0FBSyxpQkFBaUI7Z0JBQzFCLElBQUksS0FBSyxPQUFPO2dCQUNoQixJQUFJLEtBQUssZ0JBQWdCLEVBQ3pCO2dCQUNBLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ2YsU0FBUztpQkFDVjtnQkFDRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxrQkFBa0IsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLElBQUksRUFBRTtvQkFDckQsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO2lCQUN2QztxQkFBTTtvQkFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNwQjtnQkFFRCxJQUFJLElBQUksS0FBSyxhQUFhLElBQUksSUFBSSxLQUFLLGlCQUFpQixFQUFFO29CQUN4RCxVQUFVLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztpQkFDeEI7cUJBQU0sSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksS0FBSyxnQkFBZ0IsRUFBRTtvQkFDeEQsSUFBSSxrQkFBa0IsS0FBSyxJQUFJLEVBQUU7d0JBQy9CLEtBQUssTUFBTSxRQUFRLElBQUksa0JBQWtCLEVBQUU7NEJBQ3pDLElBQUksUUFBUSxFQUFFO2dDQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7NkJBQ3ZCO3lCQUNGO3FCQUNGO29CQUNELGtCQUFrQixHQUFHLElBQUksQ0FBQztvQkFDMUIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO29CQUN6QixnQkFBZ0IsR0FBRyxJQUFJLENBQUM7b0JBQ3hCLFVBQVUsR0FBRyxJQUFJLENBQUM7aUJBQ25CO2FBQ0Y7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQWUsRUFBRSxLQUFhLEVBQUUsRUFBRTtZQUNuRCxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3RDLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNELEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXZCLElBQUksT0FBTyxHQUFnQixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQzdDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNkLE9BQU8sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3BDLE1BQU0sYUFBYSxHQUFXLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFM0MsSUFBSSxhQUFhLEtBQUssRUFBRSxFQUFFO29CQUN4QixNQUFNO2lCQUNQO2dCQUVELE1BQU0sa0JBQWtCLEdBQWEsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQ3RCLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUM1QixrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FDN0IsQ0FBQzthQUNIO1lBRUQsSUFBSSxJQUFJLEdBQTBDLEVBQUUsQ0FBQztZQUNyRCxPQUFPLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNwQyxJQUFJLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RCO1lBRUQsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO2dCQUNkLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6QjtZQUVELElBQUksRUFBRSxHQUFHLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNuQyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEtBQUssTUFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDL0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3JDLElBQUk7b0JBQ0YsSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztpQkFDOUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7b0JBQ2QsSUFBSSxHQUFHLFlBQVksQ0FBQztvQkFFcEIsSUFBSSxFQUFFLEVBQUU7d0JBQ04sRUFBRSxHQUFHLEtBQUssQ0FBQzt3QkFDWCxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO3FCQUM5QjtpQkFDRjthQUNGO1lBRUQsT0FBTyxFQUFFO2dCQUNQLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBTTtvQkFDcEIsSUFBSTtvQkFDSixPQUFPO29CQUNQLE1BQU0sRUFBRSxJQUFJO29CQUNaLFVBQVUsRUFBRSxPQUFPO29CQUNuQixHQUFHLEVBQUUsT0FBTyxDQUFDLGFBQWE7aUJBQzNCLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUM7b0JBQ3BCLHVFQUF1RTtvQkFDdkUsS0FBSyxFQUFFLElBQUk7b0JBQ1gsT0FBTztvQkFDUCxNQUFNLEVBQUUsSUFBSTtvQkFDWixVQUFVLEVBQUUsT0FBTztvQkFDbkIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxhQUFhO2lCQUMzQixDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQ3RCLFFBQWtDLEVBQ2xDLFFBQTRCO1FBRTVCLE1BQU0sU0FBUyxHQUNiLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTFELE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQWEsRUFBRSxLQUFhLEVBQUUsRUFBRTtZQUNwRCxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3RDLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU5QixJQUFJLE9BQU8sR0FBZ0IsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxJQUFJLEdBQTBDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuRSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3pCO1lBRUQsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ25DLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxNQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUMvRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQzFCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDckMsSUFBSTtvQkFDRixJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2lCQUM5QztnQkFBQyxPQUFPLEtBQUssRUFBRTtvQkFDZCxJQUFJLEdBQUcsWUFBWSxDQUFDO29CQUVwQixJQUFJLEVBQUUsRUFBRTt3QkFDTixFQUFFLEdBQUcsS0FBSyxDQUFDO3dCQUNYLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7cUJBQzlCO2lCQUNGO2FBQ0Y7WUFFRCxPQUFPLEVBQUU7Z0JBQ1AsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFNO29CQUNwQixJQUFJO29CQUNKLE9BQU87b0JBQ1AsTUFBTSxFQUFFLElBQUk7b0JBQ1osR0FBRyxFQUFFLE9BQU8sQ0FBQyxhQUFhO2lCQUMzQixDQUFDO2dCQUNKLENBQUMsQ0FBQyxJQUFJLGlCQUFpQixDQUFDO29CQUNwQix1RUFBdUU7b0JBQ3ZFLEtBQUssRUFBRSxJQUFJO29CQUNYLE9BQU87b0JBQ1AsTUFBTSxFQUFFLElBQUk7b0JBQ1osR0FBRyxFQUFFLE9BQU8sQ0FBQyxhQUFhO2lCQUMzQixDQUFDLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEh0dHBFcnJvclJlc3BvbnNlLFxuICBIdHRwSGVhZGVycyxcbiAgSHR0cFJlc3BvbnNlLFxuICBIdHRwUmVzcG9uc2VCYXNlLFxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9EYXRhQXBpIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCB7XG4gICRCQVRDSCxcbiAgQUNDRVBULFxuICBBUFBMSUNBVElPTl9IVFRQLFxuICBBUFBMSUNBVElPTl9KU09OLFxuICBCQVRDSF9QUkVGSVgsXG4gIEJJTkFSWSxcbiAgQk9VTkRBUllfUFJFRklYX1NVRkZJWCxcbiAgQ0hBTkdFU0VUX1BSRUZJWCxcbiAgQ09OVEVOVF9JRCxcbiAgQ09OVEVOVF9UUkFOU0ZFUl9FTkNPRElORyxcbiAgQ09OVEVOVF9UWVBFLFxuICBIVFRQMTEsXG4gIE1VTFRJUEFSVF9NSVhFRCxcbiAgTVVMVElQQVJUX01JWEVEX0JPVU5EQVJZLFxuICBORVdMSU5FLFxuICBORVdMSU5FX1JFR0VYUCxcbiAgT0RBVEFfVkVSU0lPTixcbiAgVkVSU0lPTl80XzAsXG4gIFhTU0lfUFJFRklYLFxufSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUGF0aFNlZ21lbnQgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBBcnJheXMgfSBmcm9tICcuLi8uLi91dGlscy9hcnJheXMnO1xuaW1wb3J0IHsgSHR0cCB9IGZyb20gJy4uLy4uL3V0aWxzL2h0dHAnO1xuaW1wb3J0IHsgU3RyaW5ncyB9IGZyb20gJy4uLy4uL3V0aWxzL3N0cmluZ3MnO1xuaW1wb3J0IHsgT0RhdGFQYXRoU2VnbWVudHMgfSBmcm9tICcuLi9wYXRoJztcbmltcG9ydCB7IE9EYXRhUmVxdWVzdCB9IGZyb20gJy4uL3JlcXVlc3QnO1xuaW1wb3J0IHsgT0RhdGFSZXNvdXJjZSB9IGZyb20gJy4uL3Jlc291cmNlJztcbmltcG9ydCB7IE9EYXRhT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBPRGF0YUFwaU9wdGlvbnMgfSBmcm9tICcuLi8uLi9vcHRpb25zJztcbmltcG9ydCB7IE9EYXRhUmVzcG9uc2UgfSBmcm9tICcuLi9yZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUJhdGNoUmVxdWVzdDxUPiBleHRlbmRzIFN1YmplY3Q8SHR0cFJlc3BvbnNlQmFzZT4ge1xuICBpZDogc3RyaW5nO1xuICBncm91cDogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVxdWVzdDogT0RhdGFSZXF1ZXN0PGFueT4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaWQgPSBTdHJpbmdzLnVuaXF1ZUlkKHsgcHJlZml4OiAncicgfSk7XG4gICAgdGhpcy5ncm91cCA9IFN0cmluZ3MudW5pcXVlSWQoeyBwcmVmaXg6ICdnJyB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLnRvTGVnYWN5KCk7XG4gIH1cblxuICB0b0xlZ2FjeSh7IHJlbGF0aXZlVXJscyB9OiB7IHJlbGF0aXZlVXJscz86IGJvb2xlYW4gfSA9IHt9KTogc3RyaW5nIHtcbiAgICAvL1RPRE86IFJlbGF0aXZlIG9yIEFic29sdXRlIHVybCA/XG4gICAgbGV0IHJlcyA9IFtcbiAgICAgIGAke3RoaXMucmVxdWVzdC5tZXRob2R9ICR7XG4gICAgICAgIHJlbGF0aXZlVXJscyA/IHRoaXMucmVxdWVzdC5wYXRoV2l0aFBhcmFtcyA6IHRoaXMucmVxdWVzdC51cmxXaXRoUGFyYW1zXG4gICAgICB9ICR7SFRUUDExfWAsXG4gICAgXTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlcXVlc3QubWV0aG9kID09PSAnUE9TVCcgfHxcbiAgICAgIHRoaXMucmVxdWVzdC5tZXRob2QgPT09ICdQQVRDSCcgfHxcbiAgICAgIHRoaXMucmVxdWVzdC5tZXRob2QgPT09ICdQVVQnXG4gICAgKSB7XG4gICAgICByZXMucHVzaChgJHtDT05URU5UX1RZUEV9OiAke0FQUExJQ0FUSU9OX0pTT059YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVxdWVzdC5oZWFkZXJzIGluc3RhbmNlb2YgSHR0cEhlYWRlcnMpIHtcbiAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5yZXF1ZXN0LmhlYWRlcnM7XG4gICAgICByZXMgPSBbXG4gICAgICAgIC4uLnJlcyxcbiAgICAgICAgLi4uaGVhZGVyc1xuICAgICAgICAgIC5rZXlzKClcbiAgICAgICAgICAubWFwKChrZXkpID0+IGAke2tleX06ICR7KGhlYWRlcnMuZ2V0QWxsKGtleSkgfHwgW10pLmpvaW4oJywnKX1gKSxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVxdWVzdC5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMucmVxdWVzdC5tZXRob2QgPT09ICdERUxFVEUnKSB7XG4gICAgICByZXMucHVzaChORVdMSU5FKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLnB1c2goYCR7TkVXTElORX0ke0pTT04uc3RyaW5naWZ5KHRoaXMucmVxdWVzdC5ib2R5KX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLmpvaW4oTkVXTElORSk7XG4gIH1cblxuICB0b0pzb24oeyByZWxhdGl2ZVVybHMgfTogeyByZWxhdGl2ZVVybHM/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIGxldCByZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBtZXRob2Q6IHRoaXMucmVxdWVzdC5tZXRob2QsXG4gICAgICB1cmw6IHJlbGF0aXZlVXJsc1xuICAgICAgICA/IHRoaXMucmVxdWVzdC5wYXRoV2l0aFBhcmFtc1xuICAgICAgICA6IHRoaXMucmVxdWVzdC51cmxXaXRoUGFyYW1zLFxuICAgICAgLy8nYXRvbWljaXR5R3JvdXAnOiB0aGlzLmdyb3VwXG4gICAgICAvL1wiZGVwZW5kc09uXCI6IFtcImcxXCIsIFwiZzJcIiwgXCJyMlwiXVxuICAgIH07XG4gICAgaWYgKHRoaXMucmVxdWVzdC5oZWFkZXJzIGluc3RhbmNlb2YgSHR0cEhlYWRlcnMpIHtcbiAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5yZXF1ZXN0LmhlYWRlcnM7XG4gICAgICByZXNbJ2hlYWRlcnMnXSA9IGhlYWRlcnNcbiAgICAgICAgLmtleXMoKVxuICAgICAgICAubWFwKChrZXkpID0+IGAke2tleX06ICR7KGhlYWRlcnMuZ2V0QWxsKGtleSkgfHwgW10pLmpvaW4oJywnKX1gKTtcbiAgICB9XG4gICAgaWYgKCEodGhpcy5yZXF1ZXN0Lm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5yZXF1ZXN0Lm1ldGhvZCA9PT0gJ0RFTEVURScpKSB7XG4gICAgICByZXNbJ2JvZHknXSA9IHRoaXMucmVxdWVzdC5ib2R5O1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBvbkxvYWQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHRoaXMubmV4dChyZXNwb25zZSk7XG4gICAgICB0aGlzLmNvbXBsZXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFuIHVuc3VjY2Vzc2Z1bCByZXF1ZXN0IGlzIGRlbGl2ZXJlZCBvbiB0aGUgZXJyb3IgY2hhbm5lbC5cbiAgICAgIHRoaXMuZXJyb3IocmVzcG9uc2UgYXMgSHR0cEVycm9yUmVzcG9uc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uRXJyb3IocmVzcG9uc2U6IEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgdGhpcy5lcnJvcihyZXNwb25zZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBPRGF0YSBCYXRjaCBSZXNvdXJjZVxuICogaHR0cHM6Ly93d3cub2RhdGEub3JnL2dldHRpbmctc3RhcnRlZC9hZHZhbmNlZC10dXRvcmlhbC8jYmF0Y2hcbiAqL1xuZXhwb3J0IGNsYXNzIE9EYXRhQmF0Y2hSZXNvdXJjZSBleHRlbmRzIE9EYXRhUmVzb3VyY2U8YW55PiB7XG4gIC8vIFZBUklBQkxFU1xuICBwcml2YXRlIF9yZXF1ZXN0czogT0RhdGFCYXRjaFJlcXVlc3Q8YW55PltdID0gW107XG4gIHJlcXVlc3RzKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0cy5tYXAoKHIpID0+IHIucmVxdWVzdCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXNwb25zZXM6IEh0dHBSZXNwb25zZUJhc2VbXSB8IG51bGwgPSBudWxsO1xuICByZXNwb25zZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlcztcbiAgfVxuXG4gIC8vI3JlZ2lvbiBGYWN0b3J5XG4gIHN0YXRpYyBmYWN0b3J5KGFwaTogT0RhdGFBcGkpIHtcbiAgICBsZXQgc2VnbWVudHMgPSBuZXcgT0RhdGFQYXRoU2VnbWVudHMoKTtcbiAgICBzZWdtZW50cy5hZGQoUGF0aFNlZ21lbnQuYmF0Y2gsICRCQVRDSCk7XG4gICAgcmV0dXJuIG5ldyBPRGF0YUJhdGNoUmVzb3VyY2UoYXBpLCB7IHNlZ21lbnRzIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2xvbmUoKTogT0RhdGFCYXRjaFJlc291cmNlIHtcbiAgICBjb25zdCBiYXRjaCA9IHN1cGVyLmNsb25lKCkgYXMgT0RhdGFCYXRjaFJlc291cmNlO1xuICAgIGJhdGNoLl9yZXF1ZXN0cyA9IFsuLi50aGlzLl9yZXF1ZXN0c107XG4gICAgcmV0dXJuIGJhdGNoO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHByaXZhdGUgc3RvcmVSZXF1ZXN0ZXIoKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuYXBpLnJlcXVlc3RlcjtcbiAgICAvLyBTd2l0Y2ggdG8gdGhlIGJhdGNoIHJlcXVlc3RlclxuICAgIHRoaXMuYXBpLnJlcXVlc3RlciA9IChyZXE6IE9EYXRhUmVxdWVzdDxhbnk+KTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcbiAgICAgIGlmIChyZXEuYXBpICE9PSB0aGlzLmFwaSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYXRjaCBSZXF1ZXN0IGFyZSBmb3IgdGhlIHNhbWUgYXBpLicpO1xuICAgICAgaWYgKHJlcS5vYnNlcnZlID09PSAnZXZlbnRzJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmF0Y2ggUmVxdWVzdCBkb2VzIG5vdCBhbGxvd3Mgb2JzZXJ2ZSA9PSAnZXZlbnRzJy5cIik7XG4gICAgICB0aGlzLl9yZXF1ZXN0cy5wdXNoKG5ldyBPRGF0YUJhdGNoUmVxdWVzdDxhbnk+KHJlcSkpO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RzW3RoaXMuX3JlcXVlc3RzLmxlbmd0aCAtIDFdO1xuICAgIH07XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVSZXF1ZXN0ZXIoXG4gICAgaGFuZGxlcjogKChyZXE6IE9EYXRhUmVxdWVzdDxhbnk+KSA9PiBPYnNlcnZhYmxlPGFueT4pIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICB0aGlzLmFwaS5yZXF1ZXN0ZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0byBiYXRjaCByZXF1ZXN0XG4gICAqIEBwYXJhbSBjdHggVGhlIGNvbnRleHQgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXhlY3V0ZSB0aGUgY29udGV4dFxuICAgKi9cbiAgYWRkPFI+KGN0eDogKGJhdGNoOiB0aGlzKSA9PiBSKTogUiB7XG4gICAgLy8gU3RvcmUgb3JpZ2luYWwgcmVxdWVzdGVyXG4gICAgdmFyIGhhbmRsZXIgPSB0aGlzLnN0b3JlUmVxdWVzdGVyKCk7XG4gICAgLy8gRXhlY3V0ZSB0aGUgY29udGV4dFxuICAgIGNvbnN0IHJlc3VsdCA9IGN0eCh0aGlzKTtcbiAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHJlcXVlc3RlclxuICAgIHRoaXMucmVzdG9yZVJlcXVlc3RlcihoYW5kbGVyKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzZW5kKG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMpOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8YW55Pj4ge1xuICAgIGlmICh0aGlzLmFwaS5vcHRpb25zLmpzb25CYXRjaEZvcm1hdCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VuZEpzb24ob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRMZWdhY3kob3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZW5kSnNvbihvcHRpb25zPzogT0RhdGFPcHRpb25zKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPE9iamVjdD4+IHtcbiAgICBjb25zdCBoZWFkZXJzID0gSHR0cC5tZXJnZUh0dHBIZWFkZXJzKChvcHRpb25zICYmIG9wdGlvbnMuaGVhZGVycykgfHwge30sIHtcbiAgICAgIFtPREFUQV9WRVJTSU9OXTogVkVSU0lPTl80XzAsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAucmVxdWVzdDxvYmplY3Q+KCdQT1NUJywgdGhpcywge1xuICAgICAgICBib2R5OiBPRGF0YUJhdGNoUmVzb3VyY2UuYnVpbGRKc29uQm9keShcbiAgICAgICAgICB0aGlzLl9yZXF1ZXN0cyxcbiAgICAgICAgICB0aGlzLmFwaS5vcHRpb25zLFxuICAgICAgICApLFxuICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJyxcbiAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgcGFyYW1zOiBvcHRpb25zID8gb3B0aW9ucy5wYXJhbXMgOiB1bmRlZmluZWQsXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogb3B0aW9ucyA/IG9wdGlvbnMud2l0aENyZWRlbnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBPRGF0YVJlc3BvbnNlPE9iamVjdD4pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fcmVzcG9uc2VzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc3BvbnNlcyA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9yZXNwb25zZXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9yZXNwb25zZXMsXG4gICAgICAgICAgICAuLi5PRGF0YUJhdGNoUmVzb3VyY2UucGFyc2VKc29uUmVzcG9uc2UodGhpcy5fcmVxdWVzdHMsIHJlc3BvbnNlKSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIC8vSEFDSzogdHVwbGVbMV0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgIEFycmF5cy56aXAodGhpcy5fcmVxdWVzdHMsIHRoaXMuX3Jlc3BvbnNlcykuZm9yRWFjaCgodHVwbGUpID0+IHtcbiAgICAgICAgICAgIGlmICghdHVwbGVbMF0uaXNTdG9wcGVkICYmIHR1cGxlWzFdKSB0dXBsZVswXS5vbkxvYWQodHVwbGVbMV0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kTGVnYWN5KFxuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxzdHJpbmc+PiB7XG4gICAgY29uc3QgYm91bmQgPSBTdHJpbmdzLnVuaXF1ZUlkKHsgcHJlZml4OiBCQVRDSF9QUkVGSVggfSk7XG4gICAgY29uc3QgaGVhZGVycyA9IEh0dHAubWVyZ2VIdHRwSGVhZGVycygob3B0aW9ucyAmJiBvcHRpb25zLmhlYWRlcnMpIHx8IHt9LCB7XG4gICAgICBbT0RBVEFfVkVSU0lPTl06IFZFUlNJT05fNF8wLFxuICAgICAgW0NPTlRFTlRfVFlQRV06IE1VTFRJUEFSVF9NSVhFRF9CT1VOREFSWSArIGJvdW5kLFxuICAgICAgW0FDQ0VQVF06IE1VTFRJUEFSVF9NSVhFRCxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5hcGlcbiAgICAgIC5yZXF1ZXN0PE9EYXRhUmVzcG9uc2U8c3RyaW5nPj4oJ1BPU1QnLCB0aGlzLCB7XG4gICAgICAgIGJvZHk6IE9EYXRhQmF0Y2hSZXNvdXJjZS5idWlsZExlZ2FjeUJvZHkoXG4gICAgICAgICAgYm91bmQsXG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMsXG4gICAgICAgICAgdGhpcy5hcGkub3B0aW9ucyxcbiAgICAgICAgKSxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXG4gICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgIHBhcmFtczogb3B0aW9ucyA/IG9wdGlvbnMucGFyYW1zIDogdW5kZWZpbmVkLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IG9wdGlvbnMgPyBvcHRpb25zLndpdGhDcmVkZW50aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZTogT0RhdGFSZXNwb25zZTxzdHJpbmc+KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX3Jlc3BvbnNlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNwb25zZXMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcmVzcG9uc2VzID0gW1xuICAgICAgICAgICAgLi4udGhpcy5fcmVzcG9uc2VzLFxuICAgICAgICAgICAgLi4uT0RhdGFCYXRjaFJlc291cmNlLnBhcnNlTGVnYWN5UmVzcG9uc2UodGhpcy5fcmVxdWVzdHMsIHJlc3BvbnNlKSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIEFycmF5cy56aXAodGhpcy5fcmVxdWVzdHMsIHRoaXMuX3Jlc3BvbnNlcykuZm9yRWFjaCgodHVwbGUpID0+IHtcbiAgICAgICAgICAgIGlmICghdHVwbGVbMF0uaXNTdG9wcGVkICYmIHR1cGxlWzFdKSB0dXBsZVswXS5vbkxvYWQodHVwbGVbMV0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGJhdGNoIHJlcXVlc3RcbiAgICogQHBhcmFtIGN0eCBUaGUgY29udGV4dCBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgb2YgdGhlIGJhdGNoIHJlcXVlc3RcbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiBleGVjdXRlIHRoZSBjb250ZXh0XG4gICAqL1xuICBleGVjPFI+KFxuICAgIGN0eDogKGJhdGNoOiB0aGlzKSA9PiBSLFxuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8W1IsIE9EYXRhUmVzcG9uc2U8c3RyaW5nPl0+IHtcbiAgICBsZXQgcmVzdWx0ID0gdGhpcy5hZGQoY3R4KTtcbiAgICByZXR1cm4gdGhpcy5zZW5kKG9wdGlvbnMpLnBpcGUobWFwKChyZXNwb25zZSkgPT4gW3Jlc3VsdCwgcmVzcG9uc2VdKSk7XG4gIH1cblxuICBib2R5KCkge1xuICAgIHJldHVybiBPRGF0YUJhdGNoUmVzb3VyY2UuYnVpbGRMZWdhY3lCb2R5KFxuICAgICAgU3RyaW5ncy51bmlxdWVJZCh7IHByZWZpeDogQkFUQ0hfUFJFRklYIH0pLFxuICAgICAgdGhpcy5fcmVxdWVzdHMsXG4gICAgICB0aGlzLmFwaS5vcHRpb25zLFxuICAgICk7XG4gIH1cblxuICBqc29uKCkge1xuICAgIHJldHVybiBPRGF0YUJhdGNoUmVzb3VyY2UuYnVpbGRKc29uQm9keSh0aGlzLl9yZXF1ZXN0cywgdGhpcy5hcGkub3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgYnVpbGRMZWdhY3lCb2R5KFxuICAgIGJhdGNoQm91bmRhcnk6IHN0cmluZyxcbiAgICByZXF1ZXN0czogT0RhdGFCYXRjaFJlcXVlc3Q8YW55PltdLFxuICAgIG9wdGlvbnM6IE9EYXRhQXBpT3B0aW9ucyxcbiAgKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzID0gW107XG4gICAgbGV0IGNoYW5nZXNldEJvdW5kYXJ5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY2hhbmdlc2V0SWQgPSAxO1xuXG4gICAgZm9yIChjb25zdCByZXF1ZXN0IG9mIHJlcXVlc3RzKSB7XG4gICAgICAvLyBpZiBtZXRob2QgaXMgR0VUIGFuZCB0aGVyZSBpcyBhIGNoYW5nZXNldCBib3VuZGFyeSBvcGVuIHRoZW4gY2xvc2UgaXRcbiAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3QubWV0aG9kID09PSAnR0VUJyAmJiBjaGFuZ2VzZXRCb3VuZGFyeSAhPT0gbnVsbCkge1xuICAgICAgICByZXMucHVzaChcbiAgICAgICAgICBgJHtCT1VOREFSWV9QUkVGSVhfU1VGRklYfSR7Y2hhbmdlc2V0Qm91bmRhcnl9JHtCT1VOREFSWV9QUkVGSVhfU1VGRklYfWAsXG4gICAgICAgICk7XG4gICAgICAgIGNoYW5nZXNldEJvdW5kYXJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gY2hhbmdlc2V0IGJvdW5kYXJ5IG9wZW4gdGhlbiBvcGVuIGEgYmF0Y2ggYm91bmRhcnlcbiAgICAgIGlmIChjaGFuZ2VzZXRCb3VuZGFyeSA9PT0gbnVsbCkge1xuICAgICAgICByZXMucHVzaChgJHtCT1VOREFSWV9QUkVGSVhfU1VGRklYfSR7YmF0Y2hCb3VuZGFyeX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgbWV0aG9kIGlzIG5vdCBHRVQgYW5kIHRoZXJlIGlzIG5vIGNoYW5nZXNldCBib3VuZGFyeSBvcGVuIHRoZW4gb3BlbiBhIGNoYW5nZXNldCBib3VuZGFyeVxuICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdC5tZXRob2QgIT09ICdHRVQnKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzZXRCb3VuZGFyeSA9PT0gbnVsbCkge1xuICAgICAgICAgIGNoYW5nZXNldEJvdW5kYXJ5ID0gU3RyaW5ncy51bmlxdWVJZCh7IHByZWZpeDogQ0hBTkdFU0VUX1BSRUZJWCB9KTtcbiAgICAgICAgICByZXMucHVzaChcbiAgICAgICAgICAgIGAke0NPTlRFTlRfVFlQRX06ICR7TVVMVElQQVJUX01JWEVEX0JPVU5EQVJZfSR7Y2hhbmdlc2V0Qm91bmRhcnl9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlcy5wdXNoKE5FV0xJTkUpO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5wdXNoKGAke0JPVU5EQVJZX1BSRUZJWF9TVUZGSVh9JHtjaGFuZ2VzZXRCb3VuZGFyeX1gKTtcbiAgICAgIH1cblxuICAgICAgcmVzLnB1c2goYCR7Q09OVEVOVF9UWVBFfTogJHtBUFBMSUNBVElPTl9IVFRQfWApO1xuICAgICAgcmVzLnB1c2goYCR7Q09OVEVOVF9UUkFOU0ZFUl9FTkNPRElOR306ICR7QklOQVJZfWApO1xuXG4gICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0Lm1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgICAgcmVzLnB1c2goYCR7Q09OVEVOVF9JRH06ICR7Y2hhbmdlc2V0SWQrK31gKTtcbiAgICAgIH1cblxuICAgICAgcmVzLnB1c2goTkVXTElORSk7XG4gICAgICByZXMucHVzaChgJHtyZXF1ZXN0LnRvTGVnYWN5KG9wdGlvbnMpfWApO1xuICAgIH1cblxuICAgIGlmIChyZXMubGVuZ3RoKSB7XG4gICAgICBpZiAoY2hhbmdlc2V0Qm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgICAgcmVzLnB1c2goXG4gICAgICAgICAgYCR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH0ke2NoYW5nZXNldEJvdW5kYXJ5fSR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH1gLFxuICAgICAgICApO1xuICAgICAgICBjaGFuZ2VzZXRCb3VuZGFyeSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXMucHVzaChcbiAgICAgICAgYCR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH0ke2JhdGNoQm91bmRhcnl9JHtCT1VOREFSWV9QUkVGSVhfU1VGRklYfWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLmpvaW4oTkVXTElORSk7XG4gIH1cblxuICBzdGF0aWMgYnVpbGRKc29uQm9keShcbiAgICByZXF1ZXN0czogT0RhdGFCYXRjaFJlcXVlc3Q8YW55PltdLFxuICAgIG9wdGlvbnM6IE9EYXRhQXBpT3B0aW9ucyxcbiAgKTogT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWVzdHM6IHJlcXVlc3RzLm1hcCgocmVxdWVzdCkgPT4gcmVxdWVzdC50b0pzb24ob3B0aW9ucykpLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgcGFyc2VMZWdhY3lSZXNwb25zZShcbiAgICByZXF1ZXN0czogT0RhdGFCYXRjaFJlcXVlc3Q8YW55PltdLFxuICAgIHJlc3BvbnNlOiBPRGF0YVJlc3BvbnNlPHN0cmluZz4sXG4gICk6IEh0dHBSZXNwb25zZUJhc2VbXSB7XG4gICAgbGV0IGNodW5rczogc3RyaW5nW11bXSA9IFtdO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlOiBzdHJpbmcgPSByZXNwb25zZS5oZWFkZXJzLmdldChDT05URU5UX1RZUEUpIHx8ICcnO1xuICAgIGNvbnN0IGJhdGNoQm91bmRhcnk6IHN0cmluZyA9IEh0dHAuYm91bmRhcnlEZWxpbWl0ZXIoY29udGVudFR5cGUpO1xuICAgIGNvbnN0IGVuZExpbmU6IHN0cmluZyA9IEh0dHAuYm91bmRhcnlFbmQoYmF0Y2hCb3VuZGFyeSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSAocmVzcG9uc2UuYm9keSB8fCAnJykuc3BsaXQoTkVXTElORV9SRUdFWFApO1xuXG4gICAgbGV0IGNoYW5nZXNldFJlc3BvbnNlczogc3RyaW5nW11bXSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjb250ZW50SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjaGFuZ2VzZXRCb3VuZGFyeTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNoYW5nZXNldEVuZExpbmU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzdGFydEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGluZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBsaW5lID0gbGluZXNbaW5kZXhdO1xuXG4gICAgICBpZiAobGluZS5zdGFydHNXaXRoKENPTlRFTlRfVFlQRSkpIHtcbiAgICAgICAgY29uc3QgY29udGVudFR5cGVWYWx1ZTogc3RyaW5nID0gSHR0cC5oZWFkZXJWYWx1ZShsaW5lKTtcbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlVmFsdWUgPT09IE1VTFRJUEFSVF9NSVhFRCkge1xuICAgICAgICAgIGNoYW5nZXNldFJlc3BvbnNlcyA9IFtdO1xuICAgICAgICAgIGNvbnRlbnRJZCA9IG51bGw7XG4gICAgICAgICAgY2hhbmdlc2V0Qm91bmRhcnkgPSBIdHRwLmJvdW5kYXJ5RGVsaW1pdGVyKGxpbmUpO1xuICAgICAgICAgIGNoYW5nZXNldEVuZExpbmUgPSBIdHRwLmJvdW5kYXJ5RW5kKGNoYW5nZXNldEJvdW5kYXJ5KTtcbiAgICAgICAgICBzdGFydEluZGV4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlc2V0UmVzcG9uc2VzICE9PSBudWxsICYmIGxpbmUuc3RhcnRzV2l0aChDT05URU5UX0lEKSkge1xuICAgICAgICBjb250ZW50SWQgPSBOdW1iZXIoSHR0cC5oZWFkZXJWYWx1ZShsaW5lKSk7XG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChIVFRQMTEpKSB7XG4gICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleDtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGxpbmUgPT09IGJhdGNoQm91bmRhcnkgfHxcbiAgICAgICAgbGluZSA9PT0gY2hhbmdlc2V0Qm91bmRhcnkgfHxcbiAgICAgICAgbGluZSA9PT0gZW5kTGluZSB8fFxuICAgICAgICBsaW5lID09PSBjaGFuZ2VzZXRFbmRMaW5lXG4gICAgICApIHtcbiAgICAgICAgaWYgKCFzdGFydEluZGV4KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2h1bmsgPSBsaW5lcy5zbGljZShzdGFydEluZGV4LCBpbmRleCk7XG4gICAgICAgIGlmIChjaGFuZ2VzZXRSZXNwb25zZXMgIT09IG51bGwgJiYgY29udGVudElkICE9PSBudWxsKSB7XG4gICAgICAgICAgY2hhbmdlc2V0UmVzcG9uc2VzW2NvbnRlbnRJZF0gPSBjaHVuaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZSA9PT0gYmF0Y2hCb3VuZGFyeSB8fCBsaW5lID09PSBjaGFuZ2VzZXRCb3VuZGFyeSkge1xuICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAobGluZSA9PT0gZW5kTGluZSB8fCBsaW5lID09PSBjaGFuZ2VzZXRFbmRMaW5lKSB7XG4gICAgICAgICAgaWYgKGNoYW5nZXNldFJlc3BvbnNlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBjaGFuZ2VzZXRSZXNwb25zZXMpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgY2h1bmtzLnB1c2gocmVzcG9uc2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoYW5nZXNldFJlc3BvbnNlcyA9IG51bGw7XG4gICAgICAgICAgY2hhbmdlc2V0Qm91bmRhcnkgPSBudWxsO1xuICAgICAgICAgIGNoYW5nZXNldEVuZExpbmUgPSBudWxsO1xuICAgICAgICAgIHN0YXJ0SW5kZXggPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaHVua3MubWFwKChjaHVuazogc3RyaW5nW10sIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGxldCByZXF1ZXN0ID0gcmVxdWVzdHNbaW5kZXhdLnJlcXVlc3Q7XG4gICAgICBsZXQgeyBjb2RlLCBtZXNzYWdlIH0gPSBIdHRwLnBhcnNlUmVzcG9uc2VTdGF0dXMoY2h1bmtbMF0pO1xuICAgICAgY2h1bmsgPSBjaHVuay5zbGljZSgxKTtcblxuICAgICAgbGV0IGhlYWRlcnM6IEh0dHBIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgICB2YXIgaW5kZXggPSAxO1xuICAgICAgZm9yICg7IGluZGV4IDwgY2h1bmsubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGJhdGNoQm9keUxpbmU6IHN0cmluZyA9IGNodW5rW2luZGV4XTtcblxuICAgICAgICBpZiAoYmF0Y2hCb2R5TGluZSA9PT0gJycpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhdGNoQm9keUxpbmVQYXJ0czogc3RyaW5nW10gPSBiYXRjaEJvZHlMaW5lLnNwbGl0KCc6ICcpO1xuICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5hcHBlbmQoXG4gICAgICAgICAgYmF0Y2hCb2R5TGluZVBhcnRzWzBdLnRyaW0oKSxcbiAgICAgICAgICBiYXRjaEJvZHlMaW5lUGFydHNbMV0udHJpbSgpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBsZXQgYm9keTogc3RyaW5nIHwgeyBlcnJvcjogYW55OyB0ZXh0OiBzdHJpbmcgfSA9ICcnO1xuICAgICAgZm9yICg7IGluZGV4IDwgY2h1bmsubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGJvZHkgKz0gY2h1bmtbaW5kZXhdO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICBjb2RlID0gISFib2R5ID8gMjAwIDogMDtcbiAgICAgIH1cblxuICAgICAgbGV0IG9rID0gY29kZSA+PSAyMDAgJiYgY29kZSA8IDMwMDtcbiAgICAgIGlmIChyZXF1ZXN0LnJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nICYmIHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbEJvZHkgPSBib2R5O1xuICAgICAgICBib2R5ID0gYm9keS5yZXBsYWNlKFhTU0lfUFJFRklYLCAnJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYm9keSA9IGJvZHkgIT09ICcnID8gSlNPTi5wYXJzZShib2R5KSA6IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgYm9keSA9IG9yaWdpbmFsQm9keTtcblxuICAgICAgICAgIGlmIChvaykge1xuICAgICAgICAgICAgb2sgPSBmYWxzZTtcbiAgICAgICAgICAgIGJvZHkgPSB7IGVycm9yLCB0ZXh0OiBib2R5IH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBva1xuICAgICAgICA/IG5ldyBIdHRwUmVzcG9uc2U8YW55Pih7XG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IG1lc3NhZ2UsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsV2l0aFBhcmFtcyxcbiAgICAgICAgICB9KVxuICAgICAgICA6IG5ldyBIdHRwRXJyb3JSZXNwb25zZSh7XG4gICAgICAgICAgICAvLyBUaGUgZXJyb3IgaW4gdGhpcyBjYXNlIGlzIHRoZSByZXNwb25zZSBib2R5IChlcnJvciBmcm9tIHRoZSBzZXJ2ZXIpLlxuICAgICAgICAgICAgZXJyb3I6IGJvZHksXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc3RhdHVzVGV4dDogbWVzc2FnZSxcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmxXaXRoUGFyYW1zLFxuICAgICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHBhcnNlSnNvblJlc3BvbnNlKFxuICAgIHJlcXVlc3RzOiBPRGF0YUJhdGNoUmVxdWVzdDxhbnk+W10sXG4gICAgcmVzcG9uc2U6IE9EYXRhUmVzcG9uc2U8YW55PixcbiAgKTogSHR0cFJlc3BvbnNlQmFzZVtdIHtcbiAgICBjb25zdCByZXNwb25zZXM6IE9iamVjdFtdID1cbiAgICAgIChyZXNwb25zZS5ib2R5ID8gcmVzcG9uc2UuYm9keSA6IHt9KVsncmVzcG9uc2VzJ10gPz8gW107XG5cbiAgICByZXR1cm4gcmVzcG9uc2VzLm1hcCgocmVzcG9uc2U6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IHJlcXVlc3QgPSByZXF1ZXN0c1tpbmRleF0ucmVxdWVzdDtcbiAgICAgIGxldCBjb2RlID0gcmVzcG9uc2VbJ3N0YXR1cyddO1xuXG4gICAgICBsZXQgaGVhZGVyczogSHR0cEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMocmVzcG9uc2VbJ2hlYWRlcnMnXSk7XG4gICAgICBsZXQgYm9keTogc3RyaW5nIHwgeyBlcnJvcjogYW55OyB0ZXh0OiBzdHJpbmcgfSA9IHJlc3BvbnNlWydib2R5J107XG4gICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICBjb2RlID0gISFib2R5ID8gMjAwIDogMDtcbiAgICAgIH1cblxuICAgICAgbGV0IG9rID0gY29kZSA+PSAyMDAgJiYgY29kZSA8IDMwMDtcbiAgICAgIGlmIChyZXF1ZXN0LnJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nICYmIHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbEJvZHkgPSBib2R5O1xuICAgICAgICBib2R5ID0gYm9keS5yZXBsYWNlKFhTU0lfUFJFRklYLCAnJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYm9keSA9IGJvZHkgIT09ICcnID8gSlNPTi5wYXJzZShib2R5KSA6IG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgYm9keSA9IG9yaWdpbmFsQm9keTtcblxuICAgICAgICAgIGlmIChvaykge1xuICAgICAgICAgICAgb2sgPSBmYWxzZTtcbiAgICAgICAgICAgIGJvZHkgPSB7IGVycm9yLCB0ZXh0OiBib2R5IH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBva1xuICAgICAgICA/IG5ldyBIdHRwUmVzcG9uc2U8YW55Pih7XG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmxXaXRoUGFyYW1zLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogbmV3IEh0dHBFcnJvclJlc3BvbnNlKHtcbiAgICAgICAgICAgIC8vIFRoZSBlcnJvciBpbiB0aGlzIGNhc2UgaXMgdGhlIHJlc3BvbnNlIGJvZHkgKGVycm9yIGZyb20gdGhlIHNlcnZlcikuXG4gICAgICAgICAgICBlcnJvcjogYm9keSxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsV2l0aFBhcmFtcyxcbiAgICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|