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,553 +0,0 @@
|
|
|
1
|
-
import { forkJoin, NEVER, throwError } from 'rxjs';
|
|
2
|
-
import { finalize, map } from 'rxjs/operators';
|
|
3
|
-
import { ODataEntityResource, ODataNavigationPropertyResource, } from '../resources';
|
|
4
|
-
import { Objects, Strings, Types } from '../utils';
|
|
5
|
-
import { ODataCollection } from './collection';
|
|
6
|
-
import { INCLUDE_DEEP, ODataModelOptions, ODataModelEventType, ODataModelEventEmitter, } from './options';
|
|
7
|
-
export class ODataModel {
|
|
8
|
-
static buildMetaOptions({ config, structuredType, }) {
|
|
9
|
-
if (config === undefined) {
|
|
10
|
-
const fields = structuredType
|
|
11
|
-
.fields({ include_navigation: true, include_parents: true })
|
|
12
|
-
.reduce((acc, field) => {
|
|
13
|
-
let name = field.name;
|
|
14
|
-
// Prevent collision with reserved keywords
|
|
15
|
-
while (RESERVED_FIELD_NAMES.includes(name)) {
|
|
16
|
-
name = name + '_';
|
|
17
|
-
}
|
|
18
|
-
return Object.assign(acc, {
|
|
19
|
-
[name]: {
|
|
20
|
-
field: field.name,
|
|
21
|
-
default: field.default,
|
|
22
|
-
required: !field.nullable,
|
|
23
|
-
},
|
|
24
|
-
});
|
|
25
|
-
}, {});
|
|
26
|
-
config = {
|
|
27
|
-
fields: new Map(Object.entries(fields)),
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
return new ODataModelOptions({ config, structuredType });
|
|
31
|
-
}
|
|
32
|
-
constructor(data = {}, { parent, resource, annots, reset = false, } = {}) {
|
|
33
|
-
// Parent
|
|
34
|
-
this._parent = null;
|
|
35
|
-
this._resource = null;
|
|
36
|
-
this._resources = [];
|
|
37
|
-
this._attributes = new Map();
|
|
38
|
-
const Klass = this.constructor;
|
|
39
|
-
if (Klass.meta === undefined)
|
|
40
|
-
throw new Error(`Model: Can't create model without metadata`);
|
|
41
|
-
this._meta = Klass.meta;
|
|
42
|
-
this.events$ = new ODataModelEventEmitter({ model: this });
|
|
43
|
-
this._meta.bind(this, { parent, resource, annots });
|
|
44
|
-
// Client Id
|
|
45
|
-
this[this._meta.cid] =
|
|
46
|
-
data[this._meta.cid] ||
|
|
47
|
-
Strings.uniqueId({
|
|
48
|
-
prefix: `${Klass.meta.structuredType.name.toLowerCase()}-`,
|
|
49
|
-
});
|
|
50
|
-
if (!reset)
|
|
51
|
-
data = Objects.merge(this.defaults(), data);
|
|
52
|
-
this.assign(data, { reset });
|
|
53
|
-
}
|
|
54
|
-
//#region Resources
|
|
55
|
-
resource() {
|
|
56
|
-
return ODataModelOptions.resource(this);
|
|
57
|
-
}
|
|
58
|
-
pushResource(resource) {
|
|
59
|
-
// Push current parent and resource
|
|
60
|
-
this._resources.push({ parent: this._parent, resource: this._resource });
|
|
61
|
-
// Replace parent and resource
|
|
62
|
-
this._parent = null;
|
|
63
|
-
this._resource = resource;
|
|
64
|
-
}
|
|
65
|
-
popResource() {
|
|
66
|
-
// Pop parent and resource
|
|
67
|
-
const pop = this._resources.pop();
|
|
68
|
-
if (pop !== undefined) {
|
|
69
|
-
const current = { parent: this._parent, resource: this._resource };
|
|
70
|
-
this._parent = pop.parent;
|
|
71
|
-
this._resource = pop.resource;
|
|
72
|
-
return current;
|
|
73
|
-
}
|
|
74
|
-
return undefined;
|
|
75
|
-
}
|
|
76
|
-
navigationProperty(name) {
|
|
77
|
-
const field = this._meta.findField(name);
|
|
78
|
-
if (!field || !field.navigation)
|
|
79
|
-
throw Error(`navigationProperty: Can't find navigation property ${name}`);
|
|
80
|
-
const resource = this.resource();
|
|
81
|
-
if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
|
|
82
|
-
throw Error("navigationProperty: Can't get navigation without ODataEntityResource with key");
|
|
83
|
-
return field.resourceFactory(resource);
|
|
84
|
-
}
|
|
85
|
-
property(name) {
|
|
86
|
-
const field = this._meta.findField(name);
|
|
87
|
-
if (!field || field.navigation)
|
|
88
|
-
throw Error(`property: Can't find property ${name}`);
|
|
89
|
-
const resource = this.resource();
|
|
90
|
-
if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
|
|
91
|
-
throw Error("property: Can't get property without ODataEntityResource with key");
|
|
92
|
-
return field.resourceFactory(resource);
|
|
93
|
-
}
|
|
94
|
-
attach(resource) {
|
|
95
|
-
return this._meta.attach(this, resource);
|
|
96
|
-
}
|
|
97
|
-
//#endregion
|
|
98
|
-
schema() {
|
|
99
|
-
return this._meta.structuredType;
|
|
100
|
-
}
|
|
101
|
-
annots() {
|
|
102
|
-
return this._annotations;
|
|
103
|
-
}
|
|
104
|
-
key({ field_mapping = false, resolve = true, } = {}) {
|
|
105
|
-
return this._meta.resolveKey(this, { field_mapping, resolve });
|
|
106
|
-
}
|
|
107
|
-
isOpenModel() {
|
|
108
|
-
return this._meta.isOpenType();
|
|
109
|
-
}
|
|
110
|
-
isParentOf(child) {
|
|
111
|
-
return (child !== this &&
|
|
112
|
-
ODataModelOptions.chain(child).some((p) => p[0] === this));
|
|
113
|
-
}
|
|
114
|
-
referential(attr, { field_mapping = false, resolve = true, } = {}) {
|
|
115
|
-
return this._meta.resolveReferential(this, attr, {
|
|
116
|
-
field_mapping,
|
|
117
|
-
resolve,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
referenced(attr, { field_mapping = false, resolve = true, } = {}) {
|
|
121
|
-
return this._meta.resolveReferenced(this, attr, {
|
|
122
|
-
field_mapping,
|
|
123
|
-
resolve,
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
validate({ method, navigation = false, } = {}) {
|
|
127
|
-
return this._meta.validate(this, { method, navigation });
|
|
128
|
-
}
|
|
129
|
-
isValid({ method, navigation = false, } = {}) {
|
|
130
|
-
this._errors = this.validate({ method, navigation });
|
|
131
|
-
if (this._errors !== undefined)
|
|
132
|
-
this.events$.trigger(ODataModelEventType.Invalid, {
|
|
133
|
-
value: this._errors,
|
|
134
|
-
options: { method },
|
|
135
|
-
});
|
|
136
|
-
return this._errors === undefined;
|
|
137
|
-
}
|
|
138
|
-
defaults() {
|
|
139
|
-
return this._meta.defaults() || {};
|
|
140
|
-
}
|
|
141
|
-
toEntity({ client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_id = false, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
|
|
142
|
-
return this._meta.toEntity(this, {
|
|
143
|
-
client_id,
|
|
144
|
-
include_navigation,
|
|
145
|
-
include_concurrency,
|
|
146
|
-
include_computed,
|
|
147
|
-
include_key,
|
|
148
|
-
include_id,
|
|
149
|
-
include_non_field,
|
|
150
|
-
changes_only,
|
|
151
|
-
field_mapping,
|
|
152
|
-
chain,
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
toJson() {
|
|
156
|
-
return this.toEntity(INCLUDE_DEEP);
|
|
157
|
-
}
|
|
158
|
-
set(path, value, { type } = {}) {
|
|
159
|
-
const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
|
|
160
|
-
if (pathArray.length === 0)
|
|
161
|
-
return undefined;
|
|
162
|
-
if (pathArray.length > 1) {
|
|
163
|
-
const model = this[pathArray[0]];
|
|
164
|
-
return model.set(pathArray.slice(1), value, {});
|
|
165
|
-
}
|
|
166
|
-
if (pathArray.length === 1) {
|
|
167
|
-
return this._meta.set(this, pathArray[0], value, { type });
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
get(path) {
|
|
171
|
-
const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
|
|
172
|
-
if (pathArray.length === 0)
|
|
173
|
-
return undefined;
|
|
174
|
-
const value = this._meta.get(this, pathArray[0]);
|
|
175
|
-
if (pathArray.length > 1 &&
|
|
176
|
-
(value instanceof ODataModel || value instanceof ODataCollection)) {
|
|
177
|
-
return value.get(pathArray.slice(1));
|
|
178
|
-
}
|
|
179
|
-
return value;
|
|
180
|
-
}
|
|
181
|
-
has(path) {
|
|
182
|
-
const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
|
|
183
|
-
if (pathArray.length === 0)
|
|
184
|
-
return false;
|
|
185
|
-
const value = this._meta.get(this, pathArray[0]);
|
|
186
|
-
if (pathArray.length > 1 &&
|
|
187
|
-
(value instanceof ODataModel || value instanceof ODataCollection)) {
|
|
188
|
-
return value.has(pathArray.slice(1));
|
|
189
|
-
}
|
|
190
|
-
return value !== undefined;
|
|
191
|
-
}
|
|
192
|
-
reset({ path, silent = false, } = {}) {
|
|
193
|
-
const pathArray = (path === undefined
|
|
194
|
-
? []
|
|
195
|
-
: Types.isArray(path)
|
|
196
|
-
? path
|
|
197
|
-
: path.match(/([^[.\]])+/g));
|
|
198
|
-
const name = pathArray[0];
|
|
199
|
-
const value = name !== undefined ? this[name] : undefined;
|
|
200
|
-
if (ODataModelOptions.isModel(value) ||
|
|
201
|
-
ODataModelOptions.isCollection(value)) {
|
|
202
|
-
value.reset({ path: pathArray.slice(1), silent });
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
this._meta.reset(this, { name: pathArray[0], silent });
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
clear({ silent = false } = {}) {
|
|
209
|
-
this._attributes.clear();
|
|
210
|
-
if (!silent) {
|
|
211
|
-
this.events$.trigger(ODataModelEventType.Update);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
assign(entity, { add = true, merge = true, remove = true, reset = false, reparent = false, silent = false, } = {}) {
|
|
215
|
-
return this._meta.assign(this, entity, {
|
|
216
|
-
add,
|
|
217
|
-
merge,
|
|
218
|
-
remove,
|
|
219
|
-
reset,
|
|
220
|
-
silent,
|
|
221
|
-
reparent,
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
clone() {
|
|
225
|
-
return new this.constructor(this.toEntity(INCLUDE_DEEP), {
|
|
226
|
-
resource: this.resource(),
|
|
227
|
-
annots: this.annots(),
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
_request(obs$, mapCallback) {
|
|
231
|
-
this.events$.trigger(ODataModelEventType.Request, {
|
|
232
|
-
options: { observable: obs$ },
|
|
233
|
-
});
|
|
234
|
-
return obs$.pipe(map((response) => mapCallback(response)), finalize(() => this.events$.trigger(ODataModelEventType.Sync)));
|
|
235
|
-
}
|
|
236
|
-
fetch({ ...options } = {}) {
|
|
237
|
-
const resource = this.resource();
|
|
238
|
-
if (!resource)
|
|
239
|
-
return throwError(() => new Error('fetch: Resource is null'));
|
|
240
|
-
let obs$;
|
|
241
|
-
if (resource instanceof ODataEntityResource) {
|
|
242
|
-
obs$ = resource.fetch(options);
|
|
243
|
-
}
|
|
244
|
-
else if (resource instanceof ODataNavigationPropertyResource) {
|
|
245
|
-
obs$ = resource.fetch({ responseType: 'entity', ...options });
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
obs$ = resource.fetch({
|
|
249
|
-
responseType: 'entity',
|
|
250
|
-
...options,
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
return this._request(obs$, ({ entity, annots }) => {
|
|
254
|
-
this._annotations = annots;
|
|
255
|
-
return this.assign(entity ?? {}, { reset: true });
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
save({ method, navigation = false, validate = true, ...options } = {}) {
|
|
259
|
-
const resource = this.resource();
|
|
260
|
-
if (!resource)
|
|
261
|
-
return throwError(() => new Error('save: Resource is null'));
|
|
262
|
-
if (!(resource instanceof ODataEntityResource ||
|
|
263
|
-
resource instanceof ODataNavigationPropertyResource))
|
|
264
|
-
return throwError(() => new Error('save: Resource type ODataEntityResource/ODataNavigationPropertyResource needed'));
|
|
265
|
-
// Resolve method and resource key
|
|
266
|
-
if (method === undefined && this.schema().isCompoundKey())
|
|
267
|
-
return throwError(() => new Error('save: Composite key require a specific method, use create/update/modify'));
|
|
268
|
-
method = method || (!resource.hasKey() ? 'create' : 'update');
|
|
269
|
-
if (resource instanceof ODataEntityResource &&
|
|
270
|
-
(method === 'update' || method === 'modify') &&
|
|
271
|
-
!resource.hasKey())
|
|
272
|
-
return throwError(() => new Error('save: Update/Patch require entity key'));
|
|
273
|
-
if (resource instanceof ODataNavigationPropertyResource ||
|
|
274
|
-
method === 'create')
|
|
275
|
-
resource.clearKey();
|
|
276
|
-
if (validate && !this.isValid({ method, navigation })) {
|
|
277
|
-
return throwError(() => new Error('save: Validation errors'));
|
|
278
|
-
}
|
|
279
|
-
const _entity = this.toEntity({
|
|
280
|
-
changes_only: method === 'modify',
|
|
281
|
-
field_mapping: true,
|
|
282
|
-
include_concurrency: true,
|
|
283
|
-
include_navigation: navigation,
|
|
284
|
-
});
|
|
285
|
-
const obs$ = method === 'create'
|
|
286
|
-
? resource.create(_entity, options)
|
|
287
|
-
: method === 'modify'
|
|
288
|
-
? resource.modify(_entity, {
|
|
289
|
-
etag: this.annots().etag,
|
|
290
|
-
...options,
|
|
291
|
-
})
|
|
292
|
-
: resource.update(_entity, {
|
|
293
|
-
etag: this.annots().etag,
|
|
294
|
-
...options,
|
|
295
|
-
});
|
|
296
|
-
return this._request(obs$, ({ entity, annots }) => {
|
|
297
|
-
this._annotations = annots;
|
|
298
|
-
return this.assign(entity ?? _entity, {
|
|
299
|
-
reset: true,
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
destroy({ ...options } = {}) {
|
|
304
|
-
const resource = this.resource();
|
|
305
|
-
if (!resource)
|
|
306
|
-
return throwError(() => new Error('destroy: Resource is null'));
|
|
307
|
-
if (!(resource instanceof ODataEntityResource ||
|
|
308
|
-
resource instanceof ODataNavigationPropertyResource))
|
|
309
|
-
return throwError(() => new Error('destroy: Resource type ODataEntityResource/ODataNavigationPropertyResource needed'));
|
|
310
|
-
if (!resource.hasKey())
|
|
311
|
-
return throwError(() => new Error("destroy: Can't destroy model without key"));
|
|
312
|
-
const obs$ = resource.destroy({ etag: this.annots().etag, ...options });
|
|
313
|
-
return this._request(obs$, (resp) => {
|
|
314
|
-
this.events$.trigger(ODataModelEventType.Destroy);
|
|
315
|
-
return resp;
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* Create an execution context for change the internal query of a resource
|
|
320
|
-
* @param ctx Function to execute
|
|
321
|
-
*/
|
|
322
|
-
query(ctx) {
|
|
323
|
-
const resource = this.resource();
|
|
324
|
-
return (resource ? this._meta.query(this, resource, ctx) : this);
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Perform a check on the internal state of the model and return true if the model is changed.
|
|
328
|
-
* @param include_navigation Check in navigation properties
|
|
329
|
-
* @returns true if the model has changed, false otherwise
|
|
330
|
-
*/
|
|
331
|
-
hasChanged({ include_navigation = false, } = {}) {
|
|
332
|
-
return this._meta.hasChanged(this, { include_navigation });
|
|
333
|
-
}
|
|
334
|
-
encode(name, options) {
|
|
335
|
-
const value = this[name];
|
|
336
|
-
if (value === undefined)
|
|
337
|
-
return undefined;
|
|
338
|
-
const field = this._meta.findField(name);
|
|
339
|
-
return field ? field.encode(value, options) : value;
|
|
340
|
-
}
|
|
341
|
-
isNew() {
|
|
342
|
-
return !this._meta.hasKey(this);
|
|
343
|
-
}
|
|
344
|
-
withResource(resource, ctx) {
|
|
345
|
-
return this._meta.withResource(this, resource, ctx);
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Create an execution context for a given function, where the model is bound to its entity endpoint
|
|
349
|
-
* @param ctx Context function
|
|
350
|
-
* @returns The result of the context
|
|
351
|
-
*/
|
|
352
|
-
asEntity(ctx) {
|
|
353
|
-
return this._meta.asEntity(this, ctx);
|
|
354
|
-
}
|
|
355
|
-
//#region Callables
|
|
356
|
-
callFunction(name, params, responseType, options = {}) {
|
|
357
|
-
const resource = this.resource();
|
|
358
|
-
if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
|
|
359
|
-
return throwError(() => new Error("callFunction: Can't call function without ODataEntityResource with key"));
|
|
360
|
-
const func = resource.function(name).query((q) => q.restore(options));
|
|
361
|
-
switch (responseType) {
|
|
362
|
-
case 'property':
|
|
363
|
-
return this._request(func.callProperty(params, options), (resp) => resp);
|
|
364
|
-
case 'model':
|
|
365
|
-
return this._request(func.callModel(params, options), (resp) => resp);
|
|
366
|
-
case 'collection':
|
|
367
|
-
return this._request(func.callCollection(params, options), (resp) => resp);
|
|
368
|
-
case 'blob':
|
|
369
|
-
return this._request(func.callBlob(params, options), (resp) => resp);
|
|
370
|
-
case 'arraybuffer':
|
|
371
|
-
return this._request(func.callArraybuffer(params, options), (resp) => resp);
|
|
372
|
-
default:
|
|
373
|
-
return this._request(func.call(params, { responseType, ...options }), (resp) => resp);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
callAction(name, params, responseType, { ...options } = {}) {
|
|
377
|
-
const resource = this.resource();
|
|
378
|
-
if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
|
|
379
|
-
return throwError(() => new Error("callAction: Can't call action without ODataEntityResource with key"));
|
|
380
|
-
const action = resource.action(name).query((q) => q.restore(options));
|
|
381
|
-
switch (responseType) {
|
|
382
|
-
case 'property':
|
|
383
|
-
return this._request(action.callProperty(params, options), (resp) => resp);
|
|
384
|
-
case 'model':
|
|
385
|
-
return this._request(action.callModel(params, options), (resp) => resp);
|
|
386
|
-
case 'collection':
|
|
387
|
-
return this._request(action.callCollection(params, options), (resp) => resp);
|
|
388
|
-
case 'blob':
|
|
389
|
-
return this._request(action.callBlob(params, options), (resp) => resp);
|
|
390
|
-
case 'arraybuffer':
|
|
391
|
-
return this._request(action.callArraybuffer(params, options), (resp) => resp);
|
|
392
|
-
default:
|
|
393
|
-
return this._request(action.call(params, { responseType, ...options }), (resp) => resp);
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
//#endregion
|
|
397
|
-
// Cast
|
|
398
|
-
cast(type, ModelType) {
|
|
399
|
-
//: ODataModel<S> {
|
|
400
|
-
const resource = this.resource();
|
|
401
|
-
if (!(resource instanceof ODataEntityResource))
|
|
402
|
-
throw new Error(`cast: Can't cast to derived model without ODataEntityResource`);
|
|
403
|
-
return resource
|
|
404
|
-
.cast(type)
|
|
405
|
-
.asModel(this.toEntity(INCLUDE_DEEP), {
|
|
406
|
-
annots: this.annots(),
|
|
407
|
-
ModelType,
|
|
408
|
-
});
|
|
409
|
-
}
|
|
410
|
-
fetchNavigationProperty(name, responseType, options = {}) {
|
|
411
|
-
const nav = this.navigationProperty(name);
|
|
412
|
-
nav.query((q) => q.restore(options));
|
|
413
|
-
switch (responseType) {
|
|
414
|
-
case 'model':
|
|
415
|
-
return nav.fetchModel(options);
|
|
416
|
-
case 'collection':
|
|
417
|
-
return nav.fetchCollection(options);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
fetchAttribute(name, options = {}) {
|
|
421
|
-
const field = this._meta.findField(name);
|
|
422
|
-
if (!field)
|
|
423
|
-
throw Error(`fetchAttribute: Can't find attribute ${name}`);
|
|
424
|
-
if (field.isStructuredType() && field.collection) {
|
|
425
|
-
const collection = field.collectionFactory({ parent: this });
|
|
426
|
-
collection.query((q) => q.restore(options));
|
|
427
|
-
return this._request(collection.fetch(options), () => {
|
|
428
|
-
this.assign({ [name]: collection });
|
|
429
|
-
return collection;
|
|
430
|
-
});
|
|
431
|
-
}
|
|
432
|
-
else if (field.isStructuredType()) {
|
|
433
|
-
const model = field.modelFactory({ parent: this });
|
|
434
|
-
model.query((q) => q.restore(options));
|
|
435
|
-
return this._request(model.fetch(options), () => {
|
|
436
|
-
this.assign({ [name]: model });
|
|
437
|
-
return model;
|
|
438
|
-
});
|
|
439
|
-
}
|
|
440
|
-
else {
|
|
441
|
-
const prop = field.resourceFactory(this.resource());
|
|
442
|
-
prop.query((q) => q.restore(options));
|
|
443
|
-
return this._request(prop.fetchProperty(options), (resp) => {
|
|
444
|
-
this.assign({ [name]: resp });
|
|
445
|
-
return resp;
|
|
446
|
-
});
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
getAttribute(name) {
|
|
450
|
-
const field = this._meta.findField(name);
|
|
451
|
-
if (!field)
|
|
452
|
-
throw Error(`getAttribute: Can't find attribute ${name}`);
|
|
453
|
-
let model = this[name];
|
|
454
|
-
if (field.isStructuredType() && model === undefined) {
|
|
455
|
-
if (field.collection) {
|
|
456
|
-
model = field.collectionFactory({ parent: this });
|
|
457
|
-
}
|
|
458
|
-
else {
|
|
459
|
-
const ref = field.navigation
|
|
460
|
-
? this.referenced(field)
|
|
461
|
-
: undefined;
|
|
462
|
-
model =
|
|
463
|
-
ref === null
|
|
464
|
-
? null
|
|
465
|
-
: field.modelFactory({ parent: this, value: ref });
|
|
466
|
-
}
|
|
467
|
-
this[name] = model;
|
|
468
|
-
}
|
|
469
|
-
return model;
|
|
470
|
-
}
|
|
471
|
-
setAttribute(name, model, options) {
|
|
472
|
-
const reference = this.navigationProperty(name).reference();
|
|
473
|
-
const etag = this.annots().etag;
|
|
474
|
-
let obs$ = NEVER;
|
|
475
|
-
if (model instanceof ODataModel) {
|
|
476
|
-
obs$ = reference.set(model.asEntity((e) => e.resource()), { etag, ...options });
|
|
477
|
-
}
|
|
478
|
-
else if (model instanceof ODataCollection) {
|
|
479
|
-
obs$ = forkJoin(model
|
|
480
|
-
.models()
|
|
481
|
-
.map((m) => reference.add(m.asEntity((e) => e.resource()), options)));
|
|
482
|
-
}
|
|
483
|
-
else if (model === null) {
|
|
484
|
-
obs$ = reference.unset({ etag, ...options });
|
|
485
|
-
}
|
|
486
|
-
return this._request(obs$, (model) => this.assign({ [name]: model }));
|
|
487
|
-
}
|
|
488
|
-
setReference(name, model, options) {
|
|
489
|
-
const reference = this.navigationProperty(name).reference();
|
|
490
|
-
const etag = this.annots().etag;
|
|
491
|
-
let obs$ = NEVER;
|
|
492
|
-
if (model instanceof ODataModel) {
|
|
493
|
-
obs$ = reference.set(model.asEntity((e) => e.resource()), { etag, ...options });
|
|
494
|
-
}
|
|
495
|
-
else if (model instanceof ODataCollection) {
|
|
496
|
-
obs$ = forkJoin(model
|
|
497
|
-
.models()
|
|
498
|
-
.map((m) => reference.add(m.asEntity((e) => e.resource()), options)));
|
|
499
|
-
}
|
|
500
|
-
else if (model === null) {
|
|
501
|
-
obs$ = reference.unset({ etag, ...options });
|
|
502
|
-
}
|
|
503
|
-
return this._request(obs$, (model) => this.assign({ [name]: model }));
|
|
504
|
-
}
|
|
505
|
-
//#region Model Identity
|
|
506
|
-
get [Symbol.toStringTag]() {
|
|
507
|
-
return 'Model';
|
|
508
|
-
}
|
|
509
|
-
equals(other) {
|
|
510
|
-
if (this === other)
|
|
511
|
-
return true;
|
|
512
|
-
if (typeof this !== typeof other)
|
|
513
|
-
return false;
|
|
514
|
-
const meta = this._meta;
|
|
515
|
-
const thisCid = this[meta.cid];
|
|
516
|
-
const otherCid = other[meta.cid];
|
|
517
|
-
if (thisCid !== undefined &&
|
|
518
|
-
otherCid !== undefined &&
|
|
519
|
-
Types.isEqual(thisCid, otherCid))
|
|
520
|
-
return true;
|
|
521
|
-
if (meta.isEntityType()) {
|
|
522
|
-
const thisKey = this.key();
|
|
523
|
-
const otherKey = other.key();
|
|
524
|
-
if (thisKey !== undefined &&
|
|
525
|
-
otherKey !== undefined &&
|
|
526
|
-
Types.isEqual(thisKey, otherKey))
|
|
527
|
-
return true;
|
|
528
|
-
}
|
|
529
|
-
else if (meta.isComplexType()) {
|
|
530
|
-
const thisJson = this.toJson();
|
|
531
|
-
const otherJson = other.toJson();
|
|
532
|
-
if (Types.isEqual(thisJson, otherJson))
|
|
533
|
-
return true;
|
|
534
|
-
}
|
|
535
|
-
return false;
|
|
536
|
-
}
|
|
537
|
-
//#endregion
|
|
538
|
-
//#region Collection Tools
|
|
539
|
-
collection() {
|
|
540
|
-
return this._parent !== null &&
|
|
541
|
-
ODataModelOptions.isCollection(this._parent[0])
|
|
542
|
-
? this._parent[0]
|
|
543
|
-
: undefined;
|
|
544
|
-
}
|
|
545
|
-
next() {
|
|
546
|
-
return this.collection()?.next(this);
|
|
547
|
-
}
|
|
548
|
-
prev() {
|
|
549
|
-
return this.collection()?.prev(this);
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
const RESERVED_FIELD_NAMES = Object.getOwnPropertyNames(ODataModel.prototype);
|
|
553
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvbW9kZWxzL21vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFHTCxtQkFBbUIsRUFFbkIsK0JBQStCLEdBUWhDLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFDTCxZQUFZLEVBR1osaUJBQWlCLEVBRWpCLG1CQUFtQixFQUNuQixzQkFBc0IsR0FFdkIsTUFBTSxXQUFXLENBQUM7QUFLbkIsTUFBTSxPQUFPLFVBQVU7SUE4QnJCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBSSxFQUN6QixNQUFNLEVBQ04sY0FBYyxHQUlmO1FBQ0MsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sTUFBTSxHQUFHLGNBQWM7aUJBQzFCLE1BQU0sQ0FBQyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzNELE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDckIsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDdEIsMkNBQTJDO2dCQUMzQyxPQUFPLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDMUMsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7aUJBQ25CO2dCQUNE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QUFDLENBQXVDO1lBQ3hELENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUVGO0FBRUQsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ya0pvaW4sIE5FVkVSLCBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRW50aXR5S2V5LFxuICBPRGF0YUFjdGlvbk9wdGlvbnMsXG4gIE9EYXRhRW50aXR5UmVzb3VyY2UsXG4gIE9EYXRhRnVuY3Rpb25PcHRpb25zLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YU9wdGlvbnMsXG4gIE9EYXRhUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFRdWVyeUFyZ3VtZW50cyxcbiAgT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnMsXG4gIE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcixcbiAgT0RhdGFSZXNvdXJjZSxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbn0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IE9EYXRhU3RydWN0dXJlZFR5cGUgfSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgT2JqZWN0cywgU3RyaW5ncywgVHlwZXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtcbiAgSU5DTFVERV9ERUVQLFxuICBNb2RlbE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxGaWVsZCxcbiAgT0RhdGFNb2RlbE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxBdHRyaWJ1dGUsXG4gIE9EYXRhTW9kZWxFdmVudFR5cGUsXG4gIE9EYXRhTW9kZWxFdmVudEVtaXR0ZXIsXG4gIE1vZGVsRmllbGRPcHRpb25zLFxufSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgRWRtVHlwZSwgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE9EYXRhRW50aXR5QW5ub3RhdGlvbnMgfSBmcm9tICcuLi9hbm5vdGF0aW9ucyc7XG5pbXBvcnQgeyBPRGF0YUVudGl0eSB9IGZyb20gJy4uL3Jlc291cmNlcy9yZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YU1vZGVsPFQ+IHtcbiAgLy8gUHJvcGVydGllc1xuICBzdGF0aWMgb3B0aW9uczogTW9kZWxPcHRpb25zO1xuICBzdGF0aWMgbWV0YTogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgLy8gUGFyZW50XG4gIF9wYXJlbnQ6XG4gICAgfCBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCxcbiAgICAgIF1cbiAgICB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8VD4gfCBudWxsID0gbnVsbDtcbiAgX3Jlc291cmNlczoge1xuICAgIHBhcmVudDpcbiAgICAgIHwgW1xuICAgICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsLFxuICAgICAgICBdXG4gICAgICB8IG51bGw7XG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8VD4gfCBudWxsO1xuICB9W10gPSBbXTtcbiAgX2F0dHJpYnV0ZXM6IE1hcDxzdHJpbmcsIE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55Pj4gPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBPRGF0YU1vZGVsQXR0cmlidXRlPGFueT5cbiAgPigpO1xuICBfYW5ub3RhdGlvbnMhOiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+O1xuICBfbWV0YTogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgLy8gRXZlbnRzXG4gIGV2ZW50cyQ6IE9EYXRhTW9kZWxFdmVudEVtaXR0ZXI8VD47XG5cbiAgc3RhdGljIGJ1aWxkTWV0YU9wdGlvbnM8VD4oe1xuICAgIGNvbmZpZyxcbiAgICBzdHJ1Y3R1cmVkVHlwZSxcbiAgfToge1xuICAgIGNvbmZpZz86IE1vZGVsT3B0aW9ucztcbiAgICBzdHJ1Y3R1cmVkVHlwZTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPjtcbiAgfSkge1xuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZmllbGRzID0gc3RydWN0dXJlZFR5cGVcbiAgICAgICAgLmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSwgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgICAgICBsZXQgbmFtZSA9IGZpZWxkLm5hbWU7XG4gICAgICAgICAgLy8gUHJldmVudCBjb2xsaXNpb24gd2l0aCByZXNlcnZlZCBrZXl3b3Jkc1xuICAgICAgICAgIHdoaWxlIChSRVNFUlZFRF9GSUVMRF9OQU1FUy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAnXyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywge1xuICAgICAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgICAgIGZpZWxkOiBmaWVsZC5uYW1lLFxuICAgICAgICAgICAgICBkZWZhdWx0OiBmaWVsZC5kZWZhdWx0LFxuICAgICAgICAgICAgICByZXF1aXJlZDogIWZpZWxkLm51bGxhYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwge30pO1xuICAgICAgY29uZmlnID0ge1xuICAgICAgICBmaWVsZHM6IG5ldyBNYXA8c3RyaW5nLCBNb2RlbEZpZWxkT3B0aW9ucz4oT2JqZWN0LmVudHJpZXMoZmllbGRzKSksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE9EYXRhTW9kZWxPcHRpb25zPFQ+KHsgY29uZmlnLCBzdHJ1Y3R1cmVkVHlwZSB9KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhdGE6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBwYXJlbnQ/OiBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCxcbiAgICAgIF07XG4gICAgICByZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD4gfCBudWxsO1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxUPjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IEtsYXNzID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT0RhdGFNb2RlbDtcbiAgICBpZiAoS2xhc3MubWV0YSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbDogQ2FuJ3QgY3JlYXRlIG1vZGVsIHdpdGhvdXQgbWV0YWRhdGFgKTtcbiAgICB0aGlzLl9tZXRhID0gS2xhc3MubWV0YTtcbiAgICB0aGlzLmV2ZW50cyQgPSBuZXcgT0RhdGFNb2RlbEV2ZW50RW1pdHRlcjxUPih7IG1vZGVsOiB0aGlzIH0pO1xuICAgIHRoaXMuX21ldGEuYmluZCh0aGlzLCB7IHBhcmVudCwgcmVzb3VyY2UsIGFubm90cyB9KTtcblxuICAgIC8vIENsaWVudCBJZFxuICAgICg8YW55PnRoaXMpW3RoaXMuX21ldGEuY2lkXSA9XG4gICAgICAoPGFueT5kYXRhKVt0aGlzLl9tZXRhLmNpZF0gfHxcbiAgICAgIFN0cmluZ3MudW5pcXVlSWQoe1xuICAgICAgICBwcmVmaXg6IGAke0tsYXNzLm1ldGEuc3RydWN0dXJlZFR5cGUubmFtZS50b0xvd2VyQ2FzZSgpfS1gLFxuICAgICAgfSk7XG5cbiAgICBpZiAoIXJlc2V0KVxuICAgICAgZGF0YSA9IE9iamVjdHMubWVyZ2UoXG4gICAgICAgIHRoaXMuZGVmYXVsdHMoKSxcbiAgICAgICAgZGF0YSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICAgICkgYXMgUGFydGlhbDxUPjtcblxuICAgIHRoaXMuYXNzaWduKGRhdGEsIHsgcmVzZXQgfSk7XG4gIH1cblxuICAvLyNyZWdpb24gUmVzb3VyY2VzXG4gIHJlc291cmNlKCk6XG4gICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICB8IG51bGwge1xuICAgIHJldHVybiBPRGF0YU1vZGVsT3B0aW9ucy5yZXNvdXJjZTxUPih0aGlzKSBhc1xuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICAgIHwgbnVsbDtcbiAgfVxuXG4gIHB1c2hSZXNvdXJjZShcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICAgICB8IG51bGwsXG4gICkge1xuICAgIC8vIFB1c2ggY3VycmVudCBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgdGhpcy5fcmVzb3VyY2VzLnB1c2goeyBwYXJlbnQ6IHRoaXMuX3BhcmVudCwgcmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlIH0pO1xuICAgIC8vIFJlcGxhY2UgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgfVxuXG4gIHBvcFJlc291cmNlKCkge1xuICAgIC8vIFBvcCBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgY29uc3QgcG9wID0gdGhpcy5fcmVzb3VyY2VzLnBvcCgpO1xuICAgIGlmIChwb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHsgcGFyZW50OiB0aGlzLl9wYXJlbnQsIHJlc291cmNlOiB0aGlzLl9yZXNvdXJjZSB9O1xuICAgICAgdGhpcy5fcGFyZW50ID0gcG9wLnBhcmVudDtcbiAgICAgIHRoaXMuX3Jlc291cmNlID0gcG9wLnJlc291cmNlO1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBuYXZpZ2F0aW9uUHJvcGVydHk8Tj4oXG4gICAgbmFtZToga2V5b2YgVCB8IHN0cmluZyxcbiAgKTogT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxOPiB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpbmRGaWVsZDxOPihuYW1lKTtcbiAgICBpZiAoIWZpZWxkIHx8ICFmaWVsZC5uYXZpZ2F0aW9uKVxuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBuYXZpZ2F0aW9uUHJvcGVydHk6IENhbid0IGZpbmQgbmF2aWdhdGlvbiBwcm9wZXJ0eSAke25hbWUgYXMgc3RyaW5nfWAsXG4gICAgICApO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB8fCAhcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJuYXZpZ2F0aW9uUHJvcGVydHk6IENhbid0IGdldCBuYXZpZ2F0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiLFxuICAgICAgKTtcblxuICAgIHJldHVybiBmaWVsZC5yZXNvdXJjZUZhY3Rvcnk8VCwgTj4oXG4gICAgICByZXNvdXJjZSxcbiAgICApIGFzIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Tj47XG4gIH1cblxuICBwcm9wZXJ0eTxOPihuYW1lOiBzdHJpbmcpOiBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Tj4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maW5kRmllbGQ8Tj4obmFtZSk7XG4gICAgaWYgKCFmaWVsZCB8fCBmaWVsZC5uYXZpZ2F0aW9uKVxuICAgICAgdGhyb3cgRXJyb3IoYHByb3BlcnR5OiBDYW4ndCBmaW5kIHByb3BlcnR5ICR7bmFtZX1gKTtcblxuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkgfHwgIXJlc291cmNlLmhhc0tleSgpKVxuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIFwicHJvcGVydHk6IENhbid0IGdldCBwcm9wZXJ0eSB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2Ugd2l0aCBrZXlcIixcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZmllbGQucmVzb3VyY2VGYWN0b3J5PFQsIE4+KHJlc291cmNlKSBhcyBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Tj47XG4gIH1cblxuICBhdHRhY2goXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPixcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuYXR0YWNoKHRoaXMsIHJlc291cmNlKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBzY2hlbWEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuc3RydWN0dXJlZFR5cGU7XG4gIH1cblxuICBhbm5vdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICB9XG5cbiAga2V5KHtcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgcmVzb2x2ZSA9IHRydWUsXG4gIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fSk6XG4gICAgfCBFbnRpdHlLZXk8VD5cbiAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnJlc29sdmVLZXkodGhpcywgeyBmaWVsZF9tYXBwaW5nLCByZXNvbHZlIH0pO1xuICB9XG5cbiAgaXNPcGVuTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuaXNPcGVuVHlwZSgpO1xuICB9XG5cbiAgaXNQYXJlbnRPZihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoaWxkICE9PSB0aGlzICYmXG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5jaGFpbihjaGlsZCkuc29tZSgocCkgPT4gcFswXSA9PT0gdGhpcylcbiAgICApO1xuICB9XG5cbiAgcmVmZXJlbnRpYWwoXG4gICAgYXR0cjogT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9LFxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnJlc29sdmVSZWZlcmVudGlhbCh0aGlzLCBhdHRyLCB7XG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgcmVzb2x2ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHJlZmVyZW5jZWQoXG4gICAgYXR0cjogT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9LFxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnJlc29sdmVSZWZlcmVuY2VkKHRoaXMsIGF0dHIsIHtcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICByZXNvbHZlLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gVmFsaWRhdGlvblxuICBfZXJyb3JzPzogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIHZhbGlkYXRlKHtcbiAgICBtZXRob2QsXG4gICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICB9OiB7XG4gICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS52YWxpZGF0ZSh0aGlzLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KTtcbiAgfVxuXG4gIGlzVmFsaWQoe1xuICAgIG1ldGhvZCxcbiAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHtcbiAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gIH0gPSB7fSk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2Vycm9ycyA9IHRoaXMudmFsaWRhdGUoeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gICAgaWYgKHRoaXMuX2Vycm9ycyAhPT0gdW5kZWZpbmVkKVxuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5JbnZhbGlkLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLl9lcnJvcnMsXG4gICAgICAgIG9wdGlvbnM6IHsgbWV0aG9kIH0sXG4gICAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JzID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWZhdWx0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5kZWZhdWx0cygpIHx8IHt9O1xuICB9XG5cbiAgdG9FbnRpdHkoe1xuICAgIGNsaWVudF9pZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgIGluY2x1ZGVfaWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICBjaGFpbiA9IFtdLFxuICB9OiB7XG4gICAgY2xpZW50X2lkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfa2V5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2lkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICBjaGFpbj86IChPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVtdO1xuICB9ID0ge30pOiBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnRvRW50aXR5KHRoaXMsIHtcbiAgICAgIGNsaWVudF9pZCxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgaW5jbHVkZV9rZXksXG4gICAgICBpbmNsdWRlX2lkLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICBjaGFuZ2VzX29ubHksXG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgY2hhaW4sXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9FbnRpdHkoSU5DTFVERV9ERUVQKTtcbiAgfVxuXG4gIHNldChcbiAgICBwYXRoOiBrZXlvZiBUIHwgc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgdmFsdWU6IGFueSxcbiAgICB7IHR5cGUgfTogeyB0eXBlPzogRWRtVHlwZSB8IHN0cmluZyB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbW9kZWwgPSAoPGFueT50aGlzKVtwYXRoQXJyYXlbMF1dO1xuICAgICAgcmV0dXJuIG1vZGVsLnNldChwYXRoQXJyYXkuc2xpY2UoMSksIHZhbHVlLCB7fSk7XG4gICAgfVxuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWV0YS5zZXQodGhpcywgcGF0aEFycmF5WzBdLCB2YWx1ZSwgeyB0eXBlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldChwYXRoOiBrZXlvZiBUIHwgc3RyaW5nIHwgc3RyaW5nW10pOiBhbnkge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fbWV0YS5nZXQ8YW55Pih0aGlzLCBwYXRoQXJyYXlbMF0pO1xuICAgIGlmIChcbiAgICAgIHBhdGhBcnJheS5sZW5ndGggPiAxICYmXG4gICAgICAodmFsdWUgaW5zdGFuY2VvZiBPRGF0YU1vZGVsIHx8IHZhbHVlIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKVxuICAgICkge1xuICAgICAgcmV0dXJuIHZhbHVlLmdldChwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBoYXMocGF0aDoga2V5b2YgVCB8IHN0cmluZyB8IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiAocGF0aCBhcyBzdHJpbmcpLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX21ldGEuZ2V0PGFueT4odGhpcywgcGF0aEFycmF5WzBdKTtcbiAgICBpZiAoXG4gICAgICBwYXRoQXJyYXkubGVuZ3RoID4gMSAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgT0RhdGFNb2RlbCB8fCB2YWx1ZSBpbnN0YW5jZW9mIE9EYXRhQ29sbGVjdGlvbilcbiAgICApIHtcbiAgICAgIHJldHVybiB2YWx1ZS5oYXMocGF0aEFycmF5LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICByZXNldCh7XG4gICAgcGF0aCxcbiAgICBzaWxlbnQgPSBmYWxzZSxcbiAgfTogeyBwYXRoPzoga2V5b2YgVCB8IHN0cmluZyB8IHN0cmluZ1tdOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIGNvbnN0IHBhdGhBcnJheTogc3RyaW5nW10gPSAoXG4gICAgICBwYXRoID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBbXVxuICAgICAgICA6IFR5cGVzLmlzQXJyYXkocGF0aClcbiAgICAgICAgICA/IHBhdGhcbiAgICAgICAgICA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBjb25zdCBuYW1lID0gcGF0aEFycmF5WzBdO1xuICAgIGNvbnN0IHZhbHVlID0gbmFtZSAhPT0gdW5kZWZpbmVkID8gKDxhbnk+dGhpcylbbmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkgfHxcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSlcbiAgICApIHtcbiAgICAgIHZhbHVlLnJlc2V0KHsgcGF0aDogcGF0aEFycmF5LnNsaWNlKDEpLCBzaWxlbnQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21ldGEucmVzZXQodGhpcywgeyBuYW1lOiBwYXRoQXJyYXlbMF0sIHNpbGVudCB9KTtcbiAgICB9XG4gIH1cblxuICBjbGVhcih7IHNpbGVudCA9IGZhbHNlIH06IHsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICB0aGlzLl9hdHRyaWJ1dGVzLmNsZWFyKCk7XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlKTtcbiAgICB9XG4gIH1cblxuICBhc3NpZ24oXG4gICAgZW50aXR5OiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAge1xuICAgICAgYWRkID0gdHJ1ZSxcbiAgICAgIG1lcmdlID0gdHJ1ZSxcbiAgICAgIHJlbW92ZSA9IHRydWUsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIGFkZD86IGJvb2xlYW47XG4gICAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgICByZW1vdmU/OiBib29sZWFuO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmFzc2lnbih0aGlzLCBlbnRpdHksIHtcbiAgICAgIGFkZCxcbiAgICAgIG1lcmdlLFxuICAgICAgcmVtb3ZlLFxuICAgICAgcmVzZXQsXG4gICAgICBzaWxlbnQsXG4gICAgICByZXBhcmVudCxcbiAgICB9KSBhcyB0aGlzO1xuICB9XG5cbiAgY2xvbmU8TSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KCkge1xuICAgIHJldHVybiBuZXcgKDx0eXBlb2YgT0RhdGFNb2RlbD50aGlzLmNvbnN0cnVjdG9yKShcbiAgICAgIHRoaXMudG9FbnRpdHkoSU5DTFVERV9ERUVQKSxcbiAgICAgIHtcbiAgICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UoKSBhcyBPRGF0YVJlc291cmNlPFQ+LFxuICAgICAgICBhbm5vdHM6IHRoaXMuYW5ub3RzKCksXG4gICAgICB9LFxuICAgICkgYXMgTTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVlc3Q8VCwgUj4oXG4gICAgb2JzJDogT2JzZXJ2YWJsZTxUPixcbiAgICBtYXBDYWxsYmFjazogKHJlc3BvbnNlOiBUKSA9PiBSLFxuICApOiBPYnNlcnZhYmxlPFI+IHtcbiAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlJlcXVlc3QsIHtcbiAgICAgIG9wdGlvbnM6IHsgb2JzZXJ2YWJsZTogb2JzJCB9LFxuICAgIH0pO1xuICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiBtYXBDYWxsYmFjayhyZXNwb25zZSkpLFxuICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5TeW5jKSksXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoKHtcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIXJlc291cmNlKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdmZXRjaDogUmVzb3VyY2UgaXMgbnVsbCcpKTtcblxuICAgIGxldCBvYnMkOiBPYnNlcnZhYmxlPE9EYXRhRW50aXR5PFQ+PjtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB7XG4gICAgICBvYnMkID0gcmVzb3VyY2UuZmV0Y2gob3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIG9icyQgPSByZXNvdXJjZS5mZXRjaCh7IHJlc3BvbnNlVHlwZTogJ2VudGl0eScsIC4uLm9wdGlvbnMgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9icyQgPSAocmVzb3VyY2UgYXMgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+KS5mZXRjaCh7XG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2VudGl0eScsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgKHsgZW50aXR5LCBhbm5vdHMgfSkgPT4ge1xuICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICByZXR1cm4gdGhpcy5hc3NpZ24oZW50aXR5ID8/IHt9LCB7IHJlc2V0OiB0cnVlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2F2ZSh7XG4gICAgbWV0aG9kLFxuICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB2YWxpZGF0ZSA9IHRydWUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIHZhbGlkYXRlPzogYm9vbGVhbjtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIXJlc291cmNlKSByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ3NhdmU6IFJlc291cmNlIGlzIG51bGwnKSk7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlIHx8XG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZVxuICAgICAgKVxuICAgIClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICdzYXZlOiBSZXNvdXJjZSB0eXBlIE9EYXRhRW50aXR5UmVzb3VyY2UvT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSBuZWVkZWQnLFxuICAgICAgICAgICksXG4gICAgICApO1xuXG4gICAgLy8gUmVzb2x2ZSBtZXRob2QgYW5kIHJlc291cmNlIGtleVxuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnNjaGVtYSgpLmlzQ29tcG91bmRLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICdzYXZlOiBDb21wb3NpdGUga2V5IHJlcXVpcmUgYSBzcGVjaWZpYyBtZXRob2QsIHVzZSBjcmVhdGUvdXBkYXRlL21vZGlmeScsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgbWV0aG9kID0gbWV0aG9kIHx8ICghcmVzb3VyY2UuaGFzS2V5KCkgPyAnY3JlYXRlJyA6ICd1cGRhdGUnKTtcbiAgICBpZiAoXG4gICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgJiZcbiAgICAgIChtZXRob2QgPT09ICd1cGRhdGUnIHx8IG1ldGhvZCA9PT0gJ21vZGlmeScpICYmXG4gICAgICAhcmVzb3VyY2UuaGFzS2V5KClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT4gbmV3IEVycm9yKCdzYXZlOiBVcGRhdGUvUGF0Y2ggcmVxdWlyZSBlbnRpdHkga2V5JyksXG4gICAgICApO1xuICAgIGlmIChcbiAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSB8fFxuICAgICAgbWV0aG9kID09PSAnY3JlYXRlJ1xuICAgIClcbiAgICAgIHJlc291cmNlLmNsZWFyS2V5KCk7XG5cbiAgICBpZiAodmFsaWRhdGUgJiYgIXRoaXMuaXNWYWxpZCh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdzYXZlOiBWYWxpZGF0aW9uIGVycm9ycycpKTtcbiAgICB9XG4gICAgY29uc3QgX2VudGl0eSA9IHRoaXMudG9FbnRpdHkoe1xuICAgICAgY2hhbmdlc19vbmx5OiBtZXRob2QgPT09ICdtb2RpZnknLFxuICAgICAgZmllbGRfbWFwcGluZzogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IG5hdmlnYXRpb24sXG4gICAgfSk7XG4gICAgY29uc3Qgb2JzJCA9XG4gICAgICBtZXRob2QgPT09ICdjcmVhdGUnXG4gICAgICAgID8gcmVzb3VyY2UuY3JlYXRlKF9lbnRpdHkgYXMgVCwgb3B0aW9ucylcbiAgICAgICAgOiBtZXRob2QgPT09ICdtb2RpZnknXG4gICAgICAgICAgPyByZXNvdXJjZS5tb2RpZnkoX2VudGl0eSBhcyBULCB7XG4gICAgICAgICAgICAgIGV0YWc6IHRoaXMuYW5ub3RzKCkuZXRhZyxcbiAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiByZXNvdXJjZS51cGRhdGUoX2VudGl0eSBhcyBULCB7XG4gICAgICAgICAgICAgIGV0YWc6IHRoaXMuYW5ub3RzKCkuZXRhZyxcbiAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsICh7IGVudGl0eSwgYW5ub3RzIH0pID0+IHtcbiAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgcmV0dXJuIHRoaXMuYXNzaWduKGVudGl0eSA/PyAoX2VudGl0eSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSksIHtcbiAgICAgICAgcmVzZXQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlc3Ryb3koe1xuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnM7XG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghcmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ2Rlc3Ryb3k6IFJlc291cmNlIGlzIG51bGwnKSk7XG5cbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgfHxcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlXG4gICAgICApXG4gICAgKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2Rlc3Ryb3k6IFJlc291cmNlIHR5cGUgT0RhdGFFbnRpdHlSZXNvdXJjZS9PRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlIG5lZWRlZCcsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgaWYgKCFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PiBuZXcgRXJyb3IoXCJkZXN0cm95OiBDYW4ndCBkZXN0cm95IG1vZGVsIHdpdGhvdXQga2V5XCIpLFxuICAgICAgKTtcblxuICAgIGNvbnN0IG9icyQgPSByZXNvdXJjZS5kZXN0cm95KHsgZXRhZzogdGhpcy5hbm5vdHMoKS5ldGFnLCAuLi5vcHRpb25zIH0pO1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsIChyZXNwKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLkRlc3Ryb3kpO1xuICAgICAgcmV0dXJuIHJlc3A7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBjaGFuZ2UgdGhlIGludGVybmFsIHF1ZXJ5IG9mIGEgcmVzb3VyY2VcbiAgICogQHBhcmFtIGN0eCBGdW5jdGlvbiB0byBleGVjdXRlXG4gICAqL1xuICBxdWVyeShcbiAgICBjdHg6IChxOiBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXI8VD4sIHM/OiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+KSA9PiB2b2lkLFxuICApIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICByZXR1cm4gKHJlc291cmNlID8gdGhpcy5fbWV0YS5xdWVyeSh0aGlzLCByZXNvdXJjZSwgY3R4KSA6IHRoaXMpIGFzIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIGNoZWNrIG9uIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgbW9kZWwgYW5kIHJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBpcyBjaGFuZ2VkLlxuICAgKiBAcGFyYW0gaW5jbHVkZV9uYXZpZ2F0aW9uIENoZWNrIGluIG5hdmlnYXRpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBtb2RlbCBoYXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBoYXNDaGFuZ2VkKHtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgfTogeyBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmhhc0NoYW5nZWQodGhpcywgeyBpbmNsdWRlX25hdmlnYXRpb24gfSk7XG4gIH1cblxuICBlbmNvZGU8RT4obmFtZToga2V5b2YgVCwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9ICg8YW55PnRoaXMpW25hbWVdO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maW5kRmllbGQ8RT4obmFtZSk7XG4gICAgcmV0dXJuIGZpZWxkID8gZmllbGQuZW5jb2RlKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xuICB9XG5cbiAgaXNOZXcoKSB7XG4gICAgcmV0dXJuICF0aGlzLl9tZXRhLmhhc0tleSh0aGlzKTtcbiAgfVxuXG4gIHdpdGhSZXNvdXJjZTxSPihyZXNvdXJjZTogYW55LCBjdHg6IChtb2RlbDogdGhpcykgPT4gUik6IFIge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLndpdGhSZXNvdXJjZSh0aGlzLCByZXNvdXJjZSwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24sIHdoZXJlIHRoZSBtb2RlbCBpcyBib3VuZCB0byBpdHMgZW50aXR5IGVuZHBvaW50XG4gICAqIEBwYXJhbSBjdHggQ29udGV4dCBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBjb250ZXh0XG4gICAqL1xuICBhc0VudGl0eTxSPihjdHg6IChtb2RlbDogdGhpcykgPT4gUik6IFIge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmFzRW50aXR5KHRoaXMsIGN0eCk7XG4gIH1cblxuICAvLyNyZWdpb24gQ2FsbGFibGVzXG4gIGNhbGxGdW5jdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6XG4gICAgICB8ICdwcm9wZXJ0eSdcbiAgICAgIHwgJ21vZGVsJ1xuICAgICAgfCAnY29sbGVjdGlvbidcbiAgICAgIHwgJ25vbmUnXG4gICAgICB8ICdibG9iJ1xuICAgICAgfCAnYXJyYXlidWZmZXInLFxuICAgIG9wdGlvbnM6IE9EYXRhRnVuY3Rpb25PcHRpb25zPFI+ID0ge30sXG4gICk6IE9ic2VydmFibGU8XG4gICAgfCBSXG4gICAgfCBPRGF0YU1vZGVsPFI+XG4gICAgfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj5cbiAgICB8IG51bGxcbiAgICB8IEJsb2JcbiAgICB8IEFycmF5QnVmZmVyXG4gID4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkgfHwgIXJlc291cmNlLmhhc0tleSgpKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJjYWxsRnVuY3Rpb246IENhbid0IGNhbGwgZnVuY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlIHdpdGgga2V5XCIsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBmdW5jID0gcmVzb3VyY2UuZnVuY3Rpb248UCwgUj4obmFtZSkucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgZnVuYy5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoZnVuYy5jYWxsTW9kZWwocGFyYW1zLCBvcHRpb25zKSwgKHJlc3ApID0+IHJlc3ApO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGZ1bmMuY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ2Jsb2InOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChmdW5jLmNhbGxCbG9iKHBhcmFtcywgb3B0aW9ucyksIChyZXNwKSA9PiByZXNwKTtcbiAgICAgIGNhc2UgJ2FycmF5YnVmZmVyJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgZnVuYy5jYWxsQXJyYXlidWZmZXIocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGZ1bmMuY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlLCAuLi5vcHRpb25zIH0pLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxBY3Rpb248UCwgUj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgcmVzcG9uc2VUeXBlPzpcbiAgICAgIHwgJ3Byb3BlcnR5J1xuICAgICAgfCAnbW9kZWwnXG4gICAgICB8ICdjb2xsZWN0aW9uJ1xuICAgICAgfCAnbm9uZSdcbiAgICAgIHwgJ2Jsb2InXG4gICAgICB8ICdhcnJheWJ1ZmZlcicsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgT0RhdGFBY3Rpb25PcHRpb25zPFI+ID0ge30sXG4gICk6IE9ic2VydmFibGU8XG4gICAgfCBSXG4gICAgfCBPRGF0YU1vZGVsPFI+XG4gICAgfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj5cbiAgICB8IG51bGxcbiAgICB8IEJsb2JcbiAgICB8IEFycmF5QnVmZmVyXG4gID4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkgfHwgIXJlc291cmNlLmhhc0tleSgpKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJjYWxsQWN0aW9uOiBDYW4ndCBjYWxsIGFjdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2Ugd2l0aCBrZXlcIixcbiAgICAgICAgICApLFxuICAgICAgKTtcblxuICAgIGNvbnN0IGFjdGlvbiA9IHJlc291cmNlLmFjdGlvbjxQLCBSPihuYW1lKS5xdWVyeSgocSkgPT4gcS5yZXN0b3JlKG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBhY3Rpb24uY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KGFjdGlvbi5jYWxsTW9kZWwocGFyYW1zLCBvcHRpb25zKSwgKHJlc3ApID0+IHJlc3ApO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGFjdGlvbi5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgICAgY2FzZSAnYmxvYic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KGFjdGlvbi5jYWxsQmxvYihwYXJhbXMsIG9wdGlvbnMpLCAocmVzcCkgPT4gcmVzcCk7XG4gICAgICBjYXNlICdhcnJheWJ1ZmZlcic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGFjdGlvbi5jYWxsQXJyYXlidWZmZXIocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGFjdGlvbi5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vIENhc3RcbiAgY2FzdDxTPih0eXBlOiBzdHJpbmcsIE1vZGVsVHlwZT86IHR5cGVvZiBPRGF0YU1vZGVsKSB7XG4gICAgLy86IE9EYXRhTW9kZWw8Uz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYXN0OiBDYW4ndCBjYXN0IHRvIGRlcml2ZWQgbW9kZWwgd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlYCxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgIC5jYXN0PFM+KHR5cGUpXG4gICAgICAuYXNNb2RlbCh0aGlzLnRvRW50aXR5KElOQ0xVREVfREVFUCkgYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sIHtcbiAgICAgICAgYW5ub3RzOiB0aGlzLmFubm90cygpIGFzIGFueSxcbiAgICAgICAgTW9kZWxUeXBlLFxuICAgICAgfSk7XG4gIH1cblxuICBmZXRjaE5hdmlnYXRpb25Qcm9wZXJ0eTxTPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIHJlc3BvbnNlVHlwZTogJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyxcbiAgICBvcHRpb25zOiBPRGF0YVF1ZXJ5QXJndW1lbnRzT3B0aW9uczxTPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhTW9kZWw8Uz4gfCBPRGF0YUNvbGxlY3Rpb248UywgT0RhdGFNb2RlbDxTPj4gfCBudWxsPiB7XG4gICAgY29uc3QgbmF2ID0gdGhpcy5uYXZpZ2F0aW9uUHJvcGVydHk8Uz4oXG4gICAgICBuYW1lLFxuICAgICkgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxTPjtcbiAgICBuYXYucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIG5hdi5mZXRjaE1vZGVsKG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBuYXYuZmV0Y2hDb2xsZWN0aW9uKG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGZldGNoQXR0cmlidXRlPFA+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnM8UD4gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxQIHwgT0RhdGFNb2RlbDxQPiB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PiB8IG51bGw+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmluZEZpZWxkPFA+KG5hbWUpO1xuICAgIGlmICghZmllbGQpXG4gICAgICB0aHJvdyBFcnJvcihgZmV0Y2hBdHRyaWJ1dGU6IENhbid0IGZpbmQgYXR0cmlidXRlICR7bmFtZSBhcyBzdHJpbmd9YCk7XG5cbiAgICBpZiAoZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpICYmIGZpZWxkLmNvbGxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBmaWVsZC5jb2xsZWN0aW9uRmFjdG9yeTxQPih7IHBhcmVudDogdGhpcyB9KTtcbiAgICAgIGNvbGxlY3Rpb24ucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zIGFzIE9EYXRhUXVlcnlBcmd1bWVudHM8UD4pKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KGNvbGxlY3Rpb24uZmV0Y2gob3B0aW9ucyksICgpID0+IHtcbiAgICAgICAgdGhpcy5hc3NpZ24oeyBbbmFtZV06IGNvbGxlY3Rpb24gfSk7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKCkpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gZmllbGQubW9kZWxGYWN0b3J5PFA+KHsgcGFyZW50OiB0aGlzIH0pO1xuICAgICAgbW9kZWwucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zIGFzIE9EYXRhUXVlcnlBcmd1bWVudHM8UD4pKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG1vZGVsLmZldGNoKG9wdGlvbnMpLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuYXNzaWduKHsgW25hbWVdOiBtb2RlbCB9KTtcbiAgICAgICAgcmV0dXJuIG1vZGVsO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByb3AgPSBmaWVsZC5yZXNvdXJjZUZhY3Rvcnk8VCwgUD4oXG4gICAgICAgIHRoaXMucmVzb3VyY2UoKSEsXG4gICAgICApIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxQPjtcbiAgICAgIHByb3AucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zIGFzIE9EYXRhUXVlcnlBcmd1bWVudHM8UD4pKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHByb3AuZmV0Y2hQcm9wZXJ0eShvcHRpb25zKSwgKHJlc3ApID0+IHtcbiAgICAgICAgdGhpcy5hc3NpZ24oeyBbbmFtZV06IHJlc3AgfSk7XG4gICAgICAgIHJldHVybiByZXNwO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXR0cmlidXRlPFA+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICk6IFAgfCBPRGF0YU1vZGVsPFA+IHwgT0RhdGFDb2xsZWN0aW9uPFAsIE9EYXRhTW9kZWw8UD4+IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpbmRGaWVsZDxQPihuYW1lKTtcbiAgICBpZiAoIWZpZWxkKVxuICAgICAgdGhyb3cgRXJyb3IoYGdldEF0dHJpYnV0ZTogQ2FuJ3QgZmluZCBhdHRyaWJ1dGUgJHtuYW1lIGFzIHN0cmluZ31gKTtcblxuICAgIGxldCBtb2RlbCA9ICh0aGlzIGFzIGFueSlbbmFtZV0gYXNcbiAgICAgIHwgUFxuICAgICAgfCBPRGF0YU1vZGVsPFA+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PlxuICAgICAgfCBudWxsO1xuICAgIGlmIChmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKCkgJiYgbW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpZWxkLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgbW9kZWwgPSBmaWVsZC5jb2xsZWN0aW9uRmFjdG9yeSh7IHBhcmVudDogdGhpcyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlZiA9IGZpZWxkLm5hdmlnYXRpb25cbiAgICAgICAgICA/ICh0aGlzLnJlZmVyZW5jZWQoZmllbGQpIGFzIFApXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1vZGVsID1cbiAgICAgICAgICByZWYgPT09IG51bGxcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiBmaWVsZC5tb2RlbEZhY3RvcnkoeyBwYXJlbnQ6IHRoaXMsIHZhbHVlOiByZWYgfSk7XG4gICAgICB9XG4gICAgICAodGhpcyBhcyBhbnkpW25hbWVdID0gbW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIHNldEF0dHJpYnV0ZTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPE4+IHwgT0RhdGFDb2xsZWN0aW9uPE4sIE9EYXRhTW9kZWw8Tj4+IHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSAoXG4gICAgICB0aGlzLm5hdmlnYXRpb25Qcm9wZXJ0eTxOPihuYW1lKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+XG4gICAgKS5yZWZlcmVuY2UoKTtcblxuICAgIGNvbnN0IGV0YWcgPSB0aGlzLmFubm90cygpLmV0YWc7XG4gICAgbGV0IG9icyQgPSBORVZFUiBhcyBPYnNlcnZhYmxlPGFueT47XG4gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFNb2RlbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS5zZXQoXG4gICAgICAgIG1vZGVsLmFzRW50aXR5KChlKSA9PiBlLnJlc291cmNlKCkpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8Tj4sXG4gICAgICAgIHsgZXRhZywgLi4ub3B0aW9ucyB9LFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKSB7XG4gICAgICBvYnMkID0gZm9ya0pvaW4oXG4gICAgICAgIG1vZGVsXG4gICAgICAgICAgLm1vZGVscygpXG4gICAgICAgICAgLm1hcCgobSkgPT5cbiAgICAgICAgICAgIHJlZmVyZW5jZS5hZGQoXG4gICAgICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUucmVzb3VyY2UoKSkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxOPixcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gbnVsbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS51bnNldCh7IGV0YWcsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsIChtb2RlbCkgPT4gdGhpcy5hc3NpZ24oeyBbbmFtZV06IG1vZGVsIH0pKTtcbiAgfVxuXG4gIHNldFJlZmVyZW5jZTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPE4+IHwgT0RhdGFDb2xsZWN0aW9uPE4sIE9EYXRhTW9kZWw8Tj4+IHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSAoXG4gICAgICB0aGlzLm5hdmlnYXRpb25Qcm9wZXJ0eTxOPihuYW1lKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+XG4gICAgKS5yZWZlcmVuY2UoKTtcblxuICAgIGNvbnN0IGV0YWcgPSB0aGlzLmFubm90cygpLmV0YWc7XG4gICAgbGV0IG9icyQgPSBORVZFUiBhcyBPYnNlcnZhYmxlPGFueT47XG4gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFNb2RlbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS5zZXQoXG4gICAgICAgIG1vZGVsLmFzRW50aXR5KChlKSA9PiBlLnJlc291cmNlKCkpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8Tj4sXG4gICAgICAgIHsgZXRhZywgLi4ub3B0aW9ucyB9LFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKSB7XG4gICAgICBvYnMkID0gZm9ya0pvaW4oXG4gICAgICAgIG1vZGVsXG4gICAgICAgICAgLm1vZGVscygpXG4gICAgICAgICAgLm1hcCgobSkgPT5cbiAgICAgICAgICAgIHJlZmVyZW5jZS5hZGQoXG4gICAgICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUucmVzb3VyY2UoKSkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxOPixcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gbnVsbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS51bnNldCh7IGV0YWcsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsIChtb2RlbCkgPT4gdGhpcy5hc3NpZ24oeyBbbmFtZV06IG1vZGVsIH0pKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBNb2RlbCBJZGVudGl0eVxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdNb2RlbCc7XG4gIH1cbiAgZXF1YWxzKG90aGVyOiBPRGF0YU1vZGVsPFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMgPT09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIHRoaXMgIT09IHR5cGVvZiBvdGhlcikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9tZXRhO1xuICAgIGNvbnN0IHRoaXNDaWQgPSAoPGFueT50aGlzKVttZXRhLmNpZF07XG4gICAgY29uc3Qgb3RoZXJDaWQgPSAoPGFueT5vdGhlcilbbWV0YS5jaWRdO1xuICAgIGlmIChcbiAgICAgIHRoaXNDaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgb3RoZXJDaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgVHlwZXMuaXNFcXVhbCh0aGlzQ2lkLCBvdGhlckNpZClcbiAgICApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAobWV0YS5pc0VudGl0eVR5cGUoKSkge1xuICAgICAgY29uc3QgdGhpc0tleSA9IHRoaXMua2V5KCk7XG4gICAgICBjb25zdCBvdGhlcktleSA9IG90aGVyLmtleSgpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgb3RoZXJLZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBUeXBlcy5pc0VxdWFsKHRoaXNLZXksIG90aGVyS2V5KVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1ldGEuaXNDb21wbGV4VHlwZSgpKSB7XG4gICAgICBjb25zdCB0aGlzSnNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgICBjb25zdCBvdGhlckpzb24gPSBvdGhlci50b0pzb24oKTtcbiAgICAgIGlmIChUeXBlcy5pc0VxdWFsKHRoaXNKc29uLCBvdGhlckpzb24pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBDb2xsZWN0aW9uIFRvb2xzXG4gIGNvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHRoaXMuX3BhcmVudFswXSlcbiAgICAgID8gKHRoaXMuX3BhcmVudFswXSBhcyBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5leHQoKTogT0RhdGFNb2RlbDxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbigpPy5uZXh0KHRoaXMpO1xuICB9XG5cbiAgcHJldigpOiBPRGF0YU1vZGVsPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uKCk/LnByZXYodGhpcyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG5cbmNvbnN0IFJFU0VSVkVEX0ZJRUxEX05BTUVTID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT0RhdGFNb2RlbC5wcm90b3R5cGUpO1xuIl19
|