@kaspernj/api-maker 1.0.2129 → 1.0.2131

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.
@@ -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: Array<number | string>;
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,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;kBACtB,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;;AAd/C;;;;;;;;;;;;;;;GAeG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,sCApBG;IAAwC,SAAS,EAAzC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IACiB,UAAU,EAAnD,sCAAiC;IACN,aAAa,EAAxC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACH,OAAO,EAAvB,MAAM,EAAE;IACoB,WAAW,EAAvC,MAAa,OAAO;IACN,KAAK,EAAnB,MAAM;IAC0C,UAAU,EAA1D,cAAc,iBAAiB,EAAE,OAAO;IACM,yBAAyB,EAAvE,MAAa,OAAO,OAAO,EAAE,SAAS;IACQ,qBAAqB,EAAnE,MAAa,OAAO,OAAO,EAAE,SAAS;IACb,cAAc,EAAvC,MAAa,IAAI;IACF,UAAU,EAAzB,OAAO;IACS,QAAQ,EAAxB,MAAM,EAAE;IACwF,WAAW,EAA3G,CAAS,IAA0C,EAA1C;QAAC,KAAK,EAAE,sCAAiC,CAAA;KAAC,KAAI,sCAAiC;IAC1E,SAAS,EAAvB,MAAM;IACqB,OAAO,EAAlC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACa,MAAM,EAAtC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IACQ,aAAa,EAA7C,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAChC,cAAQ,GAAG,EAAE,GACH,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAsSrD"}
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;;AA0W/C,yGA0DC"}
@@ -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 { useCallback, useEffect, useMemo, useRef } from "react";
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 {Array<number | string>} modelIdsCacheString
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,158 @@ 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
- const useCollection = (props, cacheKeys = []) => {
49
- const { abilities, collection, defaultParams, groupBy, ifCondition, limit, modelClass, noRecordsAvailableContent = undefined, noRecordsFoundContent = undefined, onModelsLoaded, pagination = false, preloads = [], queryMethod, queryName: initialQueryName, ransack, select = {}, selectColumns, ...restProps } = props;
50
- if (Object.keys(restProps).length > 0) {
51
- throw new Error(`Unknown props given to useCollection: ${Object.keys(restProps).join(", ")}`);
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
- const s = useShape(props);
54
- const queryName = initialQueryName || digg(modelClass.modelClassData(), "collectionKey");
55
- const loadModelsGenerationRef = useRef(0);
56
- const loadOverallCountGenerationRef = useRef(0);
57
- s.meta.queryParams = useQueryParams();
58
- const hasQParams = useCallback(() => {
59
- if (s.s.queryQName in s.m.queryParams)
60
- return true;
61
- return false;
62
- }, []);
63
- const qParams = useCallback(() => {
64
- if (hasQParams())
65
- return JSON.parse(digg(s.m.queryParams, s.s.queryQName));
66
- return {};
67
- }, []);
68
- s.useStates({
69
- models: undefined,
70
- overallCount: undefined,
71
- query: undefined,
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`;
76
+ }
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()));
88
92
  }
89
- else if (s.s.models.length === 0) {
90
- modelIdsCacheString = "no-models";
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
- else {
93
- modelIdsCacheString = s.s.models.map((model) => model.cacheKey())?.join("---");
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
- const loadOverallCount = useCallback(async () => {
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 = loadOverallCountGenerationRef.current + 1;
98
- loadOverallCountGenerationRef.current = loadOverallCountGeneration;
99
- const baseQuery = s.p.collection || s.p.modelClass.all();
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 != loadOverallCountGenerationRef.current)
143
+ if (loadOverallCountGeneration != this.loadOverallCountGeneration)
102
144
  return;
103
- s.set({
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
- const loadQParams = useCallback(() => {
110
- const qParamsToSet = hasQParams() ? qParams() : Object.assign({}, s.props.defaultParams);
150
+ };
151
+ /** @returns {{qParams: Record<string, any>, searchParams: string[]}} */
152
+ loadQParams() {
153
+ let qParamsToSet = Object.assign({}, this.p.defaultParams);
111
154
  const searchParams = [];
112
- if (s.m.queryParams[s.s.querySName]) {
113
- for (const rawSearchParam of s.m.queryParams[s.s.querySName]) {
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
- s.set({
164
+ this.setState({
119
165
  qParams: qParamsToSet,
120
166
  searchParams
121
167
  });
122
- }, []);
123
- const loadModels = useCallback(async () => {
168
+ return {
169
+ qParams: qParamsToSet,
170
+ searchParams
171
+ };
172
+ }
173
+ /**
174
+ * @param {object} [args]
175
+ * @param {Record<string, any>} [args.qParams]
176
+ * @param {string[]} [args.searchParams]
177
+ * @returns {{qParams: Record<string, any>, searchParams: string[]}}
178
+ */
179
+ loadModelsArgs(args = {}) {
180
+ return {
181
+ qParams: args.qParams ?? this.s.qParams,
182
+ searchParams: args.searchParams ?? this.s.searchParams
183
+ };
184
+ }
185
+ /**
186
+ * @param {object} [args]
187
+ * @param {Record<string, any>} [args.qParams]
188
+ * @param {string[]} [args.searchParams]
189
+ * @returns {Promise<void>}
190
+ */
191
+ loadModels = async (args = {}) => {
124
192
  // Only the newest collection request is allowed to update state after navigation/filter changes.
125
- const loadModelsGeneration = loadModelsGenerationRef.current + 1;
126
- loadModelsGenerationRef.current = loadModelsGeneration;
127
- let query = s.props.collection?.clone() || s.p.modelClass.ransack();
128
- if (s.props.pagination) {
129
- const page = s.m.queryParams[s.s.queryPageName] || 1;
130
- let per = s.m.queryParams[s.s.queryPerKey] || 30;
193
+ const loadModelsGeneration = this.loadModelsGeneration + 1;
194
+ const { qParams, searchParams } = this.loadModelsArgs(args);
195
+ this.loadModelsGeneration = loadModelsGeneration;
196
+ let query = this.p.collection?.clone() || this.p.modelClass.ransack();
197
+ if (this.p.pagination) {
198
+ const page = this.queryParams?.[this.queryPageName()] || 1;
199
+ let per = this.queryParams?.[this.queryPerKey()] || 30;
131
200
  if (per == "all") {
132
201
  per = 999_999_999;
133
202
  }
@@ -136,154 +205,182 @@ const useCollection = (props, cacheKeys = []) => {
136
205
  }
137
206
  query.page(page).per(per);
138
207
  }
139
- if (s.props.groupBy)
140
- query = query.groupBy(...s.p.groupBy);
208
+ if (this.p.groupBy)
209
+ query = query.groupBy(...this.p.groupBy);
141
210
  query = query
142
- .ransack(s.s.qParams)
143
- .search(s.s.searchParams)
144
- .searchKey(s.s.queryQName)
145
- .pageKey(s.s.queryPageName)
146
- .perKey(s.s.queryPerKey);
147
- if (s.props.abilities)
148
- query.abilities(s.p.abilities);
149
- if (s.props.limit !== undefined)
150
- query.limit(s.p.limit);
151
- if (s.props.preloads)
152
- query.preload(s.p.preloads);
153
- if (s.props.ransack)
154
- query.ransack(s.props.ransack);
155
- if (s.props.select)
156
- query.select(s.p.select);
157
- if (s.props.selectColumns)
158
- query.selectColumns(s.p.selectColumns);
211
+ .ransack(qParams)
212
+ .search(searchParams)
213
+ .searchKey(this.queryQName())
214
+ .pageKey(this.queryPageName())
215
+ .perKey(this.queryPerKey());
216
+ if (this.p.abilities)
217
+ query.abilities(this.p.abilities);
218
+ if (this.p.limit !== undefined)
219
+ query.limit(this.p.limit);
220
+ if (this.p.preloads)
221
+ query.preload(this.p.preloads);
222
+ if (this.p.ransack)
223
+ query.ransack(this.p.ransack);
224
+ if (this.p.select)
225
+ query.select(this.p.select);
226
+ if (this.p.selectColumns)
227
+ query.selectColumns(this.p.selectColumns);
159
228
  let result;
160
- if (s.props.queryMethod) {
161
- result = await s.p.queryMethod({ query });
229
+ if (this.p.queryMethod) {
230
+ result = await this.p.queryMethod({ query });
162
231
  }
163
232
  else {
164
233
  result = await query.result();
165
234
  }
166
235
  const models = result.models();
167
- if (loadModelsGeneration != loadModelsGenerationRef.current)
236
+ if (loadModelsGeneration != this.loadModelsGeneration)
168
237
  return;
169
- if (s.props.onModelsLoaded) {
170
- s.p.onModelsLoaded({
238
+ if (this.p.onModelsLoaded) {
239
+ this.p.onModelsLoaded({
171
240
  models,
172
- qParams: s.s.qParams,
241
+ qParams: this.s.qParams,
173
242
  query,
174
243
  result
175
244
  });
176
245
  }
177
- s.set({
178
- models: result.models(),
246
+ this.setState({
247
+ models,
179
248
  query,
180
249
  result,
181
- showNoRecordsAvailableContent: showNoRecordsAvailableContent({ models }),
182
- showNoRecordsFoundContent: showNoRecordsFoundContent({ models })
250
+ showNoRecordsAvailableContent: this.showNoRecordsAvailableContent({ models }),
251
+ showNoRecordsFoundContent: this.showNoRecordsFoundContent({ models })
183
252
  });
184
- }, []);
185
- const loadModelsDebounce = useCallback(debounce(loadModels), []);
186
- const onModelDestroyed = useCallback((args) => {
187
- s.set({
188
- models: s.s.models.filter((model) => model.id() != args.model.id())
253
+ };
254
+ /** @param {{model: import("./base-model.js").default}} args */
255
+ onModelDestroyed(args) {
256
+ const destroyedModel = digg(args, "model");
257
+ this.setState({
258
+ models: this.s.models.filter((model) => model.id() != destroyedModel.id())
189
259
  });
190
- }, []);
191
- const onModelUpdated = useCallback((args) => {
260
+ }
261
+ /** @param {{model: import("./base-model.js").default}} args */
262
+ onModelUpdated(args) {
192
263
  const updatedModel = digg(args, "model");
193
- const foundModel = s.s.models.find((model) => model.id() == updatedModel.id());
264
+ const foundModel = this.s.models.find((model) => model.id() == updatedModel.id());
194
265
  if (foundModel)
195
- loadModelsDebounce();
196
- }, []);
197
- const showNoRecordsAvailableContent = useCallback((args) => {
198
- let models, overallCount;
199
- if (args.models !== undefined) {
200
- models = args.models;
201
- }
202
- else if (s.s.models !== undefined) {
203
- models = s.s.models;
204
- }
205
- if (args.overallCount !== undefined) {
206
- overallCount = args.overallCount;
207
- }
208
- else if (s.s.overallCount !== undefined) {
209
- overallCount = s.s.overallCount;
210
- }
211
- if (models === undefined || overallCount === undefined || s.p.noRecordsAvailableContent === undefined)
212
- return false;
213
- if (models.length === 0 && overallCount === 0 && s.p.noRecordsAvailableContent)
214
- return true;
215
- }, []);
216
- const showNoRecordsFoundContent = useCallback((args) => {
217
- let models, overallCount;
218
- if (args.models !== undefined) {
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));
266
+ this.loadModelsDebounce()();
267
+ }
268
+ /** @returns {void} */
269
+ onCreated() {
270
+ this.loadModelsDebounce()();
271
+ }
272
+ /** @returns {void} */
273
+ componentDidMount() {
274
+ this.setState({ readyToLoad: true });
275
+ }
276
+ /** @returns {void} */
277
+ setup() {
278
+ this.useStates({
279
+ models: undefined,
280
+ overallCount: undefined,
281
+ qParams: {},
282
+ query: undefined,
283
+ readyToLoad: false,
284
+ result: undefined,
285
+ searchParams: undefined,
286
+ showNoRecordsAvailableContent: false,
287
+ showNoRecordsFoundContent: false
288
+ });
289
+ this.setInstance({ queryParams: useQueryParams() });
290
+ // Wait until componentDidMount has flipped readyToLoad so the first load runs after useShapeHook has marked the hook mounted.
291
+ useEffect(() => {
292
+ if (!this.s.readyToLoad)
293
+ return;
294
+ let ifConditionMet;
295
+ if (typeof this.p.ifCondition == "function") {
296
+ ifConditionMet = this.p.ifCondition();
274
297
  }
275
- }
276
- return () => {
277
- for (const connection of connections) {
278
- connection.unsubscribe();
298
+ else if (this.p.ifCondition === undefined) {
299
+ ifConditionMet = true;
279
300
  }
280
- };
281
- }, [modelIdsCacheString]);
282
- const result = /** @type {UseCollectionResult & Record<string, any>} */ (Object.assign({}, s.state));
283
- const modelVariableName = inflection.pluralize(inflection.camelize(modelClass.modelClassData().name, true));
284
- result.modelIdsCacheString = modelIdsCacheString;
285
- result[modelVariableName] = s.s.models;
301
+ else {
302
+ ifConditionMet = this.p.ifCondition;
303
+ }
304
+ if (ifConditionMet) {
305
+ const { qParams, searchParams } = this.loadQParams();
306
+ this.loadModels({ qParams, searchParams });
307
+ }
308
+ }, [
309
+ this.p.modelClass,
310
+ this.p.ifCondition,
311
+ this.queryName(),
312
+ this.queryParams?.[this.queryQName()],
313
+ this.queryParams?.[this.queryPageName()],
314
+ this.queryParams?.[this.queryPerKey()],
315
+ this.queryParams?.[this.querySName()],
316
+ this.s.readyToLoad,
317
+ this.p.collection
318
+ ].concat(this.p.cacheKeys));
319
+ useEffect(() => {
320
+ if (!this.s.readyToLoad)
321
+ return;
322
+ if (this.p.noRecordsAvailableContent) {
323
+ this.loadOverallCount();
324
+ }
325
+ }, [this.p.modelClass, this.s.readyToLoad]);
326
+ useCreatedEvent(this.p.modelClass, () => this.onCreated());
327
+ // Invalidate any in-flight async responses so unmounted hooks cannot write stale state.
328
+ useEffect(() => () => {
329
+ this.loadModelsGeneration += 1;
330
+ this.loadOverallCountGeneration += 1;
331
+ this.loadModelsDebounce().clear?.();
332
+ }, []);
333
+ useEffect(() => {
334
+ const connections = [];
335
+ if (this.s.models) {
336
+ for (const model of this.s.models) {
337
+ connections.push(ModelEvents.connectUpdated(model, (args) => this.onModelUpdated(args)));
338
+ connections.push(ModelEvents.connectDestroyed(model, (args) => this.onModelDestroyed(args)));
339
+ }
340
+ }
341
+ return () => {
342
+ for (const connection of connections) {
343
+ connection.unsubscribe();
344
+ }
345
+ };
346
+ }, [this.modelIdsCacheString()]);
347
+ }
348
+ }
349
+ const useCollection = (props, cacheKeys = []) => {
350
+ const { abilities, collection, defaultParams, groupBy, ifCondition, limit, modelClass, noRecordsAvailableContent = undefined, noRecordsFoundContent = undefined, onModelsLoaded, pagination = false, preloads = [], queryMethod, queryName, ransack, select = {}, selectColumns, ...restProps } = props;
351
+ if (Object.keys(restProps).length > 0) {
352
+ throw new Error(`Unknown props given to useCollection: ${Object.keys(restProps).join(", ")}`);
353
+ }
354
+ const shapeHook = useShapeHook(UseCollectionShapeHook, {
355
+ abilities,
356
+ cacheKeys,
357
+ collection,
358
+ defaultParams,
359
+ groupBy,
360
+ ifCondition,
361
+ limit,
362
+ modelClass,
363
+ noRecordsAvailableContent,
364
+ noRecordsFoundContent,
365
+ onModelsLoaded,
366
+ pagination,
367
+ preloads,
368
+ queryMethod,
369
+ queryName,
370
+ ransack,
371
+ select,
372
+ selectColumns
373
+ });
374
+ const result = /** @type {UseCollectionResult & Record<string, any>} */ (Object.assign({}, shapeHook.state));
375
+ const modelVariableName = inflection.pluralize(inflection.camelize(shapeHook.p.modelClass.modelClassData().name, true));
376
+ result.modelIdsCacheString = shapeHook.modelIdsCacheString();
377
+ result.queryName = shapeHook.queryName();
378
+ result.queryPerKey = shapeHook.queryPerKey();
379
+ result.queryQName = shapeHook.queryQName();
380
+ result.querySName = shapeHook.querySName();
381
+ result.queryPageName = shapeHook.queryPageName();
382
+ result[modelVariableName] = shapeHook.s.models;
286
383
  return result;
287
384
  };
288
385
  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=
386
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInVzZS1jb2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZGQUE2RjtBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQ3pELE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQTtBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBQzlCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sV0FBVyxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxPQUFPLENBQUE7QUFDL0IsT0FBTyxlQUFlLE1BQU0sd0JBQXdCLENBQUE7QUFDcEQsT0FBTyxjQUFjLE1BQU0sK0NBQStDLENBQUE7QUFFMUU7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILDhDQUE4QztBQUM5QyxNQUFNLHNCQUF1QixTQUFRLFNBQVM7SUFDNUMsbUJBQW1CO0lBQ25CLFlBQVksS0FBSztRQUNmLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNaLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUE7UUFDN0IsSUFBSSxDQUFDLDBCQUEwQixHQUFHLENBQUMsQ0FBQTtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTtJQUM5QixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQTtJQUN0RixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLFdBQVc7UUFDVCxPQUFPLEdBQUcsSUFBSSxDQUFDLFNB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QyxDQUFBO0FBRUQsZUFBZSxhQUFhLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycywgbm8tdXNlLWJlZm9yZS1kZWZpbmUsIHByZWZlci1vYmplY3Qtc3ByZWFkLCBzb3J0LWltcG9ydHMgKi9cbmltcG9ydCB7U2hhcGVIb29rLCB1c2VTaGFwZUhvb2t9IGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZVwiXG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcImRlYm91bmNlXCJcbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBNb2RlbEV2ZW50cyBmcm9tIFwiLi9tb2RlbC1ldmVudHMuanNcIlxuaW1wb3J0IHt1c2VFZmZlY3R9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgdXNlQ3JlYXRlZEV2ZW50IGZyb20gXCIuL3VzZS1jcmVhdGVkLWV2ZW50LmpzXCJcbmltcG9ydCB1c2VRdWVyeVBhcmFtcyBmcm9tIFwib24tbG9jYXRpb24tY2hhbmdlZC9idWlsZC91c2UtcXVlcnktcGFyYW1zLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVc2VDb2xsZWN0aW9uUmVzdWx0XG4gKiBAcHJvcGVydHkge0FycmF5PGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0Pn0gbW9kZWxzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWxJZHNDYWNoZVN0cmluZ1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG92ZXJhbGxDb3VudFxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdH0gcXVlcnlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeVBlcktleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHF1ZXJ5UU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeVNOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnlQYWdlTmFtZVxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3Jlc3VsdC5qc1wiKS5kZWZhdWx0fSByZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHNlYXJjaFBhcmFtc1xuICogQHByb3BlcnR5IHtmYWxzZSB8IGltcG9ydChcInJlYWN0XCIpLlJlYWN0Tm9kZX0gc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnRcbiAqIEBwcm9wZXJ0eSB7ZmFsc2UgfCBpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IHByb3BzLmFiaWxpdGllc1xuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdH0gcHJvcHMuY29sbGVjdGlvblxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwcm9wcy5kZWZhdWx0UGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcy5ncm91cEJ5XG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiBib29sZWFufSBwcm9wcy5pZkNvbmRpdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IHByb3BzLmxpbWl0XG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdH0gcHJvcHMubW9kZWxDbGFzc1xuICogQHBhcmFtIHtmdW5jdGlvbigpIDogaW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfSBwcm9wcy5ub1JlY29yZHNBdmFpbGFibGVDb250ZW50XG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiBpbXBvcnQoXCJyZWFjdFwiKS5SZWFjdE5vZGV9IHByb3BzLm5vUmVjb3Jkc0ZvdW5kQ29udGVudFxuICogQHBhcmFtIHtmdW5jdGlvbigpIDogdm9pZH0gcHJvcHMub25Nb2RlbHNMb2FkZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJvcHMucGFnaW5hdGlvblxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHMucHJlbG9hZHNcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oe3F1ZXJ5OiBpbXBvcnQoXCIuL2NvbGxlY3Rpb24uanNcIikuZGVmYXVsdH0pIDogaW1wb3J0KFwiLi9jb2xsZWN0aW9uLmpzXCIpLmRlZmF1bHR9IHByb3BzLnF1ZXJ5TWV0aG9kXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcHMucXVlcnlOYW1lXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IHByb3BzLnJhbnNhY2tcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBwcm9wcy5zZWxlY3RcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBwcm9wcy5zZWxlY3RDb2x1bW5zXG4gKiBAcGFyYW0ge2FueVtdfSBjYWNoZUtleXNcbiAqIEByZXR1cm5zIHtVc2VDb2xsZWN0aW9uUmVzdWx0ICYgUmVjb3JkPHN0cmluZywgYW55Pn1cbiAqL1xuLyoqIEhvb2sgc3RhdGUgY29udGFpbmVyIGZvciB1c2VDb2xsZWN0aW9uLiAqL1xuY2xhc3MgVXNlQ29sbGVjdGlvblNoYXBlSG9vayBleHRlbmRzIFNoYXBlSG9vayB7XG4gIC8qKiBDb25zdHJ1Y3Rvci4gKi9cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLmxvYWRNb2RlbHNHZW5lcmF0aW9uID0gMFxuICAgIHRoaXMubG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb24gPSAwXG4gICAgdGhpcy5xdWVyeVBhcmFtcyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIHF1ZXJ5TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wLnF1ZXJ5TmFtZSB8fCBkaWdnKHRoaXMucC5tb2RlbENsYXNzLm1vZGVsQ2xhc3NEYXRhKCksIFwiY29sbGVjdGlvbktleVwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIHF1ZXJ5UGVyS2V5KCkge1xuICAgIHJldHVybiBgJHt0aGlzLnF1ZXJ5TmFtZSgpfV9wZXJgXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgcXVlcnlRTmFtZSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5xdWVyeU5hbWUoKX1fcWBcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBxdWVyeVNOYW1lKCkge1xuICAgIHJldHVybiBgJHt0aGlzLnF1ZXJ5TmFtZSgpfV9zYFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIHF1ZXJ5UGFnZU5hbWUoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMucXVlcnlOYW1lKCl9X3BhZ2VgXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgbW9kZWxJZHNDYWNoZVN0cmluZygpIHtcbiAgICBpZiAodGhpcy5zLm1vZGVscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gXCJtb2RlbHMtdW5kZWZpbmVkXCJcbiAgICB9IGVsc2UgaWYgKHRoaXMucy5tb2RlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJuby1tb2RlbHNcIlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5zLm1vZGVscy5tYXAoKG1vZGVsKSA9PiBtb2RlbC5jYWNoZUtleSgpKT8uam9pbihcIi0tLVwiKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7RnVuY3Rpb24gJiB7Y2xlYXI/OiAoKSA9PiB2b2lkfX0gKi9cbiAgbG9hZE1vZGVsc0RlYm91bmNlKCkge1xuICAgIHJldHVybiB0aGlzLmNhY2hlKFwibG9hZE1vZGVsc0RlYm91bmNlXCIsICgpID0+IGRlYm91bmNlKCgpID0+IHRoaXMubG9hZE1vZGVscygpKSlcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MgKi9cbiAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQoYXJncykge1xuICAgIGxldCBtb2RlbHMsIG92ZXJhbGxDb3VudFxuXG4gICAgaWYgKGFyZ3MubW9kZWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGVscyA9IGFyZ3MubW9kZWxzXG4gICAgfSBlbHNlIGlmICh0aGlzLnMubW9kZWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGVscyA9IHRoaXMucy5tb2RlbHNcbiAgICB9XG5cbiAgICBpZiAoYXJncy5vdmVyYWxsQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3ZlcmFsbENvdW50ID0gYXJncy5vdmVyYWxsQ291bnRcbiAgICB9IGVsc2UgaWYgKHRoaXMucy5vdmVyYWxsQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3ZlcmFsbENvdW50ID0gdGhpcy5zLm92ZXJhbGxDb3VudFxuICAgIH1cblxuICAgIGlmIChtb2RlbHMgPT09IHVuZGVmaW5lZCB8fCBvdmVyYWxsQ291bnQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnAubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2VcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCAmJiBvdmVyYWxsQ291bnQgPT09IDAgJiYgdGhpcy5wLm5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQpIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzICovXG4gIHNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQoYXJncykge1xuICAgIGxldCBtb2RlbHMsIG92ZXJhbGxDb3VudFxuXG4gICAgaWYgKGFyZ3MubW9kZWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGVscyA9IGFyZ3MubW9kZWxzXG4gICAgfSBlbHNlIGlmICh0aGlzLnMubW9kZWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGVscyA9IHRoaXMucy5tb2RlbHNcbiAgICB9XG5cbiAgICBpZiAoYXJncy5vdmVyYWxsQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3ZlcmFsbENvdW50ID0gYXJncy5vdmVyYWxsQ291bnRcbiAgICB9IGVsc2UgaWYgKHRoaXMucy5vdmVyYWxsQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3ZlcmFsbENvdW50ID0gdGhpcy5zLm92ZXJhbGxDb3VudFxuICAgIH1cblxuICAgIGlmIChtb2RlbHMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnAubm9SZWNvcmRzRm91bmRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZVxuXG4gICAgLy8gRG9udCBzaG93IG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQgdG9nZXRoZXIgd2l0aCBub1JlY29yZHNBdmFpbGFibGVDb250ZW50XG4gICAgaWYgKG1vZGVscy5sZW5ndGggPT09IDAgJiYgb3ZlcmFsbENvdW50ID09PSAwICYmIHRoaXMucC5ub1JlY29yZHNBdmFpbGFibGVDb250ZW50KSByZXR1cm4gZmFsc2VcbiAgICBpZiAobW9kZWxzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnAubm9SZWNvcmRzRm91bmRDb250ZW50KSByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBsb2FkT3ZlcmFsbENvdW50ID0gYXN5bmMgKCkgPT4ge1xuICAgIC8vIElnbm9yZSBsYXRlIG92ZXJhbGwtY291bnQgcmVzcG9uc2VzIG9uY2UgYSBuZXdlciBsb2FkIGN5Y2xlIGhhcyBzdGFydGVkIG9yIHRoZSBob29rIHVubW91bnRlZC5cbiAgICBjb25zdCBsb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvbiA9IHRoaXMubG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb24gKyAxXG5cbiAgICB0aGlzLmxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uID0gbG9hZE92ZXJhbGxDb3VudEdlbmVyYXRpb25cblxuICAgIGNvbnN0IGJhc2VRdWVyeSA9IHRoaXMucC5jb2xsZWN0aW9uIHx8IHRoaXMucC5tb2RlbENsYXNzLmFsbCgpXG4gICAgY29uc3Qgb3ZlcmFsbENvdW50ID0gYXdhaXQgYmFzZVF1ZXJ5LmNvdW50KClcblxuICAgIGlmIChsb2FkT3ZlcmFsbENvdW50R2VuZXJhdGlvbiAhPSB0aGlzLmxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uKSByZXR1cm5cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgb3ZlcmFsbENvdW50LFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IHRoaXMuc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQoe292ZXJhbGxDb3VudH0pLFxuICAgICAgc2hvd05vUmVjb3Jkc0ZvdW5kQ29udGVudDogdGhpcy5zaG93Tm9SZWNvcmRzRm91bmRDb250ZW50KHtvdmVyYWxsQ291bnR9KVxuICAgIH0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3txUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzZWFyY2hQYXJhbXM6IHN0cmluZ1tdfX0gKi9cbiAgbG9hZFFQYXJhbXMoKSB7XG4gICAgbGV0IHFQYXJhbXNUb1NldCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucC5kZWZhdWx0UGFyYW1zKVxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IFtdXG5cbiAgICBpZiAodGhpcy5xdWVyeVBhcmFtcyAmJiB0aGlzLnF1ZXJ5UU5hbWUoKSBpbiB0aGlzLnF1ZXJ5UGFyYW1zKSB7XG4gICAgICBxUGFyYW1zVG9TZXQgPSBKU09OLnBhcnNlKGRpZ2codGhpcy5xdWVyeVBhcmFtcywgdGhpcy5xdWVyeVFOYW1lKCkpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVNOYW1lKCldKSB7XG4gICAgICBmb3IgKGNvbnN0IHJhd1NlYXJjaFBhcmFtIG9mIHRoaXMucXVlcnlQYXJhbXNbdGhpcy5xdWVyeVNOYW1lKCldKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFNlYXJjaFBhcmFtID0gSlNPTi5wYXJzZShyYXdTZWFyY2hQYXJhbSlcblxuICAgICAgICBzZWFyY2hQYXJhbXMucHVzaChwYXJzZWRTZWFyY2hQYXJhbSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHFQYXJhbXM6IHFQYXJhbXNUb1NldCxcbiAgICAgIHNlYXJjaFBhcmFtc1xuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgcVBhcmFtczogcVBhcmFtc1RvU2V0LFxuICAgICAgc2VhcmNoUGFyYW1zXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc11cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXJncy5xUGFyYW1zXVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5zZWFyY2hQYXJhbXNdXG4gICAqIEByZXR1cm5zIHt7cVBhcmFtczogUmVjb3JkPHN0cmluZywgYW55Piwgc2VhcmNoUGFyYW1zOiBzdHJpbmdbXX19XG4gICAqL1xuICBsb2FkTW9kZWxzQXJncyhhcmdzID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgcVBhcmFtczogYXJncy5xUGFyYW1zID8/IHRoaXMucy5xUGFyYW1zLFxuICAgICAgc2VhcmNoUGFyYW1zOiBhcmdzLnNlYXJjaFBhcmFtcyA/PyB0aGlzLnMuc2VhcmNoUGFyYW1zXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc11cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXJncy5xUGFyYW1zXVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5zZWFyY2hQYXJhbXNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgbG9hZE1vZGVscyA9IGFzeW5jIChhcmdzID0ge30pID0+IHtcbiAgICAvLyBPbmx5IHRoZSBuZXdlc3QgY29sbGVjdGlvbiByZXF1ZXN0IGlzIGFsbG93ZWQgdG8gdXBkYXRlIHN0YXRlIGFmdGVyIG5hdmlnYXRpb24vZmlsdGVyIGNoYW5nZXMuXG4gICAgY29uc3QgbG9hZE1vZGVsc0dlbmVyYXRpb24gPSB0aGlzLmxvYWRNb2RlbHNHZW5lcmF0aW9uICsgMVxuICAgIGNvbnN0IHtxUGFyYW1zLCBzZWFyY2hQYXJhbXN9ID0gdGhpcy5sb2FkTW9kZWxzQXJncyhhcmdzKVxuXG4gICAgdGhpcy5sb2FkTW9kZWxzR2VuZXJhdGlvbiA9IGxvYWRNb2RlbHNHZW5lcmF0aW9uXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5wLmNvbGxlY3Rpb24/LmNsb25lKCkgfHwgdGhpcy5wLm1vZGVsQ2xhc3MucmFuc2FjaygpXG5cbiAgICBpZiAodGhpcy5wLnBhZ2luYXRpb24pIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVBhZ2VOYW1lKCldIHx8IDFcbiAgICAgIGxldCBwZXIgPSB0aGlzLnF1ZXJ5UGFyYW1zPy5bdGhpcy5xdWVyeVBlcktleSgpXSB8fCAzMFxuXG4gICAgICBpZiAocGVyID09IFwiYWxsXCIpIHtcbiAgICAgICAgcGVyID0gOTk5Xzk5OV85OTlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlciA9IE51bWJlcihwZXIpXG4gICAgICB9XG5cbiAgICAgIHF1ZXJ5LnBhZ2UocGFnZSkucGVyKHBlcilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wLmdyb3VwQnkpIHF1ZXJ5ID0gcXVlcnkuZ3JvdXBCeSguLi50aGlzLnAuZ3JvdXBCeSlcblxuICAgIHF1ZXJ5ID0gcXVlcnlcbiAgICAgIC5yYW5zYWNrKHFQYXJhbXMpXG4gICAgICAuc2VhcmNoKHNlYXJjaFBhcmFtcylcbiAgICAgIC5zZWFyY2hLZXkodGhpcy5xdWVyeVFOYW1lKCkpXG4gICAgICAucGFnZUtleSh0aGlzLnF1ZXJ5UGFnZU5hbWUoKSlcbiAgICAgIC5wZXJLZXkodGhpcy5xdWVyeVBlcktleSgpKVxuXG4gICAgaWYgKHRoaXMucC5hYmlsaXRpZXMpIHF1ZXJ5LmFiaWxpdGllcyh0aGlzLnAuYWJpbGl0aWVzKVxuICAgIGlmICh0aGlzLnAubGltaXQgIT09IHVuZGVmaW5lZCkgcXVlcnkubGltaXQodGhpcy5wLmxpbWl0KVxuICAgIGlmICh0aGlzLnAucHJlbG9hZHMpIHF1ZXJ5LnByZWxvYWQodGhpcy5wLnByZWxvYWRzKVxuICAgIGlmICh0aGlzLnAucmFuc2FjaykgcXVlcnkucmFuc2Fjayh0aGlzLnAucmFuc2FjaylcbiAgICBpZiAodGhpcy5wLnNlbGVjdCkgcXVlcnkuc2VsZWN0KHRoaXMucC5zZWxlY3QpXG4gICAgaWYgKHRoaXMucC5zZWxlY3RDb2x1bW5zKSBxdWVyeS5zZWxlY3RDb2x1bW5zKHRoaXMucC5zZWxlY3RDb2x1bW5zKVxuXG4gICAgbGV0IHJlc3VsdFxuXG4gICAgaWYgKHRoaXMucC5xdWVyeU1ldGhvZCkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5wLnF1ZXJ5TWV0aG9kKHtxdWVyeX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHF1ZXJ5LnJlc3VsdCgpXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxzID0gcmVzdWx0Lm1vZGVscygpXG5cbiAgICBpZiAobG9hZE1vZGVsc0dlbmVyYXRpb24gIT0gdGhpcy5sb2FkTW9kZWxzR2VuZXJhdGlvbikgcmV0dXJuXG5cbiAgICBpZiAodGhpcy5wLm9uTW9kZWxzTG9hZGVkKSB7XG4gICAgICB0aGlzLnAub25Nb2RlbHNMb2FkZWQoe1xuICAgICAgICBtb2RlbHMsXG4gICAgICAgIHFQYXJhbXM6IHRoaXMucy5xUGFyYW1zLFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgcmVzdWx0XG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgbW9kZWxzLFxuICAgICAgcXVlcnksXG4gICAgICByZXN1bHQsXG4gICAgICBzaG93Tm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudDogdGhpcy5zaG93Tm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCh7bW9kZWxzfSksXG4gICAgICBzaG93Tm9SZWNvcmRzRm91bmRDb250ZW50OiB0aGlzLnNob3dOb1JlY29yZHNGb3VuZENvbnRlbnQoe21vZGVsc30pXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3ttb2RlbDogaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9fSBhcmdzICovXG4gIG9uTW9kZWxEZXN0cm95ZWQoYXJncykge1xuICAgIGNvbnN0IGRlc3Ryb3llZE1vZGVsID0gZGlnZyhhcmdzLCBcIm1vZGVsXCIpXG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIG1vZGVsczogdGhpcy5zLm1vZGVscy5maWx0ZXIoKG1vZGVsKSA9PiBtb2RlbC5pZCgpICE9IGRlc3Ryb3llZE1vZGVsLmlkKCkpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3ttb2RlbDogaW1wb3J0KFwiLi9iYXNlLW1vZGVsLmpzXCIpLmRlZmF1bHR9fSBhcmdzICovXG4gIG9uTW9kZWxVcGRhdGVkKGFyZ3MpIHtcbiAgICBjb25zdCB1cGRhdGVkTW9kZWwgPSBkaWdnKGFyZ3MsIFwibW9kZWxcIilcbiAgICBjb25zdCBmb3VuZE1vZGVsID0gdGhpcy5zLm1vZGVscy5maW5kKChtb2RlbCkgPT4gbW9kZWwuaWQoKSA9PSB1cGRhdGVkTW9kZWwuaWQoKSlcblxuICAgIGlmIChmb3VuZE1vZGVsKSB0aGlzLmxvYWRNb2RlbHNEZWJvdW5jZSgpKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgb25DcmVhdGVkKCkge1xuICAgIHRoaXMubG9hZE1vZGVsc0RlYm91bmNlKCkoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtyZWFkeVRvTG9hZDogdHJ1ZX0pXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIHNldHVwKCkge1xuICAgIHRoaXMudXNlU3RhdGVzKHtcbiAgICAgIG1vZGVsczogdW5kZWZpbmVkLFxuICAgICAgb3ZlcmFsbENvdW50OiB1bmRlZmluZWQsXG4gICAgICBxUGFyYW1zOiB7fSxcbiAgICAgIHF1ZXJ5OiB1bmRlZmluZWQsXG4gICAgICByZWFkeVRvTG9hZDogZmFsc2UsXG4gICAgICByZXN1bHQ6IHVuZGVmaW5lZCxcbiAgICAgIHNlYXJjaFBhcmFtczogdW5kZWZpbmVkLFxuICAgICAgc2hvd05vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQ6IGZhbHNlLFxuICAgICAgc2hvd05vUmVjb3Jkc0ZvdW5kQ29udGVudDogZmFsc2VcbiAgICB9KVxuICAgIHRoaXMuc2V0SW5zdGFuY2Uoe3F1ZXJ5UGFyYW1zOiB1c2VRdWVyeVBhcmFtcygpfSlcblxuICAgIC8vIFdhaXQgdW50aWwgY29tcG9uZW50RGlkTW91bnQgaGFzIGZsaXBwZWQgcmVhZHlUb0xvYWQgc28gdGhlIGZpcnN0IGxvYWQgcnVucyBhZnRlciB1c2VTaGFwZUhvb2sgaGFzIG1hcmtlZCB0aGUgaG9vayBtb3VudGVkLlxuICAgIHVzZUVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnMucmVhZHlUb0xvYWQpIHJldHVyblxuICAgICAgICBsZXQgaWZDb25kaXRpb25NZXRcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucC5pZkNvbmRpdGlvbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBpZkNvbmRpdGlvbk1ldCA9IHRoaXMucC5pZkNvbmRpdGlvbigpXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wLmlmQ29uZGl0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZkNvbmRpdGlvbk1ldCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZkNvbmRpdGlvbk1ldCA9IHRoaXMucC5pZkNvbmRpdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlmQ29uZGl0aW9uTWV0KSB7XG4gICAgICAgICAgY29uc3Qge3FQYXJhbXMsIHNlYXJjaFBhcmFtc30gPSB0aGlzLmxvYWRRUGFyYW1zKClcblxuICAgICAgICAgIHRoaXMubG9hZE1vZGVscyh7cVBhcmFtcywgc2VhcmNoUGFyYW1zfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtcbiAgICAgICAgdGhpcy5wLm1vZGVsQ2xhc3MsXG4gICAgICAgIHRoaXMucC5pZkNvbmRpdGlvbixcbiAgICAgICAgdGhpcy5xdWVyeU5hbWUoKSxcbiAgICAgICAgdGhpcy5xdWVyeVBhcmFtcz8uW3RoaXMucXVlcnlRTmFtZSgpXSxcbiAgICAgICAgdGhpcy5xdWVyeVBhcmFtcz8uW3RoaXMucXVlcnlQYWdlTmFtZSgpXSxcbiAgICAgICAgdGhpcy5xdWVyeVBhcmFtcz8uW3RoaXMucXVlcnlQZXJLZXkoKV0sXG4gICAgICAgIHRoaXMucXVlcnlQYXJhbXM/Llt0aGlzLnF1ZXJ5U05hbWUoKV0sXG4gICAgICAgIHRoaXMucy5yZWFkeVRvTG9hZCxcbiAgICAgICAgdGhpcy5wLmNvbGxlY3Rpb25cbiAgICAgIF0uY29uY2F0KHRoaXMucC5jYWNoZUtleXMpXG4gICAgKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5zLnJlYWR5VG9Mb2FkKSByZXR1cm5cbiAgICAgIGlmICh0aGlzLnAubm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCkge1xuICAgICAgICB0aGlzLmxvYWRPdmVyYWxsQ291bnQoKVxuICAgICAgfVxuICAgIH0sIFt0aGlzLnAubW9kZWxDbGFzcywgdGhpcy5zLnJlYWR5VG9Mb2FkXSlcblxuICAgIHVzZUNyZWF0ZWRFdmVudCh0aGlzLnAubW9kZWxDbGFzcywgKCkgPT4gdGhpcy5vbkNyZWF0ZWQoKSlcblxuICAgIC8vIEludmFsaWRhdGUgYW55IGluLWZsaWdodCBhc3luYyByZXNwb25zZXMgc28gdW5tb3VudGVkIGhvb2tzIGNhbm5vdCB3cml0ZSBzdGFsZSBzdGF0ZS5cbiAgICB1c2VFZmZlY3QoKCkgPT4gKCkgPT4ge1xuICAgICAgdGhpcy5sb2FkTW9kZWxzR2VuZXJhdGlvbiArPSAxXG4gICAgICB0aGlzLmxvYWRPdmVyYWxsQ291bnRHZW5lcmF0aW9uICs9IDFcbiAgICAgIHRoaXMubG9hZE1vZGVsc0RlYm91bmNlKCkuY2xlYXI/LigpXG4gICAgfSwgW10pXG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgY29ubmVjdGlvbnMgPSBbXVxuXG4gICAgICBpZiAodGhpcy5zLm1vZGVscykge1xuICAgICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHRoaXMucy5tb2RlbHMpIHtcbiAgICAgICAgICBjb25uZWN0aW9ucy5wdXNoKE1vZGVsRXZlbnRzLmNvbm5lY3RVcGRhdGVkKG1vZGVsLCAoYXJncykgPT4gdGhpcy5vbk1vZGVsVXBkYXRlZChhcmdzKSkpXG4gICAgICAgICAgY29ubmVjdGlvbnMucHVzaChNb2RlbEV2ZW50cy5jb25uZWN0RGVzdHJveWVkKG1vZGVsLCAoYXJncykgPT4gdGhpcy5vbk1vZGVsRGVzdHJveWVkKGFyZ3MpKSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIHtcbiAgICAgICAgICBjb25uZWN0aW9uLnVuc3Vic2NyaWJlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFt0aGlzLm1vZGVsSWRzQ2FjaGVTdHJpbmcoKV0pXG4gIH1cbn1cblxuY29uc3QgdXNlQ29sbGVjdGlvbiA9IChwcm9wcywgY2FjaGVLZXlzID0gW10pID0+IHtcbiAgY29uc3Qge1xuICAgIGFiaWxpdGllcyxcbiAgICBjb2xsZWN0aW9uLFxuICAgIGRlZmF1bHRQYXJhbXMsXG4gICAgZ3JvdXBCeSxcbiAgICBpZkNvbmRpdGlvbixcbiAgICBsaW1pdCxcbiAgICBtb2RlbENsYXNzLFxuICAgIG5vUmVjb3Jkc0F2YWlsYWJsZUNvbnRlbnQgPSB1bmRlZmluZWQsXG4gICAgbm9SZWNvcmRzRm91bmRDb250ZW50ID0gdW5kZWZpbmVkLFxuICAgIG9uTW9kZWxzTG9hZGVkLFxuICAgIHBhZ2luYXRpb24gPSBmYWxzZSxcbiAgICBwcmVsb2FkcyA9IFtdLFxuICAgIHF1ZXJ5TWV0aG9kLFxuICAgIHF1ZXJ5TmFtZSxcbiAgICByYW5zYWNrLFxuICAgIHNlbGVjdCA9IHt9LFxuICAgIHNlbGVjdENvbHVtbnMsXG4gICAgLi4ucmVzdFByb3BzXG4gIH0gPSBwcm9wc1xuXG4gIGlmIChPYmplY3Qua2V5cyhyZXN0UHJvcHMpLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcHJvcHMgZ2l2ZW4gdG8gdXNlQ29sbGVjdGlvbjogJHtPYmplY3Qua2V5cyhyZXN0UHJvcHMpLmpvaW4oXCIsIFwiKX1gKVxuICB9XG5cbiAgY29uc3Qgc2hhcGVIb29rID0gdXNlU2hhcGVIb29rKFVzZUNvbGxlY3Rpb25TaGFwZUhvb2ssIHtcbiAgICBhYmlsaXRpZXMsXG4gICAgY2FjaGVLZXlzLFxuICAgIGNvbGxlY3Rpb24sXG4gICAgZGVmYXVsdFBhcmFtcyxcbiAgICBncm91cEJ5LFxuICAgIGlmQ29uZGl0aW9uLFxuICAgIGxpbWl0LFxuICAgIG1vZGVsQ2xhc3MsXG4gICAgbm9SZWNvcmRzQXZhaWxhYmxlQ29udGVudCxcbiAgICBub1JlY29yZHNGb3VuZENvbnRlbnQsXG4gICAgb25Nb2RlbHNMb2FkZWQsXG4gICAgcGFnaW5hdGlvbixcbiAgICBwcmVsb2FkcyxcbiAgICBxdWVyeU1ldGhvZCxcbiAgICBxdWVyeU5hbWUsXG4gICAgcmFuc2FjayxcbiAgICBzZWxlY3QsXG4gICAgc2VsZWN0Q29sdW1uc1xuICB9KVxuICBjb25zdCByZXN1bHQgPSAvKiogQHR5cGUge1VzZUNvbGxlY3Rpb25SZXN1bHQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoT2JqZWN0LmFzc2lnbih7fSwgc2hhcGVIb29rLnN0YXRlKSlcbiAgY29uc3QgbW9kZWxWYXJpYWJsZU5hbWUgPSBpbmZsZWN0aW9uLnBsdXJhbGl6ZShpbmZsZWN0aW9uLmNhbWVsaXplKHNoYXBlSG9vay5wLm1vZGVsQ2xhc3MubW9kZWxDbGFzc0RhdGEoKS5uYW1lLCB0cnVlKSlcblxuICByZXN1bHQubW9kZWxJZHNDYWNoZVN0cmluZyA9IHNoYXBlSG9vay5tb2RlbElkc0NhY2hlU3RyaW5nKClcbiAgcmVzdWx0LnF1ZXJ5TmFtZSA9IHNoYXBlSG9vay5xdWVyeU5hbWUoKVxuICByZXN1bHQucXVlcnlQZXJLZXkgPSBzaGFwZUhvb2sucXVlcnlQZXJLZXkoKVxuICByZXN1bHQucXVlcnlRTmFtZSA9IHNoYXBlSG9vay5xdWVyeVFOYW1lKClcbiAgcmVzdWx0LnF1ZXJ5U05hbWUgPSBzaGFwZUhvb2sucXVlcnlTTmFtZSgpXG4gIHJlc3VsdC5xdWVyeVBhZ2VOYW1lID0gc2hhcGVIb29rLnF1ZXJ5UGFnZU5hbWUoKVxuICByZXN1bHRbbW9kZWxWYXJpYWJsZU5hbWVdID0gc2hhcGVIb29rLnMubW9kZWxzXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZGVmYXVsdCB1c2VDb2xsZWN0aW9uXG4iXX0=
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kaspernj/api-maker",
3
3
  "type": "module",
4
- "version": "1.0.2129",
4
+ "version": "1.0.2131",
5
5
  "description": "My new module",
6
6
  "files": [
7
7
  "build/**"