@kaspernj/api-maker 1.0.2129 → 1.0.2130
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/build/use-collection.d.ts +2 -60
- package/build/use-collection.d.ts.map +1 -1
- package/build/use-collection.js +250 -195
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export default useCollection;
|
|
2
2
|
export type UseCollectionResult = {
|
|
3
3
|
models: Array<import("./base-model.js").default>;
|
|
4
|
-
modelIdsCacheString:
|
|
4
|
+
modelIdsCacheString: string;
|
|
5
5
|
overallCount: number;
|
|
6
6
|
query: import("./collection.js").default<any>;
|
|
7
7
|
queryName: string;
|
|
@@ -14,63 +14,5 @@ export type UseCollectionResult = {
|
|
|
14
14
|
showNoRecordsAvailableContent: false | import("react").ReactNode;
|
|
15
15
|
showNoRecordsFoundContent: false | import("react").ReactNode;
|
|
16
16
|
};
|
|
17
|
-
|
|
18
|
-
* @typedef {object} UseCollectionResult
|
|
19
|
-
* @property {Array<import("./base-model.js").default>} models
|
|
20
|
-
* @property {Array<number | string>} modelIdsCacheString
|
|
21
|
-
* @property {number} overallCount
|
|
22
|
-
* @property {import("./collection.js").default} query
|
|
23
|
-
* @property {string} queryName
|
|
24
|
-
* @property {string} queryPerKey
|
|
25
|
-
* @property {string} queryQName
|
|
26
|
-
* @property {string} querySName
|
|
27
|
-
* @property {string} queryPageName
|
|
28
|
-
* @property {import("./result.js").default} result
|
|
29
|
-
* @property {string[]} searchParams
|
|
30
|
-
* @property {false | import("react").ReactNode} showNoRecordsAvailableContent
|
|
31
|
-
* @property {false | import("react").ReactNode} showNoRecordsFoundContent
|
|
32
|
-
*/
|
|
33
|
-
/**
|
|
34
|
-
* @param {object} props
|
|
35
|
-
* @param {Record<string, string[]>} props.abilities
|
|
36
|
-
* @param {import("./collection.js").default} props.collection
|
|
37
|
-
* @param {Record<string, any>} props.defaultParams
|
|
38
|
-
* @param {string[]} props.groupBy
|
|
39
|
-
* @param {function() : boolean} props.ifCondition
|
|
40
|
-
* @param {number} props.limit
|
|
41
|
-
* @param {typeof import("./base-model.js").default} props.modelClass
|
|
42
|
-
* @param {function() : import("react").ReactNode} props.noRecordsAvailableContent
|
|
43
|
-
* @param {function() : import("react").ReactNode} props.noRecordsFoundContent
|
|
44
|
-
* @param {function() : void} props.onModelsLoaded
|
|
45
|
-
* @param {boolean} props.pagination
|
|
46
|
-
* @param {string[]} props.preloads
|
|
47
|
-
* @param {function({query: import("./collection.js").default}) : import("./collection.js").default} props.queryMethod
|
|
48
|
-
* @param {string} props.queryName
|
|
49
|
-
* @param {Record<string, any>} props.ransack
|
|
50
|
-
* @param {Record<string, string[]>} props.select
|
|
51
|
-
* @param {Record<string, string[]>} props.selectColumns
|
|
52
|
-
* @param {any[]} cacheKeys
|
|
53
|
-
* @returns {UseCollectionResult & Record<string, any>}
|
|
54
|
-
*/
|
|
55
|
-
declare function useCollection(props: {
|
|
56
|
-
abilities: Record<string, string[]>;
|
|
57
|
-
collection: import("./collection.js").default<any>;
|
|
58
|
-
defaultParams: Record<string, any>;
|
|
59
|
-
groupBy: string[];
|
|
60
|
-
ifCondition: () => boolean;
|
|
61
|
-
limit: number;
|
|
62
|
-
modelClass: typeof import("./base-model.js").default;
|
|
63
|
-
noRecordsAvailableContent: () => import("react").ReactNode;
|
|
64
|
-
noRecordsFoundContent: () => import("react").ReactNode;
|
|
65
|
-
onModelsLoaded: () => void;
|
|
66
|
-
pagination: boolean;
|
|
67
|
-
preloads: string[];
|
|
68
|
-
queryMethod: (arg0: {
|
|
69
|
-
query: import("./collection.js").default<any>;
|
|
70
|
-
}) => import("./collection.js").default<any>;
|
|
71
|
-
queryName: string;
|
|
72
|
-
ransack: Record<string, any>;
|
|
73
|
-
select: Record<string, string[]>;
|
|
74
|
-
selectColumns: Record<string, string[]>;
|
|
75
|
-
}, cacheKeys?: any[]): UseCollectionResult & Record<string, any>;
|
|
17
|
+
declare function useCollection(props: any, cacheKeys?: any[]): UseCollectionResult & Record<string, any>;
|
|
76
18
|
//# sourceMappingURL=use-collection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-collection.d.ts","sourceRoot":"/src/","sources":["use-collection.js"],"names":[],"mappings":";;YAYc,KAAK,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC;yBACxC,
|
|
1
|
+
{"version":3,"file":"use-collection.d.ts","sourceRoot":"/src/","sources":["use-collection.js"],"names":[],"mappings":";;YAYc,KAAK,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC;yBACxC,MAAM;kBACN,MAAM;;eAEN,MAAM;iBACN,MAAM;gBACN,MAAM;gBACN,MAAM;mBACN,MAAM;YACN,OAAO,aAAa,EAAE,OAAO;kBAC7B,MAAM,EAAE;mCACR,KAAK,GAAG,OAAO,OAAO,EAAE,SAAS;+BACjC,KAAK,GAAG,OAAO,OAAO,EAAE,SAAS;;AA8T/C,yGA0DC"}
|
package/build/use-collection.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars, no-use-before-define, prefer-object-spread, sort-imports */
|
|
2
|
+
import { ShapeHook, useShapeHook } from "set-state-compare";
|
|
2
3
|
import debounce from "debounce";
|
|
3
4
|
import { digg } from "diggerize";
|
|
4
5
|
import * as inflection from "inflection";
|
|
5
6
|
import ModelEvents from "./model-events.js";
|
|
6
|
-
import {
|
|
7
|
+
import { useEffect } from "react";
|
|
7
8
|
import useCreatedEvent from "./use-created-event.js";
|
|
8
|
-
import useShape from "./use-shape.js";
|
|
9
9
|
import useQueryParams from "on-location-changed/build/use-query-params.js";
|
|
10
10
|
/**
|
|
11
11
|
* @typedef {object} UseCollectionResult
|
|
12
12
|
* @property {Array<import("./base-model.js").default>} models
|
|
13
|
-
* @property {
|
|
13
|
+
* @property {string} modelIdsCacheString
|
|
14
14
|
* @property {number} overallCount
|
|
15
15
|
* @property {import("./collection.js").default} query
|
|
16
16
|
* @property {string} queryName
|
|
@@ -45,89 +45,136 @@ import useQueryParams from "on-location-changed/build/use-query-params.js";
|
|
|
45
45
|
* @param {any[]} cacheKeys
|
|
46
46
|
* @returns {UseCollectionResult & Record<string, any>}
|
|
47
47
|
*/
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
/** Hook state container for useCollection. */
|
|
49
|
+
class UseCollectionShapeHook extends ShapeHook {
|
|
50
|
+
/** Constructor. */
|
|
51
|
+
constructor(props) {
|
|
52
|
+
super(props);
|
|
53
|
+
this.loadModelsGeneration = 0;
|
|
54
|
+
this.loadOverallCountGeneration = 0;
|
|
55
|
+
this.queryParams = undefined;
|
|
52
56
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
queryName,
|
|
73
|
-
queryPerKey: `${queryName}_per`,
|
|
74
|
-
queryQName: `${queryName}_q`,
|
|
75
|
-
querySName: `${queryName}_s`,
|
|
76
|
-
queryPageName: `${queryName}_page`,
|
|
77
|
-
result: undefined,
|
|
78
|
-
searchParams: undefined,
|
|
79
|
-
showNoRecordsAvailableContent: false,
|
|
80
|
-
showNoRecordsFoundContent: false
|
|
81
|
-
});
|
|
82
|
-
s.useStates({
|
|
83
|
-
qParams: () => qParams()
|
|
84
|
-
});
|
|
85
|
-
let modelIdsCacheString;
|
|
86
|
-
if (s.s.models === undefined) {
|
|
87
|
-
modelIdsCacheString = "models-undefined";
|
|
57
|
+
/** @returns {string} */
|
|
58
|
+
queryName() {
|
|
59
|
+
return this.p.queryName || digg(this.p.modelClass.modelClassData(), "collectionKey");
|
|
60
|
+
}
|
|
61
|
+
/** @returns {string} */
|
|
62
|
+
queryPerKey() {
|
|
63
|
+
return `${this.queryName()}_per`;
|
|
64
|
+
}
|
|
65
|
+
/** @returns {string} */
|
|
66
|
+
queryQName() {
|
|
67
|
+
return `${this.queryName()}_q`;
|
|
68
|
+
}
|
|
69
|
+
/** @returns {string} */
|
|
70
|
+
querySName() {
|
|
71
|
+
return `${this.queryName()}_s`;
|
|
72
|
+
}
|
|
73
|
+
/** @returns {string} */
|
|
74
|
+
queryPageName() {
|
|
75
|
+
return `${this.queryName()}_page`;
|
|
88
76
|
}
|
|
89
|
-
|
|
90
|
-
|
|
77
|
+
/** @returns {string} */
|
|
78
|
+
modelIdsCacheString() {
|
|
79
|
+
if (this.s.models === undefined) {
|
|
80
|
+
return "models-undefined";
|
|
81
|
+
}
|
|
82
|
+
else if (this.s.models.length === 0) {
|
|
83
|
+
return "no-models";
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
return this.s.models.map((model) => model.cacheKey())?.join("---");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** @returns {Function & {clear?: () => void}} */
|
|
90
|
+
loadModelsDebounce() {
|
|
91
|
+
return this.cache("loadModelsDebounce", () => debounce(() => this.loadModels()));
|
|
92
|
+
}
|
|
93
|
+
/** @param {Record<string, any>} args */
|
|
94
|
+
showNoRecordsAvailableContent(args) {
|
|
95
|
+
let models, overallCount;
|
|
96
|
+
if (args.models !== undefined) {
|
|
97
|
+
models = args.models;
|
|
98
|
+
}
|
|
99
|
+
else if (this.s.models !== undefined) {
|
|
100
|
+
models = this.s.models;
|
|
101
|
+
}
|
|
102
|
+
if (args.overallCount !== undefined) {
|
|
103
|
+
overallCount = args.overallCount;
|
|
104
|
+
}
|
|
105
|
+
else if (this.s.overallCount !== undefined) {
|
|
106
|
+
overallCount = this.s.overallCount;
|
|
107
|
+
}
|
|
108
|
+
if (models === undefined || overallCount === undefined || this.p.noRecordsAvailableContent === undefined)
|
|
109
|
+
return false;
|
|
110
|
+
if (models.length === 0 && overallCount === 0 && this.p.noRecordsAvailableContent)
|
|
111
|
+
return true;
|
|
91
112
|
}
|
|
92
|
-
|
|
93
|
-
|
|
113
|
+
/** @param {Record<string, any>} args */
|
|
114
|
+
showNoRecordsFoundContent(args) {
|
|
115
|
+
let models, overallCount;
|
|
116
|
+
if (args.models !== undefined) {
|
|
117
|
+
models = args.models;
|
|
118
|
+
}
|
|
119
|
+
else if (this.s.models !== undefined) {
|
|
120
|
+
models = this.s.models;
|
|
121
|
+
}
|
|
122
|
+
if (args.overallCount !== undefined) {
|
|
123
|
+
overallCount = args.overallCount;
|
|
124
|
+
}
|
|
125
|
+
else if (this.s.overallCount !== undefined) {
|
|
126
|
+
overallCount = this.s.overallCount;
|
|
127
|
+
}
|
|
128
|
+
if (models === undefined || this.p.noRecordsFoundContent === undefined)
|
|
129
|
+
return false;
|
|
130
|
+
// Dont show noRecordsAvailableContent together with noRecordsAvailableContent
|
|
131
|
+
if (models.length === 0 && overallCount === 0 && this.p.noRecordsAvailableContent)
|
|
132
|
+
return false;
|
|
133
|
+
if (models.length === 0 && this.p.noRecordsFoundContent)
|
|
134
|
+
return true;
|
|
94
135
|
}
|
|
95
|
-
|
|
136
|
+
/** @returns {Promise<void>} */
|
|
137
|
+
loadOverallCount = async () => {
|
|
96
138
|
// Ignore late overall-count responses once a newer load cycle has started or the hook unmounted.
|
|
97
|
-
const loadOverallCountGeneration =
|
|
98
|
-
|
|
99
|
-
const baseQuery =
|
|
139
|
+
const loadOverallCountGeneration = this.loadOverallCountGeneration + 1;
|
|
140
|
+
this.loadOverallCountGeneration = loadOverallCountGeneration;
|
|
141
|
+
const baseQuery = this.p.collection || this.p.modelClass.all();
|
|
100
142
|
const overallCount = await baseQuery.count();
|
|
101
|
-
if (loadOverallCountGeneration !=
|
|
143
|
+
if (!this.isMounted() || loadOverallCountGeneration != this.loadOverallCountGeneration)
|
|
102
144
|
return;
|
|
103
|
-
|
|
145
|
+
this.setState({
|
|
104
146
|
overallCount,
|
|
105
|
-
showNoRecordsAvailableContent: showNoRecordsAvailableContent({ overallCount }),
|
|
106
|
-
showNoRecordsFoundContent: showNoRecordsFoundContent({ overallCount })
|
|
147
|
+
showNoRecordsAvailableContent: this.showNoRecordsAvailableContent({ overallCount }),
|
|
148
|
+
showNoRecordsFoundContent: this.showNoRecordsFoundContent({ overallCount })
|
|
107
149
|
});
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
|
|
150
|
+
};
|
|
151
|
+
/** @returns {void} */
|
|
152
|
+
loadQParams() {
|
|
153
|
+
let qParamsToSet = Object.assign({}, this.p.defaultParams);
|
|
111
154
|
const searchParams = [];
|
|
112
|
-
if (
|
|
113
|
-
|
|
155
|
+
if (this.queryParams && this.queryQName() in this.queryParams) {
|
|
156
|
+
qParamsToSet = JSON.parse(digg(this.queryParams, this.queryQName()));
|
|
157
|
+
}
|
|
158
|
+
if (this.queryParams?.[this.querySName()]) {
|
|
159
|
+
for (const rawSearchParam of this.queryParams[this.querySName()]) {
|
|
114
160
|
const parsedSearchParam = JSON.parse(rawSearchParam);
|
|
115
161
|
searchParams.push(parsedSearchParam);
|
|
116
162
|
}
|
|
117
163
|
}
|
|
118
|
-
|
|
164
|
+
this.setState({
|
|
119
165
|
qParams: qParamsToSet,
|
|
120
166
|
searchParams
|
|
121
167
|
});
|
|
122
|
-
}
|
|
123
|
-
|
|
168
|
+
}
|
|
169
|
+
/** @returns {Promise<void>} */
|
|
170
|
+
loadModels = async () => {
|
|
124
171
|
// Only the newest collection request is allowed to update state after navigation/filter changes.
|
|
125
|
-
const loadModelsGeneration =
|
|
126
|
-
|
|
127
|
-
let query =
|
|
128
|
-
if (
|
|
129
|
-
const page =
|
|
130
|
-
let per =
|
|
172
|
+
const loadModelsGeneration = this.loadModelsGeneration + 1;
|
|
173
|
+
this.loadModelsGeneration = loadModelsGeneration;
|
|
174
|
+
let query = this.p.collection?.clone() || this.p.modelClass.ransack();
|
|
175
|
+
if (this.p.pagination) {
|
|
176
|
+
const page = this.queryParams?.[this.queryPageName()] || 1;
|
|
177
|
+
let per = this.queryParams?.[this.queryPerKey()] || 30;
|
|
131
178
|
if (per == "all") {
|
|
132
179
|
per = 999_999_999;
|
|
133
180
|
}
|
|
@@ -136,154 +183,162 @@ const useCollection = (props, cacheKeys = []) => {
|
|
|
136
183
|
}
|
|
137
184
|
query.page(page).per(per);
|
|
138
185
|
}
|
|
139
|
-
if (
|
|
140
|
-
query = query.groupBy(...
|
|
186
|
+
if (this.p.groupBy)
|
|
187
|
+
query = query.groupBy(...this.p.groupBy);
|
|
141
188
|
query = query
|
|
142
|
-
.ransack(
|
|
143
|
-
.search(
|
|
144
|
-
.searchKey(
|
|
145
|
-
.pageKey(
|
|
146
|
-
.perKey(
|
|
147
|
-
if (
|
|
148
|
-
query.abilities(
|
|
149
|
-
if (
|
|
150
|
-
query.limit(
|
|
151
|
-
if (
|
|
152
|
-
query.preload(
|
|
153
|
-
if (
|
|
154
|
-
query.ransack(
|
|
155
|
-
if (
|
|
156
|
-
query.select(
|
|
157
|
-
if (
|
|
158
|
-
query.selectColumns(
|
|
189
|
+
.ransack(this.s.qParams)
|
|
190
|
+
.search(this.s.searchParams)
|
|
191
|
+
.searchKey(this.queryQName())
|
|
192
|
+
.pageKey(this.queryPageName())
|
|
193
|
+
.perKey(this.queryPerKey());
|
|
194
|
+
if (this.p.abilities)
|
|
195
|
+
query.abilities(this.p.abilities);
|
|
196
|
+
if (this.p.limit !== undefined)
|
|
197
|
+
query.limit(this.p.limit);
|
|
198
|
+
if (this.p.preloads)
|
|
199
|
+
query.preload(this.p.preloads);
|
|
200
|
+
if (this.p.ransack)
|
|
201
|
+
query.ransack(this.p.ransack);
|
|
202
|
+
if (this.p.select)
|
|
203
|
+
query.select(this.p.select);
|
|
204
|
+
if (this.p.selectColumns)
|
|
205
|
+
query.selectColumns(this.p.selectColumns);
|
|
159
206
|
let result;
|
|
160
|
-
if (
|
|
161
|
-
result = await
|
|
207
|
+
if (this.p.queryMethod) {
|
|
208
|
+
result = await this.p.queryMethod({ query });
|
|
162
209
|
}
|
|
163
210
|
else {
|
|
164
211
|
result = await query.result();
|
|
165
212
|
}
|
|
166
213
|
const models = result.models();
|
|
167
|
-
if (loadModelsGeneration !=
|
|
214
|
+
if (!this.isMounted() || loadModelsGeneration != this.loadModelsGeneration)
|
|
168
215
|
return;
|
|
169
|
-
if (
|
|
170
|
-
|
|
216
|
+
if (this.p.onModelsLoaded) {
|
|
217
|
+
this.p.onModelsLoaded({
|
|
171
218
|
models,
|
|
172
|
-
qParams:
|
|
219
|
+
qParams: this.s.qParams,
|
|
173
220
|
query,
|
|
174
221
|
result
|
|
175
222
|
});
|
|
176
223
|
}
|
|
177
|
-
|
|
178
|
-
models
|
|
224
|
+
this.setState({
|
|
225
|
+
models,
|
|
179
226
|
query,
|
|
180
227
|
result,
|
|
181
|
-
showNoRecordsAvailableContent: showNoRecordsAvailableContent({ models }),
|
|
182
|
-
showNoRecordsFoundContent: showNoRecordsFoundContent({ models })
|
|
228
|
+
showNoRecordsAvailableContent: this.showNoRecordsAvailableContent({ models }),
|
|
229
|
+
showNoRecordsFoundContent: this.showNoRecordsFoundContent({ models })
|
|
183
230
|
});
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
231
|
+
};
|
|
232
|
+
/** @param {{model: import("./base-model.js").default}} args */
|
|
233
|
+
onModelDestroyed(args) {
|
|
234
|
+
const destroyedModel = digg(args, "model");
|
|
235
|
+
this.setState({
|
|
236
|
+
models: this.s.models.filter((model) => model.id() != destroyedModel.id())
|
|
189
237
|
});
|
|
190
|
-
}
|
|
191
|
-
|
|
238
|
+
}
|
|
239
|
+
/** @param {{model: import("./base-model.js").default}} args */
|
|
240
|
+
onModelUpdated(args) {
|
|
192
241
|
const updatedModel = digg(args, "model");
|
|
193
|
-
const foundModel =
|
|
242
|
+
const foundModel = this.s.models.find((model) => model.id() == updatedModel.id());
|
|
194
243
|
if (foundModel)
|
|
195
|
-
loadModelsDebounce();
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
models = args.models;
|
|
220
|
-
}
|
|
221
|
-
else if (s.s.models !== undefined) {
|
|
222
|
-
models = s.s.models;
|
|
223
|
-
}
|
|
224
|
-
if (args.overallCount !== undefined) {
|
|
225
|
-
overallCount = args.overallCount;
|
|
226
|
-
}
|
|
227
|
-
else if (s.s.overallCount !== undefined) {
|
|
228
|
-
overallCount = s.s.overallCount;
|
|
229
|
-
}
|
|
230
|
-
if (models === undefined || s.props.noRecordsFoundContent === undefined)
|
|
231
|
-
return false;
|
|
232
|
-
// Dont show noRecordsAvailableContent together with noRecordsAvailableContent
|
|
233
|
-
if (models.length === 0 && overallCount === 0 && s.props.noRecordsAvailableContent)
|
|
234
|
-
return false;
|
|
235
|
-
if (models.length === 0 && s.props.noRecordsFoundContent)
|
|
236
|
-
return true;
|
|
237
|
-
}, []);
|
|
238
|
-
const onCreated = useCallback(() => {
|
|
239
|
-
loadModelsDebounce();
|
|
240
|
-
}, []);
|
|
241
|
-
// Collection loading has to wait until mount so fast responses cannot get stranded in ShapeHook's pre-mount queue.
|
|
242
|
-
useEffect(() => {
|
|
243
|
-
if (!("ifCondition" in s.props) || s.props.ifCondition) {
|
|
244
|
-
loadQParams();
|
|
245
|
-
loadModels();
|
|
246
|
-
}
|
|
247
|
-
}, [
|
|
248
|
-
modelClass,
|
|
249
|
-
s.props.ifCondition,
|
|
250
|
-
s.s.queryName,
|
|
251
|
-
s.m.queryParams[s.s.queryQName],
|
|
252
|
-
s.m.queryParams[s.s.queryPageName],
|
|
253
|
-
s.m.queryParams[s.s.queryPerKey],
|
|
254
|
-
s.m.queryParams[s.s.querySName],
|
|
255
|
-
collection
|
|
256
|
-
].concat(cacheKeys));
|
|
257
|
-
useEffect(() => {
|
|
258
|
-
if (s.props.noRecordsAvailableContent) {
|
|
259
|
-
loadOverallCount();
|
|
260
|
-
}
|
|
261
|
-
}, [modelClass]);
|
|
262
|
-
useCreatedEvent(s.p.modelClass, onCreated);
|
|
263
|
-
// Invalidate any in-flight async responses so unmounted hooks cannot write stale state.
|
|
264
|
-
useEffect(() => () => {
|
|
265
|
-
loadModelsGenerationRef.current += 1;
|
|
266
|
-
loadOverallCountGenerationRef.current += 1;
|
|
267
|
-
}, []);
|
|
268
|
-
useEffect(() => {
|
|
269
|
-
const connections = [];
|
|
270
|
-
if (s.s.models) {
|
|
271
|
-
for (const model of s.s.models) {
|
|
272
|
-
connections.push(ModelEvents.connectUpdated(model, onModelUpdated));
|
|
273
|
-
connections.push(ModelEvents.connectDestroyed(model, onModelDestroyed));
|
|
244
|
+
this.loadModelsDebounce()();
|
|
245
|
+
}
|
|
246
|
+
/** @returns {void} */
|
|
247
|
+
onCreated() {
|
|
248
|
+
this.loadModelsDebounce()();
|
|
249
|
+
}
|
|
250
|
+
/** @returns {void} */
|
|
251
|
+
setup() {
|
|
252
|
+
this.useStates({
|
|
253
|
+
models: undefined,
|
|
254
|
+
overallCount: undefined,
|
|
255
|
+
qParams: {},
|
|
256
|
+
query: undefined,
|
|
257
|
+
result: undefined,
|
|
258
|
+
searchParams: undefined,
|
|
259
|
+
showNoRecordsAvailableContent: false,
|
|
260
|
+
showNoRecordsFoundContent: false
|
|
261
|
+
});
|
|
262
|
+
this.setInstance({ queryParams: useQueryParams() });
|
|
263
|
+
// Collection loading has to wait until mount so fast responses cannot get stranded in ShapeHook's pre-mount queue.
|
|
264
|
+
useEffect(() => {
|
|
265
|
+
if (!("ifCondition" in this.props) || this.p.ifCondition) {
|
|
266
|
+
this.loadQParams();
|
|
267
|
+
this.loadModels();
|
|
274
268
|
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
269
|
+
}, [
|
|
270
|
+
this.p.modelClass,
|
|
271
|
+
this.p.ifCondition,
|
|
272
|
+
this.queryName(),
|
|
273
|
+
this.queryParams?.[this.queryQName()],
|
|
274
|
+
this.queryParams?.[this.queryPageName()],
|
|
275
|
+
this.queryParams?.[this.queryPerKey()],
|
|
276
|
+
this.queryParams?.[this.querySName()],
|
|
277
|
+
this.p.collection
|
|
278
|
+
].concat(this.p.cacheKeys));
|
|
279
|
+
useEffect(() => {
|
|
280
|
+
if (this.p.noRecordsAvailableContent) {
|
|
281
|
+
this.loadOverallCount();
|
|
282
|
+
}
|
|
283
|
+
}, [this.p.modelClass]);
|
|
284
|
+
useCreatedEvent(this.p.modelClass, () => this.onCreated());
|
|
285
|
+
// Invalidate any in-flight async responses so unmounted hooks cannot write stale state.
|
|
286
|
+
useEffect(() => () => {
|
|
287
|
+
this.loadModelsGeneration += 1;
|
|
288
|
+
this.loadOverallCountGeneration += 1;
|
|
289
|
+
this.loadModelsDebounce().clear?.();
|
|
290
|
+
}, []);
|
|
291
|
+
useEffect(() => {
|
|
292
|
+
const connections = [];
|
|
293
|
+
if (this.s.models) {
|
|
294
|
+
for (const model of this.s.models) {
|
|
295
|
+
connections.push(ModelEvents.connectUpdated(model, (args) => this.onModelUpdated(args)));
|
|
296
|
+
connections.push(ModelEvents.connectDestroyed(model, (args) => this.onModelDestroyed(args)));
|
|
297
|
+
}
|
|
279
298
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
299
|
+
return () => {
|
|
300
|
+
for (const connection of connections) {
|
|
301
|
+
connection.unsubscribe();
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
}, [this.modelIdsCacheString()]);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const useCollection = (props, cacheKeys = []) => {
|
|
308
|
+
const { abilities, collection, defaultParams, groupBy, ifCondition, limit, modelClass, noRecordsAvailableContent = undefined, noRecordsFoundContent = undefined, onModelsLoaded, pagination = false, preloads = [], queryMethod, queryName, ransack, select = {}, selectColumns, ...restProps } = props;
|
|
309
|
+
if (Object.keys(restProps).length > 0) {
|
|
310
|
+
throw new Error(`Unknown props given to useCollection: ${Object.keys(restProps).join(", ")}`);
|
|
311
|
+
}
|
|
312
|
+
const shapeHook = useShapeHook(UseCollectionShapeHook, {
|
|
313
|
+
abilities,
|
|
314
|
+
cacheKeys,
|
|
315
|
+
collection,
|
|
316
|
+
defaultParams,
|
|
317
|
+
groupBy,
|
|
318
|
+
ifCondition,
|
|
319
|
+
limit,
|
|
320
|
+
modelClass,
|
|
321
|
+
noRecordsAvailableContent,
|
|
322
|
+
noRecordsFoundContent,
|
|
323
|
+
onModelsLoaded,
|
|
324
|
+
pagination,
|
|
325
|
+
preloads,
|
|
326
|
+
queryMethod,
|
|
327
|
+
queryName,
|
|
328
|
+
ransack,
|
|
329
|
+
select,
|
|
330
|
+
selectColumns
|
|
331
|
+
});
|
|
332
|
+
const result = /** @type {UseCollectionResult & Record<string, any>} */ (Object.assign({}, shapeHook.state));
|
|
333
|
+
const modelVariableName = inflection.pluralize(inflection.camelize(shapeHook.p.modelClass.modelClassData().name, true));
|
|
334
|
+
result.modelIdsCacheString = shapeHook.modelIdsCacheString();
|
|
335
|
+
result.queryName = shapeHook.queryName();
|
|
336
|
+
result.queryPerKey = shapeHook.queryPerKey();
|
|
337
|
+
result.queryQName = shapeHook.queryQName();
|
|
338
|
+
result.querySName = shapeHook.querySName();
|
|
339
|
+
result.queryPageName = shapeHook.queryPageName();
|
|
340
|
+
result[modelVariableName] = shapeHook.s.models;
|
|
286
341
|
return result;
|
|
287
342
|
};
|
|
288
343
|
export default useCollection;
|
|
289
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInVzZS1jb2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZGQUE2RjtBQUM3RixPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUE7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLFdBQVcsTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFDLE1BQU0sT0FBTyxDQUFBO0FBQzdELE9BQU8sZUFBZSxNQUFNLHdCQUF3QixDQUFBO0FBQ3BELE9BQU8sUUFBUSxNQUFNLGdCQUFnQixDQUFBO0FBQ3JDLE9BQU8sY0FBYyxNQUFNLCtDQUErQyxDQUFBO0FBRTFFOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDOUMsTUFBTSxFQUNKLFNBQVMsRUFDVCxVQUFVLEVBQ1YsYUFBYSxFQUNiLE9BQU8sRUFDUCxXQUFXLEVBQ1gsS0FBSyxFQUNMLFVBQVUsRUFDVix5QkFBeUIsR0FBRyxTQUFTLEVBQ3JDLHFCQUFxQixHQUFHLFNBQVMsRUFDakMsY0FBYyxFQUNkLFVBQVUsR0FBRyxLQUFLLEVBQ2xCLFFBQVEsR0FBRyxFQUFFLEVBQ2IsV0FBVyxFQUNYLFNBQVMsRUFBRSxnQkFBZ0IsRUFDM0IsT0FBTyxFQUNQLE1BQU0sR0FBRyxFQUFFLEVBQ1gsYUFBYSxFQUNiLEdBQUcsU0FBUyxFQUNiLEdBQUcsS0FBSyxDQUFBO0lBRVQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFD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LFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUUzRyxNQUFNLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUE7SUFDaEQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7SUFFdEMsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUE7QUFFRCxlQUFlLGFBQWEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZSwgcHJlZmVyLW9iamVjdC1zcHJlYWQsIHNvcnQtaW1wb3J0cyAqL1xuaW1wb3J0IGRlYm91bmNlIGZyb20gXCJkZWJvdW5jZVwiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTW9kZWxFdmVudHMgZnJvbSBcIi4vbW9kZWwtZXZlbnRzLmpzXCJcbmltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHVzZUNyZWF0ZWRFdmVudCBmcm9tIFwiLi91c2UtY3JlYXRlZC1ldmVudC5qc1wiXG5pbXBvcnQgdXNlU2hhcGUgZnJvbSBcIi4vdXNlLXNoYXBlLmpzXCJcbmltcG9ydCB1c2VRdWVyeVBhcmFtcyBmcm9tIFwib24tbG9jYXRpb24tY2hhbmdlZC9idWlsZC91c2UtcXVlcnktcGFyYW1zLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVc2VDb2xsZWN0aW9uUmVzdWx0XG4gKiBAcHJvcGVydHkge0FycmF5PGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0Pn0gbW9kZWxzXG4gKiBAcHJvcGVydHkge0FycmF5PG51bWJlciB8IHN0cmluZz59IG1vZGVsSWRzQ2FjaGVTdHJpbmdcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvdmVyYWxsQ291bnRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHF1ZXJ5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlQZXJLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeVFOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlTTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHF1ZXJ5UGFnZU5hbWVcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9yZXN1bHQuanNcIikuZGVmYXVsdH0gcmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBzZWFyY2hQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7ZmFsc2UgfCBpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50XG4gKiBAcHJvcGVydHkge2ZhbHNlIHwgaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBwcm9wcy5hYmlsaXRpZXNcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHByb3BzLmNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcHJvcHMuZGVmYXVsdFBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHMuZ3JvdXBCeVxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogYm9vbGVhbn0gcHJvcHMuaWZDb25kaXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBwcm9wcy5saW1pdFxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9IHByb3BzLm1vZGVsQ2xhc3NcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IGltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gcHJvcHMubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudFxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBwcm9wcy5ub1JlY29yZHNGb3VuZENvbnRlbnRcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IHByb3BzLm9uTW9kZWxzTG9hZGVkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHByb3BzLnBhZ2luYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BzLnByZWxvYWRzXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHtxdWVyeTogaW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9KSA6IGltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0fSBwcm9wcy5xdWVyeU1ldGhvZFxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BzLnF1ZXJ5TmFtZVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwcm9wcy5yYW5zYWNrXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gcHJvcHMuc2VsZWN0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gcHJvcHMuc2VsZWN0Q29sdW1uc1xuICogQHBhcmFtIHthbnlbXX0gY2FjaGVLZXlzXG4gKiBAcmV0dXJucyB7VXNlQ29sbGVjdGlvblJlc3VsdCAmIFJlY29yZDxzdHJpbmcsIGFueT59XG4gKi9cbmNvbnN0IHVzZUNvbGxlY3Rpb24gPSAocHJvcHMsIGNhY2hlS2V5cyA9IFtdKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhYmlsaXRpZXMsXG4gICAgY29sbGVjdGlvbixcbiAgICBkZWZhdWx0UGFyYW1zLFxuICAgIGdyb3VwQnksXG4gICAgaWZDb25kaXRpb24sXG4gICAgbGltaXQsXG4gICAgbW9kZWxDbGFzcyxcbiAgICBub1JlY29yZHNBdmFpbGFibGVDb250ZW50ID0gdW5kZWZpbmVkLFxuICAgIG5vUmVjb3Jkc0ZvdW5kQ29udGVudCA9IHVuZGVmaW5lZCxcbiAgICBvbk1vZGVsc0xvYWRlZCxcbiAgICBwYWdpbmF0aW9uID0gZmFsc2UsXG4gICAgcHJlbG9hZHMgPSBbXSxcbiAgICBxdWVyeU1ldGhvZCxcbiAgICBxdWVyeU5hbWU6IGluaXRpYWxRdWVyeU5hbWUsXG4gICAgcmFuc2FjayxcbiAgICBzZWxlY3QgPSB7fSxcbiAgICBzZWxlY3RDb2x1bW5zLFxuICAgIC4uLnJlc3RQcm9wc1xuICB9ID0gcHJvcHNcblxuICBpZiAoT2JqZWN0LmtleXMocmVzdFByb3BzKS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHByb3BzIGdpdmVuIHRvIHVzZUNvbGxlY3Rpb246ICR7T2JqZWN0LmtleXMocmVzdFByb3BzKS5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIGNvbnN0IHMgPSB1c2VTaGFwZShwcm9wcylcbiAgY29uc3QgcXVlcnlOYW1lID0gaW5pdGlhbFF1ZXJ5TmFtZSB8fCBkaWdnKG1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKSwgXCJjb2xsZWN0aW9uS2V5XCIpXG4gIGNvbnN0IGxvYWRNb2RlbHNHZW5lcmF0aW9uUmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uUmVmID0gdXNlUmVmKDApXG5cbiAgcy5tZXRhLnF1ZXJ5UGFyYW1zID0gdXNlUXVlcnlQYXJhbXMoKVxuXG4gIGNvbnN0IGhhc1FQYXJhbXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKHMucy5xdWVyeVFOYW1lIGluIHMubS5xdWVyeVBhcmFtcykgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBmYWxzZVxuICB9LCBbXSlcblxuICBjb25zdCBxUGFyYW1zID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChoYXNRUGFyYW1zKCkpIHJldHVybiBKU09OLnBhcnNlKGRpZ2cocy5tLnF1ZXJ5UGFyYW1zLCBzLnMucXVlcnlRTmFtZSkpXG5cbiAgICByZXR1cm4ge31cbiAgfSwgW10pXG5cbiAgcy51c2VTdGF0ZXMoe1xuICAgIG1vZGVsczogdW5kZWZpbmVkLFxuICAgIG92ZXJhbGxDb3VudDogdW5kZWZpbmVkLFxuICAgIHF1ZXJ5OiB1bmRlZmluZWQsXG4gICAgcXVlcnlOYW1lLFxuICAgIHF1ZXJ5UGVyS2V5OiBgJHtxdWVyeU5hbWV9X3BlcmAsXG4gICAgcXVlcnlRTmFtZTogYCR7cXVlcnlOYW1lfV9xYCxcbiAgICBxdWVyeVNOYW1lOiBgJHtxdWVyeU5hbWV9X3NgLFxuICAgIHF1ZXJ5UGFnZU5hbWU6IGAke3F1ZXJ5TmFtZX1fcGFnZWAsXG4gICAgcmVzdWx0OiB1bmRlZmluZWQsXG4gICAgc2VhcmNoUGFyYW1zOiB1bmRlZmluZWQsXG4gICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IGZhbHNlLFxuICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IGZhbHNlXG4gIH0pXG4gIHMudXNlU3RhdGVzKHtcbiAgICBxUGFyYW1zOiAoKSA9PiBxUGFyYW1zKClcbiAgfSlcblxuICBsZXQgbW9kZWxJZHNDYWNoZVN0cmluZ1xuXG4gIGlmIChzLnMubW9kZWxzID09PSB1bmRlZmluZWQpIHtcbiAgICBtb2RlbElkc0NhY2hlU3RyaW5nID0gXCJtb2RlbHMtdW5kZWZpbmVkXCJcbiAgfSBlbHNlIGlmIChzLnMubW9kZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgIG1vZGVsSWRzQ2FjaGVTdHJpbmcgPSBcIm5vLW1vZGVsc1wiXG4gIH0gZWxzZSB7XG4gICAgbW9kZWxJZHNDYWNoZVN0cmluZyA9IHMucy5tb2RlbHMubWFwKChtb2RlbCkgPT4gbW9kZWwuY2FjaGVLZXkoKSk/LmpvaW4oXCItLS1cIilcbiAgfVxuXG4gIGNvbnN0IGxvYWRPdmVyYWxsQ291bnQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgLy8gSWdub3JlIGxhdGUgb3ZlcmFsbC1jb3VudCByZXNwb25zZXMgb25jZSBhIG5ld2VyIGxvYWQgY3ljbGUgaGFzIHN0YXJ0ZWQgb3IgdGhlIGhvb2sgdW5tb3VudGVkLlxuICAgIGNvbnN0IGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uID0gbG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb25SZWYuY3VycmVudCArIDFcblxuICAgIGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uUmVmLmN1cnJlbnQgPSBsb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvblxuXG4gICAgY29uc3QgYmFzZVF1ZXJ5ID0gcy5wLmNvbGxlY3Rpb24gfHwgcy5wLm1vZGVsQ2xhc3MuYWxsKClcbiAgICBjb25zdCBvdmVyYWxsQ291bnQgPSBhd2FpdCBiYXNlUXVlcnkuY291bnQoKVxuXG4gICAgaWYgKGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uICE9IGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uUmVmLmN1cnJlbnQpIHJldHVyblxuXG4gICAgcy5zZXQoe1xuICAgICAgb3ZlcmFsbENvdW50LFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50KHtvdmVyYWxsQ291bnR9KSxcbiAgICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQoe292ZXJhbGxDb3VudH0pXG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgbG9hZFFQYXJhbXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgcVBhcmFtc1RvU2V0ID0gaGFzUVBhcmFtcygpID8gcVBhcmFtcygpIDogT2JqZWN0LmFzc2lnbih7fSwgcy5wcm9wcy5kZWZhdWx0UGFyYW1zKVxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IFtdXG5cbiAgICBpZiAocy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVNOYW1lXSkge1xuICAgICAgZm9yIChjb25zdCByYXdTZWFyY2hQYXJhbSBvZiBzLm0ucXVlcnlQYXJhbXNbcy5zLnF1ZXJ5U05hbWVdKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFNlYXJjaFBhcmFtID0gSlNPTi5wYXJzZShyYXdTZWFyY2hQYXJhbSlcblxuICAgICAgICBzZWFyY2hQYXJhbXMucHVzaChwYXJzZWRTZWFyY2hQYXJhbSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzLnNldCh7XG4gICAgICBxUGFyYW1zOiBxUGFyYW1zVG9TZXQsXG4gICAgICBzZWFyY2hQYXJhbXNcbiAgICB9KVxuICB9LCBbXSlcblxuICBjb25zdCBsb2FkTW9kZWxzID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIC8vIE9ubHkgdGhlIG5ld2VzdCBjb2xsZWN0aW9uIHJlcXVlc3QgaXMgYWxsb3dlZCB0byB1cGRhdGUgc3RhdGUgYWZ0ZXIgbmF2aWdhdGlvbi9maWx0ZXIgY2hhbmdlcy5cbiAgICBjb25zdCBsb2FkTW9kZWxzR2VuZXJhdGlvbiA9IGxvYWRNb2RlbHNHZW5lcmF0aW9uUmVmLmN1cnJlbnQgKyAxXG5cbiAgICBsb2FkTW9kZWxzR2VuZXJhdGlvblJlZi5jdXJyZW50ID0gbG9hZE1vZGVsc0dlbmVyYXRpb25cbiAgICBsZXQgcXVlcnkgPSBzLnByb3BzLmNvbGxlY3Rpb24/LmNsb25lKCkgfHwgcy5wLm1vZGVsQ2xhc3MucmFuc2FjaygpXG5cbiAgICBpZiAocy5wcm9wcy5wYWdpbmF0aW9uKSB7XG4gICAgICBjb25zdCBwYWdlID0gcy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVBhZ2VOYW1lXSB8fCAxXG4gICAgICBsZXQgcGVyID0gcy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVBlcktleV0gfHwgMzBcblxuICAgICAgaWYgKHBlciA9PSBcImFsbFwiKSB7XG4gICAgICAgIHBlciA9IDk5OV85OTlfOTk5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZXIgPSBOdW1iZXIocGVyKVxuICAgICAgfVxuXG4gICAgICBxdWVyeS5wYWdlKHBhZ2UpLnBlcihwZXIpXG4gICAgfVxuXG4gICAgaWYgKHMucHJvcHMuZ3JvdXBCeSkgcXVlcnkgPSBxdWVyeS5ncm91cEJ5KC4uLnMucC5ncm91cEJ5KVxuXG4gICAgcXVlcnkgPSBxdWVyeVxuICAgICAgLnJhbnNhY2socy5zLnFQYXJhbXMpXG4gICAgICAuc2VhcmNoKHMucy5zZWFyY2hQYXJhbXMpXG4gICAgICAuc2VhcmNoS2V5KHMucy5xdWVyeVFOYW1lKVxuICAgICAgLnBhZ2VLZXkocy5zLnF1ZXJ5UGFnZU5hbWUpXG4gICAgICAucGVyS2V5KHMucy5xdWVyeVBlcktleSlcblxuICAgIGlmIChzLnByb3BzLmFiaWxpdGllcykgcXVlcnkuYWJpbGl0aWVzKHMucC5hYmlsaXRpZXMpXG4gICAgaWYgKHMucHJvcHMubGltaXQgIT09IHVuZGVmaW5lZCkgcXVlcnkubGltaXQocy5wLmxpbWl0KVxuICAgIGlmIChzLnByb3BzLnByZWxvYWRzKSBxdWVyeS5wcmVsb2FkKHMucC5wcmVsb2FkcylcbiAgICBpZiAocy5wcm9wcy5yYW5zYWNrKSBxdWVyeS5yYW5zYWNrKHMucHJvcHMucmFuc2FjaylcbiAgICBpZiAocy5wcm9wcy5zZWxlY3QpIHF1ZXJ5LnNlbGVjdChzLnAuc2VsZWN0KVxuICAgIGlmIChzLnByb3BzLnNlbGVjdENvbHVtbnMpIHF1ZXJ5LnNlbGVjdENvbHVtbnMocy5wLnNlbGVjdENvbHVtbnMpXG5cbiAgICBsZXQgcmVzdWx0XG5cbiAgICBpZiAocy5wcm9wcy5xdWVyeU1ldGhvZCkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcy5wLnF1ZXJ5TWV0aG9kKHtxdWVyeX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHF1ZXJ5LnJlc3VsdCgpXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxzID0gcmVzdWx0Lm1vZGVscygpXG5cbiAgICBpZiAobG9hZE1vZGVsc0dlbmVyYXRpb24gIT0gbG9hZE1vZGVsc0dlbmVyYXRpb25SZWYuY3VycmVudCkgcmV0dXJuXG5cbiAgICBpZiAocy5wcm9wcy5vbk1vZGVsc0xvYWRlZCkge1xuICAgICAgcy5wLm9uTW9kZWxzTG9hZGVkKHtcbiAgICAgICAgbW9kZWxzLFxuICAgICAgICBxUGFyYW1zOiBzLnMucVBhcmFtcyxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHJlc3VsdFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBzLnNldCh7XG4gICAgICBtb2RlbHM6IHJlc3VsdC5tb2RlbHMoKSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgcmVzdWx0LFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50KHttb2RlbHN9KSxcbiAgICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQoe21vZGVsc30pXG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3QgbG9hZE1vZGVsc0RlYm91bmNlID0gdXNlQ2FsbGJhY2soZGVib3VuY2UobG9hZE1vZGVscyksIFtdKVxuICBjb25zdCBvbk1vZGVsRGVzdHJveWVkID0gdXNlQ2FsbGJhY2soKGFyZ3MpID0+IHtcbiAgICBzLnNldCh7XG4gICAgICBtb2RlbHM6IHMucy5tb2RlbHMuZmlsdGVyKChtb2RlbCkgPT4gbW9kZWwuaWQoKSAhPSBhcmdzLm1vZGVsLmlkKCkpXG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgb25Nb2RlbFVwZGF0ZWQgPSB1c2VDYWxsYmFjaygoYXJncykgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRNb2RlbCA9IGRpZ2coYXJncywgXCJtb2RlbFwiKVxuICAgIGNvbnN0IGZvdW5kTW9kZWwgPSBzLnMubW9kZWxzLmZpbmQoKG1vZGVsKSA9PiBtb2RlbC5pZCgpID09IHVwZGF0ZWRNb2RlbC5pZCgpKVxuXG4gICAgaWYgKGZvdW5kTW9kZWwpIGxvYWRNb2RlbHNEZWJvdW5jZSgpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50ID0gdXNlQ2FsbGJhY2soKGFyZ3MpID0+IHtcbiAgICBsZXQgbW9kZWxzLCBvdmVyYWxsQ291bnRcblxuICAgIGlmIChhcmdzLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBhcmdzLm1vZGVsc1xuICAgIH0gZWxzZSBpZiAocy5zLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBzLnMubW9kZWxzXG4gICAgfVxuXG4gICAgaWYgKGFyZ3Mub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IGFyZ3Mub3ZlcmFsbENvdW50XG4gICAgfSBlbHNlIGlmIChzLnMub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IHMucy5vdmVyYWxsQ291bnRcbiAgICB9XG5cbiAgICBpZiAobW9kZWxzID09PSB1bmRlZmluZWQgfHwgb3ZlcmFsbENvdW50ID09PSB1bmRlZmluZWQgfHwgcy5wLm5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT09IDAgJiYgb3ZlcmFsbENvdW50ID09PSAwICYmIHMucC5ub1JlY29yZHNBdmFpbGFibGVDb250ZW50KSByZXR1cm4gdHJ1ZVxuICB9LCBbXSlcblxuICBjb25zdCBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50ID0gdXNlQ2FsbGJhY2soKGFyZ3MpID0+IHtcbiAgICBsZXQgbW9kZWxzLCBvdmVyYWxsQ291bnRcblxuICAgIGlmIChhcmdzLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBhcmdzLm1vZGVsc1xuICAgIH0gZWxzZSBpZiAocy5zLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBzLnMubW9kZWxzXG4gICAgfVxuXG4gICAgaWYgKGFyZ3Mub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IGFyZ3Mub3ZlcmFsbENvdW50XG4gICAgfSBlbHNlIGlmIChzLnMub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IHMucy5vdmVyYWxsQ291bnRcbiAgICB9XG5cbiAgICBpZiAobW9kZWxzID09PSB1bmRlZmluZWQgfHwgcy5wcm9wcy5ub1JlY29yZHNGb3VuZENvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlXG5cbiAgICAvLyBEb250IHNob3cgbm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCB0b2dldGhlciB3aXRoIG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnRcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCAmJiBvdmVyYWxsQ291bnQgPT09IDAgJiYgcy5wcm9wcy5ub1JlY29yZHNBdmFpbGFibGVDb250ZW50KSByZXR1cm4gZmFsc2VcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCAmJiBzLnByb3BzLm5vUmVjb3Jkc0ZvdW5kQ29udGVudCkgcmV0dXJuIHRydWVcbiAgfSwgW10pXG5cbiAgY29uc3Qgb25DcmVhdGVkID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGxvYWRNb2RlbHNEZWJvdW5jZSgpXG4gIH0sIFtdKVxuXG4gIC8vIENvbGxlY3Rpb24gbG9hZGluZyBoYXMgdG8gd2FpdCB1bnRpbCBtb3VudCBzbyBmYXN0IHJlc3BvbnNlcyBjYW5ub3QgZ2V0IHN0cmFuZGVkIGluIFNoYXBlSG9vaydzIHByZS1tb3VudCBxdWV1ZS5cbiAgdXNlRWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGlmICghKFwiaWZDb25kaXRpb25cIiBpbiBzLnByb3BzKSB8fCBzLnByb3BzLmlmQ29uZGl0aW9uKSB7XG4gICAgICAgIGxvYWRRUGFyYW1zKClcbiAgICAgICAgbG9hZE1vZGVscygpXG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgcy5wcm9wcy5pZkNvbmRpdGlvbixcbiAgICAgIHMucy5xdWVyeU5hbWUsXG4gICAgICBzLm0ucXVlcnlQYXJhbXNbcy5zLnF1ZXJ5UU5hbWVdLFxuICAgICAgcy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVBhZ2VOYW1lXSxcbiAgICAgIHMubS5xdWVyeVBhcmFtc1tzLnMucXVlcnlQZXJLZXldLFxuICAgICAgcy5tLnF1ZXJ5UGFyYW1zW3Mucy5xdWVyeVNOYW1lXSxcbiAgICAgIGNvbGxlY3Rpb25cbiAgICBdLmNvbmNhdChjYWNoZUtleXMpXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzLnByb3BzLm5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQpIHtcbiAgICAgIGxvYWRPdmVyYWxsQ291bnQoKVxuICAgIH1cbiAgfSwgW21vZGVsQ2xhc3NdKVxuXG4gIHVzZUNyZWF0ZWRFdmVudChzLnAubW9kZWxDbGFzcywgb25DcmVhdGVkKVxuXG4gIC8vIEludmFsaWRhdGUgYW55IGluLWZsaWdodCBhc3luYyByZXNwb25zZXMgc28gdW5tb3VudGVkIGhvb2tzIGNhbm5vdCB3cml0ZSBzdGFsZSBzdGF0ZS5cbiAgdXNlRWZmZWN0KCgpID0+ICgpID0+IHtcbiAgICBsb2FkTW9kZWxzR2VuZXJhdGlvblJlZi5jdXJyZW50ICs9IDFcbiAgICBsb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvblJlZi5jdXJyZW50ICs9IDFcbiAgfSwgW10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjb25uZWN0aW9ucyA9IFtdXG5cbiAgICBpZiAocy5zLm1vZGVscykge1xuICAgICAgZm9yKGNvbnN0IG1vZGVsIG9mIHMucy5tb2RlbHMpIHtcbiAgICAgICAgY29ubmVjdGlvbnMucHVzaChNb2RlbEV2ZW50cy5jb25uZWN0VXBkYXRlZChtb2RlbCwgb25Nb2RlbFVwZGF0ZWQpKVxuICAgICAgICBjb25uZWN0aW9ucy5wdXNoKE1vZGVsRXZlbnRzLmNvbm5lY3REZXN0cm95ZWQobW9kZWwsIG9uTW9kZWxEZXN0cm95ZWQpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBmb3IoY29uc3QgY29ubmVjdGlvbiBvZiBjb25uZWN0aW9ucykge1xuICAgICAgICBjb25uZWN0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFttb2RlbElkc0NhY2hlU3RyaW5nXSlcblxuICBjb25zdCByZXN1bHQgPSAvKiogQHR5cGUge1VzZUNvbGxlY3Rpb25SZXN1bHQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoT2JqZWN0LmFzc2lnbih7fSwgcy5zdGF0ZSkpXG4gIGNvbnN0IG1vZGVsVmFyaWFibGVOYW1lID0gaW5mbGVjdGlvbi5wbHVyYWxpemUoaW5mbGVjdGlvbi5jYW1lbGl6ZShtb2RlbENsYXNzLm1vZGVsQ2xhc3NEYXRhKCkubmFtZSwgdHJ1ZSkpXG5cbiAgcmVzdWx0Lm1vZGVsSWRzQ2FjaGVTdHJpbmcgPSBtb2RlbElkc0NhY2hlU3RyaW5nXG4gIHJlc3VsdFttb2RlbFZhcmlhYmxlTmFtZV0gPSBzLnMubW9kZWxzXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VDb2xsZWN0aW9uXG4iXX0=
|
|
344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInVzZS1jb2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZGQUE2RjtBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3pELE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQTtBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sV0FBVyxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxPQUFPLENBQUE7QUFDL0IsT0FBTyxlQUFlLE1BQU0sd0JBQXdCLENBQUE7QUFDcEQsT0FBTyxjQUFjLE1BQU0sK0NBQStDLENBQUE7QUFFMUU7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILDhDQUE4QztBQUM5QyxNQUFNLHNCQUF1QixTQUFRLFNBQVM7SUFDNUMsbUJBQW1CO0lBQ25CLFlBQVksS0FBSztRQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNaLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUE7UUFDN0IsSUFBSSxDQUFDLDBCQUEwQixHQUFHLENBQUMsQ0FBQTtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtJQUM5QixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQTtJQUN0RixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLFdBQVc7UUFDVCxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUE7SUFDbEMsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixVQUFVO1FBQ1IsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFBO0lBQ2hDLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsVUFBVTtRQUNSLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQTtJQUNoQyxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLGFBQWE7UUFDWCxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUE7SUFDbkMsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixtQkFBbUI7UUFDakIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoQyxPQUFPLGtCQUFrQixDQUFBO1FBQzNCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxPQUFPLFdBQVcsQ0FBQTtRQUNwQixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFFRCxpREFBaUQ7SUFDakQsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNsRixDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLDZCQUE2QixDQUFDLElBQUk7UUFDaEMsSUFBSSxNQUFNLEVBQUUsWUFBWSxDQUFBO1FBRXhCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5QixNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtRQUN0QixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2QyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7UUFDeEIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNwQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQTtRQUNsQyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3QyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUE7UUFDcEMsQ0FBQztRQUVELElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMseUJBQXlCLEtBQUssU0FBUztZQUFFLE9BQU8sS0FBSyxDQUFBO1FBQ3RILElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksWUFBWSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLHlCQUF5QjtZQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ2hHLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMseUJBQXlCLENBQUMsSUFBSTtRQUM1QixJQUFJLE1BQU0sRUFBRSxZQUFZLENBQUE7UUFFeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBO1FBQ3RCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQTtRQUN4QixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFBO1FBQ2xDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzdDLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQTtRQUNwQyxDQUFDO1FBRUQsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMscUJBQXFCLEtBQUssU0FBUztZQUFFLE9BQU8sS0FBSyxDQUFBO1FBRXBGLDhFQUE4RTtRQUM5RSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFlBQVksS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUMvRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMscUJBQXFCO1lBQUUsT0FBTyxJQUFJLENBQUE7SUFDdEUsQ0FBQztJQUVELCtCQUErQjtJQUMvQixnQkFBZ0IsR0FBRyxLQUFLLElBQUksRUFBRTtRQUM1QixpR0FBaUc7UUFDakcsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsQ0FBQyxDQUFBO1FBRXRFLElBQUksQ0FBQywwQkFBMEIsR0FBRywwQkFBMEIsQ0FBQTtRQUU1RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUM5RCxNQUFNLFlBQVksR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUU1QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLDBCQUEwQixJQUFJLElBQUksQ0FBQywwQkFBMEI7WUFBRSxPQUFNO1FBRTlGLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixZQUFZO1lBQ1osNkJBQTZCLEVBQUUsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUM7WUFDakYseUJBQXlCLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUM7U0FDMUUsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFBO0lBRUQsc0JBQXNCO0lBQ3RCLFdBQVc7UUFDVCxJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQzFELE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQTtRQUV2QixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM5RCxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzFDLEtBQUssTUFBTSxjQUFjLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7Z0JBRXBELFlBQVksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtZQUN0QyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUM7WUFDWixPQUFPLEVBQUUsWUFBWTtZQUNyQixZQUFZO1NBQ2IsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELCtCQUErQjtJQUMvQixVQUFVLEdBQUcsS0FBSyxJQUFJLEVBQUU7UUFDdEIsaUdBQWlHO1FBQ2pHLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQTtRQUUxRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUE7UUFDaEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFckUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDMUQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUV0RCxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDakIsR0FBRyxHQUFHLFdBQVcsQ0FBQTtZQUNuQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNuQixDQUFDO1lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDM0IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBRTVELEtBQUssR0FBRyxLQUFLO2FBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2FBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQzthQUMzQixTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO1FBRTdCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3ZELElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUztZQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN6RCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUTtZQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNuRCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTztZQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNqRCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM5QyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYTtZQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUVuRSxJQUFJLE1BQU0sQ0FBQTtRQUVWLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDNUMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDL0IsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUU5QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLG9CQUFvQixJQUFJLElBQUksQ0FBQyxvQkFBb0I7WUFBRSxPQUFNO1FBRWxGLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztnQkFDcEIsTUFBTTtnQkFDTixPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPO2dCQUN2QixLQUFLO2dCQUNMLE1BQU07YUFDUCxDQUFDLENBQUE7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNaLE1BQU07WUFDTixLQUFLO1lBQ0wsTUFBTTtZQUNOLDZCQUE2QixFQUFFLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDO1lBQzNFLHlCQUF5QixFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDO1NBQ3BFLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQTtJQUVELCtEQUErRDtJQUMvRCxnQkFBZ0IsQ0FBQyxJQUFJO1FBQ25CLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFFMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNaLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxjQUFjLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDM0UsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELCtEQUErRDtJQUMvRCxjQUFjLENBQUMsSUFBSTtRQUNqQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWpGLElBQUksVUFBVTtZQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUE7SUFDN0MsQ0FBQztJQUVELHNCQUFzQjtJQUN0QixTQUFTO1FBQ1AsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQTtJQUM3QixDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2IsTUFBTSxFQUFFLFNBQVM7WUFDakIsWUFBWSxFQUFFLFNBQVM7WUFDdkIsT0FBTyxFQUFFLEVBQUU7WUFDWCxLQUFLLEVBQUUsU0FBUztZQUNoQixNQUFNLEVBQUUsU0FBUztZQUNqQixZQUFZLEVBQUUsU0FBUztZQUN2Qiw2QkFBNkIsRUFBRSxLQUFLO1lBQ3BDLHlCQUF5QixFQUFFLEtBQUs7U0FDakMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFDLFdBQVcsRUFBRSxjQUFjLEVBQUUsRUFBQyxDQUFDLENBQUE7UUFFakQsbUhBQW1IO1FBQ25ILFNBQVMsQ0FDUCxHQUFHLEVBQUU7WUFDSCxJQUFJLENBQUMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtnQkFDbEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO1lBQ25CLENBQUM7UUFDSCxDQUFDLEVBQ0Q7WUFDRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVU7WUFDakIsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXO1lBQ2xCLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVU7U0FDbEIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FDM0IsQ0FBQTtRQUVELFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDYixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMseUJBQXlCLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFDekIsQ0FBQztRQUNILENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtRQUV2QixlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFFMUQsd0ZBQXdGO1FBQ3hGLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLG9CQUFvQixJQUFJLENBQUMsQ0FBQTtZQUM5QixJQUFJLENBQUMsMEJBQTBCLElBQUksQ0FBQyxDQUFBO1lBQ3BDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUE7UUFDckMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRU4sU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNiLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQTtZQUV0QixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbEMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7b0JBQ3hGLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDOUYsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLEdBQUcsRUFBRTtnQkFDVixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNyQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUE7Z0JBQzFCLENBQUM7WUFDSCxDQUFDLENBQUE7UUFDSCxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDbEMsQ0FBQztDQUNGO0FBRUQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxHQUFHLEVBQUUsRUFBRSxFQUFFO0lBQzlDLE1BQU0sRUFDSixTQUFTLEVBQ1QsVUFBVSxFQUNWLGFBQWEsRUFDYixPQUFPLEVBQ1AsV0FBVyxFQUNYLEtBQUssRUFDTCxVQUFVLEVBQ1YseUJBQXlCLEdBQUcsU0FBUyxFQUNyQyxxQkFBcUIsR0FBRyxTQUFTLEVBQ2pDLGNBQWMsRUFDZCxVQUFVLEdBQUcsS0FBSyxFQUNsQixRQUFRLEdBQUcsRUFBRSxFQUNiLFdBQVcsRUFDWCxTQUFTLEVBQ1QsT0FBTyxFQUNQLE1BQU0sR0FBRyxFQUFFLEVBQ1gsYUFBYSxFQUNiLEdBQUcsU0FBUyxFQUNiLEdBQUcsS0FBSyxDQUFBO0lBRVQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDL0YsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxzQkFBc0IsRUFBRTtRQUNyRCxTQUFTO1FBQ1QsU0FBUztRQUNULFVBQVU7UUFDVixhQUFhO1FBQ2IsT0FBTztRQUNQLFdBQVc7UUFDWCxLQUFLO1FBQ0wsVUFBVTtRQUNWLHlCQUF5QjtRQUN6QixxQkFBcUI7UUFDckIsY0FBYztRQUNkLFVBQVU7UUFDVixRQUFRO1FBQ1IsV0FBVztRQUNYLFNBQVM7UUFDVCxPQUFPO1FBQ1AsTUFBTTtRQUNOLGFBQWE7S0FDZCxDQUFDLENBQUE7SUFDRixNQUFNLE1BQU0sR0FBRyx3REFBd0QsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQzVHLE1BQU0saUJBQWlCLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBRXZILE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtJQUM1RCxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUN4QyxNQUFNLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUM1QyxNQUFNLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUMxQyxNQUFNLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUMxQyxNQUFNLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUNoRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQTtJQUU5QyxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMsQ0FBQTtBQUVELGVBQWUsYUFBYSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMsIG5vLXVzZS1iZWZvcmUtZGVmaW5lLCBwcmVmZXItb2JqZWN0LXNwcmVhZCwgc29ydC1pbXBvcnRzICovXG5pbXBvcnQge1NoYXBlSG9vaywgdXNlU2hhcGVIb29rfSBmcm9tIFwic2V0LXN0YXRlLWNvbXBhcmVcIlxuaW1wb3J0IGRlYm91bmNlIGZyb20gXCJkZWJvdW5jZVwiXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTW9kZWxFdmVudHMgZnJvbSBcIi4vbW9kZWwtZXZlbnRzLmpzXCJcbmltcG9ydCB7dXNlRWZmZWN0fSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHVzZUNyZWF0ZWRFdmVudCBmcm9tIFwiLi91c2UtY3JlYXRlZC1ldmVudC5qc1wiXG5pbXBvcnQgdXNlUXVlcnlQYXJhbXMgZnJvbSBcIm9uLWxvY2F0aW9uLWNoYW5nZWQvYnVpbGQvdXNlLXF1ZXJ5LXBhcmFtcy5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVXNlQ29sbGVjdGlvblJlc3VsdFxuICogQHByb3BlcnR5IHtBcnJheTxpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdD59IG1vZGVsc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZGVsSWRzQ2FjaGVTdHJpbmdcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvdmVyYWxsQ291bnRcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHF1ZXJ5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlQZXJLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeVFOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlTTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHF1ZXJ5UGFnZU5hbWVcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9yZXN1bHQuanNcIikuZGVmYXVsdH0gcmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBzZWFyY2hQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7ZmFsc2UgfCBpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50XG4gKiBAcHJvcGVydHkge2ZhbHNlIHwgaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBwcm9wcy5hYmlsaXRpZXNcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHByb3BzLmNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcHJvcHMuZGVmYXVsdFBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHMuZ3JvdXBCeVxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogYm9vbGVhbn0gcHJvcHMuaWZDb25kaXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBwcm9wcy5saW1pdFxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9IHByb3BzLm1vZGVsQ2xhc3NcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IGltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gcHJvcHMubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudFxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBwcm9wcy5ub1JlY29yZHNGb3VuZENvbnRlbnRcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IHByb3BzLm9uTW9kZWxzTG9hZGVkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHByb3BzLnBhZ2luYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IHByb3BzLnByZWxvYWRzXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKHtxdWVyeTogaW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9KSA6IGltcG9ydChcIi4vY29sbGVjdGlvbi5qc1wiKS5kZWZhdWx0fSBwcm9wcy5xdWVyeU1ldGhvZFxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BzLnF1ZXJ5TmFtZVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwcm9wcy5yYW5zYWNrXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gcHJvcHMuc2VsZWN0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gcHJvcHMuc2VsZWN0Q29sdW1uc1xuICogQHBhcmFtIHthbnlbXX0gY2FjaGVLZXlzXG4gKiBAcmV0dXJucyB7VXNlQ29sbGVjdGlvblJlc3VsdCAmIFJlY29yZDxzdHJpbmcsIGFueT59XG4gKi9cbi8qKiBIb29rIHN0YXRlIGNvbnRhaW5lciBmb3IgdXNlQ29sbGVjdGlvbi4gKi9cbmNsYXNzIFVzZUNvbGxlY3Rpb25TaGFwZUhvb2sgZXh0ZW5kcyBTaGFwZUhvb2sge1xuICAvKiogQ29uc3RydWN0b3IuICovXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgdGhpcy5sb2FkTW9kZWxzR2VuZXJhdGlvbiA9IDBcbiAgICB0aGlzLmxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uID0gMFxuICAgIHRoaXMucXVlcnlQYXJhbXMgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBxdWVyeU5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucC5xdWVyeU5hbWUgfHwgZGlnZyh0aGlzLnAubW9kZWxDbGFzcy5tb2RlbENsYXNzRGF0YSgpLCBcImNvbGxlY3Rpb25LZXlcIilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBxdWVyeVBlcktleSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5xdWVyeU5hbWUoKX1fcGVyYFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIHF1ZXJ5UU5hbWUoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMucXVlcnlOYW1lKCl9X3FgXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgcXVlcnlTTmFtZSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5xdWVyeU5hbWUoKX1fc2BcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBxdWVyeVBhZ2VOYW1lKCkge1xuICAgIHJldHVybiBgJHt0aGlzLnF1ZXJ5TmFtZSgpfV9wYWdlYFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIG1vZGVsSWRzQ2FjaGVTdHJpbmcoKSB7XG4gICAgaWYgKHRoaXMucy5tb2RlbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFwibW9kZWxzLXVuZGVmaW5lZFwiXG4gICAgfSBlbHNlIGlmICh0aGlzLnMubW9kZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFwibm8tbW9kZWxzXCJcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucy5tb2RlbHMubWFwKChtb2RlbCkgPT4gbW9kZWwuY2FjaGVLZXkoKSk/LmpvaW4oXCItLS1cIilcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge0Z1bmN0aW9uICYge2NsZWFyPzogKCkgPT4gdm9pZH19ICovXG4gIGxvYWRNb2RlbHNEZWJvdW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZShcImxvYWRNb2RlbHNEZWJvdW5jZVwiLCAoKSA9PiBkZWJvdW5jZSgoKSA9PiB0aGlzLmxvYWRNb2RlbHMoKSkpXG4gIH1cblxuICAvKiogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzICovXG4gIHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50KGFyZ3MpIHtcbiAgICBsZXQgbW9kZWxzLCBvdmVyYWxsQ291bnRcblxuICAgIGlmIChhcmdzLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBhcmdzLm1vZGVsc1xuICAgIH0gZWxzZSBpZiAodGhpcy5zLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSB0aGlzLnMubW9kZWxzXG4gICAgfVxuXG4gICAgaWYgKGFyZ3Mub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IGFyZ3Mub3ZlcmFsbENvdW50XG4gICAgfSBlbHNlIGlmICh0aGlzLnMub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IHRoaXMucy5vdmVyYWxsQ291bnRcbiAgICB9XG5cbiAgICBpZiAobW9kZWxzID09PSB1bmRlZmluZWQgfHwgb3ZlcmFsbENvdW50ID09PSB1bmRlZmluZWQgfHwgdGhpcy5wLm5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT09IDAgJiYgb3ZlcmFsbENvdW50ID09PSAwICYmIHRoaXMucC5ub1JlY29yZHNBdmFpbGFibGVDb250ZW50KSByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncyAqL1xuICBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50KGFyZ3MpIHtcbiAgICBsZXQgbW9kZWxzLCBvdmVyYWxsQ291bnRcblxuICAgIGlmIChhcmdzLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSBhcmdzLm1vZGVsc1xuICAgIH0gZWxzZSBpZiAodGhpcy5zLm1vZGVscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtb2RlbHMgPSB0aGlzLnMubW9kZWxzXG4gICAgfVxuXG4gICAgaWYgKGFyZ3Mub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IGFyZ3Mub3ZlcmFsbENvdW50XG4gICAgfSBlbHNlIGlmICh0aGlzLnMub3ZlcmFsbENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG92ZXJhbGxDb3VudCA9IHRoaXMucy5vdmVyYWxsQ291bnRcbiAgICB9XG5cbiAgICBpZiAobW9kZWxzID09PSB1bmRlZmluZWQgfHwgdGhpcy5wLm5vUmVjb3Jkc0ZvdW5kQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2VcblxuICAgIC8vIERvbnQgc2hvdyBub1JlY29yZHNBdmFpbGFibGVDb250ZW50IHRvZ2V0aGVyIHdpdGggbm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudFxuICAgIGlmIChtb2RlbHMubGVuZ3RoID09PSAwICYmIG92ZXJhbGxDb3VudCA9PT0gMCAmJiB0aGlzLnAubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT09IDAgJiYgdGhpcy5wLm5vUmVjb3Jkc0ZvdW5kQ29udGVudCkgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgbG9hZE92ZXJhbGxDb3VudCA9IGFzeW5jICgpID0+IHtcbiAgICAvLyBJZ25vcmUgbGF0ZSBvdmVyYWxsLWNvdW50IHJlc3BvbnNlcyBvbmNlIGEgbmV3ZXIgbG9hZCBjeWNsZSBoYXMgc3RhcnRlZCBvciB0aGUgaG9vayB1bm1vdW50ZWQuXG4gICAgY29uc3QgbG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb24gPSB0aGlzLmxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uICsgMVxuXG4gICAgdGhpcy5sb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvbiA9IGxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uXG5cbiAgICBjb25zdCBiYXNlUXVlcnkgPSB0aGlzLnAuY29sbGVjdGlvbiB8fCB0aGlzLnAubW9kZWxDbGFzcy5hbGwoKVxuICAgIGNvbnN0IG92ZXJhbGxDb3VudCA9IGF3YWl0IGJhc2VRdWVyeS5jb3VudCgpXG5cbiAgICBpZiAoIXRoaXMuaXNNb3VudGVkKCkgfHwgbG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb24gIT0gdGhpcy5sb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvbikgcmV0dXJuXG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIG92ZXJhbGxDb3VudCxcbiAgICAgIHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50OiB0aGlzLnNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50KHtvdmVyYWxsQ291bnR9KSxcbiAgICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IHRoaXMuc2hvd05vUmVjb3Jkc0ZvdW5kQ29udGVudCh7b3ZlcmFsbENvdW50fSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBsb2FkUVBhcmFtcygpIHtcbiAgICBsZXQgcVBhcmFtc1RvU2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wLmRlZmF1bHRQYXJhbXMpXG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gW11cblxuICAgIGlmICh0aGlzLnF1ZXJ5UGFyYW1zICYmIHRoaXMucXVlcnlRTmFtZSgpIGluIHRoaXMucXVlcnlQYXJhbXMpIHtcbiAgICAgIHFQYXJhbXNUb1NldCA9IEpTT04ucGFyc2UoZGlnZyh0aGlzLnF1ZXJ5UGFyYW1zLCB0aGlzLnF1ZXJ5UU5hbWUoKSkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVlcnlQYXJhbXM/Llt0aGlzLnF1ZXJ5U05hbWUoKV0pIHtcbiAgICAgIGZvciAoY29uc3QgcmF3U2VhcmNoUGFyYW0gb2YgdGhpcy5xdWVyeVBhcmFtc1t0aGlzLnF1ZXJ5U05hbWUoKV0pIHtcbiAgICAgICAgY29uc3QgcGFyc2VkU2VhcmNoUGFyYW0gPSBKU09OLnBhcnNlKHJhd1NlYXJjaFBhcmFtKVxuXG4gICAgICAgIHNlYXJjaFBhcmFtcy5wdXNoKHBhcnNlZFNlYXJjaFBhcmFtKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgcVBhcmFtczogcVBhcmFtc1RvU2V0LFxuICAgICAgc2VhcmNoUGFyYW1zXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgbG9hZE1vZGVscyA9IGFzeW5jICgpID0+IHtcbiAgICAvLyBPbmx5IHRoZSBuZXdlc3QgY29sbGVjdGlvbiByZXF1ZXN0IGlzIGFsbG93ZWQgdG8gdXBkYXRlIHN0YXRlIGFmdGVyIG5hdmlnYXRpb24vZmlsdGVyIGNoYW5nZXMuXG4gICAgY29uc3QgbG9hZE1vZGVsc0dlbmVyYXRpb24gPSB0aGlzLmxvYWRNb2RlbHNHZW5lcmF0aW9uICsgMVxuXG4gICAgdGhpcy5sb2FkTW9kZWxzR2VuZXJhdGlvbiA9IGxvYWRNb2RlbHNHZW5lcmF0aW9uXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5wLmNvbGxlY3Rpb24/LmNsb25lKCkgfHwgdGhpcy5wLm1vZGVsQ2xhc3MucmFuc2FjaygpXG5cbiAgICBpZiAodGhpcy5wLnBhZ2luYXRpb24pIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVBhZ2VOYW1lKCldIHx8IDFcbiAgICAgIGxldCBwZXIgPSB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVBlcktleSgpXSB8fCAzMFxuXG4gICAgICBpZiAocGVyID09IFwiYWxsXCIpIHtcbiAgICAgICAgcGVyID0gOTk5Xzk5OV85OTlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlciA9IE51bWJlcihwZXIpXG4gICAgICB9XG5cbiAgICAgIHF1ZXJ5LnBhZ2UocGFnZSkucGVyKHBlcilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wLmdyb3VwQnkpIHF1ZXJ5ID0gcXVlcnkuZ3JvdXBCeSguLi50aGlzLnAuZ3JvdXBCeSlcblxuICAgIHF1ZXJ5ID0gcXVlcnlcbiAgICAgIC5yYW5zYWNrKHRoaXMucy5xUGFyYW1zKVxuICAgICAgLnNlYXJjaCh0aGlzLnMuc2VhcmNoUGFyYW1zKVxuICAgICAgLnNlYXJjaEtleSh0aGlzLnF1ZXJ5UU5hbWUoKSlcbiAgICAgIC5wYWdlS2V5KHRoaXMucXVlcnlQYWdlTmFtZSgpKVxuICAgICAgLnBlcktleSh0aGlzLnF1ZXJ5UGVyS2V5KCkpXG5cbiAgICBpZiAodGhpcy5wLmFiaWxpdGllcykgcXVlcnkuYWJpbGl0aWVzKHRoaXMucC5hYmlsaXRpZXMpXG4gICAgaWYgKHRoaXMucC5saW1pdCAhPT0gdW5kZWZpbmVkKSBxdWVyeS5saW1pdCh0aGlzLnAubGltaXQpXG4gICAgaWYgKHRoaXMucC5wcmVsb2FkcykgcXVlcnkucHJlbG9hZCh0aGlzLnAucHJlbG9hZHMpXG4gICAgaWYgKHRoaXMucC5yYW5zYWNrKSBxdWVyeS5yYW5zYWNrKHRoaXMucC5yYW5zYWNrKVxuICAgIGlmICh0aGlzLnAuc2VsZWN0KSBxdWVyeS5zZWxlY3QodGhpcy5wLnNlbGVjdClcbiAgICBpZiAodGhpcy5wLnNlbGVjdENvbHVtbnMpIHF1ZXJ5LnNlbGVjdENvbHVtbnModGhpcy5wLnNlbGVjdENvbHVtbnMpXG5cbiAgICBsZXQgcmVzdWx0XG5cbiAgICBpZiAodGhpcy5wLnF1ZXJ5TWV0aG9kKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnAucXVlcnlNZXRob2Qoe3F1ZXJ5fSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcXVlcnkucmVzdWx0KClcbiAgICB9XG5cbiAgICBjb25zdCBtb2RlbHMgPSByZXN1bHQubW9kZWxzKClcblxuICAgIGlmICghdGhpcy5pc01vdW50ZWQoKSB8fCBsb2FkTW9kZWxzR2VuZXJhdGlvbiAhPSB0aGlzLmxvYWRNb2RlbHNHZW5lcmF0aW9uKSByZXR1cm5cblxuICAgIGlmICh0aGlzLnAub25Nb2RlbHNMb2FkZWQpIHtcbiAgICAgIHRoaXMucC5vbk1vZGVsc0xvYWRlZCh7XG4gICAgICAgIG1vZGVscyxcbiAgICAgICAgcVBhcmFtczogdGhpcy5zLnFQYXJhbXMsXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICByZXN1bHRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBtb2RlbHMsXG4gICAgICBxdWVyeSxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50OiB0aGlzLnNob3dOb1JlY29yZHNBdmFpbGFibGVDb250ZW50KHttb2RlbHN9KSxcbiAgICAgIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQ6IHRoaXMuc2hvd05vUmVjb3Jkc0ZvdW5kQ29udGVudCh7bW9kZWxzfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7e21vZGVsOiBpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdH19IGFyZ3MgKi9cbiAgb25Nb2RlbERlc3Ryb3llZChhcmdzKSB7XG4gICAgY29uc3QgZGVzdHJveWVkTW9kZWwgPSBkaWdnKGFyZ3MsIFwibW9kZWxcIilcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbW9kZWxzOiB0aGlzLnMubW9kZWxzLmZpbHRlcigobW9kZWwpID0+IG1vZGVsLmlkKCkgIT0gZGVzdHJveWVkTW9kZWwuaWQoKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7e21vZGVsOiBpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdH19IGFyZ3MgKi9cbiAgb25Nb2RlbFVwZGF0ZWQoYXJncykge1xuICAgIGNvbnN0IHVwZGF0ZWRNb2RlbCA9IGRpZ2coYXJncywgXCJtb2RlbFwiKVxuICAgIGNvbnN0IGZvdW5kTW9kZWwgPSB0aGlzLnMubW9kZWxzLmZpbmQoKG1vZGVsKSA9PiBtb2RlbC5pZCgpID09IHVwZGF0ZWRNb2RlbC5pZCgpKVxuXG4gICAgaWYgKGZvdW5kTW9kZWwpIHRoaXMubG9hZE1vZGVsc0RlYm91bmNlKCkoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBvbkNyZWF0ZWQoKSB7XG4gICAgdGhpcy5sb2FkTW9kZWxzRGVib3VuY2UoKSgpXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIHNldHVwKCkge1xuICAgIHRoaXMudXNlU3RhdGVzKHtcbiAgICAgIG1vZGVsczogdW5kZWZpbmVkLFxuICAgICAgb3ZlcmFsbENvdW50OiB1bmRlZmluZWQsXG4gICAgICBxUGFyYW1zOiB7fSxcbiAgICAgIHF1ZXJ5OiB1bmRlZmluZWQsXG4gICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgIHNlYXJjaFBhcmFtczogdW5kZWZpbmVkLFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgc2hvd05vUmVjb3Jkc0ZvdW5kQ29udGVudDogZmFsc2VcbiAgICB9KVxuICAgIHRoaXMuc2V0SW5zdGFuY2Uoe3F1ZXJ5UGFyYW1zOiB1c2VRdWVyeVBhcmFtcygpfSlcblxuICAgIC8vIENvbGxlY3Rpb24gbG9hZGluZyBoYXMgdG8gd2FpdCB1bnRpbCBtb3VudCBzbyBmYXN0IHJlc3BvbnNlcyBjYW5ub3QgZ2V0IHN0cmFuZGVkIGluIFNoYXBlSG9vaydzIHByZS1tb3VudCBxdWV1ZS5cbiAgICB1c2VFZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmICghKFwiaWZDb25kaXRpb25cIiBpbiB0aGlzLnByb3BzKSB8fCB0aGlzLnAuaWZDb25kaXRpb24pIHtcbiAgICAgICAgICB0aGlzLmxvYWRRUGFyYW1zKClcbiAgICAgICAgICB0aGlzLmxvYWRNb2RlbHMoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW1xuICAgICAgICB0aGlzLnAubW9kZWxDbGFzcyxcbiAgICAgICAgdGhpcy5wLmlmQ29uZGl0aW9uLFxuICAgICAgICB0aGlzLnF1ZXJ5TmFtZSgpLFxuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVFOYW1lKCldLFxuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVBhZ2VOYW1lKCldLFxuICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVBlcktleSgpXSxcbiAgICAgICAgdGhpcy5xdWVyeVBhcmFtcz8uW3RoaXMucXVlcnlTTmFtZSgpXSxcbiAgICAgICAgdGhpcy5wLmNvbGxlY3Rpb25cbiAgICAgIF0uY29uY2F0KHRoaXMucC5jYWNoZUtleXMpXG4gICAgKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnAubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCkge1xuICAgICAgICB0aGlzLmxvYWRPdmVyYWxsQ291bnQoKVxuICAgICAgfVxuICAgIH0sIFt0aGlzLnAubW9kZWxDbGFzc10pXG5cbiAgICB1c2VDcmVhdGVkRXZlbnQodGhpcy5wLm1vZGVsQ2xhc3MsICgpID0+IHRoaXMub25DcmVhdGVkKCkpXG5cbiAgICAvLyBJbnZhbGlkYXRlIGFueSBpbi1mbGlnaHQgYXN5bmMgcmVzcG9uc2VzIHNvIHVubW91bnRlZCBob29rcyBjYW5ub3Qgd3JpdGUgc3RhbGUgc3RhdGUuXG4gICAgdXNlRWZmZWN0KCgpID0+ICgpID0+IHtcbiAgICAgIHRoaXMubG9hZE1vZGVsc0dlbmVyYXRpb24gKz0gMVxuICAgICAgdGhpcy5sb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvbiArPSAxXG4gICAgICB0aGlzLmxvYWRNb2RlbHNEZWJvdW5jZSgpLmNsZWFyPy4oKVxuICAgIH0sIFtdKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gW11cblxuICAgICAgaWYgKHRoaXMucy5tb2RlbHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiB0aGlzLnMubW9kZWxzKSB7XG4gICAgICAgICAgY29ubmVjdGlvbnMucHVzaChNb2RlbEV2ZW50cy5jb25uZWN0VXBkYXRlZChtb2RlbCwgKGFyZ3MpID0+IHRoaXMub25Nb2RlbFVwZGF0ZWQoYXJncykpKVxuICAgICAgICAgIGNvbm5lY3Rpb25zLnB1c2goTW9kZWxFdmVudHMuY29ubmVjdERlc3Ryb3llZChtb2RlbCwgKGFyZ3MpID0+IHRoaXMub25Nb2RlbERlc3Ryb3llZChhcmdzKSkpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICAgICAgY29ubmVjdGlvbi51bnN1YnNjcmliZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBbdGhpcy5tb2RlbElkc0NhY2hlU3RyaW5nKCldKVxuICB9XG59XG5cbmNvbnN0IHVzZUNvbGxlY3Rpb24gPSAocHJvcHMsIGNhY2hlS2V5cyA9IFtdKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhYmlsaXRpZXMsXG4gICAgY29sbGVjdGlvbixcbiAgICBkZWZhdWx0UGFyYW1zLFxuICAgIGdyb3VwQnksXG4gICAgaWZDb25kaXRpb24sXG4gICAgbGltaXQsXG4gICAgbW9kZWxDbGFzcyxcbiAgICBub1JlY29yZHNBdmFpbGFibGVDb250ZW50ID0gdW5kZWZpbmVkLFxuICAgIG5vUmVjb3Jkc0ZvdW5kQ29udGVudCA9IHVuZGVmaW5lZCxcbiAgICBvbk1vZGVsc0xvYWRlZCxcbiAgICBwYWdpbmF0aW9uID0gZmFsc2UsXG4gICAgcHJlbG9hZHMgPSBbXSxcbiAgICBxdWVyeU1ldGhvZCxcbiAgICBxdWVyeU5hbWUsXG4gICAgcmFuc2FjayxcbiAgICBzZWxlY3QgPSB7fSxcbiAgICBzZWxlY3RDb2x1bW5zLFxuICAgIC4uLnJlc3RQcm9wc1xuICB9ID0gcHJvcHNcblxuICBpZiAoT2JqZWN0LmtleXMocmVzdFByb3BzKS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHByb3BzIGdpdmVuIHRvIHVzZUNvbGxlY3Rpb246ICR7T2JqZWN0LmtleXMocmVzdFByb3BzKS5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIGNvbnN0IHNoYXBlSG9vayA9IHVzZVNoYXBlSG9vayhVc2VDb2xsZWN0aW9uU2hhcGVIb29rLCB7XG4gICAgYWJpbGl0aWVzLFxuICAgIGNhY2hlS2V5cyxcbiAgICBjb2xsZWN0aW9uLFxuICAgIGRlZmF1bHRQYXJhbXMsXG4gICAgZ3JvdXBCeSxcbiAgICBpZkNvbmRpdGlvbixcbiAgICBsaW1pdCxcbiAgICBtb2RlbENsYXNzLFxuICAgIG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQsXG4gICAgbm9SZWNvcmRzRm91bmRDb250ZW50LFxuICAgIG9uTW9kZWxzTG9hZGVkLFxuICAgIHBhZ2luYXRpb24sXG4gICAgcHJlbG9hZHMsXG4gICAgcXVlcnlNZXRob2QsXG4gICAgcXVlcnlOYW1lLFxuICAgIHJhbnNhY2ssXG4gICAgc2VsZWN0LFxuICAgIHNlbGVjdENvbHVtbnNcbiAgfSlcbiAgY29uc3QgcmVzdWx0ID0gLyoqIEB0eXBlIHtVc2VDb2xsZWN0aW9uUmVzdWx0ICYgUmVjb3JkPHN0cmluZywgYW55Pn0gKi8gKE9iamVjdC5hc3NpZ24oe30sIHNoYXBlSG9vay5zdGF0ZSkpXG4gIGNvbnN0IG1vZGVsVmFyaWFibGVOYW1lID0gaW5mbGVjdGlvbi5wbHVyYWxpemUoaW5mbGVjdGlvbi5jYW1lbGl6ZShzaGFwZUhvb2sucC5tb2RlbENsYXNzLm1vZGVsQ2xhc3NEYXRhKCkubmFtZSwgdHJ1ZSkpXG5cbiAgcmVzdWx0Lm1vZGVsSWRzQ2FjaGVTdHJpbmcgPSBzaGFwZUhvb2subW9kZWxJZHNDYWNoZVN0cmluZygpXG4gIHJlc3VsdC5xdWVyeU5hbWUgPSBzaGFwZUhvb2sucXVlcnlOYW1lKClcbiAgcmVzdWx0LnF1ZXJ5UGVyS2V5ID0gc2hhcGVIb29rLnF1ZXJ5UGVyS2V5KClcbiAgcmVzdWx0LnF1ZXJ5UU5hbWUgPSBzaGFwZUhvb2sucXVlcnlRTmFtZSgpXG4gIHJlc3VsdC5xdWVyeVNOYW1lID0gc2hhcGVIb29rLnF1ZXJ5U05hbWUoKVxuICByZXN1bHQucXVlcnlQYWdlTmFtZSA9IHNoYXBlSG9vay5xdWVyeVBhZ2VOYW1lKClcbiAgcmVzdWx0W21vZGVsVmFyaWFibGVOYW1lXSA9IHNoYXBlSG9vay5zLm1vZGVsc1xuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlQ29sbGVjdGlvblxuIl19
|