@ironcode/vas-lib 1.8.0-alpha.3 → 1.8.0-alpha.6

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.
Files changed (184) hide show
  1. package/cjs/lib/control-value/vas-camera-control-value.model.js +1 -2
  2. package/cjs/lib/control-value/vas-camera-control-value.model.js.map +1 -1
  3. package/cjs/lib/controls-config/vas-control-config-direction.enum.js +1 -1
  4. package/cjs/lib/controls-config/vas-control-config-direction.enum.js.map +1 -1
  5. package/cjs/lib/elastic/index.d.ts +2 -0
  6. package/cjs/lib/elastic/index.d.ts.map +1 -0
  7. package/cjs/lib/elastic/index.js +5 -0
  8. package/cjs/lib/elastic/index.js.map +1 -0
  9. package/cjs/lib/elastic/job.elastic-doc.d.ts +14 -0
  10. package/cjs/lib/elastic/job.elastic-doc.d.ts.map +1 -0
  11. package/cjs/lib/elastic/job.elastic-doc.js +3 -0
  12. package/cjs/lib/elastic/job.elastic-doc.js.map +1 -0
  13. package/cjs/lib/entity/index.d.ts +3 -0
  14. package/cjs/lib/entity/index.d.ts.map +1 -1
  15. package/cjs/lib/entity/index.js +3 -0
  16. package/cjs/lib/entity/index.js.map +1 -1
  17. package/cjs/lib/entity/vas-account.dto.js +1 -1
  18. package/cjs/lib/entity/vas-account.dto.js.map +1 -1
  19. package/cjs/lib/entity/vas-base.model.d.ts +4 -2
  20. package/cjs/lib/entity/vas-base.model.d.ts.map +1 -1
  21. package/cjs/lib/entity/vas-base.model.js.map +1 -1
  22. package/cjs/lib/entity/vas-contact.model.d.ts +1 -0
  23. package/cjs/lib/entity/vas-contact.model.d.ts.map +1 -1
  24. package/cjs/lib/entity/vas-contact.model.js +20 -1
  25. package/cjs/lib/entity/vas-contact.model.js.map +1 -1
  26. package/cjs/lib/entity/vas-control.model.js.map +1 -1
  27. package/cjs/lib/entity/vas-field.model.js.map +1 -1
  28. package/cjs/lib/entity/vas-file.dto.js +1 -2
  29. package/cjs/lib/entity/vas-file.dto.js.map +1 -1
  30. package/cjs/lib/entity/vas-file.model.js.map +1 -1
  31. package/cjs/lib/entity/vas-fire-user.model.d.ts +1 -1
  32. package/cjs/lib/entity/vas-fire-user.model.d.ts.map +1 -1
  33. package/cjs/lib/entity/vas-fire-user.model.js.map +1 -1
  34. package/cjs/lib/entity/vas-form-config.model.d.ts +3 -13
  35. package/cjs/lib/entity/vas-form-config.model.d.ts.map +1 -1
  36. package/cjs/lib/entity/vas-form-config.model.js.map +1 -1
  37. package/cjs/lib/entity/vas-form.model.d.ts +4 -0
  38. package/cjs/lib/entity/vas-form.model.d.ts.map +1 -1
  39. package/cjs/lib/entity/vas-form.model.js +9 -0
  40. package/cjs/lib/entity/vas-form.model.js.map +1 -1
  41. package/cjs/lib/entity/vas-group.model.js.map +1 -1
  42. package/cjs/lib/entity/vas-invitation.js +1 -1
  43. package/cjs/lib/entity/vas-invitation.js.map +1 -1
  44. package/cjs/lib/entity/vas-job.model.js +1 -1
  45. package/cjs/lib/entity/vas-job.model.js.map +1 -1
  46. package/cjs/lib/entity/vas-lookup.model.d.ts +34 -0
  47. package/cjs/lib/entity/vas-lookup.model.d.ts.map +1 -0
  48. package/cjs/lib/entity/vas-lookup.model.js +61 -0
  49. package/cjs/lib/entity/vas-lookup.model.js.map +1 -0
  50. package/cjs/lib/entity/vas-task.dto.d.ts +1 -0
  51. package/cjs/lib/entity/vas-task.dto.d.ts.map +1 -1
  52. package/cjs/lib/entity/vas-task.dto.js.map +1 -1
  53. package/cjs/lib/entity/vas-task.model.d.ts +2 -1
  54. package/cjs/lib/entity/vas-task.model.d.ts.map +1 -1
  55. package/cjs/lib/entity/vas-task.model.js +4 -2
  56. package/cjs/lib/entity/vas-task.model.js.map +1 -1
  57. package/cjs/lib/entity/vas-user.model.d.ts +2 -2
  58. package/cjs/lib/entity/vas-user.model.d.ts.map +1 -1
  59. package/cjs/lib/entity/vas-user.model.js +1 -1
  60. package/cjs/lib/entity/vas-user.model.js.map +1 -1
  61. package/cjs/lib/entity/vas-vehicle.model.d.ts +1 -0
  62. package/cjs/lib/entity/vas-vehicle.model.d.ts.map +1 -1
  63. package/cjs/lib/entity/vas-vehicle.model.js +12 -0
  64. package/cjs/lib/entity/vas-vehicle.model.js.map +1 -1
  65. package/cjs/lib/utils/find-form-control.js.map +1 -1
  66. package/cjs/lib/utils/get-value-by-path.d.ts.map +1 -1
  67. package/cjs/lib/utils/get-value-by-path.js.map +1 -1
  68. package/cjs/lib/utils/is-array-string.d.ts +1 -1
  69. package/cjs/lib/utils/is-array-string.d.ts.map +1 -1
  70. package/cjs/lib/utils/omit.d.ts +8 -0
  71. package/cjs/lib/utils/omit.d.ts.map +1 -0
  72. package/cjs/lib/utils/omit.js +26 -0
  73. package/cjs/lib/utils/omit.js.map +1 -0
  74. package/cjs/lib/utils/only.d.ts +8 -0
  75. package/cjs/lib/utils/only.d.ts.map +1 -0
  76. package/cjs/lib/utils/only.js +26 -0
  77. package/cjs/lib/utils/only.js.map +1 -0
  78. package/cjs/public-api.d.ts +1 -0
  79. package/cjs/public-api.d.ts.map +1 -1
  80. package/cjs/public-api.js +1 -0
  81. package/cjs/public-api.js.map +1 -1
  82. package/{fesm2020 → fesm2022}/ironcode-vas-lib.mjs +685 -8
  83. package/fesm2022/ironcode-vas-lib.mjs.map +1 -0
  84. package/lib/elastic/index.d.ts +1 -0
  85. package/lib/elastic/job.elastic-doc.d.ts +13 -0
  86. package/lib/entity/index.d.ts +3 -0
  87. package/lib/entity/vas-base.model.d.ts +4 -2
  88. package/lib/entity/vas-contact.model.d.ts +1 -0
  89. package/lib/entity/vas-fire-user.model.d.ts +1 -1
  90. package/lib/entity/vas-form-config.model.d.ts +3 -13
  91. package/lib/entity/vas-form.model.d.ts +4 -0
  92. package/lib/entity/vas-lookup.model.d.ts +33 -0
  93. package/lib/entity/vas-task.dto.d.ts +9 -0
  94. package/lib/entity/vas-task.model.d.ts +35 -0
  95. package/lib/entity/vas-user.model.d.ts +2 -2
  96. package/lib/entity/vas-vehicle.model.d.ts +1 -0
  97. package/lib/utils/is-array-string.d.ts +1 -1
  98. package/lib/utils/only.d.ts +7 -0
  99. package/package.json +4 -11
  100. package/public-api.d.ts +1 -0
  101. package/cjs/package.json +0 -66
  102. package/esm2020/ironcode-vas-lib.mjs +0 -5
  103. package/esm2020/lib/control-value/index.mjs +0 -3
  104. package/esm2020/lib/control-value/vas-camera-control-value.model.mjs +0 -8
  105. package/esm2020/lib/control-value/vas-function-control-value.dto.mjs +0 -2
  106. package/esm2020/lib/controls-config/index.mjs +0 -5
  107. package/esm2020/lib/controls-config/vas-control-config-direction.enum.mjs +0 -8
  108. package/esm2020/lib/controls-config/vas-control-config.model.mjs +0 -2
  109. package/esm2020/lib/controls-config/vas-function-control-config.dto.mjs +0 -2
  110. package/esm2020/lib/controls-config/vas-select-control-config.model.mjs +0 -2
  111. package/esm2020/lib/entity/index.mjs +0 -65
  112. package/esm2020/lib/entity/vas-access-group.dto.mjs +0 -2
  113. package/esm2020/lib/entity/vas-account-config.dto.mjs +0 -2
  114. package/esm2020/lib/entity/vas-account-object.dto.mjs +0 -2
  115. package/esm2020/lib/entity/vas-account-object.model.mjs +0 -24
  116. package/esm2020/lib/entity/vas-account.dto.mjs +0 -7
  117. package/esm2020/lib/entity/vas-base.dto.mjs +0 -2
  118. package/esm2020/lib/entity/vas-base.model.mjs +0 -34
  119. package/esm2020/lib/entity/vas-branch.dto.mjs +0 -2
  120. package/esm2020/lib/entity/vas-branch.model.mjs +0 -68
  121. package/esm2020/lib/entity/vas-contact-type.dto.mjs +0 -2
  122. package/esm2020/lib/entity/vas-contact.dto.mjs +0 -2
  123. package/esm2020/lib/entity/vas-contact.model.mjs +0 -84
  124. package/esm2020/lib/entity/vas-control-type.dto.mjs +0 -2
  125. package/esm2020/lib/entity/vas-control-type.model.mjs +0 -52
  126. package/esm2020/lib/entity/vas-control.dto.mjs +0 -2
  127. package/esm2020/lib/entity/vas-control.model.mjs +0 -171
  128. package/esm2020/lib/entity/vas-field.dto.mjs +0 -2
  129. package/esm2020/lib/entity/vas-field.model.mjs +0 -97
  130. package/esm2020/lib/entity/vas-file.dto.mjs +0 -9
  131. package/esm2020/lib/entity/vas-file.model.mjs +0 -125
  132. package/esm2020/lib/entity/vas-fire-user.dto.mjs +0 -2
  133. package/esm2020/lib/entity/vas-fire-user.model.mjs +0 -102
  134. package/esm2020/lib/entity/vas-form-config.dto.mjs +0 -2
  135. package/esm2020/lib/entity/vas-form-config.model.mjs +0 -31
  136. package/esm2020/lib/entity/vas-form.dto.mjs +0 -2
  137. package/esm2020/lib/entity/vas-form.model.mjs +0 -194
  138. package/esm2020/lib/entity/vas-group.dto.mjs +0 -2
  139. package/esm2020/lib/entity/vas-group.model.mjs +0 -97
  140. package/esm2020/lib/entity/vas-instruction-job-field.dto.mjs +0 -2
  141. package/esm2020/lib/entity/vas-instruction-job-field.model.mjs +0 -48
  142. package/esm2020/lib/entity/vas-instruction-job.dto.mjs +0 -2
  143. package/esm2020/lib/entity/vas-instruction-job.model.mjs +0 -81
  144. package/esm2020/lib/entity/vas-instruction-provider.dto.mjs +0 -2
  145. package/esm2020/lib/entity/vas-instruction-provider.model.mjs +0 -66
  146. package/esm2020/lib/entity/vas-instruction.dto.mjs +0 -2
  147. package/esm2020/lib/entity/vas-instruction.model.mjs +0 -52
  148. package/esm2020/lib/entity/vas-invitation.mjs +0 -88
  149. package/esm2020/lib/entity/vas-job-data.dto.mjs +0 -2
  150. package/esm2020/lib/entity/vas-job-data.model.mjs +0 -21
  151. package/esm2020/lib/entity/vas-job-email.dto.mjs +0 -2
  152. package/esm2020/lib/entity/vas-job-email.model.mjs +0 -79
  153. package/esm2020/lib/entity/vas-job-status.dto.mjs +0 -2
  154. package/esm2020/lib/entity/vas-job-type.dto.mjs +0 -2
  155. package/esm2020/lib/entity/vas-job.dto.mjs +0 -2
  156. package/esm2020/lib/entity/vas-job.model.mjs +0 -497
  157. package/esm2020/lib/entity/vas-lookup-type.dto.mjs +0 -2
  158. package/esm2020/lib/entity/vas-lookup.dto.mjs +0 -2
  159. package/esm2020/lib/entity/vas-membership.dto.mjs +0 -2
  160. package/esm2020/lib/entity/vas-membership.model.mjs +0 -62
  161. package/esm2020/lib/entity/vas-note.dto.mjs +0 -2
  162. package/esm2020/lib/entity/vas-note.model.mjs +0 -59
  163. package/esm2020/lib/entity/vas-report-layout.dto.mjs +0 -2
  164. package/esm2020/lib/entity/vas-report-layout.model.mjs +0 -22
  165. package/esm2020/lib/entity/vas-report-request.dto.mjs +0 -2
  166. package/esm2020/lib/entity/vas-report-request.model.mjs +0 -44
  167. package/esm2020/lib/entity/vas-report.dto.mjs +0 -2
  168. package/esm2020/lib/entity/vas-report.model.mjs +0 -57
  169. package/esm2020/lib/entity/vas-restricted-account-object.dto.mjs +0 -2
  170. package/esm2020/lib/entity/vas-restricted-account-object.model.mjs +0 -24
  171. package/esm2020/lib/entity/vas-task-type.dto.mjs +0 -2
  172. package/esm2020/lib/entity/vas-user.dto.mjs +0 -2
  173. package/esm2020/lib/entity/vas-user.model.mjs +0 -42
  174. package/esm2020/lib/entity/vas-vehicle.dto.mjs +0 -2
  175. package/esm2020/lib/entity/vas-vehicle.model.mjs +0 -57
  176. package/esm2020/lib/model/geo-location.mjs +0 -12
  177. package/esm2020/lib/model/index.mjs +0 -3
  178. package/esm2020/lib/model/vas-time-range.model.mjs +0 -2
  179. package/esm2020/lib/utils/get-value-by-path.mjs +0 -64
  180. package/esm2020/lib/utils/is-array-string.mjs +0 -4
  181. package/esm2020/public-api.mjs +0 -5
  182. package/fesm2015/ironcode-vas-lib.mjs +0 -2360
  183. package/fesm2015/ironcode-vas-lib.mjs.map +0 -1
  184. package/fesm2020/ironcode-vas-lib.mjs.map +0 -1
@@ -1,497 +0,0 @@
1
- import { isFileDto } from './vas-file.dto';
2
- import { UUID } from 'angular2-uuid';
3
- import moment from 'moment';
4
- import { getValueByPath } from '../utils/get-value-by-path';
5
- import { VasFieldModel } from './vas-field.model';
6
- import { VasRestrictedAccountObjectModel } from './vas-restricted-account-object.model';
7
- import { getEmptyGeoLocation } from '../model/geo-location';
8
- import { isCameraControlValueV1 } from '../control-value/vas-camera-control-value.model';
9
- import { isArrayString } from '../utils/is-array-string';
10
- /**
11
- * JobModel
12
- */
13
- export class VasJobModel extends VasRestrictedAccountObjectModel {
14
- constructor(id, created, serverCreated, createdBy, modified, serverModified, modifiedBy, createdByName, modifiedByName, account, accessGroup, reference, jobDate, jobStatus, jobType, assigneeId, formId, timeZoneOffset, pendingFields, childModified, version, fields, files, createdByDisplayName, modifiedByDisplayName, geoLocation) {
15
- super(id, created, serverCreated, createdBy, modified, serverModified, modifiedBy, createdByName, modifiedByName, account, accessGroup);
16
- this.id = id;
17
- this.created = created;
18
- this.serverCreated = serverCreated;
19
- this.createdBy = createdBy;
20
- this.modified = modified;
21
- this.serverModified = serverModified;
22
- this.modifiedBy = modifiedBy;
23
- this.createdByName = createdByName;
24
- this.modifiedByName = modifiedByName;
25
- this.account = account;
26
- this.accessGroup = accessGroup;
27
- this.reference = reference;
28
- this.jobDate = jobDate;
29
- this.jobStatus = jobStatus;
30
- this.jobType = jobType;
31
- this.assigneeId = assigneeId;
32
- this.formId = formId;
33
- this.timeZoneOffset = timeZoneOffset;
34
- this.pendingFields = pendingFields;
35
- this.childModified = childModified;
36
- this.version = version;
37
- this.fields = fields;
38
- this.files = files;
39
- this.createdByDisplayName = createdByDisplayName;
40
- this.modifiedByDisplayName = modifiedByDisplayName;
41
- this.geoLocation = geoLocation;
42
- }
43
- /**
44
- * Returns this with the dynamic interface
45
- * @return {VasJobModelDynamicInterface}
46
- */
47
- get $this() {
48
- return this;
49
- }
50
- /**
51
- * Returns a list of Job dynamic properties i.e. those that are added by the
52
- * dynamic forms
53
- */
54
- get dynamicProperties() {
55
- const nativeProps = this.staticProperties;
56
- return Object
57
- .getOwnPropertyNames(this)
58
- .filter(prop => !nativeProps.includes(prop));
59
- }
60
- /**
61
- * Returns the list of properties of the Job type
62
- */
63
- get staticProperties() {
64
- return Object.getOwnPropertyNames(VasJobModel.empty());
65
- }
66
- /**
67
- * @return {VasJobModel}
68
- */
69
- static empty() {
70
- return new VasJobModel('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', moment().utcOffset(), 0, '', 0, [], [], '', '', getEmptyGeoLocation());
71
- }
72
- static fromDto(dto) {
73
- const model = new VasJobModel(dto.id || '', dto.created || '', dto.serverCreated || '', dto.createdBy || '', dto.modified || '', dto.serverModified || '', dto.modifiedBy || '', dto.createdByName || '', dto.modifiedByName || '', dto.account || '', dto.accessGroup || '', dto.reference || '', dto.jobDate || '', dto.jobStatus || '', dto.jobType || '', dto.assigneeId || '', dto.formId || '', dto.timeZoneOffset || moment().utcOffset(), dto.pendingFields || 0, dto.childModified || '', dto.version || 0, dto.fields || [], dto.files || [], dto.createdByDisplayName || '', dto.modifiedByDisplayName || '', dto.geoLocation || getEmptyGeoLocation());
74
- const emptyKeys = model.staticProperties;
75
- Object
76
- .keys(dto)
77
- .filter(key => emptyKeys.indexOf(key) === -1)
78
- .forEach((key) => model.$this[key] = dto[key]);
79
- return model;
80
- }
81
- /**
82
- * This method will instantiate a new JobModel. The difference with this
83
- * method of instantiation is that we are coming from a relation frame i.e.
84
- * the job has a list of {@link VasFieldDto} instead of a Job document.
85
- *
86
- */
87
- static fromRelational(dto, form) {
88
- const model = new VasJobModel(dto.id || '', dto.created || '', dto.serverCreated || '', dto.createdBy || '', dto.modified || '', dto.serverModified || '', dto.modifiedBy || '', dto.createdByName || '', dto.modifiedByName || '', dto.account || '', dto.accessGroup || '', dto.reference || '', dto.jobDate || '', dto.jobStatus || '', dto.jobType || '', dto.assigneeId || '', dto.formId || '', dto.timeZoneOffset || moment().utcOffset(), dto.pendingFields || 0, dto.childModified || '', dto.version || 0, dto.fields || [], dto.files || [], dto.createdByDisplayName || '', dto.modifiedByDisplayName || '', dto.geoLocation || getEmptyGeoLocation());
89
- form.groups
90
- .forEach(group => {
91
- group.controls
92
- .forEach(control => {
93
- const field = dto.fields?.find(f => f.control === control.id);
94
- if (!field) {
95
- return;
96
- }
97
- model.getGroup(group.name)[control.name] = field.value;
98
- });
99
- });
100
- return model;
101
- }
102
- /**
103
- * @param {VasFormModel} formModel
104
- * @return {Record<string, VasFieldDtoValue>}
105
- */
106
- getFields(formModel) {
107
- const fields = {};
108
- formModel.groups
109
- .forEach(group => {
110
- group.controls.forEach(control => {
111
- (fields)[control.reportTemplateName] =
112
- this.getValueByPath([group.name, control.name]) || null;
113
- });
114
- });
115
- return fields;
116
- }
117
- /**
118
- * Will return an object whose keys are the names of all fields in the job.
119
- * This method is similar to `getFields` except that this method will only
120
- * return values where a value was set, as opposed to `getFields` which will
121
- * return a value for every control even if not value was set, because it uses
122
- * the form to drive the logic. Note also this method will return values for
123
- * any Fields in the fields array.
124
- * @return {Record<string, VasFieldDtoValue>}
125
- */
126
- getFields2() {
127
- let fields = {};
128
- this.dynamicProperties
129
- .forEach((groupName) => {
130
- Object
131
- .keys(this.$this[groupName])
132
- .forEach(controlName => {
133
- fields[controlName] =
134
- this.getValueByPath([groupName, controlName]) || null;
135
- });
136
- }, {});
137
- this.fields.forEach(field => fields[field.controlName] = field.value);
138
- return fields;
139
- }
140
- /**
141
- * Returns an object describing how many attachments were added to this job
142
- * (camera controls and files), and how many have not been uploaded yet.
143
- *
144
- * @param formModel instance of {@link VasFormModel} that was used when the
145
- * job was created
146
- */
147
- getFilesUploadStatus(formModel) {
148
- const pathsWithValue = formModel
149
- .getCameraControlPaths()
150
- .map(path => {
151
- const value = this.getValueByPath(path);
152
- if (value && !!value.id) {
153
- return path;
154
- }
155
- return null;
156
- })
157
- .filter(path => path !== null ? path : null)
158
- .filter(isArrayString);
159
- let total = pathsWithValue.length;
160
- total += this.files.length;
161
- // calculate the number of camera images still to upload
162
- let pending = pathsWithValue
163
- .map(path => this.getValueByPath(path))
164
- .map((value) => {
165
- if (isFileDto(value)) {
166
- return value.id && value.status !== 'COMPLETE';
167
- }
168
- else if (isCameraControlValueV1(value)) {
169
- // if url is not set, it hasn't been uploaded
170
- return value.id && !value.url;
171
- }
172
- return false;
173
- })
174
- .filter(hasUploaded => hasUploaded)
175
- .length;
176
- // add total from files that are pending
177
- pending += this.files
178
- .filter(value => value.status !== 'COMPLETE')
179
- .length;
180
- return {
181
- pending,
182
- total
183
- };
184
- }
185
- /**
186
- * This method will return the dynamic property from the JobModel that
187
- * represent a group (from a form).
188
- *
189
- * @param name the name of the group
190
- * @param init if true (default) and group is not found, initialise an empty
191
- * group, otherwise throw an error
192
- */
193
- getGroup(name, init = true) {
194
- let prop;
195
- if (this.staticProperties.includes(name)) {
196
- throw Error(`invalid group name ${name}, not a dynamic property`);
197
- }
198
- else if (this.$this[name] === undefined) {
199
- if (init) {
200
- prop = this.$this[name] = {};
201
- }
202
- else {
203
- throw Error(`invalid group name ${name}, not found`);
204
- }
205
- }
206
- else {
207
- prop = this.$this[name];
208
- if (typeof prop !== 'object') {
209
- throw Error(`invalid group name ${name}, not an object`);
210
- }
211
- }
212
- return prop;
213
- }
214
- /**
215
- * @param path path segments
216
- */
217
- getValueByPath(path = []) {
218
- return getValueByPath(path, this.$this);
219
- }
220
- /**
221
- * In order to understand why we need this method it is important to
222
- * understand that within the system, Jobs can be represented in one of two
223
- * ways, document and relational.
224
- *
225
- * The important distinction is how values submitted by a form are stored.
226
- *
227
- * Jobs stored as documents (JSON objects) will store user values, as dynamic
228
- * properties of the document.
229
- *
230
- * Whereas, Jobs stored as relational, will store user values in an array of
231
- * {@link VasFieldDto} objects.
232
- *
233
- * Depending on where we are in the system, either one of these approaches can
234
- * be more useful than the other.
235
- *
236
- * This method, assumes that the JobModel has been instantiated from a
237
- * document representation, and serves to hydrate the fields array. In order
238
- * to achieve this, knowledge of the {@link VasFormDto} that created the job
239
- * is required.
240
- *
241
- *
242
- * Job in document representation
243
- * {
244
- * id: <guid>,
245
- * reference: "something"
246
- * <other static job properties>...
247
- * foo: {
248
- * bar: "value"
249
- * }
250
- * }
251
- *
252
- * Job in relational representation
253
- * {
254
- * id: <guid>,
255
- * reference: "something"
256
- * <other static job properties>...
257
- * <will not have dynamic properties>...
258
- * fields: [
259
- * {
260
- * id: <guid>,
261
- * <other field properties>,
262
- * value: "value"
263
- * }
264
- * ]
265
- * }
266
- *
267
- *
268
- * @param formModel the VasFormModel that was used to create the job
269
- * @param controlFieldIdMap This is used to determine the id each field.
270
- * Either one will be found in the map, or a new one is generated.
271
- * @param controlNames if a value is provided, it will be used
272
- * to filter the fields that are returned.
273
- * @return {Array<VasFieldDto>}
274
- */
275
- hydrateFields(formModel, controlFieldIdMap = new Map(), controlNames) {
276
- const fields = [];
277
- formModel.groups
278
- .forEach(group => {
279
- group.controls.forEach(control => {
280
- if (!control.name.startsWith('fields.')) {
281
- return;
282
- }
283
- if (controlNames && !controlNames.includes(control.name)) {
284
- return;
285
- }
286
- fields.push(VasFieldModel.fromDto({
287
- // if the controlId exists in the map, use the associated fieldId,
288
- // otherwise generate a new id for the field.
289
- id: controlFieldIdMap.get(control.id) || UUID.UUID(),
290
- account: this.account,
291
- job: this.id,
292
- createdBy: this.createdBy,
293
- created: this.created,
294
- modifiedBy: this.modifiedBy,
295
- modified: this.modified,
296
- control: control.id,
297
- value: this.getValueByPath([group.name, control.name])
298
- }));
299
- });
300
- });
301
- this.fields = fields;
302
- }
303
- /**
304
- * A very non sophisticated way to set values in the job via paths
305
- *
306
- * For example:
307
- *
308
- * setValueByPath('value', ['foo', 'bar']);
309
- *
310
- * will make results in job
311
- * {
312
- * foo: {
313
- * bar: 'value'
314
- * }
315
- * }
316
- *
317
- * @param value the value to set
318
- * @param path path segments
319
- */
320
- setValueByPath(value, path = []) {
321
- switch (path.length) {
322
- case 0: {
323
- return;
324
- }
325
- case 1: {
326
- this[path[0]] = value;
327
- return;
328
- }
329
- case 2: {
330
- // eslint-disable-next-line max-len
331
- this.$this[path[0]][path[1]] = value;
332
- return;
333
- }
334
- case 3: {
335
- // eslint-disable-next-line max-len
336
- this.$this[path[0]][path[1]][path[2]] = value;
337
- return;
338
- }
339
- default: {
340
- throw Error('path has too many segments');
341
- }
342
- }
343
- }
344
- /**
345
- * @param staticOnly if true, will only output values for the static
346
- * properties in the dto
347
- */
348
- toDto(staticOnly = false) {
349
- if (staticOnly) {
350
- return {
351
- id: this.id,
352
- created: this.created,
353
- createdBy: this.createdBy,
354
- modified: this.modified,
355
- modifiedBy: this.modifiedBy,
356
- serverCreated: this.serverCreated,
357
- serverModified: this.serverModified,
358
- createdByName: this.createdByName,
359
- modifiedByName: this.modifiedByName,
360
- account: this.account,
361
- accessGroup: this.accessGroup,
362
- reference: this.reference,
363
- jobDate: this.jobDate,
364
- jobStatus: this.jobStatus,
365
- jobType: this.jobType,
366
- assigneeId: this.assigneeId,
367
- formId: this.formId,
368
- timeZoneOffset: this.timeZoneOffset,
369
- pendingFields: this.pendingFields,
370
- childModified: this.childModified,
371
- version: this.version,
372
- fields: this.fields,
373
- files: this.files,
374
- createdByDisplayName: this.createdByDisplayName,
375
- modifiedByDisplayName: this.modifiedByDisplayName,
376
- geoLocation: this.geoLocation
377
- };
378
- }
379
- const dto = {};
380
- [...this.staticProperties, ...this.dynamicProperties]
381
- .forEach(prop => dto[prop] = this.$this[prop]);
382
- return dto;
383
- }
384
- /**
385
- * This method will parse a syntax that allows us to build strings from the
386
- * values of from the job model. For example if the job model was:
387
- *
388
- * {
389
- * foo: 'bar'
390
- * }
391
- *
392
- * and we pass "i am foo {foo}", the result would be:
393
- *
394
- * "i am foo bar"
395
- *
396
- * we can also use moment to parse dates, for example if the job model was:
397
- *
398
- * {
399
- * created: "2022-01-01T00:00:00+0000"
400
- * }
401
- *
402
- * and we pass "{created|date:YY-MM-DD}", the result would be:
403
- *
404
- * "2022-01-01"
405
- *
406
- * @param {string} value a string with the syntax
407
- * @param {ParseSyntaxOptions} options
408
- * @return the results of parsing the syntax on this job
409
- */
410
- parseSyntax(value, options = {
411
- timeZoneOffset: 0
412
- }) {
413
- if (!value || typeof value !== 'string') {
414
- return '';
415
- }
416
- return value.replace(/({[^}]*})/g, (match, token) => {
417
- const syntax = token.substring(1, token.length - 1);
418
- let [key, filter] = syntax.split('|');
419
- key = (key || '').trim();
420
- filter = (filter || '').trim();
421
- let filterName, filterArg = '';
422
- if (filter) {
423
- const splitIndex = filter.indexOf(':');
424
- if (splitIndex !== -1) {
425
- filterName = filter.substring(0, splitIndex);
426
- filterArg = filter.substring(splitIndex + 1);
427
- }
428
- else {
429
- filterName = filter;
430
- filterArg = '';
431
- }
432
- filterName = (filterName || '').trim();
433
- filterArg = (filterArg || '').trim();
434
- }
435
- const path = key.split('.');
436
- const objectKey = path.shift() || '';
437
- let result = '';
438
- if (objectKey === 'job') {
439
- result = (this.getValueByPath(path) || '').toString();
440
- }
441
- else if (objectKey === 'fields') {
442
- result = (getValueByPath(['fields.' + path.shift(), ...path], this.getFields2()) || '').toString();
443
- }
444
- else if (objectKey.length) {
445
- if (options.objects) {
446
- if (options.objects[objectKey] === undefined) {
447
- console.debug(`objectKey ${objectKey} is not present in options.object`);
448
- result = '';
449
- }
450
- else {
451
- result = (getValueByPath(path, options.objects[objectKey]) || '')
452
- .toString();
453
- }
454
- }
455
- else {
456
- console.debug(`objectKey ${objectKey} was used but options.object is not set`);
457
- return '';
458
- }
459
- }
460
- else {
461
- return '';
462
- }
463
- if (filterName && result) {
464
- switch (filterName) {
465
- case 'date': {
466
- return moment(result)
467
- .utcOffset(options.timeZoneOffset)
468
- .format(filterArg || '');
469
- }
470
- default: {
471
- console.warn('unknown filter %s', filterName);
472
- }
473
- }
474
- }
475
- return result;
476
- }).trim();
477
- }
478
- ;
479
- /**
480
- * @return {object}
481
- */
482
- toApiDto() {
483
- return {
484
- ...super.toApiDto(),
485
- reference: this.reference || '~',
486
- jobDate: this.jobDate || '~',
487
- jobType: this.jobType || '~',
488
- accessGroup: this.accessGroup || '~',
489
- jobStatus: this.jobStatus || '~',
490
- assigneeId: this.assigneeId || '~',
491
- timeZoneOffset: this.timeZoneOffset || 0,
492
- pendingFields: this.pendingFields || 0,
493
- lastForm: this.formId || '~'
494
- };
495
- }
496
- }
497
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWpvYi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Zhcy1saWIvc3JjL2xpYi9lbnRpdHkvdmFzLWpvYi5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdsRCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQWUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsc0JBQXNCLEVBQThCLE1BQU0saURBQWlELENBQUM7QUFDckgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBcUJ6RDs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsK0JBQStCO0lBRTlELFlBQ2tCLEVBQVUsRUFDVixPQUFlLEVBQ2YsYUFBcUIsRUFDckIsU0FBaUIsRUFDakIsUUFBZ0IsRUFDaEIsY0FBc0IsRUFDdEIsVUFBa0IsRUFDbEIsYUFBcUIsRUFDckIsY0FBc0IsRUFDdEIsT0FBZSxFQUNmLFdBQW1CLEVBQzVCLFNBQWlCLEVBQ2pCLE9BQWUsRUFDZixTQUFpQixFQUNqQixPQUFlLEVBQ2YsVUFBa0IsRUFDbEIsTUFBYyxFQUNkLGNBQXNCLEVBQ3RCLGFBQXFCLEVBQ3JCLGFBQXFCLEVBQ3JCLE9BQWUsRUFDZixNQUEwQixFQUMxQixLQUF3QixFQUN4QixvQkFBNEIsRUFDNUIscUJBQTZCLEVBQzdCLFdBQXdCO1FBRS9CLEtBQUssQ0FD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YyxDQUFDOzZCQUNqQyxNQUFNLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDO3FCQUM1QjtvQkFDRCxPQUFPLENBQUMsQ0FBQzt3QkFDUCxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxDQUFDO3FCQUMvQztpQkFDRjthQUNGO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDWixDQUFDO0lBQUEsQ0FBQztJQUVGOztPQUVHO0lBQ00sUUFBUTtRQUNmLE9BQU87WUFDTCxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLElBQUksR0FBRztZQUNoQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxHQUFHO1lBQzVCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLEdBQUc7WUFDNUIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksR0FBRztZQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHO1lBQ2hDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLEdBQUc7WUFDbEMsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQztZQUN4QyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDO1lBQ3RDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLEdBQUc7U0FDN0IsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRmlsZUR0bywgVmFzRmlsZUR0byB9IGZyb20gJy4vdmFzLWZpbGUuZHRvJztcbmltcG9ydCB7IFVVSUQgfSBmcm9tICdhbmd1bGFyMi11dWlkJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IGdldFZhbHVlQnlQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZ2V0LXZhbHVlLWJ5LXBhdGgnO1xuaW1wb3J0IHsgVmFzQmFzZUR0byB9IGZyb20gJy4vdmFzLWJhc2UuZHRvJztcbmltcG9ydCB7IFZhc0ZpZWxkRHRvLCBWYXNGaWVsZER0b1ZhbHVlIH0gZnJvbSAnLi92YXMtZmllbGQuZHRvJztcbmltcG9ydCB7IFZhc0ZpZWxkTW9kZWwgfSBmcm9tICcuL3Zhcy1maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBWYXNGb3JtTW9kZWwgfSBmcm9tICcuL3Zhcy1mb3JtLm1vZGVsJztcbmltcG9ydCB7IFZhc0pvYkR0byB9IGZyb20gJy4vdmFzLWpvYi5kdG8nO1xuaW1wb3J0IHsgVmFzUmVzdHJpY3RlZEFjY291bnRPYmplY3RNb2RlbCB9IGZyb20gJy4vdmFzLXJlc3RyaWN0ZWQtYWNjb3VudC1vYmplY3QubW9kZWwnO1xuaW1wb3J0IHsgR2VvTG9jYXRpb24sIGdldEVtcHR5R2VvTG9jYXRpb24gfSBmcm9tICcuLi9tb2RlbC9nZW8tbG9jYXRpb24nO1xuaW1wb3J0IHsgaXNDYW1lcmFDb250cm9sVmFsdWVWMSwgVmFzQ2FtZXJhQ29udHJvbFZhbHVlTW9kZWwgfSBmcm9tICcuLi9jb250cm9sLXZhbHVlL3Zhcy1jYW1lcmEtY29udHJvbC12YWx1ZS5tb2RlbCc7XG5pbXBvcnQgeyBpc0FycmF5U3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvaXMtYXJyYXktc3RyaW5nJztcbmltcG9ydCB7IFZhc0Zvcm1EdG8gfSBmcm9tICcuL3Zhcy1mb3JtLmR0byc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBWYXNKb2JNb2RlbER5bmFtaWNJbnRlcmZhY2Uge1xuICBbczogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgUmVjb3JkPHN0cmluZywgVmFzRmllbGREdG9WYWx1ZT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VTeW50YXhPcHRpb25zIHtcbiAgLy8gVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gYWRqdXN0IGFueSBkYXRldGltZSB2YWx1ZXMgdGhhdCBhcmUgcmVmZXJlbmNlZFxuICAvLyBpbiB0aGUgc3ludGF4IHN0cmluZy4gU2VlXG4gIC8vIGh0dHBzOi8vbW9tZW50anNjb20ucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L21vbWVudC8wMy1tYW5pcHVsYXRpbmcvMDktdXRjLW9mZnNldC9cbiAgLy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IGBtb21lbnRgIHdpbGwgaGFuZGxlIHRoZSB2YWx1ZS5cbiAgdGltZVpvbmVPZmZzZXQ6IG51bWJlcixcbiAgLy8gdGhpcyBkaWN0aW9uYXJ5IGNhbiBiZSBwYXNzZWQgaW4gdG8gY29udGFpbiBvdGhlciBvYmplY3RzIHRvIGJlIHJlZmVyZW5jZWRcbiAgLy8gaW4gdGhlIHN5bnRheC4gRm9yIGV4YW1wbGUgaWYgd2UgaGF2ZSB7am9iLmZvb30gdGhpcyB3aWxsIHJlZmVyZW5jZSB0aGVcbiAgLy8gam9iJ3MgYGZvb2AgcHJvcGVydHksIGhvd2V2ZXIgaWYgd2UgaGF2ZSBcInJlcG9ydExheW91dC50aXRsZVwiIHRoaXMgd2lsbFxuICAvLyBleHBlY3QgdG8gZmluZCBhIHByb3BlcnR5IG9mIGBvYmplY3RzYCBjYWxsZWQgYHJlcG9ydExheW91dGAgd2hpY2ggd2lsbFxuICAvLyBoYXZlIGEgcHJvcGVydHkgY2FsbGVkIGB0aXRsZWBcbiAgb2JqZWN0cz86IFJlY29yZDxzdHJpbmcsIFBhcnRpYWw8VmFzQmFzZUR0bz4gfCBSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPj47XG59XG5cbi8qKlxuICogSm9iTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFZhc0pvYk1vZGVsIGV4dGVuZHMgVmFzUmVzdHJpY3RlZEFjY291bnRPYmplY3RNb2RlbCB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG92ZXJyaWRlIGlkOiBzdHJpbmcsXG4gICAgcHVibGljIG92ZXJyaWRlIGNyZWF0ZWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VydmVyQ3JlYXRlZDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBjcmVhdGVkQnk6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgbW9kaWZpZWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VydmVyTW9kaWZpZWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgbW9kaWZpZWRCeTogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBjcmVhdGVkQnlOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIG92ZXJyaWRlIG1vZGlmaWVkQnlOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIG92ZXJyaWRlIGFjY291bnQ6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgYWNjZXNzR3JvdXA6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgcHVibGljIGpvYkRhdGU6IHN0cmluZyxcbiAgICBwdWJsaWMgam9iU3RhdHVzOiBzdHJpbmcsXG4gICAgcHVibGljIGpvYlR5cGU6IHN0cmluZyxcbiAgICBwdWJsaWMgYXNzaWduZWVJZDogc3RyaW5nLFxuICAgIHB1YmxpYyBmb3JtSWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgdGltZVpvbmVPZmZzZXQ6IG51bWJlcixcbiAgICBwdWJsaWMgcGVuZGluZ0ZpZWxkczogbnVtYmVyLFxuICAgIHB1YmxpYyBjaGlsZE1vZGlmaWVkOiBzdHJpbmcsXG4gICAgcHVibGljIHZlcnNpb246IG51bWJlcixcbiAgICBwdWJsaWMgZmllbGRzOiBBcnJheTxWYXNGaWVsZER0bz4sXG4gICAgcHVibGljIGZpbGVzOiBBcnJheTxWYXNGaWxlRHRvPixcbiAgICBwdWJsaWMgY3JlYXRlZEJ5RGlzcGxheU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgbW9kaWZpZWRCeURpc3BsYXlOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIGdlb0xvY2F0aW9uOiBHZW9Mb2NhdGlvblxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGlkLFxuICAgICAgY3JlYXRlZCxcbiAgICAgIHNlcnZlckNyZWF0ZWQsXG4gICAgICBjcmVhdGVkQnksXG4gICAgICBtb2RpZmllZCxcbiAgICAgIHNlcnZlck1vZGlmaWVkLFxuICAgICAgbW9kaWZpZWRCeSxcbiAgICAgIGNyZWF0ZWRCeU5hbWUsXG4gICAgICBtb2RpZmllZEJ5TmFtZSxcbiAgICAgIGFjY291bnQsXG4gICAgICBhY2Nlc3NHcm91cFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGlzIHdpdGggdGhlIGR5bmFtaWMgaW50ZXJmYWNlXG4gICAqIEByZXR1cm4ge1Zhc0pvYk1vZGVsRHluYW1pY0ludGVyZmFjZX1cbiAgICovXG4gIGdldCAkdGhpcygpOiBWYXNKb2JNb2RlbER5bmFtaWNJbnRlcmZhY2Uge1xuICAgIHJldHVybiB0aGlzIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBKb2IgZHluYW1pYyBwcm9wZXJ0aWVzIGkuZS4gdGhvc2UgdGhhdCBhcmUgYWRkZWQgYnkgdGhlXG4gICAqIGR5bmFtaWMgZm9ybXNcbiAgICovXG4gIGdldCBkeW5hbWljUHJvcGVydGllcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCBuYXRpdmVQcm9wcyA9IHRoaXMuc3RhdGljUHJvcGVydGllcztcbiAgICByZXR1cm4gT2JqZWN0XG4gICAgICAuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKVxuICAgICAgLmZpbHRlcihwcm9wID0+ICFuYXRpdmVQcm9wcy5pbmNsdWRlcyhwcm9wKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIG9mIHRoZSBKb2IgdHlwZVxuICAgKi9cbiAgZ2V0IHN0YXRpY1Byb3BlcnRpZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFZhc0pvYk1vZGVsLmVtcHR5KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge1Zhc0pvYk1vZGVsfVxuICAgKi9cbiAgc3RhdGljIGVtcHR5KCk6IFZhc0pvYk1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFZhc0pvYk1vZGVsKFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgIG1vbWVudCgpLnV0Y09mZnNldCgpLFxuICAgICAgMCxcbiAgICAgICcnLFxuICAgICAgMCxcbiAgICAgIFtdLFxuICAgICAgW10sXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgZ2V0RW1wdHlHZW9Mb2NhdGlvbigpXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBmcm9tRHRvKGR0bzogUGFydGlhbDxWYXNKb2JEdG8+KTogVmFzSm9iTW9kZWwge1xuICAgIGNvbnN0IG1vZGVsID0gbmV3IFZhc0pvYk1vZGVsKFxuICAgICAgZHRvLmlkIHx8ICcnLFxuICAgICAgZHRvLmNyZWF0ZWQgfHwgJycsXG4gICAgICBkdG8uc2VydmVyQ3JlYXRlZCB8fCAnJyxcbiAgICAgIGR0by5jcmVhdGVkQnkgfHwgJycsXG4gICAgICBkdG8ubW9kaWZpZWQgfHwgJycsXG4gICAgICBkdG8uc2VydmVyTW9kaWZpZWQgfHwgJycsXG4gICAgICBkdG8ubW9kaWZpZWRCeSB8fCAnJyxcbiAgICAgIGR0by5jcmVhdGVkQnlOYW1lIHx8ICcnLFxuICAgICAgZHRvLm1vZGlmaWVkQnlOYW1lIHx8ICcnLFxuICAgICAgZHRvLmFjY291bnQgfHwgJycsXG4gICAgICBkdG8uYWNjZXNzR3JvdXAgfHwgJycsXG4gICAgICBkdG8ucmVmZXJlbmNlIHx8ICcnLFxuICAgICAgZHRvLmpvYkRhdGUgfHwgJycsXG4gICAgICBkdG8uam9iU3RhdHVzIHx8ICcnLFxuICAgICAgZHRvLmpvYlR5cGUgfHwgJycsXG4gICAgICBkdG8uYXNzaWduZWVJZCB8fCAnJyxcbiAgICAgIGR0by5mb3JtSWQgfHwgJycsXG4gICAgICBkdG8udGltZVpvbmVPZmZzZXQgfHwgbW9tZW50KCkudXRjT2Zmc2V0KCksXG4gICAgICBkdG8ucGVuZGluZ0ZpZWxkcyB8fCAwLFxuICAgICAgZHRvLmNoaWxkTW9kaWZpZWQgfHwgJycsXG4gICAgICBkdG8udmVyc2lvbiB8fCAwLFxuICAgICAgZHRvLmZpZWxkcyB8fCBbXSxcbiAgICAgIGR0by5maWxlcyB8fCBbXSxcbiAgICAgIGR0by5jcmVhdGVkQnlEaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZEJ5RGlzcGxheU5hbWUgfHwgJycsXG4gICAgICBkdG8uZ2VvTG9jYXRpb24gfHwgZ2V0RW1wdHlHZW9Mb2NhdGlvbigpXG4gICAgKTtcbiAgICBjb25zdCBlbXB0eUtleXMgPSBtb2RlbC5zdGF0aWNQcm9wZXJ0aWVzO1xuICAgIE9iamVjdFxuICAgICAgLmtleXMoZHRvKVxuICAgICAgLmZpbHRlcihrZXkgPT4gZW1wdHlLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpXG4gICAgICAuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+XG4gICAgICAgIG1vZGVsLiR0aGlzW2tleV0gPSAoZHRvIGFzIFZhc0pvYk1vZGVsRHluYW1pY0ludGVyZmFjZSlba2V5XVxuICAgICAgKTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBpbnN0YW50aWF0ZSBhIG5ldyBKb2JNb2RlbC4gVGhlIGRpZmZlcmVuY2Ugd2l0aCB0aGlzXG4gICAqIG1ldGhvZCBvZiBpbnN0YW50aWF0aW9uIGlzIHRoYXQgd2UgYXJlIGNvbWluZyBmcm9tIGEgcmVsYXRpb24gZnJhbWUgaS5lLlxuICAgKiB0aGUgam9iIGhhcyBhIGxpc3Qgb2Yge0BsaW5rIFZhc0ZpZWxkRHRvfSBpbnN0ZWFkIG9mIGEgSm9iIGRvY3VtZW50LlxuICAgKlxuICAgKi9cbiAgc3RhdGljIGZyb21SZWxhdGlvbmFsKFxuICAgIGR0bzogUGFydGlhbDxWYXNKb2JEdG8+LFxuICAgIGZvcm06IFZhc0Zvcm1EdG9cbiAgKTogVmFzSm9iTW9kZWwge1xuICAgIGNvbnN0IG1vZGVsID0gbmV3IFZhc0pvYk1vZGVsKFxuICAgICAgZHRvLmlkIHx8ICcnLFxuICAgICAgZHRvLmNyZWF0ZWQgfHwgJycsXG4gICAgICBkdG8uc2VydmVyQ3JlYXRlZCB8fCAnJyxcbiAgICAgIGR0by5jcmVhdGVkQnkgfHwgJycsXG4gICAgICBkdG8ubW9kaWZpZWQgfHwgJycsXG4gICAgICBkdG8uc2VydmVyTW9kaWZpZWQgfHwgJycsXG4gICAgICBkdG8ubW9kaWZpZWRCeSB8fCAnJyxcbiAgICAgIGR0by5jcmVhdGVkQnlOYW1lIHx8ICcnLFxuICAgICAgZHRvLm1vZGlmaWVkQnlOYW1lIHx8ICcnLFxuICAgICAgZHRvLmFjY291bnQgfHwgJycsXG4gICAgICBkdG8uYWNjZXNzR3JvdXAgfHwgJycsXG4gICAgICBkdG8ucmVmZXJlbmNlIHx8ICcnLFxuICAgICAgZHRvLmpvYkRhdGUgfHwgJycsXG4gICAgICBkdG8uam9iU3RhdHVzIHx8ICcnLFxuICAgICAgZHRvLmpvYlR5cGUgfHwgJycsXG4gICAgICBkdG8uYXNzaWduZWVJZCB8fCAnJyxcbiAgICAgIGR0by5mb3JtSWQgfHwgJycsXG4gICAgICBkdG8udGltZVpvbmVPZmZzZXQgfHwgbW9tZW50KCkudXRjT2Zmc2V0KCksXG4gICAgICBkdG8ucGVuZGluZ0ZpZWxkcyB8fCAwLFxuICAgICAgZHRvLmNoaWxkTW9kaWZpZWQgfHwgJycsXG4gICAgICBkdG8udmVyc2lvbiB8fCAwLFxuICAgICAgZHRvLmZpZWxkcyB8fCBbXSxcbiAgICAgIGR0by5maWxlcyB8fCBbXSxcbiAgICAgIGR0by5jcmVhdGVkQnlEaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZEJ5RGlzcGxheU5hbWUgfHwgJycsXG4gICAgICBkdG8uZ2VvTG9jYXRpb24gfHwgZ2V0RW1wdHlHZW9Mb2NhdGlvbigpXG4gICAgKTtcblxuICAgIGZvcm0uZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgIGdyb3VwLmNvbnRyb2xzXG4gICAgICAgICAgLmZvckVhY2goY29udHJvbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGR0by5maWVsZHM/LmZpbmQoZiA9PiBmLmNvbnRyb2wgPT09IGNvbnRyb2wuaWQpO1xuICAgICAgICAgICAgaWYgKCFmaWVsZCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtb2RlbC5nZXRHcm91cChncm91cC5uYW1lKVtjb250cm9sLm5hbWVdID0gZmllbGQudmFsdWU7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtWYXNGb3JtTW9kZWx9IGZvcm1Nb2RlbFxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPn1cbiAgICovXG4gIGdldEZpZWxkcyhmb3JtTW9kZWw6IFZhc0Zvcm1Nb2RlbCk6IFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+IHtcbiAgICBjb25zdCBmaWVsZHM6IHsgW2tleTogc3RyaW5nXTogVmFzRmllbGREdG9WYWx1ZSB9ID0ge307XG4gICAgZm9ybU1vZGVsLmdyb3Vwc1xuICAgICAgLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICBncm91cC5jb250cm9scy5mb3JFYWNoKGNvbnRyb2wgPT4ge1xuICAgICAgICAgIChmaWVsZHMpW2NvbnRyb2wucmVwb3J0VGVtcGxhdGVOYW1lXSA9XG4gICAgICAgICAgICB0aGlzLmdldFZhbHVlQnlQYXRoKFtncm91cC5uYW1lLCBjb250cm9sLm5hbWVdKSB8fCBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIHJldHVybiBmaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogV2lsbCByZXR1cm4gYW4gb2JqZWN0IHdob3NlIGtleXMgYXJlIHRoZSBuYW1lcyBvZiBhbGwgZmllbGRzIGluIHRoZSBqb2IuXG4gICAqIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gYGdldEZpZWxkc2AgZXhjZXB0IHRoYXQgdGhpcyBtZXRob2Qgd2lsbCBvbmx5XG4gICAqIHJldHVybiB2YWx1ZXMgd2hlcmUgYSB2YWx1ZSB3YXMgc2V0LCBhcyBvcHBvc2VkIHRvIGBnZXRGaWVsZHNgIHdoaWNoIHdpbGxcbiAgICogcmV0dXJuIGEgdmFsdWUgZm9yIGV2ZXJ5IGNvbnRyb2wgZXZlbiBpZiBub3QgdmFsdWUgd2FzIHNldCwgYmVjYXVzZSBpdCB1c2VzXG4gICAqIHRoZSBmb3JtIHRvIGRyaXZlIHRoZSBsb2dpYy4gTm90ZSBhbHNvIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHZhbHVlcyBmb3JcbiAgICogYW55IEZpZWxkcyBpbiB0aGUgZmllbGRzIGFycmF5LlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPn1cbiAgICovXG4gIGdldEZpZWxkczIoKTogUmVjb3JkPHN0cmluZywgVmFzRmllbGREdG9WYWx1ZT4ge1xuICAgIGxldCBmaWVsZHM6IHsgW2tleTogc3RyaW5nXTogVmFzRmllbGREdG9WYWx1ZSB9ID0ge307XG4gICAgdGhpcy5keW5hbWljUHJvcGVydGllc1xuICAgICAgLmZvckVhY2goKGdyb3VwTmFtZSkgPT4ge1xuICAgICAgICBPYmplY3RcbiAgICAgICAgICAua2V5cyh0aGlzLiR0aGlzW2dyb3VwTmFtZV0pXG4gICAgICAgICAgLmZvckVhY2goY29udHJvbE5hbWUgPT4ge1xuICAgICAgICAgICAgZmllbGRzW2NvbnRyb2xOYW1lXSA9XG4gICAgICAgICAgICAgIHRoaXMuZ2V0VmFsdWVCeVBhdGgoW2dyb3VwTmFtZSwgY29udHJvbE5hbWVdKSB8fCBudWxsO1xuICAgICAgICAgIH0pO1xuICAgICAgfSwge30pO1xuICAgIHRoaXMuZmllbGRzLmZvckVhY2goZmllbGQgPT4gZmllbGRzW2ZpZWxkLmNvbnRyb2xOYW1lXSA9IGZpZWxkLnZhbHVlKTtcbiAgICByZXR1cm4gZmllbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IGRlc2NyaWJpbmcgaG93IG1hbnkgYXR0YWNobWVudHMgd2VyZSBhZGRlZCB0byB0aGlzIGpvYlxuICAgKiAoY2FtZXJhIGNvbnRyb2xzIGFuZCBmaWxlcyksIGFuZCBob3cgbWFueSBoYXZlIG5vdCBiZWVuIHVwbG9hZGVkIHlldC5cbiAgICpcbiAgICogQHBhcmFtIGZvcm1Nb2RlbCBpbnN0YW5jZSBvZiB7QGxpbmsgVmFzRm9ybU1vZGVsfSB0aGF0IHdhcyB1c2VkIHdoZW4gdGhlXG4gICAqIGpvYiB3YXMgY3JlYXRlZFxuICAgKi9cbiAgZ2V0RmlsZXNVcGxvYWRTdGF0dXMoXG4gICAgZm9ybU1vZGVsOiBWYXNGb3JtTW9kZWxcbiAgKTogeyBwZW5kaW5nOiBudW1iZXI7IHRvdGFsOiBudW1iZXIgfSB7XG5cbiAgICBjb25zdCBwYXRoc1dpdGhWYWx1ZTogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBmb3JtTW9kZWxcbiAgICAgIC5nZXRDYW1lcmFDb250cm9sUGF0aHMoKVxuICAgICAgLm1hcChwYXRoID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWU6IFZhc0ZpbGVEdG8gfCBWYXNDYW1lcmFDb250cm9sVmFsdWVNb2RlbCA9XG4gICAgICAgICAgdGhpcy5nZXRWYWx1ZUJ5UGF0aChwYXRoKSBhcyBhbnk7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAhIXZhbHVlLmlkKSB7XG4gICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihwYXRoID0+IHBhdGggIT09IG51bGwgPyBwYXRoIDogbnVsbClcbiAgICAgIC5maWx0ZXIoaXNBcnJheVN0cmluZyk7XG5cbiAgICBsZXQgdG90YWwgPSBwYXRoc1dpdGhWYWx1ZS5sZW5ndGg7XG5cbiAgICB0b3RhbCArPSB0aGlzLmZpbGVzLmxlbmd0aDtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNhbWVyYSBpbWFnZXMgc3RpbGwgdG8gdXBsb2FkXG4gICAgbGV0IHBlbmRpbmcgPSBwYXRoc1dpdGhWYWx1ZVxuICAgICAgLm1hcChwYXRoID0+IHRoaXMuZ2V0VmFsdWVCeVBhdGgocGF0aCkgYXMgYW55KVxuICAgICAgLm1hcCgodmFsdWU6IFZhc0ZpbGVEdG8gfCBWYXNDYW1lcmFDb250cm9sVmFsdWVNb2RlbCkgPT4ge1xuICAgICAgICBpZiAoaXNGaWxlRHRvKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZS5pZCAmJiB2YWx1ZS5zdGF0dXMgIT09ICdDT01QTEVURSc7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDYW1lcmFDb250cm9sVmFsdWVWMSh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyBpZiB1cmwgaXMgbm90IHNldCwgaXQgaGFzbid0IGJlZW4gdXBsb2FkZWRcbiAgICAgICAgICByZXR1cm4gdmFsdWUuaWQgJiYgIXZhbHVlLnVybDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihoYXNVcGxvYWRlZCA9PiBoYXNVcGxvYWRlZClcbiAgICAgIC5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdG90YWwgZnJvbSBmaWxlcyB0aGF0IGFyZSBwZW5kaW5nXG4gICAgcGVuZGluZyArPSB0aGlzLmZpbGVzXG4gICAgICAuZmlsdGVyKHZhbHVlID0+IHZhbHVlLnN0YXR1cyAhPT0gJ0NPTVBMRVRFJylcbiAgICAgIC5sZW5ndGg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGVuZGluZyxcbiAgICAgIHRvdGFsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgZHluYW1pYyBwcm9wZXJ0eSBmcm9tIHRoZSBKb2JNb2RlbCB0aGF0XG4gICAqIHJlcHJlc2VudCBhIGdyb3VwIChmcm9tIGEgZm9ybSkuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBncm91cFxuICAgKiBAcGFyYW0gaW5pdCBpZiB0cnVlIChkZWZhdWx0KSBhbmQgZ3JvdXAgaXMgbm90IGZvdW5kLCBpbml0aWFsaXNlIGFuIGVtcHR5XG4gICAqIGdyb3VwLCBvdGhlcndpc2UgdGhyb3cgYW4gZXJyb3JcbiAgICovXG4gIGdldEdyb3VwKG5hbWU6IHN0cmluZywgaW5pdCA9IHRydWUpOiBSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPiB7XG4gICAgbGV0IHByb3A7XG4gICAgaWYgKHRoaXMuc3RhdGljUHJvcGVydGllcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYGludmFsaWQgZ3JvdXAgbmFtZSAke25hbWV9LCBub3QgYSBkeW5hbWljIHByb3BlcnR5YCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiR0aGlzW25hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpbml0KSB7XG4gICAgICAgIHByb3AgPSB0aGlzLiR0aGlzW25hbWVdID0ge307XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgaW52YWxpZCBncm91cCBuYW1lICR7bmFtZX0sIG5vdCBmb3VuZGApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wID0gdGhpcy4kdGhpc1tuYW1lXTtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYGludmFsaWQgZ3JvdXAgbmFtZSAke25hbWV9LCBub3QgYW4gb2JqZWN0YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIHBhdGggc2VnbWVudHNcbiAgICovXG4gIGdldFZhbHVlQnlQYXRoPFQgZXh0ZW5kcyBWYXNGaWVsZER0b1ZhbHVlPihcbiAgICBwYXRoOiBzdHJpbmdbXSA9IFtdXG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBnZXRWYWx1ZUJ5UGF0aChwYXRoLCB0aGlzLiR0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBvcmRlciB0byB1bmRlcnN0YW5kIHdoeSB3ZSBuZWVkIHRoaXMgbWV0aG9kIGl0IGlzIGltcG9ydGFudCB0b1xuICAgKiB1bmRlcnN0YW5kIHRoYXQgd2l0aGluIHRoZSBzeXN0ZW0sIEpvYnMgY2FuIGJlIHJlcHJlc2VudGVkIGluIG9uZSBvZiB0d29cbiAgICogd2F5cywgZG9jdW1lbnQgYW5kIHJlbGF0aW9uYWwuXG4gICAqXG4gICAqIFRoZSBpbXBvcnRhbnQgZGlzdGluY3Rpb24gaXMgaG93IHZhbHVlcyBzdWJtaXR0ZWQgYnkgYSBmb3JtIGFyZSBzdG9yZWQuXG4gICAqXG4gICAqIEpvYnMgc3RvcmVkIGFzIGRvY3VtZW50cyAoSlNPTiBvYmplY3RzKSB3aWxsIHN0b3JlIHVzZXIgdmFsdWVzLCBhcyBkeW5hbWljXG4gICAqIHByb3BlcnRpZXMgb2YgdGhlIGRvY3VtZW50LlxuICAgKlxuICAgKiBXaGVyZWFzLCBKb2JzIHN0b3JlZCBhcyByZWxhdGlvbmFsLCB3aWxsIHN0b3JlIHVzZXIgdmFsdWVzIGluIGFuIGFycmF5IG9mXG4gICAqIHtAbGluayBWYXNGaWVsZER0b30gb2JqZWN0cy5cbiAgICpcbiAgICogRGVwZW5kaW5nIG9uIHdoZXJlIHdlIGFyZSBpbiB0aGUgc3lzdGVtLCBlaXRoZXIgb25lIG9mIHRoZXNlIGFwcHJvYWNoZXMgY2FuXG4gICAqIGJlIG1vcmUgdXNlZnVsIHRoYW4gdGhlIG90aGVyLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCwgYXNzdW1lcyB0aGF0IHRoZSBKb2JNb2RlbCBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgZnJvbSBhXG4gICAqIGRvY3VtZW50IHJlcHJlc2VudGF0aW9uLCBhbmQgc2VydmVzIHRvIGh5ZHJhdGUgdGhlIGZpZWxkcyBhcnJheS4gSW4gb3JkZXJcbiAgICogdG8gYWNoaWV2ZSB0aGlzLCBrbm93bGVkZ2Ugb2YgdGhlIHtAbGluayBWYXNGb3JtRHRvfSB0aGF0IGNyZWF0ZWQgdGhlIGpvYlxuICAgKiBpcyByZXF1aXJlZC5cbiAgICpcbiAgICpcbiAgICogSm9iIGluIGRvY3VtZW50IHJlcHJlc2VudGF0aW9uXG4gICAqIHtcbiAgICogICBpZDogPGd1aWQ+LFxuICAgKiAgIHJlZmVyZW5jZTogXCJzb21ldGhpbmdcIlxuICAgKiAgIDxvdGhlciBzdGF0aWMgam9iIHByb3BlcnRpZXM+Li4uXG4gICAqICAgZm9vOiB7XG4gICAqICAgICBiYXI6IFwidmFsdWVcIlxuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBKb2IgaW4gcmVsYXRpb25hbCByZXByZXNlbnRhdGlvblxuICAgKiB7XG4gICAqICAgaWQ6IDxndWlkPixcbiAgICogICByZWZlcmVuY2U6IFwic29tZXRoaW5nXCJcbiAgICogICA8b3RoZXIgc3RhdGljIGpvYiBwcm9wZXJ0aWVzPi4uLlxuICAgKiAgIDx3aWxsIG5vdCBoYXZlIGR5bmFtaWMgcHJvcGVydGllcz4uLi5cbiAgICogICBmaWVsZHM6IFtcbiAgICogICAgIHtcbiAgICogICAgICAgaWQ6IDxndWlkPixcbiAgICogICAgICAgPG90aGVyIGZpZWxkIHByb3BlcnRpZXM+LFxuICAgKiAgICAgICB2YWx1ZTogXCJ2YWx1ZVwiXG4gICAqICAgICB9XG4gICAqICAgXVxuICAgKiB9XG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSBmb3JtTW9kZWwgdGhlIFZhc0Zvcm1Nb2RlbCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgam9iXG4gICAqIEBwYXJhbSBjb250cm9sRmllbGRJZE1hcCBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBpZCBlYWNoIGZpZWxkLlxuICAgKiBFaXRoZXIgb25lIHdpbGwgYmUgZm91bmQgaW4gdGhlIG1hcCwgb3IgYSBuZXcgb25lIGlzIGdlbmVyYXRlZC5cbiAgICogQHBhcmFtIGNvbnRyb2xOYW1lcyBpZiBhIHZhbHVlIGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWRcbiAgICogdG8gZmlsdGVyIHRoZSBmaWVsZHMgdGhhdCBhcmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm4ge0FycmF5PFZhc0ZpZWxkRHRvPn1cbiAgICovXG4gIGh5ZHJhdGVGaWVsZHMoXG4gICAgZm9ybU1vZGVsOiBWYXNGb3JtTW9kZWwsXG4gICAgY29udHJvbEZpZWxkSWRNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpLFxuICAgIGNvbnRyb2xOYW1lcz86IEFycmF5PHN0cmluZz5cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZmllbGRzOiBBcnJheTxWYXNGaWVsZER0bz4gPSBbXTtcbiAgICBmb3JtTW9kZWwuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgIGdyb3VwLmNvbnRyb2xzLmZvckVhY2goY29udHJvbCA9PiB7XG5cbiAgICAgICAgICBpZiAoIWNvbnRyb2wubmFtZS5zdGFydHNXaXRoKCdmaWVsZHMuJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29udHJvbE5hbWVzICYmICFjb250cm9sTmFtZXMuaW5jbHVkZXMoY29udHJvbC5uYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpZWxkcy5wdXNoKFZhc0ZpZWxkTW9kZWwuZnJvbUR0byh7XG4gICAgICAgICAgICAvLyBpZiB0aGUgY29udHJvbElkIGV4aXN0cyBpbiB0aGUgbWFwLCB1c2UgdGhlIGFzc29jaWF0ZWQgZmllbGRJZCxcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBnZW5lcmF0ZSBhIG5ldyBpZCBmb3IgdGhlIGZpZWxkLlxuICAgICAgICAgICAgaWQ6IGNvbnRyb2xGaWVsZElkTWFwLmdldChjb250cm9sLmlkKSB8fCBVVUlELlVVSUQoKSxcbiAgICAgICAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgICAgICAgIGpvYjogdGhpcy5pZCxcbiAgICAgICAgICAgIGNyZWF0ZWRCeTogdGhpcy5jcmVhdGVkQnksXG4gICAgICAgICAgICBjcmVhdGVkOiB0aGlzLmNyZWF0ZWQsXG4gICAgICAgICAgICBtb2RpZmllZEJ5OiB0aGlzLm1vZGlmaWVkQnksXG4gICAgICAgICAgICBtb2RpZmllZDogdGhpcy5tb2RpZmllZCxcbiAgICAgICAgICAgIGNvbnRyb2w6IGNvbnRyb2wuaWQsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5nZXRWYWx1ZUJ5UGF0aChcbiAgICAgICAgICAgICAgW2dyb3VwLm5hbWUsIGNvbnRyb2wubmFtZV1cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogQSB2ZXJ5IG5vbiBzb3BoaXN0aWNhdGVkIHdheSB0byBzZXQgdmFsdWVzIGluIHRoZSBqb2IgdmlhIHBhdGhzXG4gICAqXG4gICAqIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiBzZXRWYWx1ZUJ5UGF0aCgndmFsdWUnLCBbJ2ZvbycsICdiYXInXSk7XG4gICAqXG4gICAqIHdpbGwgbWFrZSByZXN1bHRzIGluIGpvYlxuICAgKiB7XG4gICAqICAgZm9vOiB7XG4gICAqICAgICBiYXI6ICd2YWx1ZSdcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXRcbiAgICogQHBhcmFtIHBhdGggcGF0aCBzZWdtZW50c1xuICAgKi9cbiAgc2V0VmFsdWVCeVBhdGgodmFsdWU6IFZhc0ZpZWxkRHRvVmFsdWUsIHBhdGg6IHN0cmluZ1tdID0gW10pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHBhdGgubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAxOiB7XG4gICAgICAgICh0aGlzIGFzIGFueSlbcGF0aFswXV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSAyOiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICh0aGlzLiR0aGlzW3BhdGhbMF1dIGFzIFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+KVtwYXRoWzFdXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlIDM6IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgKCh0aGlzLiR0aGlzW3BhdGhbMF1dIGFzIFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+KVtwYXRoWzFdXSBhcyBSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPilbcGF0aFsyXV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBFcnJvcigncGF0aCBoYXMgdG9vIG1hbnkgc2VnbWVudHMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHN0YXRpY09ubHkgaWYgdHJ1ZSwgd2lsbCBvbmx5IG91dHB1dCB2YWx1ZXMgZm9yIHRoZSBzdGF0aWNcbiAgICogcHJvcGVydGllcyBpbiB0aGUgZHRvXG4gICAqL1xuICBwdWJsaWMgdG9EdG8oc3RhdGljT25seSA9IGZhbHNlKTogVmFzSm9iRHRvIHtcblxuICAgIGlmIChzdGF0aWNPbmx5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgY3JlYXRlZDogdGhpcy5jcmVhdGVkLFxuICAgICAgICBjcmVhdGVkQnk6IHRoaXMuY3JlYXRlZEJ5LFxuICAgICAgICBtb2RpZmllZDogdGhpcy5tb2RpZmllZCxcbiAgICAgICAgbW9kaWZpZWRCeTogdGhpcy5tb2RpZmllZEJ5LFxuICAgICAgICBzZXJ2ZXJDcmVhdGVkOiB0aGlzLnNlcnZlckNyZWF0ZWQsXG4gICAgICAgIHNlcnZlck1vZGlmaWVkOiB0aGlzLnNlcnZlck1vZGlmaWVkLFxuICAgICAgICBjcmVhdGVkQnlOYW1lOiB0aGlzLmNyZWF0ZWRCeU5hbWUsXG4gICAgICAgIG1vZGlmaWVkQnlOYW1lOiB0aGlzLm1vZGlmaWVkQnlOYW1lLFxuICAgICAgICBhY2NvdW50OiB0aGlzLmFjY291bnQsXG4gICAgICAgIGFjY2Vzc0dyb3VwOiB0aGlzLmFjY2Vzc0dyb3VwLFxuICAgICAgICByZWZlcmVuY2U6IHRoaXMucmVmZXJlbmNlLFxuICAgICAgICBqb2JEYXRlOiB0aGlzLmpvYkRhdGUsXG4gICAgICAgIGpvYlN0YXR1czogdGhpcy5qb2JTdGF0dXMsXG4gICAgICAgIGpvYlR5cGU6IHRoaXMuam9iVHlwZSxcbiAgICAgICAgYXNzaWduZWVJZDogdGhpcy5hc3NpZ25lZUlkLFxuICAgICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgICAgICB0aW1lWm9uZU9mZnNldDogdGhpcy50aW1lWm9uZU9mZnNldCxcbiAgICAgICAgcGVuZGluZ0ZpZWxkczogdGhpcy5wZW5kaW5nRmllbGRzLFxuICAgICAgICBjaGlsZE1vZGlmaWVkOiB0aGlzLmNoaWxkTW9kaWZpZWQsXG4gICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgZmllbGRzOiB0aGlzLmZpZWxkcyxcbiAgICAgICAgZmlsZXM6IHRoaXMuZmlsZXMsXG4gICAgICAgIGNyZWF0ZWRCeURpc3BsYXlOYW1lOiB0aGlzLmNyZWF0ZWRCeURpc3BsYXlOYW1lLFxuICAgICAgICBtb2RpZmllZEJ5RGlzcGxheU5hbWU6IHRoaXMubW9kaWZpZWRCeURpc3BsYXlOYW1lLFxuICAgICAgICBnZW9Mb2NhdGlvbjogdGhpcy5nZW9Mb2NhdGlvblxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBkdG8gPSB7fSBhcyBWYXNKb2JNb2RlbER5bmFtaWNJbnRlcmZhY2U7XG4gICAgWy4uLnRoaXMuc3RhdGljUHJvcGVydGllcywgLi4udGhpcy5keW5hbWljUHJvcGVydGllc11cbiAgICAgIC5mb3JFYWNoKHByb3AgPT4gZHRvW3Byb3BdID0gdGhpcy4kdGhpc1twcm9wXSk7XG5cbiAgICByZXR1cm4gZHRvIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIHBhcnNlIGEgc3ludGF4IHRoYXQgYWxsb3dzIHVzIHRvIGJ1aWxkIHN0cmluZ3MgZnJvbSB0aGVcbiAgICogdmFsdWVzIG9mIGZyb20gdGhlIGpvYiBtb2RlbC4gRm9yIGV4YW1wbGUgaWYgdGhlIGpvYiBtb2RlbCB3YXM6XG4gICAqXG4gICAqIHtcbiAgICogICBmb286ICdiYXInXG4gICAqIH1cbiAgICpcbiAgICogYW5kIHdlIHBhc3MgXCJpIGFtIGZvbyB7Zm9vfVwiLCB0aGUgcmVzdWx0IHdvdWxkIGJlOlxuICAgKlxuICAgKiBcImkgYW0gZm9vIGJhclwiXG4gICAqXG4gICAqIHdlIGNhbiBhbHNvIHVzZSBtb21lbnQgdG8gcGFyc2UgZGF0ZXMsIGZvciBleGFtcGxlIGlmIHRoZSBqb2IgbW9kZWwgd2FzOlxuICAgKlxuICAgKiB7XG4gICAqICAgY3JlYXRlZDogXCIyMDIyLTAxLTAxVDAwOjAwOjAwKzAwMDBcIlxuICAgKiB9XG4gICAqXG4gICAqIGFuZCB3ZSBwYXNzIFwie2NyZWF0ZWR8ZGF0ZTpZWS1NTS1ERH1cIiwgdGhlIHJlc3VsdCB3b3VsZCBiZTpcbiAgICpcbiAgICogXCIyMDIyLTAxLTAxXCJcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIGEgc3RyaW5nIHdpdGggdGhlIHN5bnRheFxuICAgKiBAcGFyYW0ge1BhcnNlU3ludGF4T3B0aW9uc30gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgdGhlIHN5bnRheCBvbiB0aGlzIGpvYlxuICAgKi9cbiAgcGFyc2VTeW50YXgoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBQYXJzZVN5bnRheE9wdGlvbnMgPSB7XG4gICAgICB0aW1lWm9uZU9mZnNldDogMFxuICAgIH1cbiAgKTogc3RyaW5nIHtcblxuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvKHtbXn1dKn0pL2csIChtYXRjaDogc3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzeW50YXggPSB0b2tlbi5zdWJzdHJpbmcoMSwgdG9rZW4ubGVuZ3RoIC0gMSk7XG5cbiAgICAgIGxldCBba2V5LCBmaWx0ZXJdID0gc3ludGF4LnNwbGl0KCd8Jyk7XG4gICAgICBrZXkgPSAoa2V5IHx8ICcnKS50cmltKCk7XG4gICAgICBmaWx0ZXIgPSAoZmlsdGVyIHx8ICcnKS50cmltKCk7XG5cbiAgICAgIGxldCBmaWx0ZXJOYW1lLCBmaWx0ZXJBcmc6IHN0cmluZyA9ICcnO1xuICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICBjb25zdCBzcGxpdEluZGV4ID0gZmlsdGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgaWYgKHNwbGl0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlci5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCk7XG4gICAgICAgICAgZmlsdGVyQXJnID0gZmlsdGVyLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsdGVyTmFtZSA9IGZpbHRlcjtcbiAgICAgICAgICBmaWx0ZXJBcmcgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBmaWx0ZXJOYW1lID0gKGZpbHRlck5hbWUgfHwgJycpLnRyaW0oKTtcbiAgICAgICAgZmlsdGVyQXJnID0gKGZpbHRlckFyZyB8fCAnJykudHJpbSgpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGF0aCA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgY29uc3Qgb2JqZWN0S2V5ID0gcGF0aC5zaGlmdCgpIHx8ICcnO1xuICAgICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgICAgaWYgKG9iamVjdEtleSA9PT0gJ2pvYicpIHtcbiAgICAgICAgcmVzdWx0ID0gKHRoaXMuZ2V0VmFsdWVCeVBhdGgocGF0aCkgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2UgaWYgKG9iamVjdEtleSA9PT0gJ2ZpZWxkcycpIHtcbiAgICAgICAgcmVzdWx0ID0gKGdldFZhbHVlQnlQYXRoKFxuICAgICAgICAgIFsnZmllbGRzLicgKyBwYXRoLnNoaWZ0KCksIC4uLnBhdGhdLFxuICAgICAgICAgIHRoaXMuZ2V0RmllbGRzMigpXG4gICAgICAgICkgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICB9IGVsc2UgaWYgKG9iamVjdEtleS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMub2JqZWN0cykge1xuICAgICAgICAgIGlmIChvcHRpb25zLm9iamVjdHNbb2JqZWN0S2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgICAgICBgb2JqZWN0S2V5ICR7b2JqZWN0S2V5fSBpcyBub3QgcHJlc2VudCBpbiBvcHRpb25zLm9iamVjdGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXN1bHQgPSAnJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gKGdldFZhbHVlQnlQYXRoKHBhdGgsIG9wdGlvbnMub2JqZWN0c1tvYmplY3RLZXldKSB8fCAnJylcbiAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgICAgICBgb2JqZWN0S2V5ICR7b2JqZWN0S2V5fSB3YXMgdXNlZCBidXQgb3B0aW9ucy5vYmplY3QgaXMgbm90IHNldGBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG5cbiAgICAgIGlmIChmaWx0ZXJOYW1lICYmIHJlc3VsdCkge1xuICAgICAgICBzd2l0Y2ggKGZpbHRlck5hbWUpIHtcbiAgICAgICAgICBjYXNlICdkYXRlJzoge1xuICAgICAgICAgICAgcmV0dXJuIG1vbWVudChyZXN1bHQpXG4gICAgICAgICAgICAgIC51dGNPZmZzZXQob3B0aW9ucy50aW1lWm9uZU9mZnNldClcbiAgICAgICAgICAgICAgLmZvcm1hdChmaWx0ZXJBcmcgfHwgJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ3Vua25vd24gZmlsdGVyICVzJywgZmlsdGVyTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSkudHJpbSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBvdmVycmlkZSB0b0FwaUR0bygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLnRvQXBpRHRvKCksXG4gICAgICByZWZlcmVuY2U6IHRoaXMucmVmZXJlbmNlIHx8ICd+JyxcbiAgICAgIGpvYkRhdGU6IHRoaXMuam9iRGF0ZSB8fCAnficsXG4gICAgICBqb2JUeXBlOiB0aGlzLmpvYlR5cGUgfHwgJ34nLFxuICAgICAgYWNjZXNzR3JvdXA6IHRoaXMuYWNjZXNzR3JvdXAgfHwgJ34nLFxuICAgICAgam9iU3RhdHVzOiB0aGlzLmpvYlN0YXR1cyB8fCAnficsXG4gICAgICBhc3NpZ25lZUlkOiB0aGlzLmFzc2lnbmVlSWQgfHwgJ34nLFxuICAgICAgdGltZVpvbmVPZmZzZXQ6IHRoaXMudGltZVpvbmVPZmZzZXQgfHwgMCxcbiAgICAgIHBlbmRpbmdGaWVsZHM6IHRoaXMucGVuZGluZ0ZpZWxkcyB8fCAwLFxuICAgICAgbGFzdEZvcm06IHRoaXMuZm9ybUlkIHx8ICd+J1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWxvb2t1cC10eXBlLmR0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Zhcy1saWIvc3JjL2xpYi9lbnRpdHkvdmFzLWxvb2t1cC10eXBlLmR0by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmFzQWNjb3VudE9iamVjdER0byB9IGZyb20gJy4vdmFzLWFjY291bnQtb2JqZWN0LmR0byc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFzTG9va3VwVHlwZUR0byBleHRlbmRzIFZhc0FjY291bnRPYmplY3REdG8ge1xuICB0aXRsZTogc3RyaW5nO1xuICBzZXF1ZW5jZTogbnVtYmVyO1xuICBjYXRlZ29yeUdyb3VwczogQXJyYXk8c3RyaW5nPjtcbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWxvb2t1cC5kdG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YXMtbGliL3NyYy9saWIvZW50aXR5L3Zhcy1sb29rdXAuZHRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWYXNBY2NvdW50T2JqZWN0RHRvIH0gZnJvbSAnLi92YXMtYWNjb3VudC1vYmplY3QuZHRvJztcblxuZXhwb3J0IGludGVyZmFjZSBWYXNMb29rdXBEdG8gZXh0ZW5kcyBWYXNBY2NvdW50T2JqZWN0RHRvIHtcbiAgaWQ6IHN0cmluZztcbiAgY3JlYXRlZDogc3RyaW5nO1xuICBzZXJ2ZXJDcmVhdGVkOiBzdHJpbmc7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICBzZXJ2ZXJNb2RpZmllZDogc3RyaW5nO1xuICBtb2RpZmllZEJ5OiBzdHJpbmc7XG4gIGFjY291bnQ6IHN0cmluZztcbiAgYWNjZXNzR3JvdXA6IHN0cmluZztcbiAgbG9va3VwVHlwZTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHNlcXVlbmNlOiBudW1iZXI7XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLW1lbWJlcnNoaXAuZHRvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFzLWxpYi9zcmMvbGliL2VudGl0eS92YXMtbWVtYmVyc2hpcC5kdG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZhc0FjY291bnRPYmplY3REdG8gfSBmcm9tICcuL3Zhcy1hY2NvdW50LW9iamVjdC5kdG8nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZhc01lbWJlcnNoaXBEdG8gZXh0ZW5kcyBWYXNBY2NvdW50T2JqZWN0RHRvIHtcbiAgdXNlcjogc3RyaW5nO1xuICBhZG1pbjogYm9vbGVhbjtcbiAgbG9va3VwVHlwZXM6IEFycmF5PHN0cmluZz47XG4gIGNvbnRhY3RUeXBlczogQXJyYXk8c3RyaW5nPjtcbiAgYWNjZXNzR3JvdXBzOiBBcnJheTxzdHJpbmc+O1xuICBqb2JTdGF0dXNlczogQXJyYXk8c3RyaW5nPjtcbiAgam9iVHlwZXM6IEFycmF5PHN0cmluZz47XG4gIHRhc2tUeXBlczogQXJyYXk8c3RyaW5nPjtcbn1cbiJdfQ==