@hestia-earth/ui-components 0.14.2 → 0.14.3

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.
@@ -22,18 +22,19 @@ const modelLink = (term, model) => `
22
22
  `;
23
23
  const threshold = (value) => code(`${value * 100}%`);
24
24
  const noTillage = { id: 'noTillage', name: 'No tillage' };
25
+ const pastureGrass = { id: 'pastureGrass', name: 'Pasture grass' };
25
26
  const idNotFoundDefaultMessage = `
26
27
  If you are using the ${code('name')} of the Term, make sure to use ${code('term.name')} column;
27
28
  if you are using the ${code('@id')} of the Term, use the ${code('term.@id')} column instead.
28
29
  `.trim();
29
30
  const idNotFoundError = (_error, _errorCount, allErrors) => {
30
- const migrationErrors = allErrors.filter(({ params }) => params?.current || params?.expected);
31
- const noMigrationErrors = allErrors.filter(({ params }) => !params?.current && !params?.expected);
31
+ const migrationErrors = allErrors.filter(({ params }) => params?.current && ('expected' in params));
32
+ const noMigrationErrors = allErrors.filter(({ params }) => !params?.current || !('expected' in params));
32
33
  return `
33
34
  <p>Does not exist in Hestia.</p>
34
- ${migrationErrors.map(({ params }) => params?.expected
35
+ ${unique(migrationErrors.map(({ params }) => params?.expected
35
36
  ? `The Term ${code(params.current)} was updated, please use this Term instead: ${code(params.expected)}.`
36
- : `The Term ${code(params.current)} was deleted. Please search the ${glossaryLink('Glossary')} for a new Term.`)}
37
+ : `The Term ${code(params.current)} was deleted. Please search the ${glossaryLink('Glossary')} for a new Term.`)).join('</br>')}
37
38
  ${noMigrationErrors.length ? idNotFoundDefaultMessage : ''}
38
39
  `;
39
40
  };
@@ -44,9 +45,11 @@ const customErrorMessage = {
44
45
  'should have required property \'id\'': idNotFoundError,
45
46
  'should match exactly one schema in oneOf': () => '',
46
47
  'should match some schema in anyOf': () => '',
48
+ 'should match "then" schema': () => '',
47
49
  'should NOT have additional properties': ({ params }, errorCount) => errorCount === 1 ?
48
50
  `The following field does not exist: ${params?.additionalProperty} or is not allowed in this case.` :
49
- `should not have additional properties`,
51
+ `Should not have additional properties.`,
52
+ 'should NOT be valid': () => 'Should not be used in this case.',
50
53
  'should match pattern "^\\d{13}$"': () => `should be composed of 13 numbers`,
51
54
  'should match pattern "^[0-9]{4}(-[0-9]{2})?(-[0-9]{2})?$"': () => dateFormatMessage,
52
55
  'should match pattern "^([0-9]{4}|-)(-[0-9]{2})?(-[0-9]{2})?$"': () => dateFormatMessage,
@@ -71,7 +74,8 @@ const customErrorMessage = {
71
74
  ${errorCount === 1
72
75
  ? `Please check the measurement, its depth intervals, and the dates of the measurement or update the soil texture if needed.`
73
76
  : `Please check your measurements, their depth intervals, and the dates of the measurements or update the soil textures if needed.`}`,
74
- 'should be equal to one of the allowed values': ({ params }) => `must have one of these values: ${params?.allowedValues.map(code).join(', ')}`,
77
+ 'should be equal to one of the allowed values': ({ params }) => `Must have one of these values: ${params?.allowedValues.map(code).join(', ')}`,
78
+ 'should be equal to constant': ({ params }) => `Must be: ${code(params?.allowedValue)}`,
75
79
  'is not allowed for this characterisedIndicator': ({ params }, errorCount) => `${errorCount === 1 ?
76
80
  `${params?.allowedValues.length ?
77
81
  `can only be used with one of these methods: ${params?.allowedValues.map(code).join(', ')}` :
@@ -84,8 +88,8 @@ const customErrorMessage = {
84
88
  `The ${paths[paths.length - 1].path} related to this ${pluralize(paths[paths.length - 2].label, 1)} are invalid` :
85
89
  `The ${paths[0].path} are invalid`;
86
90
  },
87
- 'may be between 0 and 100': () => 'percentages should be between 0 and 100, not 0 and 1. This may be an error.',
88
- 'may not all be set to false': () => `Every value in the data completeness assessment is ${code('false')}. You may have forgotten to fill it in.
91
+ 'may be between 0 and 100': () => 'Percentages should be between 0 and 100, not 0 and 1. This may be an error.',
92
+ 'may not all be set to false': () => `Every value in the data completeness assessment is ${code(false)}. You may have forgotten to fill it in.
89
93
  For information on how to fill it in, please see the ${schemaLink('Cycle#completeness', 'schema')}.`,
90
94
  'may not be empty': () => 'if this value signifies no data, Hestia only accepts "-" or empty for no data',
91
95
  'may not be 0': ({ dataPath }, errorCount) => {
@@ -95,16 +99,17 @@ const customErrorMessage = {
95
99
  If the amount produced is zero, we recommend setting value to 0.`;
96
100
  },
97
101
  'the sum of above ground crop residue and below ground crop residue must be greater than zero': () => `For sites of type ${code(SiteSiteType.cropland)} or ${code(SiteSiteType['permanent pasture'])},
98
- if data completeness is marked true for crop residue,
102
+ if data completeness is marked ${code(true)} for crop residue,
99
103
  the sum of the Above ground crop residue terms should be greater than zero,
100
104
  and Below ground crop residue should be greater than zero.`,
101
105
  'longFallowPeriod must be lower than 5 years': () => `Your longFallowPeriod is greater than five years.
102
106
  Fallow is defined by FAOSTAT as land left uncultivated for between 1 and 5 years,
103
107
  and this definition is used for Hestia also.`,
104
108
  'should be within percentage of default value': ({ params }, errorCount) => errorCount === 1 ?
105
- `is ±${threshold(params?.threshold)} different to our default value which is ${params?.default}.
109
+ `This value is ±${threshold(params?.threshold)} different to our default value which is ${params?.default}.
106
110
  Please check your uploaded data as this may be an error.` :
107
- `is substantially different than our default value. Please check your uploaded data as this may be an error.`,
111
+ `This value is substantially different than our default value.
112
+ Please check your uploaded data as this may be an error.`,
108
113
  'the value provided is not consistent with the model result': ({ params }, errorCount) => `The expected result for ${code(params?.term.name)}
109
114
  ${params?.model?.name ? `using ${modelLink(params?.term, params?.model)} ` : ''}
110
115
  from the data provided in the upload is ${errorCount === 1
@@ -207,38 +212,51 @@ const customErrorMessage = {
207
212
  then ${code('completeness.material')} must be ${code('false')}.`,
208
213
  'must be below or equal to 1 for unit in ha': () => `The maximum value for a product with units ${code('ha')} on a Cycle with a ${schemaLink('Cycle#functionalUnit', 'functional unit')} of ${code('1 ha')} is ${code('1')}.
209
214
  If you are trying to add a product with the units ${code('kg')}, use a different term.`,
210
- 'pastureGrass key units must be \'ha\'': ({ params }) => `The Term ${code(params?.term.name)} can't be used as a key for Pasture grass.
215
+ 'pastureGrass key units must be \'ha\'': ({ params }) => `The Term ${code(params?.term.name)} can't be used as a key for ${termLink(pastureGrass)}.
211
216
  Please use the Term describing the plant with the units ${code(params.expected)} instead.
212
217
  This will help us gap-fill the amount of grass consumed by the herd.`,
218
+ 'the sum of all pastureGrass values must be 100': ({ params }) => `The sum of all ${termLink(pastureGrass)} values must be equal to ${params.expected}%.`,
213
219
  'is outside confidence interval': (_error, errorCount, allErrors) => `${unique(allErrors.flatMap(({ dataPath, params }) => params?.outliers?.map(value => `The ${dataPath.includes('product') ? 'product' : 'input'} value ${errorCount === 1 ? `${code(value)} ` : ''}is ${value > params?.min ? 'above' : 'below'} ${params?.threshold ? `${code(`${(params.threshold + ((1 - params.threshold) / 2)) * 100}%`)} of` : ''} all ${params?.group ? code(params.group) : code(params?.term?.name)} data in ${code(params?.country.name)} on the Hestia platform.`))).join('</br>')}
220
+ </br>
214
221
  Please double-check these values before submitting.`,
215
222
  'should be equal to boundary': ({ params }) => `The calculated area from ${code('boundary')} is ${code(params?.expected)}.
216
223
  This may be an error if the boundary represents the area under cultivation.`,
217
- 'must specify the fate of cropResidue': () => `For sites of type cropland or permanent pasture, if data completeness is marked true for crop residue,
218
- the fate of the residue must be fully specified.
219
- The fate must be added using:
224
+ 'must specify the fate of cropResidue': () => `For sites of type cropland or permanent pasture, if data completeness is marked ${code(true)} for crop residue, the fates and quantities of the residue must be specified.
225
+ <br/>
226
+ The quantity must include both above and below ground crop residue, where the sum of above ground crop residue and below ground crop residue must be greater than zero.
227
+ This can be added using the terms:
220
228
  <ul class="is-pl-3 is-list-style-disc is-nowrap">
221
- <li>the ${glossaryTypeLink(TermTermType.cropResidueManagement)} practices;</li>
229
+ <li>${termLink({ id: 'belowGroundCropResidue', name: 'Below ground crop residue' })}; and</li>
230
+ <li>${termLink({ id: 'aboveGroundCropResidueTotal', name: 'Above ground crop residue total' })}.</li>
231
+ </ul>
232
+ <br/>
233
+ The fate can be added using:
234
+ <ul class="is-pl-3 is-list-style-disc is-nowrap">
235
+ <li>the ${glossaryTypeLink(TermTermType.cropResidueManagement)} practices; and/or</li>
222
236
  <li>the ${glossaryTypeLink(TermTermType.cropResidue)} products</li>
223
237
  </ul>
224
- where the sum of above ground crop residue and below ground crop residue must be greater than zero;
225
238
  `,
226
- 'should specify the fate of cropResidue': () => `
227
- You have not specified the fate of the crop residue.
239
+ 'should specify the fate of cropResidue': () => `You have not specified the fate of the crop residue.
228
240
  Adding this information will improve emissions and soil carbon stock calculations.
229
241
  The fate can be added using:
230
242
  <ul class="is-pl-3 is-list-style-disc is-nowrap">
231
- <li>the ${glossaryTypeLink(TermTermType.cropResidueManagement)} practices;</li>
243
+ <li>the ${glossaryTypeLink(TermTermType.cropResidueManagement)} practices; and/or</li>
232
244
  <li>the ${glossaryTypeLink(TermTermType.cropResidue)} products;</li>
233
245
  </ul>
234
- Remember to set ${code('completeness.cropResidue')} to ${code('true')}
235
- if the above and below ground crop residue quantities and fates are specified.
236
- `,
246
+ Remember to set ${code('completeness.cropResidue')} to ${code(true)} if both the above and below ground crop residue quantities and fates are specified.`,
237
247
  'should have the same privacy as the related source': ({ params }) => `To link to a ${params?.defaultSource?.dataPrivate ? 'private' : 'public'} Source,
238
248
  this Node needs to be ${params?.defaultSource?.dataPrivate ? 'private' : 'public'} as well.
239
249
  Please set ${code('dataPrivate')}=${code(`${params?.defaultSource?.dataPrivate}`)}.`,
240
250
  'should not use not relevant model': () => `All emissions should generally have a method tier, which states how the data were modelled or how the data were collected.
241
- Please see the ${schemaLink('Emission#methodTier', 'schema')} for the options available and definitions of the options.`
251
+ Please see the ${schemaLink('Emission#methodTier', 'schema')} for the options available and definitions of the options.`,
252
+ 'should not use not relevant methodTier': () => `All emissions should generally have a method tier, which states how the data were modelled or how the data were collected.
253
+ Please see the ${schemaLink('Emission#methodTier', 'schema')} for the options available and definitions of the options.`,
254
+ 'must have inputs representing the forage when set to true': () => `This Cycle includes animals and completeness is set to ${(code(true))} for ${code('animalFeed')}.
255
+ However, there are no Inputs representing the forage intake by animals in the Cycle (Inputs with terms which contain the words "fresh forage" and a ${code('value')}).
256
+ Either, set completeness to ${(code(false))} for ${code('animalFeed')}, make sure all "fresh forage" Inputs have a ${code('value')}, or add one or more Inputs representing the forage intake.`,
257
+ 'must specify the fate of the feed': () => `This Cycle is an animal production Cycle and this Input could be an animal feed or could be for another use.
258
+ Please specify the ${schemaLink('Input#fate', 'fate')} field on this Input.
259
+ Knowing the fate is essential to distinguish Inputs between those which are fed to animals and those which are used for other purposes.`
242
260
  };
243
261
  export const formatCustomErrorMessage = (message, error, allErrors = []) => {
244
262
  const formattedMessage = message && message in customErrorMessage ?
@@ -263,4 +281,4 @@ export const filterError = (error) => [
263
281
  isFailingKeywordError
264
282
  ].every(func => !func(error));
265
283
  export const missingNodeErrors = (errors) => errors.filter(({ keyword, params }) => keyword === 'required' && (params?.missingProperty === '@type' || params?.missingProperty === '@id'));
266
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtZXJyb3IubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtZXJyb3IubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBUSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBNkJoRCxNQUFNLGVBQWUsR0FBRyx5Q0FBeUMsQ0FBQztBQUVsRSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxRQUFRLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDN0MsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEYsQ0FBQyxDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLElBQWtCLEVBQUUsSUFB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QXFCO0NBQ3RCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUU5QixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQTBCLEVBQUUsRUFBRSxDQUM5RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUNwQyxPQUFPLEtBQUssVUFBVSxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsS0FBSyxPQUFPLElBQUksTUFBTSxFQUFFLGVBQWUsS0FBSyxLQUFLLENBQUMsQ0FDckcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHkgKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCB7IFNjaGVtYVR5cGUsIFNpdGVTaXRlVHlwZSwgVGVybSwgVGVybVRlcm1UeXBlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuaW1wb3J0IHsgdG9QcmVjaXNpb24sIGtleVRvTGFiZWwsIHVuaXF1ZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvdXRpbHMnO1xuXG5pbXBvcnQgeyB0ZXJtVHlwZUxhYmVsIH0gZnJvbSAnLi4vdGVybXMvdGVybXMubW9kZWwnO1xuaW1wb3J0IHsgcGF0aFRvQXBpRG9jc1BhdGggfSBmcm9tICcuLi9lbmdpbmUvZW5naW5lLnNlcnZpY2UnO1xuaW1wb3J0IHsgYmFzZVVybCwgY29kZSwgY29udGFjdFVzTGluaywgZXh0ZXJuYWxMaW5rLCBnbG9zc2FyeUxpbmssIHNjaGVtYUxpbmsgfSBmcm9tICcuLi9jb21tb24vdXRpbHMnO1xuaW1wb3J0IHsgcGx1cmFsaXplIH0gZnJvbSAnLi4vY29tbW9uL3BsdXJhbGl6ZSc7XG5cbi8vIFRPRE86IGFkZCBtb3JlIHZhbGlkYXRpb24ga2V5d29yZCBhbmQgcGFyYW1zXG5leHBvcnQgdHlwZSB2YWxpZGF0aW9uRXJyb3JMZXZlbCA9ICdlcnJvcicgfCAnd2FybmluZyc7XG5leHBvcnQgdHlwZSB2YWxpZGF0aW9uRXJyb3JQYXJhbSA9ICdtaXNzaW5nUHJvcGVydHknIHwgJ3R5cGUnIHwgJ3Rlcm0nIHwgJ21vZGVsJyB8ICdwcm9kdWN0JyB8ICdyYW5nZScgfCAnbm9kZScgfFxuICAnYWxsb3dlZFZhbHVlcycgfCAnYWRkaXRpb25hbFByb3BlcnR5JyB8ICdleHBlY3RlZCcgfCAnZGVmYXVsdCcgfCAnY3VycmVudCcgfCAncGVyY2VudGFnZScgfCAna2V5cycgfCAndGhyZXNob2xkJyB8XG4gICdvdXRsaWVycycgfCAnY291bnRyeScgfCAnbWluJyB8ICdtYXgnIHwgJ2RlZmF1bHRTb3VyY2UnIHwgJ2dyb3VwJyB8ICdtZXNzYWdlJztcbmV4cG9ydCB0eXBlIHZhbGlkYXRpb25FcnJvcktleXdvcmQgPSAncmVxdWlyZWQnIHwgJ3R5cGUnIHwgJ2lmJyB8ICd0aGVuJztcblxuZXhwb3J0IGludGVyZmFjZSBJVmFsaWRhdGlvbkVycm9yIHtcbiAgaW5kZXg/OiBudW1iZXI7XG4gIG5vZGVJbmRleD86IG51bWJlcjtcbiAgbGV2ZWw/OiB2YWxpZGF0aW9uRXJyb3JMZXZlbDtcbiAgZGF0YVBhdGg/OiBzdHJpbmc7XG4gIHNjaGVtYVBhdGg/OiBzdHJpbmc7XG4gIGtleXdvcmQ/OiB2YWxpZGF0aW9uRXJyb3JLZXl3b3JkO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHBhcmFtcz86IHsgW2tleSBpbiB2YWxpZGF0aW9uRXJyb3JQYXJhbV0/OiBhbnkgfTtcbiAgbWFwRXJyb3I/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElWYWxpZGF0aW9uRXJyb3JXaXRoSW5kZXgge1xuICBlcnJvcjogSVZhbGlkYXRpb25FcnJvcltdO1xuICBpbmRleDogbnVtYmVyO1xuICBjaGFuZ2VkPzogYm9vbGVhbjtcbn1cblxudHlwZSBoYW5kbGVFcnJvckZ1bmMgPSAoZXJyb3I6IElWYWxpZGF0aW9uRXJyb3IsIGVycm9yQ291bnQ/OiBudW1iZXIsIGFsbEVycm9ycz86IElWYWxpZGF0aW9uRXJyb3JbXSkgPT4gc3RyaW5nO1xuXG5jb25zdCBtYXBFcnJvck1lc3NhZ2UgPSAnZG9lcyBub3QgY29udGFpbiBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlJztcblxuZXhwb3J0IGNvbnN0IHBhcnNlRGF0YVBhdGggPSAoZGF0YVBhdGggPSAnJykgPT4ge1xuICBjb25zdCBbXywgLi4ucGF0aHNdID0gZGF0YVBhdGguc3BsaXQoJy4nKTtcbiAgcmV0dXJuIHBhdGhzLm1hcChwYXRoID0+ICh7IHBhdGgsIGxhYmVsOiBrZXlUb0xhYmVsKHBhdGgucmVwbGFjZSgvXFxbXFxkK1xcXS9nLCAnJykpIH0pKTtcbn07XG5cbmNvbnN0IGdsb3NzYXJ5VHlwZUxpbmsgPSAodHlwZTogVGVybVRlcm1UeXBlLCB0ZXh0ID0gdGVybVR5cGVMYWJlbCh0eXBlKSkgPT5cbiAgZXh0ZXJuYWxMaW5rKGAke2Jhc2VVcmwoKX0vZ2xvc3Nhcnk/dGVybVR5cGU9JHt0eXBlfWAsIHRleHQpO1xuY29uc3QgdGVybUxpbmsgPSAoeyBpZCwgbmFtZSB9OiBQYXJ0aWFsPFRlcm0+KSA9PlxuICBleHRlcm5hbExpbmsoYCR7YmFzZVVybCgpfS90ZXJtLyR7aWR9YCwgbmFtZSEpO1xuY29uc3QgZGF0ZUZvcm1hdE1lc3NhZ2UgPVxuICBgc2hvdWxkIGZvbGxvdyB0aGUgSVNPIDg2MDEgZGF0ZSBmb3JtYXQsIGUuZy4gJHtjb2RlKDIwMDApfSwgb3IgJHtjb2RlKCcyMDAwLTEyJyl9LCBvciAke2NvZGUoJzIwMDAtMTItMzAnKX1gO1xuY29uc3QgbW9kZWxMaW5rID0gKHRlcm06IFRlcm0sIG1vZGVsOiBUZXJtKSA9PiBgXG4gIDxhIGhyZWY9XCIke3BhdGhUb0FwaURvY3NQYXRoKG1vZGVsWydAaWQnXSwgdGVybVsnQGlkJ10pfVwiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgIDxzcGFuIGNsYXNzPVwicHItMVwiPiR7bW9kZWwubmFtZX08L3NwYW4+XG4gICAgPHNwYW4+KFZpZXcgRG9jcyk8L3NwYW4+XG4gIDwvYT5cbmA7XG5jb25zdCB0aHJlc2hvbGQgPSAodmFsdWU6IG51bWJlcikgPT4gY29kZShgJHt2YWx1ZSAqIDEwMH0lYCk7XG5cbmNvbnN0IG5vVGlsbGFnZTogUGFydGlhbDxUZXJtPiA9IHtpZDogJ25vVGlsbGFnZScsIG5hbWU6ICdObyB0aWxsYWdlJ307XG5cbmNvbnN0IGlkTm90Rm91bmREZWZhdWx0TWVzc2FnZSA9IGBcbiAgSWYgeW91IGFyZSB1c2luZyB0aGUgJHtjb2RlKCduYW1lJyl9IG9mIHRoZSBUZXJtLCBtYWtlIHN1cmUgdG8gdXNlICR7Y29kZSgndGVybS5uYW1lJyl9IGNvbHVtbjtcbiAgaWYgeW91IGFyZSB1c2luZyB0aGUgJHtjb2RlKCdAaWQnKX0gb2YgdGhlIFRlcm0sIHVzZSB0aGUgJHtjb2RlKCd0ZXJtLkBpZCcpfSBjb2x1bW4gaW5zdGVhZC5cbmAudHJpbSgpO1xuXG5jb25zdCBpZE5vdEZvdW5kRXJyb3I6IGhhbmRsZUVycm9yRnVuYyA9IChfZXJyb3IsIF9lcnJvckNvdW50LCBhbGxFcnJvcnMpID0+IHtcbiAgY29uc3QgbWlncmF0aW9uRXJyb3JzID0gYWxsRXJyb3JzLmZpbHRlcigoeyBwYXJhbXMgfSkgPT4gcGFyYW1zPy5jdXJyZW50IHx8IHBhcmFtcz8uZXhwZWN0ZWQpO1xuICBjb25zdCBub01pZ3JhdGlvbkVycm9ycyA9IGFsbEVycm9ycy5maWx0ZXIoKHsgcGFyYW1zIH0pID0+ICFwYXJhbXM/LmN1cnJlbnQgJiYgIXBhcmFtcz8uZXhwZWN0ZWQpO1xuICByZXR1cm4gYFxuICAgIDxwPkRvZXMgbm90IGV4aXN0IGluIEhlc3RpYS48L3A+XG4gICAgJHtcbiAgICAgIG1pZ3JhdGlvbkVycm9ycy5tYXAoKHsgcGFyYW1zIH0pID0+XG4gICAgICAgIHBhcmFtcz8uZXhwZWN0ZWRcbiAgICAgICAgICA/IGBUaGUgVGVybSAke2NvZGUocGFyYW1zLmN1cnJlbnQpfSB3YXMgdXBkYXRlZCwgcGxlYXNlIHVzZSB0aGlzIFRlcm0gaW5zdGVhZDogJHtjb2RlKHBhcmFtcy5leHBlY3RlZCl9LmBcbiAgICAgICAgICA6IGBUaGUgVGVybSAke2NvZGUocGFyYW1zLmN1cnJlbnQpfSB3YXMgZGVsZXRlZC4gUGxlYXNlIHNlYXJjaCB0aGUgJHtnbG9zc2FyeUxpbmsoJ0dsb3NzYXJ5Jyl9IGZvciBhIG5ldyBUZXJtLmBcbiAgICAgIClcbiAgICB9XG4gICAgJHtub01pZ3JhdGlvbkVycm9ycy5sZW5ndGggPyBpZE5vdEZvdW5kRGVmYXVsdE1lc3NhZ2UgOiAnJ31cbiAgYDtcbn07XG5cbi8vIHNldCBtZXNzYWdlIGFzIGVtcHR5IHRvIG5vdCBkaXNwbGF5IGl0XG5jb25zdCBjdXN0b21FcnJvck1lc3NhZ2U6IHtcbiAgW2tleTogc3RyaW5nXTogaGFuZGxlRXJyb3JGdW5jO1xufSA9IHtcbiAgJ3Nob3VsZCBoYXZlIHJlcXVpcmVkIHByb3BlcnR5IFxcJ0BpZFxcJyc6IGlkTm90Rm91bmRFcnJvcixcbiAgJ3Nob3VsZCBoYXZlIHJlcXVpcmVkIHByb3BlcnR5IFxcJ0B0eXBlXFwnJzogKCkgPT4gJycsXG4gICdzaG91bGQgaGF2ZSByZXF1aXJlZCBwcm9wZXJ0eSBcXCdpZFxcJyc6IGlkTm90Rm91bmRFcnJvcixcbiAgJ3Nob3VsZCBtYXRjaCBleGFjdGx5IG9uZSBzY2hlbWEgaW4gb25lT2YnOiAoKSA9PiAnJyxcbiAgJ3Nob3VsZCBtYXRjaCBzb21lIHNjaGVtYSBpbiBhbnlPZic6ICgpID0+ICcnLFxuICAnc2hvdWxkIE5PVCBoYXZlIGFkZGl0aW9uYWwgcHJvcGVydGllcyc6ICh7IHBhcmFtcyB9LCBlcnJvckNvdW50KSA9PlxuICAgIGVycm9yQ291bnQgPT09IDEgP1xuICAgICAgYFRoZSBmb2xsb3dpbmcgZmllbGQgZG9lcyBub3QgZXhpc3Q6ICR7cGFyYW1zPy5hZGRpdGlvbmFsUHJvcGVydHl9IG9yIGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgY2FzZS5gIDpcbiAgICAgIGBzaG91bGQgbm90IGhhdmUgYWRkaXRpb25hbCBwcm9wZXJ0aWVzYCxcbiAgJ3Nob3VsZCBtYXRjaCBwYXR0ZXJuIFwiXlxcXFxkezEzfSRcIic6ICgpID0+IGBzaG91bGQgYmUgY29tcG9zZWQgb2YgMTMgbnVtYmVyc2AsXG4gICdzaG91bGQgbWF0Y2ggcGF0dGVybiBcIl5bMC05XXs0fSgtWzAtOV17Mn0pPygtWzAtOV17Mn0pPyRcIic6ICgpID0+IGRhdGVGb3JtYXRNZXNzYWdlLFxuICAnc2hvdWxkIG1hdGNoIHBhdHRlcm4gXCJeKFswLTldezR9fC0pKC1bMC05XXsyfSk/KC1bMC05XXsyfSk/JFwiJzogKCkgPT4gZGF0ZUZvcm1hdE1lc3NhZ2UsXG4gICdzaG91bGQgbWF0Y2ggcGF0dGVybiBcIl4oWzAtOV17NH18LSkoLVswLTldezJ9KT8oLVswLTldezJ9KT8oW1RdWzAtMl1bMC05XVxcOlswLTVdWzAtOV1cXDpbMC01XVswLTldKChcXCt8XFwtKVswLTFdWzAtOV06WzAtNV1bMC05XSk/KT8kXCInOiAoKSA9PiBkYXRlRm9ybWF0TWVzc2FnZSxcbiAgJ3Nob3VsZCBiZSBsaW5rZWQgdG8gYW4gZXhpc3Rpbmcgbm9kZSc6ICh7IHBhcmFtcyB9KSA9PlxuICAgIGBZb3VyIHN1Ym1pc3Npb24gZG9lcyBub3QgY29udGFpbiB0aGUgJHtwYXJhbXM/Lm5vZGU/LnR5cGV9IHdpdGggJHtjb2RlKGBpZD0ke3BhcmFtcz8ubm9kZT8uaWR9YCl9LlxuICAgIElmIHlvdSBhcmUgdHJ5aW5nIHRvIGxpbmsgdG8gYW4gZXhpc3RpbmcgJHtwYXJhbXM/Lm5vZGU/LnR5cGV9IG9uIHRoZSBIZXN0aWEgcGxhdGZvcm0sIHlvdSBtdXN0IHVzZSAke2NvZGUoYEBpZD0ke3BhcmFtcz8ubm9kZT8uaWR9YCl9IGluc3RlYWQuXG4gICAgT3RoZXJ3aXNlIHlvdSBtdXN0IGluY2x1ZGUgYSBmdWxsICR7cGFyYW1zPy5ub2RlPy50eXBlfSB3aXRoIGlkICR7Y29kZShwYXJhbXM/Lm5vZGU/LmlkKX0uYCxcbiAgJ211c3QgYmUgd2l0aGluIHRoZSBjb3VudHJ5JzogKCkgPT4gYFRoZSBjb3VudHJ5IHByb3ZpZGVkIGRvZXMgbm90IGNvbnRhaW4gdGhlIHJlZ2lvbiBwcm92aWRlZC4gUGxlYXNlIGNoZWNrXG4gIHRoZSBjb3VudHJ5IGZvciBlcnJvcnMgb3IgdGhlIHJlZ2lvbiBmb3IgZXJyb3JzLCBhbmQgcmVmZXJlbmNlIHRoZSAke2dsb3NzYXJ5TGluaygnR2xvc3Nhcnkgb2YgVGVybXMnKX0uYCxcbiAgW21hcEVycm9yTWVzc2FnZV06ICh7IGRhdGFQYXRoIH0pID0+XG4gICAgZGF0YVBhdGggPT09ICcucmVnaW9uJyA/IGBUaGUgcmVnaW9uIHByb3ZpZGVkIGRvZXMgbm90IGNvbnRhaW4gdGhlIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgcHJvdmlkZWQuIFBsZWFzZSBjaGVjayB0aGVcbiAgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBmb3IgZXJyb3JzIG9yIHRoZSByZWdpb24gZm9yIGVycm9yLCBhbmQgcmVmZXJlbmNlIHRoZSAke2dsb3NzYXJ5TGluaygnR2xvc3Nhcnkgb2YgVGVybXMnKX0uYCA6XG4gICAgYFRoZSBjb3VudHJ5IHByb3ZpZGVkIGRvZXMgbm90IGNvbnRhaW4gdGhlIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgcHJvdmlkZWQuIFBsZWFzZSBjaGVjayB0aGUgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZVxuICBmb3IgZXJyb3JzIG9yIHRoZSBjb3VudHJ5IGZvciBlcnJvcnMsIGFuZCByZWZlcmVuY2UgdGhlICR7Z2xvc3NhcnlMaW5rKCdHbG9zc2FyeSBvZiBUZXJtcycpfS5gLFxuICAnc3VtIG5vdCBlcXVhbCB0byAxMDAlIGZvciBzYW5kQ29udGVudCwgc2lsdENvbnRlbnQsIGNsYXlDb250ZW50JzpcbiAgICAoKSA9PiBgVGhlIHN1bSBvZiBTYW5kLCBTaWx0LCBhbmQgQ2xheSBjb250ZW50IHNob3VsZCBlcXVhbCAxMDAlIGZvciBlYWNoIHNvaWwgZGVwdGggaW50ZXJ2YWwuYCxcbiAgJ2lzIG91dHNpZGUgdGhlIGFsbG93ZWQgcmFuZ2UnOiAoeyBwYXJhbXMgfSwgZXJyb3JDb3VudCkgPT5cbiAgICBgJHtcbiAgICAgIGVycm9yQ291bnQgPT09IDFcbiAgICAgICAgPyBwYXJhbXM/LnRlcm1cbiAgICAgICAgICAgID8gYFRoZSB2YWx1ZSBmb3IgJHtjb2RlKHBhcmFtcz8udGVybVsnQGlkJ10gfHwgcGFyYW1zPy50ZXJtLm5hbWUpfSBpcyBvdXRzaWRlIHRoZSByYW5nZSBlc3RhYmxpc2hlZCBmb3IgdGhlIHNvaWwgdGV4dHVyZSB5b3UgcHJvdmlkZWQuXG4gICAgICAgICAgICBGb3IgdGhpcyBzb2lsIHRleHR1cmUsIHRoZSBtYXhpbXVtICR7Y29kZShwYXJhbXM/LnRlcm1bJ0BpZCddIHx8IHBhcmFtcz8udGVybS5uYW1lKX0gaXMgJHtwYXJhbXM/LnJhbmdlPy5tYXh9IGFuZCB0aGUgbWluaW11bSBpcyAke3BhcmFtcz8ucmFuZ2U/Lm1pbn0uYFxuICAgICAgICAgICAgOiBgRG9lcyBub3QgbWF0Y2ggdGhlIHBvc3NpYmxlIHJhbmdlcyBvZiBzYW5kLCBzaWx0IGFuZCBjbGF5IGNvbnRlbnQuYFxuICAgICAgICA6IGBFYWNoIHNvaWwgdGV4dHVyZSBoYXMgYSBtYXhpbXVtIGFuZCBtaW5pbXVtIHZhbHVlIGZvciBzYW5kLCBzaWx0LCBhbmQgY2xheSBjb250ZW50LlxuICAgICAgICBBdCBsZWFzdCBvbmUgbWVhc3VyZW1lbnQgb2Ygc2FuZCwgc2lsdCwgb3IgY2xheSBjb250ZW50IGRvZXMgbm90IG1hdGNoIHRoZSBwb3NzaWJsZSByYW5nZSBmb3IgdGhlIHNwZWNpZmllZCBzb2lsIHRleHR1cmUuYFxuICAgIH1cbiAgICAke1xuICAgICAgZXJyb3JDb3VudCA9PT0gMVxuICAgICAgICA/IGBQbGVhc2UgY2hlY2sgdGhlIG1lYXN1cmVtZW50LCBpdHMgZGVwdGggaW50ZXJ2YWxzLCBhbmQgdGhlIGRhdGVzIG9mIHRoZSBtZWFzdXJlbWVudCBvciB1cGRhdGUgdGhlIHNvaWwgdGV4dHVyZSBpZiBuZWVkZWQuYFxuICAgICAgICA6IGBQbGVhc2UgY2hlY2sgeW91ciBtZWFzdXJlbWVudHMsIHRoZWlyIGRlcHRoIGludGVydmFscywgYW5kIHRoZSBkYXRlcyBvZiB0aGUgbWVhc3VyZW1lbnRzIG9yIHVwZGF0ZSB0aGUgc29pbCB0ZXh0dXJlcyBpZiBuZWVkZWQuYFxuICAgIH1gLFxuICAnc2hvdWxkIGJlIGVxdWFsIHRvIG9uZSBvZiB0aGUgYWxsb3dlZCB2YWx1ZXMnOlxuICAgICh7IHBhcmFtcyB9KSA9PiBgbXVzdCBoYXZlIG9uZSBvZiB0aGVzZSB2YWx1ZXM6ICR7cGFyYW1zPy5hbGxvd2VkVmFsdWVzLm1hcChjb2RlKS5qb2luKCcsICcpfWAsXG4gICdpcyBub3QgYWxsb3dlZCBmb3IgdGhpcyBjaGFyYWN0ZXJpc2VkSW5kaWNhdG9yJzogKHsgcGFyYW1zIH0sIGVycm9yQ291bnQpID0+XG4gICAgYCR7ZXJyb3JDb3VudCA9PT0gMSA/XG4gICAgICBgJHtcbiAgICAgICAgcGFyYW1zPy5hbGxvd2VkVmFsdWVzLmxlbmd0aCA/XG4gICAgICAgICAgYGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBvbmUgb2YgdGhlc2UgbWV0aG9kczogJHtwYXJhbXM/LmFsbG93ZWRWYWx1ZXMubWFwKGNvZGUpLmpvaW4oJywgJyl9YCA6XG4gICAgICAgICAgYGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIGFueSBtZXRob2QgYWxsb3dlZC4gUGxlYXNlICR7Y29udGFjdFVzTGluaygpfSB0byBjaGFuZ2UgdGhpcy5gXG4gICAgICB9LmAgOlxuICAgICAgYFNvbWUgVGVybXMgYXJlIG5vdCBhbGxvd2VkIHdpdGggdGhlIG1ldGhvZCB5b3Ugc2VsZWN0ZWQuYH1cbiAgICBZb3UgY2FuIGZpbmQgdGhlIGxpc3Qgb2YgYWxsb3dlZCBtZXRob2RzIGZvciBlYWNoIFRlcm0gYnkgY2xpY2tpbmcgb24gdGhlbS5gLFxuICAnc2hvdWxkIGNvbnRhaW4gYSB2YWxpZCBpdGVtJzogKHsgZGF0YVBhdGggfSkgPT4ge1xuICAgIGNvbnN0IHBhdGhzID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aCEpO1xuICAgIHJldHVybiBwYXRocy5sZW5ndGggPj0gMiA/XG4gICAgICBgVGhlICR7cGF0aHNbcGF0aHMubGVuZ3RoIC0gMV0ucGF0aH0gcmVsYXRlZCB0byB0aGlzICR7cGx1cmFsaXplKHBhdGhzW3BhdGhzLmxlbmd0aCAtIDJdLmxhYmVsLCAxKX0gYXJlIGludmFsaWRgIDpcbiAgICAgIGBUaGUgJHtwYXRoc1swXS5wYXRofSBhcmUgaW52YWxpZGA7XG4gIH0sXG4gICdtYXkgYmUgYmV0d2VlbiAwIGFuZCAxMDAnOiAoKSA9PiAncGVyY2VudGFnZXMgc2hvdWxkIGJlIGJldHdlZW4gMCBhbmQgMTAwLCBub3QgMCBhbmQgMS4gVGhpcyBtYXkgYmUgYW4gZXJyb3IuJyxcbiAgJ21heSBub3QgYWxsIGJlIHNldCB0byBmYWxzZSc6ICgpID0+XG4gICAgYEV2ZXJ5IHZhbHVlIGluIHRoZSBkYXRhIGNvbXBsZXRlbmVzcyBhc3Nlc3NtZW50IGlzICR7Y29kZSgnZmFsc2UnKX0uIFlvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gZmlsbCBpdCBpbi5cbiAgRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBmaWxsIGl0IGluLCBwbGVhc2Ugc2VlIHRoZSAke3NjaGVtYUxpbmsoJ0N5Y2xlI2NvbXBsZXRlbmVzcycsICdzY2hlbWEnKX0uYCxcbiAgJ21heSBub3QgYmUgZW1wdHknOiAoKSA9PiAnaWYgdGhpcyB2YWx1ZSBzaWduaWZpZXMgbm8gZGF0YSwgSGVzdGlhIG9ubHkgYWNjZXB0cyBcIi1cIiBvciBlbXB0eSBmb3Igbm8gZGF0YScsXG4gICdtYXkgbm90IGJlIDAnOiAoeyBkYXRhUGF0aCB9LCBlcnJvckNvdW50KSA9PiB7XG4gICAgY29uc3QgcGF0aHMgPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoISk7XG4gICAgcmV0dXJuIGBBZGRpbmcgYSB2YWx1ZSAke2Vycm9yQ291bnQgPT09IDEgPyBgIHRvIGV2ZXJ5ICR7cGF0aHNbMF0ubGFiZWx9IGAgOiAnICd9IGlzIGhpZ2hseSByZWNvbW1lbmRlZFxuICAgICAgYXMgd2l0aG91dCB0aGlzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYWxjdWxhdGUgdGhlIEltcGFjdCBBc3Nlc3NtZW50LlxuICAgICAgSWYgdGhlIGFtb3VudCBwcm9kdWNlZCBpcyB6ZXJvLCB3ZSByZWNvbW1lbmQgc2V0dGluZyB2YWx1ZSB0byAwLmA7XG4gIH0sXG4gICd0aGUgc3VtIG9mIGFib3ZlIGdyb3VuZCBjcm9wIHJlc2lkdWUgYW5kIGJlbG93IGdyb3VuZCBjcm9wIHJlc2lkdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyc6ICgpID0+XG4gICAgYEZvciBzaXRlcyBvZiB0eXBlICR7Y29kZShTaXRlU2l0ZVR5cGUuY3JvcGxhbmQpfSBvciAke2NvZGUoU2l0ZVNpdGVUeXBlWydwZXJtYW5lbnQgcGFzdHVyZSddKX0sXG4gICAgaWYgZGF0YSBjb21wbGV0ZW5lc3MgaXMgbWFya2VkIHRydWUgZm9yIGNyb3AgcmVzaWR1ZSxcbiAgICB0aGUgc3VtIG9mIHRoZSBBYm92ZSBncm91bmQgY3JvcCByZXNpZHVlIHRlcm1zIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVybyxcbiAgICBhbmQgQmVsb3cgZ3JvdW5kIGNyb3AgcmVzaWR1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHplcm8uYCxcbiAgJ2xvbmdGYWxsb3dQZXJpb2QgbXVzdCBiZSBsb3dlciB0aGFuIDUgeWVhcnMnOiAoKSA9PlxuICAgIGBZb3VyIGxvbmdGYWxsb3dQZXJpb2QgaXMgZ3JlYXRlciB0aGFuIGZpdmUgeWVhcnMuXG4gICAgRmFsbG93IGlzIGRlZmluZWQgYnkgRkFPU1RBVCBhcyBsYW5kIGxlZnQgdW5jdWx0aXZhdGVkIGZvciBiZXR3ZWVuIDEgYW5kIDUgeWVhcnMsXG4gICAgYW5kIHRoaXMgZGVmaW5pdGlvbiBpcyB1c2VkIGZvciBIZXN0aWEgYWxzby5gLFxuICAnc2hvdWxkIGJlIHdpdGhpbiBwZXJjZW50YWdlIG9mIGRlZmF1bHQgdmFsdWUnOiAoeyBwYXJhbXMgfSwgZXJyb3JDb3VudCkgPT5cbiAgICBlcnJvckNvdW50ID09PSAxID9cbiAgICAgIGBpcyDCsSR7dGhyZXNob2xkKHBhcmFtcz8udGhyZXNob2xkKX0gZGlmZmVyZW50IHRvIG91ciBkZWZhdWx0IHZhbHVlIHdoaWNoIGlzICR7cGFyYW1zPy5kZWZhdWx0fS5cbiAgICAgIFBsZWFzZSBjaGVjayB5b3VyIHVwbG9hZGVkIGRhdGEgYXMgdGhpcyBtYXkgYmUgYW4gZXJyb3IuYCA6XG4gICAgICBgaXMgc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQgdGhhbiBvdXIgZGVmYXVsdCB2YWx1ZS4gUGxlYXNlIGNoZWNrIHlvdXIgdXBsb2FkZWQgZGF0YSBhcyB0aGlzIG1heSBiZSBhbiBlcnJvci5gLFxuICAndGhlIHZhbHVlIHByb3ZpZGVkIGlzIG5vdCBjb25zaXN0ZW50IHdpdGggdGhlIG1vZGVsIHJlc3VsdCc6ICh7IHBhcmFtcyB9LCBlcnJvckNvdW50KSA9PlxuICAgIGBUaGUgZXhwZWN0ZWQgcmVzdWx0IGZvciAke2NvZGUocGFyYW1zPy50ZXJtLm5hbWUpfVxuICAgICR7cGFyYW1zPy5tb2RlbD8ubmFtZSA/IGB1c2luZyAke21vZGVsTGluayhwYXJhbXM/LnRlcm0sIHBhcmFtcz8ubW9kZWwpfSBgIDogJyd9XG4gICAgZnJvbSB0aGUgZGF0YSBwcm92aWRlZCBpbiB0aGUgdXBsb2FkIGlzICR7XG4gICAgICBlcnJvckNvdW50ID09PSAxXG4gICAgICAgID8gYCR7Y29kZSh0b1ByZWNpc2lvbihwYXJhbXM/LmV4cGVjdGVkLCAzKSl9LCBidXQgdGhlIHZhbHVlIGluIHRoZSB1cGxvYWQgaXMgJHtjb2RlKHRvUHJlY2lzaW9uKHBhcmFtcz8uY3VycmVudCwgMykpfS5cbiAgICAgICAgJHtwYXJhbXM/LnRocmVzaG9sZCA/IGBPdXIgdGhyZXNob2xkIGlzIMKxJHt0aHJlc2hvbGQocGFyYW1zPy50aHJlc2hvbGQpfS5gIDogJyd9XG4gICAgICAgIFBsZWFzZSBlaXRoZXI6XG4gICAgICAgIDx1bCBjbGFzcz1cImlzLXBsLTMgaXMtbGlzdC1zdHlsZS1kZWNpbWFsXCI+XG4gICAgICAgIDxsaT5DaGVjayB0aGUgJHtwYXJhbXM/LnRlcm0udGVybVR5cGV9IHZhbHVlIHlvdSBwcm92aWRlZDs8L2xpPlxuICAgICAgICA8bGk+Q2hlY2sgdGhlIGRhdGEgeW91IHByb3ZpZGVkIHdoaWNoIGlzIHRoZSBpbnB1dCBpbnRvIHRoaXMgbW9kZWw7PC9saT5cbiAgICAgICAgPGxpPkNhcmVmdWxseSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIHRvIHVuZGVyc3RhbmQgaWYgd2UgdXNlZCBhIGRlZmF1bHQgcHJvcGVydHkgYXMgcGFydCBvZiB0aGUgY2FsY3VsYXRpb25zLjwvbGk+XG4gICAgICAgIDwvdWw+YFxuICAgICAgICA6ICdub3QgY29uc2lzdGVudCB3aXRoIHRoZSBtb2RlbCByZXN1bHQuJ1xuICAgIH1gLFxuICAndGhlIG1lYXN1cmVtZW50IHByb3ZpZGVkIG1pZ2h0IGJlIGluIGVycm9yJzogKHsgcGFyYW1zIH0sIGVycm9yQ291bnQpID0+XG4gICAgYFRoZSBleHBlY3RlZCB2YWx1ZSBmb3IgJHtjb2RlKHBhcmFtcz8udGVybS5uYW1lKX1cbiAgICAke3BhcmFtcz8ubW9kZWw/Lm5hbWUgPyBgdXNpbmcgJHttb2RlbExpbmsocGFyYW1zPy50ZXJtLCBwYXJhbXM/Lm1vZGVsKX0gYCA6ICcnfVxuICAgIGZyb20gdGhlIGRhdGEgcHJvdmlkZWQgaW4gdGhlIHVwbG9hZCBpcyAke1xuICAgICAgZXJyb3JDb3VudCA9PT0gMSA/XG4gICAgICAgIGAke2NvZGUodG9QcmVjaXNpb24ocGFyYW1zPy5leHBlY3RlZCwgMykpfSwgYnV0IHRoZSB2YWx1ZSBpbiB0aGUgdXBsb2FkIGlzICR7Y29kZSh0b1ByZWNpc2lvbihwYXJhbXM/LmN1cnJlbnQsIDMpKX0uXG4gICAgICAgICR7cGFyYW1zPy50aHJlc2hvbGQgPyBgT3VyIHRocmVzaG9sZCBpcyDCsSR7dGhyZXNob2xkKHBhcmFtcz8udGhyZXNob2xkKX0uYCA6ICcnfWAgOlxuICAgICAgICBgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgbW9kZWwgcmVzdWx0LmBcbiAgICB9YCxcbiAgJ211c3QgYmUgZXF1YWwgdG8gcHJldmlvdXMgcHJvZHVjdCBtdWx0aXBsaWVkIGJ5IHRoZSBzaGFyZSc6ICgpID0+XG4gICAgYFByb2R1Y3RzIGZyb20gYSB0cmFuc2Zvcm1hdGlvbiB3aGljaCBhcmUgYW4gSW5wdXQgaW4gdG8gdGhlIG5leHQgdHJhbnNmb3JtYXRpb24gbXVzdCBmb2xsb3cgdGhlIGZvbGxvd2luZyBydWxlOlxuICAgICR7Y29kZSgncHJldmlvdXMucHJvZHVjdC52YWx1ZSAqIGN1cnJlbnQudHJhbnNmb3JtZWRTaGFyZSAvIDEwMCA9PSBjdXJyZW50LmlucHV0LnZhbHVlJyl9YCxcbiAgJ2F0IGxlYXN0IG9uZSBJbnB1dCBtdXN0IGJlIGEgUHJvZHVjdCBvZiB0aGUgQ3ljbGUnOiAoKSA9PlxuICAgIGBBIFRyYW5zZm9ybWF0aW9uIGNvbnZlcnRzIGEgUHJvZHVjdCBmcm9tIGEgQ3ljbGUgaW50byBhbm90aGVyIFByb2R1Y3QuXG4gICAgVGhlcmVmb3JlLCBhdCBsZWFzdCBvbmUgSW5wdXQgaW50byB0aGUgVHJhbnNmb3JtYXRpb24gbXVzdCBiZSBhIFByb2R1Y3Qgb2YgdGhlIEN5Y2xlLmAsXG4gICdtdXN0IGhhdmUgb25seSBvbmUgZW50cnkgd2l0aCB0aGUgc2FtZSB0ZXJtLnRlcm1UeXBlID0gZXhjcmV0YU1hbmFnZW1lbnQnOiAoKSA9PlxuICAgIGBUaGVyZSBjYW4gb25seSBiZSBvbmUgUHJhY3RpY2Ugb2YgdHlwZSBleGNyZXRhTWFuYWdlbWVudCBpbiBhIEN5Y2xlLlxuICAgIFRvIHJlcHJlc2VudCBtdWx0aXBsZSBleGNyZXRhIG1hbmFnZW1lbnQgc3lzdGVtcyBlaXRoZXIgdXNlIG11bHRpcGxlIEN5Y2xlcyBhbmQgbGluayB0aGVtIHRvZ2V0aGVyLFxuICAgIG9yIHVzZSBUcmFuc2Zvcm1hdGlvbnMgd2l0aGluIGEgQ3ljbGUgYW5kIGxpbmsgdGhvc2UgdG9nZXRoZXIuYCxcbiAgJ211c3QgYmUgaW5jbHVkZWQgYXMgYW4gSW5wdXQnOiAoeyBwYXJhbXMgfSwgZXJyb3JDb3VudCkgPT5cbiAgICBgVGhlIGV4Y3JldGEgUHJvZHVjdHMgYXJlIG5vdCBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBleGNyZXRhIElucHV0cy5cbiAgICAke1xuICAgICAgZXJyb3JDb3VudCA9PT0gMSA/XG4gICAgICAgIGBFLmcuLCB5b3UgY2Fubm90IGdldCAke1xuICAgICAgICAgIGNvZGUocGFyYW1zPy50ZXJtPy5uYW1lKVxuICAgICAgICB9IGZyb20gJHtcbiAgICAgICAgICAocGFyYW1zPy5leHBlY3RlZCB8fCBbXSkubWFwKHYgPT4gY29kZShrZXlUb0xhYmVsKHYpKSkuam9pbignIG9yICcpXG4gICAgICAgIH0uYCA6XG4gICAgICAgICcnXG4gICAgfVxuICAgIFBsZWFzZSBjaGVjayB0aGUgSW5wdXRzIGFuZCBQcm9kdWN0cyBvZiB0aGUgVHJhbnNmb3JtYXRpb24uYCxcbiAgJ211c3QgYWRkIHRoZSBsaW5rZWQgaW5wdXRzIHRvIHRoZSBjeWNsZSc6ICh7IHBhcmFtcyB9LCBlcnJvckNvdW50KSA9PlxuICAgIGAke1xuICAgICAgZXJyb3JDb3VudCA9PT0gMSA/XG4gICAgICAgIGBZb3UgaGF2ZSBzdGF0ZWQgdGhhdCAke2NvZGUocGFyYW1zPy50ZXJtPy5uYW1lKX0gd2FzIGNyZWF0ZWQgYnkgdGhlIGZvbGxvd2luZyBJbnB1dHMgJHtcbiAgICAgICAgICBwYXJhbXM/LmV4cGVjdGVkPy5tYXAoZSA9PiBjb2RlKGUubmFtZSkpLmpvaW4oJyAsICcpXG4gICAgICAgIH1gOlxuICAgICAgICAnWW91IGhhdmUgc3RhdGVkIHNvbWUgRW1pc3Npb25zIHdlcmUgY3JlYXRlZCBieSBzb21lIElucHV0cydcbiAgICB9LlxuICAgIEhvd2V2ZXIsIHRoZXNlIElucHV0cyBkbyBub3QgZXhpc3QgaW4gdGhlIEN5Y2xlLlxuICAgIFBsZWFzZSBhZGQgdGhlc2UgSW5wdXRzLCBldmVuIGlmIHlvdSBkbyBub3QgaGF2ZSBhIHZhbHVlIGZvciB0aGVtLmAsXG4gICdtdXN0IGFkZCB0aGUgbGlua2VkIHRyYW5zZm9ybWF0aW9ucyB0byB0aGUgY3ljbGUnOiAoeyBsZXZlbCwgcGFyYW1zIH0sIGVycm9yQ291bnQpID0+XG4gICAgYCR7XG4gICAgICBlcnJvckNvdW50ID09PSAxID9cbiAgICAgICAgYFlvdSBoYXZlIHNwZWNpZmllZCB0aGF0JHtjb2RlKHBhcmFtcz8udGVybT8ubmFtZSl9IHdhcyBjcmVhdGVkIGR1cmluZyBhIFRyYW5zZm9ybWF0aW9uIHdpdGggdGhlIFRlcm0gbmFtZSAke2NvZGUocGFyYW1zPy5leHBlY3RlZD8ubmFtZSl9YCA6XG4gICAgICAgICdZb3UgaGF2ZSBzdGF0ZWQgc29tZSBFbWlzc2lvbnMgd2VyZSBjcmVhdGVkIGJ5IHNvbWUgVHJhbnNmb3JtYXRpb25zJ1xuICAgIH0uXG4gICAgSG93ZXZlciwgd2UgY2Fubm90IGZpbmQgYSBUcmFuc2Zvcm1hdGlvbiB3aXRoaW4gdGhlIEN5Y2xlIHdpdGggdGhpcyBUZXJtIG5hbWUuXG4gICAgJHtcbiAgICAgIGxldmVsID09PSAnZXJyb3InID9cbiAgICAgICAgJ1BsZWFzZSBjaGVjayB0aGUgVGVybXMgdXNlZCBpbiB0aGUgRW1pc3Npb25zIGFuZC9vciB0aGUgVHJhbnNmb3JtYXRpb25zLicgOlxuICAgICAgICAnWW91IG1heSB3YW50IHRvIGFkZCB0aGlzIFRyYW5zZm9ybWF0aW9uLidcbiAgICB9YCxcbiAgJ2V2ZXJ5IGl0ZW0gaW4gdGhlIGxpc3Qgc2hvdWxkIGJlIHVuaXF1ZSc6ICh7IHBhcmFtcyB9KSA9PlxuICAgIGBUaGlzIEJsYW5rIE5vZGUgaXMgZHVwbGljYXRlZC4gRXZlcnkgQmxhbmsgTm9kZSBzaG91bGQgYmUgdW5pcXVlLlxuICAgIFVuaXF1ZW5lc3MgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZm9sbG93aW5nIGZpZWxkczogJHtcbiAgICAgIChwYXJhbXM/LmtleXMgfHwgW10pLm1hcChjb2RlKS5qb2luKCcsICcpXG4gICAgfWAsXG4gICdtdXN0IGNvbnRhaW4gYXMgbWFueSBpdGVtcyBhcyB2YWx1ZXMnOiAoeyBwYXJhbXMsIGRhdGFQYXRoIH0pID0+XG4gICAgYFRoZSBudW1iZXIgb2YgJHtjb2RlKGRhdGFQYXRoLnNwbGl0KCcuJykucG9wKCkpfSBtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgJHtjb2RlKCd2YWx1ZScpfS5cbiAgICBDdXJyZW50bHkgdGhlcmUgYXJlICR7cGFyYW1zPy5jdXJyZW50fSAke2NvZGUoZGF0YVBhdGguc3BsaXQoJy4nKS5wb3AoKSl9IGJ1dCAke3BhcmFtcz8uZXhwZWN0ZWR9ICR7Y29kZSgndmFsdWUnKX0uYCxcbiAgJ2lzIHRvbyBnZW5lcmljJzogKHsgcGFyYW1zIH0pID0+XG4gICAgYFlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgUHJvZHVjdCAke2NvZGUocGFyYW1zPy5wcm9kdWN0Py5uYW1lKX0gaG93ZXZlcixcbiAgICB5b3UgaGF2ZSB1c2VkIGEgZ2VuZXJpYyAke2dsb3NzYXJ5VHlwZUxpbmsocGFyYW1zPy50ZXJtPy50ZXJtVHlwZSl9IHRlcm0gJHtjb2RlKHBhcmFtcz8udGVybT8ubmFtZSl9LlxuICAgIFVzZSBhIG1vcmUgc3BlY2lmaWMgdGVybSBmb3IgdGhlICR7XG4gICAgICBnbG9zc2FyeVR5cGVMaW5rKHBhcmFtcz8udGVybT8udGVybVR5cGUpXG4gICAgfSB3aGljaCByZWZsZWN0cyB0aGUgc3BlY2lmaWMgJHtcbiAgICAgIGdsb3NzYXJ5VHlwZUxpbmsocGFyYW1zPy5wcm9kdWN0Py50ZXJtVHlwZSlcbiAgICB9LmAsXG4gICdpcyBtaXNzaW5nIHJlcXVpcmVkIGJpYmxpb2dyYXBoaWMgaW5mb3JtYXRpb24nOiAoKSA9PlxuICAgIGBUaGUgYXV0b21hdGljIGJpYmxpb2dyYXBoeSBzZWFyY2ggZmFpbGVkIGZvciB0aGlzIEJpYmxpb2dyYXBoeS4gRWl0aGVyOlxuICAgIDx1bCBjbGFzcz1cImlzLXBsLTMgaXMtbGlzdC1zdHlsZS1kZWNpbWFsXCI+XG4gICAgPGxpPk1hbnVhbGx5IGZpbGwtaW4gdGhlIDxiPnJlcXVpcmVkPC9iPiBiaWJsaW9ncmFwaGljIGluZm9ybWF0aW9uIGFzIHBlciAke3NjaGVtYUxpbmsoU2NoZW1hVHlwZS5CaWJsaW9ncmFwaHksICdvdXIgc2NoZW1hJyl9LjwvbGk+XG4gICAgPGxpPlByb3ZpZGUgdGhlICR7Y29kZSgnZG9jdW1lbnRET0knKX0gYXMgd2VsbCBhcyB0aGUgJHtjb2RlKCd0aXRsZScpfS48L2xpPlxuICAgIDxsaT5DaGVjayB0aGUgJHtjb2RlKCdkb2N1bWVudERPSScpfSBhbmQgJHtjb2RlKCd0aXRsZScpfSBmb3IgdHlwb3MgYWdhaW5zdCB0aGUgJHtleHRlcm5hbExpbmsoJ2h0dHBzOi8vd3d3Lm1lbmRlbGV5LmNvbScsICdNZW5kZWxleSBjYXRhbG9ndWUnKX0uPC9saT5cbiAgICA8L3VsPmAsXG4gICdzaG91bGQgYmUgbG93ZXIgdGhhbiBtYXggc2l6ZSc6ICh7IHBhcmFtcyB9KSA9PlxuICAgIGBUaGUgYm91bmRhcnkgb3IgcmVnaW9uIGlzID4ke3BhcmFtcz8uZXhwZWN0ZWR9a20yIGFuZCBpcyB0b28gbGFyZ2UgdG8gcmVsaWFibHkgZ2FwIGZpbGwgTWVhc3VyZW1lbnRzLlxuICAgIElmIHlvdSBhcmUgYWJsZSB0byB1c2UgYSBtb3JlIHNwZWNpZmljIHJlZ2lvbiwgcGxlYXNlIGRvLmAsXG4gICdhbiBleGNyZXRhIGlucHV0IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgYW4gZXhjcmV0YU1hbmFnZW1lbnQgcHJhY3RpY2UnOiAoeyBkYXRhUGF0aCB9KSA9PiB7XG4gICAgY29uc3QgcGF0aHMgPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoISk7XG4gICAgcmV0dXJuIGBFeGNyZXRhIG1hbmFnZW1lbnQgaXMgdGhlIGNvbnZlcnNpb24gb2YgZXhjcmV0YSB0byBhbm90aGVyIHR5cGUgb2YgZXhjcmV0YS5cbiAgICAgIFlvdSBoYXZlIGFkZGVkIGFuIGV4Y3JldGFNYW5hZ2VtZW50IFByYWN0aWNlIHRvIHRoaXMgJHtwYXRoc1swXS5sYWJlbH0gYnV0IHRoZXJlIGlzIG5vIGV4Y3JldGEgSW5wdXQuXG4gICAgICBUbyByZXByZXNlbnQgZXhjcmV0YSBtYW5hZ2VtZW50LCB1c2UgYSAke3BhdGhzWzBdLmxhYmVsfSB3aXRoIGV4Y3JldGEgYXMgYW4gSW5wdXQgYW5kIGV4Y3JldGFNYW5hZ2VtZW50IGFzIGEgUHJhY3RpY2UuYDtcbiAgfSxcbiAgJ29ubHkgMSBwcmltYXJ5IHByb2R1Y3QgYWxsb3dlZCc6ICgpID0+ICdUaGVyZSBjYW4gb25seSBiZSBvbmUgcHJpbWFyeSBwcm9kdWN0IGluIGVhY2ggQ3ljbGUuJyxcbiAgJ2lzIG5vdCBhbGxvd2VkIGluIGNvbWJpbmF0aW9uIHdpdGggbm9UaWxsYWdlJzogKCkgPT5cbiAgICBgVGhpcyBvcGVyYXRpb24gaW52b2x2ZXMgdGlsbGFnZSwgeWV0IHlvdSBoYXZlIHNwZWNpZmllZCB0aGUgUHJhY3RpY2UgJHt0ZXJtTGluayhub1RpbGxhZ2UpfS5cbiAgICBFaXRoZXIgY2hhbmdlIHRoaXMgb3BlcmF0aW9uIG9yIHRoZSBQcmFjdGljZS5gLFxuICAnc2hvdWxkIGNvbnRhaW4gYSB0aWxsYWdlIHByYWN0aWNlJzogKCkgPT5cbiAgICBgV2UgcmVjb21tZW5kIHNwZWNpZnlpbmcgdGhlIHR5cGUgb2YgdGlsbGFnZSB1c2VkIGZvciB0aGlzIEN5Y2xlLlxuICAgIFBsZWFzZSBzZWUgdGhlICR7Z2xvc3NhcnlUeXBlTGluayhUZXJtVGVybVR5cGUudGlsbGFnZSl9IGdsb3NzYXJ5LmAsXG4gICdtdXN0IHNldCB2YWx1ZSBmb3IgZXZlcnkgdGlsbGFnZSBwcmFjdGljZSc6ICgpID0+XG4gICAgYEVpdGhlciBzcGVjaWZ5IGEgc2luZ2xlICR7Z2xvc3NhcnlUeXBlTGluayhUZXJtVGVybVR5cGUudGlsbGFnZSl9IHByYWN0aWNlIG9yIGFkZCBhIHZhbHVlIHRvIGFsbCBwcmFjdGljZXMuYCxcbiAgJ3N1bSBub3QgZXF1YWwgdG8gMTAwJSBmb3IgdGlsbGFnZSBwcmFjdGljZXMnOiAoKSA9PlxuICAgIGBUaGUgc3VtIG9mICR7Z2xvc3NhcnlUeXBlTGluayhUZXJtVGVybVR5cGUudGlsbGFnZSl9IHByYWN0aWNlcyBtdXN0IGVxdWFsIDEwMCUuYCxcbiAgJ2NhbiBvbmx5IGhhdmUgMSB0aWxsYWdlIHByYWN0aWNlIHdpdGhvdXQgYSB2YWx1ZSc6ICh7IHBhcmFtcyB9KSA9PlxuICAgIGBJdCBpcyBub3QgcG9zc2libGUgZm9yIGEgQ3ljbGUgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIHRpbGxhZ2UgUHJhY3RpY2VzOlxuICAgICR7KHBhcmFtcz8uY3VycmVudCA/PyBbXSkubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSkuam9pbignIGFuZCAnKX0gYXQgdGhlIHNhbWUgdGltZS5cbiAgICBJZiBtdWx0aXBsZSB0aWxsYWdlIHByYWN0aWNlcyBkaWQgb2NjdXIsIHBsZWFzZSBzcGVjaWZ5IHRoZSBwZXJjZW50YWdlIG9mIGFyZWEgdGhleSBvY2N1cnJlZCBvbi5gLFxuICAnY2FuIG5vdCBiZSBsaW5rZWQgdG8gdGhlIHNhbWUgQ3ljbGUnOiAoKSA9PiAnWW91IGNhbiBub3QgbGluayBhbiBJbnB1dCB0byB0aGUgSW1wYWN0IEFzc2Vzc21lbnQgb2YgdGhlIHNhbWUgQ3ljbGUuJyxcbiAgLy8gZGVwcmVjYXRlZCwgcmVtb3ZlIHdoZW4gbWVzc2FnZSBpcyBub3QgYmVpbmcgdXNlZCBhbnltb3JlXG4gICdtdXN0IGJlIDAgZm9yIHByb2R1Y3QgdmFsdWUgMCc6ICh7IGRhdGFQYXRoLCBwYXJhbXMgfSwgZXJyb3JDb3VudCkgPT5cbiAgICBgSWYgdGhlIGFtb3VudCBwcm9kdWNlZCBpcyB6ZXJvLCB0aGUgJHtjb2RlKGRhdGFQYXRoPy5zcGxpdCgnLicpLnBvcCgpISl9IG9mICR7XG4gICAgICBlcnJvckNvdW50ID09PSAxID8gY29kZShwYXJhbXM/LnRlcm0ubmFtZSkgOiAndGhhdCBwcm9kdWN0J1xuICAgIH0gbXVzdCBhbHNvIGJlIHplcm8uYCxcbiAgJ2Vjb25vbWljVmFsdWVTaGFyZSBtdXN0IGJlIDAgZm9yIHByb2R1Y3QgdmFsdWUgMCc6ICh7IHBhcmFtcyB9LCBlcnJvckNvdW50KSA9PlxuICAgIGBJZiB0aGUgYW1vdW50IHByb2R1Y2VkIGlzIHplcm8sIHRoZSBlY29ub21pY1ZhbHVlU2hhcmUgb2YgJHtcbiAgICAgIGVycm9yQ291bnQgPT09IDEgPyBjb2RlKHBhcmFtcz8udGVybS5uYW1lKSA6ICd0aGF0IHByb2R1Y3QnXG4gICAgfSBtdXN0IGFsc28gYmUgemVyby5gLFxuICAncmV2ZW51ZSBtdXN0IGJlIDAgZm9yIHByb2R1Y3QgdmFsdWUgMCc6ICh7IHBhcmFtcyB9LCBlcnJvckNvdW50KSA9PlxuICAgIGBJZiB0aGUgYW1vdW50IHByb2R1Y2VkIGlzIHplcm8sIHRoZSByZXZlbnVlIG9mICR7XG4gICAgICBlcnJvckNvdW50ID09PSAxID8gY29kZShwYXJhbXM/LnRlcm0ubmFtZSkgOiAndGhhdCBwcm9kdWN0J1xuICAgIH0gbXVzdCBhbHNvIGJlIHplcm8uYCxcbiAgJ3Nob3VsZCBhZGQgYSBzb3VyY2UnOiAoeyBwYXJhbXMgfSkgPT5cbiAgICBgV2UgcmVjb21tZW5kIGFkZGluZyBhIFNvdXJjZSB0byBhbGwgZGF0YSBpdGVtcy5cbiAgICBUaGlzIGNhbiBiZSBkb25lIGJ5IGFkZGluZyB0aGUgJHtjb2RlKHBhcmFtcz8uY3VycmVudCl9IGZpZWxkLlxuICAgIFNvdXJjZXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGZvciBlYWNoIGRhdGEgaXRlbSAoaS5lLiwgZWFjaCBJbnB1dCwgRW1pc3Npb24sIFByb2R1Y3QsIFByYWN0aWNlLCBNZWFzdXJlbWVudCwgb3IgSW5mcmFzdHJ1Y3R1cmUpLmAsXG4gICdjb3ZlciBjcm9wIGN5Y2xlIGNvbnRhaW5zIG5vbiBjb3ZlciBjcm9wIHByb2R1Y3QnOiAoKSA9PlxuICAgIGBZb3UgaGF2ZSBzcGVjaWZpZWQgdGhhdCB0aGlzIGNyb3AgaXMgYSBjb3ZlciBjcm9wIHVzaW5nIGEgUHJhY3RpY2UuXG4gICAgQSBjb3ZlciBjcm9wIGlzIGRlZmluZWQgYXMgXCJhIGNyb3Agd2hpY2ggaXMgbGVmdCBpbiB0aGUgZmllbGQgd2l0aG91dCBhbnkgZnJhY3Rpb24gaGFydmVzdGVkIGJ5IHRoZSBlbmQgb2YgdGhlIEN5Y2xlXCIuXG4gICAgVGhlIFByb2R1Y3RzIG9mIHRoaXMgQ3ljbGUgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgY3JvcCBiZWluZyBhIGNvdmVyIGNyb3AuXG4gICAgUGxlYXNlIGNoZWNrIHRoZSBQcm9kdWN0cyBvciB0aGUgUHJhY3RpY2VzLmAsXG4gICdzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGN5Y2xlIHByb2R1Y3RzJzogKHsgcGFyYW1zIH0sIGVycm9yQ291bnQpID0+XG4gICAgYCR7XG4gICAgICBlcnJvckNvdW50ID09PSAxID9cbiAgICAgICAgYFRoZSBQcm9kdWN0ICR7Y29kZShwYXJhbXMucHJvZHVjdC5uYW1lKX0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIEN5Y2xlIHdpdGggaWQgJHtjb2RlKHBhcmFtcy5ub2RlLmlkKX1gIDpcbiAgICAgICAgJ1RoZSBJbXBhY3RBc3Nlc3NtZW50IFByb2R1Y3QgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGxpbmtlZCBDeWNsZSdcbiAgICB9LlxuICAgIFBsZWFzZSBhZGQgdGhlIFByb2R1Y3QgaW4gdGhlIEN5Y2xlIG9yIHJlbW92ZSB0aGUgbGluayB3aXRoIHRoZSBDeWNsZS5gLFxuICAnbXVsdGlwbGUgSW1wYWN0QXNzZXNzbWVudCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1lIFByb2R1Y3Qgb2YgdGhlIHNhbWUgQ3ljbGUnOiAoKSA9PlxuICAgIGBPbmx5IDEgSW1wYWN0IEFzc2Vzc21lbnQgY2FuIGJlIHJlbGF0ZWQgdG8gdGhpcyBQcm9kdWN0LlxuICAgIFBsZWFzZSBtYWtlIHN1cmUgdGhlIHByb2R1Y3QgaXMgY29ycmVjdCBvciB0aGUgY3ljbGUuaWQgeW91IGFyZSByZWZlcnJpbmcgdG8gaXMgY29ycmVjdC5gLFxuICAnbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbGFuZCBvY2N1cGF0aW9uJzogKCkgPT5cbiAgICBgTGFuZCB0cmFuc2Zvcm1hdGlvbiBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGxhbmQgb2NjdXBhdGlvblxuICAgIChsYW5kIHRyYW5zZm9ybWF0aW9uIGlzIHRoZSBhbW91bnQgb2YgbGFuZCBjb252ZXJ0ZWQgYmV0d2VlbiBzb21lIGRhdGUgaW4gdGhlIHBhc3QgYW5kIHRoZSBjdXJyZW50IHllYXIsXG4gICAgZGl2aWRlZCBieSBhbiBhbW9ydGl6YXRpb24gcGVyaW9kLCBzbyBpdCBzaG91bGQgYWx3YXlzIGJlIGxlc3MgdGhhbiBsYW5kIG9jY3VwYXRpb24gYnkgZGVmaW5pdGlvbikuYCxcbiAgJ3Nob3VsZCBiZSBsaW5rZWQgdG8gYW4gZW1pc3Npb24gaW4gdGhlIEN5Y2xlJzogKHsgcGFyYW1zIH0sIGVycm9yQ291bnQpID0+XG4gICAgYCR7XG4gICAgICBlcnJvckNvdW50ID09PSAxID8gYCR7Y29kZShwYXJhbXM/LnRlcm0ubmFtZSl9IGV4aXN0c2AgOiAnU29tZSBFbWlzc2lvbnMgZXhpc3QnXG4gICAgfSBpbiBib3RoIHRoZSBDeWNsZSBhbmQgdGhlIFRyYW5zZm9ybWF0aW9uIGJ1dCAke2Vycm9yQ291bnQgPT09IDEgPyAnaXQgaXMnIDogJ3RoZXkgYXJlJ30gbm90IGxpbmtlZCB1c2luZyAke1xuICAgICAgY29kZSgnY3ljbGUuZW1pc3Npb25zLlgudHJhbnNmb3JtYXRpb24udGVybScpXG4gICAgfS4gVGhpcyBtYXkgYmUgYW4gZXJyb3IuYCxcbiAgJ3Nob3VsZCBhZGQgYW4gYW5pbWFsIHByb2R1Y3Rpb24gc3lzdGVtJzogKCkgPT5cbiAgICBgRm9yIGFuaW1hbCBwcm9kdWN0aW9uIGN5Y2xlcywgd2UgcmVjb21tZW5kIHNwZWNpZnlpbmcgdGhlIGFuaW1hbCBwcm9kdWN0aW9uICR7Z2xvc3NhcnlUeXBlTGluayhUZXJtVGVybVR5cGUuc3lzdGVtKX0gYXMgYSBQcmFjdGljZS5cbiAgICBZb3UgY2FuIGZpbmQgYSBsaXN0IG9mIHN5c3RlbXMgaW4gdGhlICR7Z2xvc3NhcnlUeXBlTGluayhUZXJtVGVybVR5cGUuc3lzdGVtLCAnR2xvc3NhcnknKX0uYCxcbiAgJ211c3QgYmUgc2V0IHRvIGZhbHNlIHdoZW4gc3BlY2lmeWluZyBmdWVsIHVzZSc6ICh7IHBhcmFtcyB9KSA9PlxuICAgIGBJZiBtYWNoaW5lcnkgZnVlbCAoJHtwYXJhbXM/LmFsbG93ZWRWYWx1ZXMubWFwKGNvZGUpLmpvaW4oJywgJyl9KSBpcyB1c2VkIGR1cmluZyBhIEN5Y2xlLFxuICAgIGJ1dCB0aGVyZSBpcyBubyBkYXRhIG9uIHRoZSBhbW91bnQgb2YgJHtnbG9zc2FyeVR5cGVMaW5rKFRlcm1UZXJtVHlwZS5tYXRlcmlhbCl9IHVzZWQgZm9yIGFncmljdWx0dXJhbCBlcXVpcG1lbnQsXG4gICAgdGhlbiAke2NvZGUoJ2NvbXBsZXRlbmVzcy5tYXRlcmlhbCcpfSBtdXN0IGJlICR7Y29kZSgnZmFsc2UnKX0uYCxcbiAgJ211c3QgYmUgYmVsb3cgb3IgZXF1YWwgdG8gMSBmb3IgdW5pdCBpbiBoYSc6ICgpID0+XG4gICAgYFRoZSBtYXhpbXVtIHZhbHVlIGZvciBhIHByb2R1Y3Qgd2l0aCB1bml0cyAke2NvZGUoJ2hhJyl9IG9uIGEgQ3ljbGUgd2l0aCBhICR7XG4gICAgICBzY2hlbWFMaW5rKCdDeWNsZSNmdW5jdGlvbmFsVW5pdCcsICdmdW5jdGlvbmFsIHVuaXQnKVxuICAgIH0gb2YgJHtjb2RlKCcxIGhhJyl9IGlzICR7Y29kZSgnMScpfS5cbiAgICBJZiB5b3UgYXJlIHRyeWluZyB0byBhZGQgYSBwcm9kdWN0IHdpdGggdGhlIHVuaXRzICR7Y29kZSgna2cnKX0sIHVzZSBhIGRpZmZlcmVudCB0ZXJtLmAsXG4gICdwYXN0dXJlR3Jhc3Mga2V5IHVuaXRzIG11c3QgYmUgXFwnaGFcXCcnOiAoeyBwYXJhbXMgfSkgPT5cbiAgICBgVGhlIFRlcm0gJHtjb2RlKHBhcmFtcz8udGVybS5uYW1lKX0gY2FuJ3QgYmUgdXNlZCBhcyBhIGtleSBmb3IgUGFzdHVyZSBncmFzcy5cbiAgICBQbGVhc2UgdXNlIHRoZSBUZXJtIGRlc2NyaWJpbmcgdGhlIHBsYW50IHdpdGggdGhlIHVuaXRzICR7Y29kZShwYXJhbXMuZXhwZWN0ZWQpfSBpbnN0ZWFkLlxuICAgIFRoaXMgd2lsbCBoZWxwIHVzIGdhcC1maWxsIHRoZSBhbW91bnQgb2YgZ3Jhc3MgY29uc3VtZWQgYnkgdGhlIGhlcmQuYCxcbiAgJ2lzIG91dHNpZGUgY29uZmlkZW5jZSBpbnRlcnZhbCc6IChfZXJyb3IsIGVycm9yQ291bnQsIGFsbEVycm9ycykgPT5cbiAgICBgJHt1bmlxdWUoYWxsRXJyb3JzLmZsYXRNYXAoKHsgZGF0YVBhdGgsIHBhcmFtcyB9KSA9PiBwYXJhbXM/Lm91dGxpZXJzPy5tYXAodmFsdWUgPT5cbiAgICAgIGBUaGUgJHtcbiAgICAgICAgZGF0YVBhdGguaW5jbHVkZXMoJ3Byb2R1Y3QnKSA/ICdwcm9kdWN0JyA6ICdpbnB1dCdcbiAgICAgIH0gdmFsdWUgJHtcbiAgICAgICAgZXJyb3JDb3VudCA9PT0gMSA/IGAke2NvZGUodmFsdWUpfSBgIDogJydcbiAgICAgIH1pcyAke1xuICAgICAgICB2YWx1ZSA+IHBhcmFtcz8ubWluID8gJ2Fib3ZlJyA6ICdiZWxvdydcbiAgICAgIH0gJHtcbiAgICAgICAgcGFyYW1zPy50aHJlc2hvbGQgPyBgJHtjb2RlKGAkeyhwYXJhbXMudGhyZXNob2xkICsgKCgxIC0gcGFyYW1zLnRocmVzaG9sZCkgLyAyKSkgKiAxMDB9JWApfSBvZmAgOiAnJ1xuICAgICAgfSBhbGwgJHtcbiAgICAgICAgcGFyYW1zPy5ncm91cCA/IGNvZGUocGFyYW1zLmdyb3VwKSA6IGNvZGUocGFyYW1zPy50ZXJtPy5uYW1lKVxuICAgICAgfSBkYXRhIGluICR7XG4gICAgICAgIGNvZGUocGFyYW1zPy5jb3VudHJ5Lm5hbWUpXG4gICAgICB9IG9uIHRoZSBIZXN0aWEgcGxhdGZvcm0uYFxuICAgICkpKS5qb2luKCc8L2JyPicpfVxuICAgIFBsZWFzZSBkb3VibGUtY2hlY2sgdGhlc2UgdmFsdWVzIGJlZm9yZSBzdWJtaXR0aW5nLmAsXG4gICdzaG91bGQgYmUgZXF1YWwgdG8gYm91bmRhcnknOiAoeyBwYXJhbXMgfSkgPT5cbiAgICBgVGhlIGNhbGN1bGF0ZWQgYXJlYSBmcm9tICR7Y29kZSgnYm91bmRhcnknKX0gaXMgJHtjb2RlKHBhcmFtcz8uZXhwZWN0ZWQpfS5cbiAgICBUaGlzIG1heSBiZSBhbiBlcnJvciBpZiB0aGUgYm91bmRhcnkgcmVwcmVzZW50cyB0aGUgYXJlYSB1bmRlciBjdWx0aXZhdGlvbi5gLFxuICAnbXVzdCBzcGVjaWZ5IHRoZSBmYXRlIG9mIGNyb3BSZXNpZHVlJzogKCkgPT5cbiAgICBgRm9yIHNpdGVzIG9mIHR5cGUgY3JvcGxhbmQgb3IgcGVybWFuZW50IHBhc3R1cmUsIGlmIGRhdGEgY29tcGxldGVuZXNzIGlzIG1hcmtlZCB0cnVlIGZvciBjcm9wIHJlc2lkdWUsXG4gICAgdGhlIGZhdGUgb2YgdGhlIHJlc2lkdWUgbXVzdCBiZSBmdWxseSBzcGVjaWZpZWQuXG4gICAgVGhlIGZhdGUgbXVzdCBiZSBhZGRlZCB1c2luZzpcbiAgICA8dWwgY2xhc3M9XCJpcy1wbC0zIGlzLWxpc3Qtc3R5bGUtZGlzYyBpcy1ub3dyYXBcIj5cbiAgICA8bGk+dGhlICR7Z2xvc3NhcnlUeXBlTGluayhUZXJtVGVybVR5cGUuY3JvcFJlc2lkdWVNYW5hZ2VtZW50KX0gcHJhY3RpY2VzOzwvbGk+XG4gICAgPGxpPnRoZSAke2dsb3NzYXJ5VHlwZUxpbmsoVGVybVRlcm1UeXBlLmNyb3BSZXNpZHVlKX0gcHJvZHVjdHM8L2xpPlxuICAgIDwvdWw+XG4gICAgd2hlcmUgdGhlIHN1bSBvZiBhYm92ZSBncm91bmQgY3JvcCByZXNpZHVlIGFuZCBiZWxvdyBncm91bmQgY3JvcCByZXNpZHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm87XG4gICAgYCxcbiAgJ3Nob3VsZCBzcGVjaWZ5IHRoZSBmYXRlIG9mIGNyb3BSZXNpZHVlJzogKCkgPT5cbiAgICBgXG4gICAgWW91IGhhdmUgbm90IHNwZWNpZmllZCB0aGUgZmF0ZSBvZiB0aGUgY3JvcCByZXNpZHVlLlxuICAgIEFkZGluZyB0aGlzIGluZm9ybWF0aW9uIHdpbGwgaW1wcm92ZSBlbWlzc2lvbnMgYW5kIHNvaWwgY2FyYm9uIHN0b2NrIGNhbGN1bGF0aW9ucy5cbiAgICBUaGUgZmF0ZSBjYW4gYmUgYWRkZWQgdXNpbmc6XG4gICAgPHVsIGNsYXNzPVwiaXMtcGwtMyBpcy1saXN0LXN0eWxlLWRpc2MgaXMtbm93cmFwXCI+XG4gICAgPGxpPnRoZSAke2dsb3NzYXJ5VHlwZUxpbmsoVGVybVRlcm1UeXBlLmNyb3BSZXNpZHVlTWFuYWdlbWVudCl9IHByYWN0aWNlczs8L2xpPlxuICAgIDxsaT50aGUgJHtnbG9zc2FyeVR5cGVMaW5rKFRlcm1UZXJtVHlwZS5jcm9wUmVzaWR1ZSl9IHByb2R1Y3RzOzwvbGk+XG4gICAgPC91bD5cbiAgICBSZW1lbWJlciB0byBzZXQgJHtjb2RlKCdjb21wbGV0ZW5lc3MuY3JvcFJlc2lkdWUnKX0gdG8gJHtjb2RlKCd0cnVlJyl9XG4gICAgaWYgdGhlIGFib3ZlIGFuZCBiZWxvdyBncm91bmQgY3JvcCByZXNpZHVlIHF1YW50aXRpZXMgYW5kIGZhdGVzIGFyZSBzcGVjaWZpZWQuXG4gICAgYCxcbiAgJ3Nob3VsZCBoYXZlIHRoZSBzYW1lIHByaXZhY3kgYXMgdGhlIHJlbGF0ZWQgc291cmNlJzogKHsgcGFyYW1zIH0pID0+XG4gICAgYFRvIGxpbmsgdG8gYSAke3BhcmFtcz8uZGVmYXVsdFNvdXJjZT8uZGF0YVByaXZhdGUgPyAncHJpdmF0ZScgOiAncHVibGljJ30gU291cmNlLFxuICAgIHRoaXMgTm9kZSBuZWVkcyB0byBiZSAke3BhcmFtcz8uZGVmYXVsdFNvdXJjZT8uZGF0YVByaXZhdGUgPyAncHJpdmF0ZScgOiAncHVibGljJ30gYXMgd2VsbC5cbiAgICBQbGVhc2Ugc2V0ICR7Y29kZSgnZGF0YVByaXZhdGUnKX09JHtjb2RlKGAke3BhcmFtcz8uZGVmYXVsdFNvdXJjZT8uZGF0YVByaXZhdGV9YCl9LmAsXG4gICdzaG91bGQgbm90IHVzZSBub3QgcmVsZXZhbnQgbW9kZWwnOiAoKSA9PlxuICAgIGBBbGwgZW1pc3Npb25zIHNob3VsZCBnZW5lcmFsbHkgaGF2ZSBhIG1ldGhvZCB0aWVyLCB3aGljaCBzdGF0ZXMgaG93IHRoZSBkYXRhIHdlcmUgbW9kZWxsZWQgb3IgaG93IHRoZSBkYXRhIHdlcmUgY29sbGVjdGVkLlxuICAgIFBsZWFzZSBzZWUgdGhlICR7c2NoZW1hTGluaygnRW1pc3Npb24jbWV0aG9kVGllcicsICdzY2hlbWEnKX0gZm9yIHRoZSBvcHRpb25zIGF2YWlsYWJsZSBhbmQgZGVmaW5pdGlvbnMgb2YgdGhlIG9wdGlvbnMuYFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdEN1c3RvbUVycm9yTWVzc2FnZSA9IChtZXNzYWdlPzogc3RyaW5nLCBlcnJvcj86IElWYWxpZGF0aW9uRXJyb3IsIGFsbEVycm9yczogSVZhbGlkYXRpb25FcnJvcltdID0gW10pID0+IHtcbiAgY29uc3QgZm9ybWF0dGVkTWVzc2FnZSA9IG1lc3NhZ2UgJiYgbWVzc2FnZSBpbiBjdXN0b21FcnJvck1lc3NhZ2UgP1xuICAgIGN1c3RvbUVycm9yTWVzc2FnZVttZXNzYWdlXShlcnJvciEsIGFsbEVycm9ycy5sZW5ndGgsIGFsbEVycm9ycykgOlxuICAgIG1lc3NhZ2U7XG4gIHJldHVybiBmb3JtYXR0ZWRNZXNzYWdlID8gYDxwIGNsYXNzPVwiaXMtbm9ybWFsXCI+JHtmb3JtYXR0ZWRNZXNzYWdlfTwvcD5gIDogJyc7XG59O1xuXG5leHBvcnQgY29uc3QgZm9ybWF0RXJyb3IgPSAoZXJyb3I/OiBJVmFsaWRhdGlvbkVycm9yLCBhbGxFcnJvcnM6IElWYWxpZGF0aW9uRXJyb3JbXSA9IFtdKTogSVZhbGlkYXRpb25FcnJvciB8IHVuZGVmaW5lZCA9PlxuICBlcnJvclxuICAgID8gKHtcbiAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgLi4uZXJyb3IsXG4gICAgICBtYXBFcnJvcjogZXJyb3IubWVzc2FnZSA9PT0gbWFwRXJyb3JNZXNzYWdlLFxuICAgICAgbWVzc2FnZTogZm9ybWF0Q3VzdG9tRXJyb3JNZXNzYWdlKGVycm9yLm1lc3NhZ2UsIGVycm9yLCBhbGxFcnJvcnMpXG4gICAgfSlcbiAgICA6IHVuZGVmaW5lZDtcblxuZXhwb3J0IGNvbnN0IGVycm9ySGFzRXJyb3IgPSAoZXJyb3I/OiBJVmFsaWRhdGlvbkVycm9yKSA9PiBlcnJvciAmJiAoZXJyb3IubGV2ZWwgPT09ICdlcnJvcicgfHwgIWVycm9yLmxldmVsKTtcblxuZXhwb3J0IGNvbnN0IGVycm9ySGFzV2FybmluZyA9IChlcnJvcj86IElWYWxpZGF0aW9uRXJyb3IpID0+IGVycm9yICYmIGVycm9yLmxldmVsID09PSAnd2FybmluZyc7XG5cbmV4cG9ydCBjb25zdCBpc01pc3NpbmdQcm9wZXJ0eUVycm9yID0gKHsgcGFyYW1zIH06IElWYWxpZGF0aW9uRXJyb3IpID0+ICEhcGFyYW1zICYmICdtaXNzaW5nUHJvcGVydHknIGluIHBhcmFtcztcblxuZXhwb3J0IGNvbnN0IGlzTWlzc2luZ09uZU9mRXJyb3IgPSAoeyBrZXl3b3JkLCBzY2hlbWFQYXRoIH06IElWYWxpZGF0aW9uRXJyb3IpID0+XG4gIGtleXdvcmQgPT09ICdyZXF1aXJlZCcgJiYgKHNjaGVtYVBhdGggfHwgJycpLmluY2x1ZGVzKCdvbmVPZicpO1xuXG5jb25zdCBpc0ZhaWxpbmdLZXl3b3JkRXJyb3IgPSAoeyBwYXJhbXMgfTogSVZhbGlkYXRpb25FcnJvcikgPT4gISFwYXJhbXMgJiYgJ2ZhaWxpbmdLZXl3b3JkJyBpbiBwYXJhbXM7XG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJFcnJvciA9IChlcnJvcjogSVZhbGlkYXRpb25FcnJvcikgPT4gW1xuICBpc0ZhaWxpbmdLZXl3b3JkRXJyb3Jcbl0uZXZlcnkoZnVuYyA9PiAhZnVuYyhlcnJvcikpO1xuXG5leHBvcnQgY29uc3QgbWlzc2luZ05vZGVFcnJvcnMgPSAoZXJyb3JzOiBJVmFsaWRhdGlvbkVycm9yW10pID0+XG4gIGVycm9ycy5maWx0ZXIoKHsga2V5d29yZCwgcGFyYW1zIH0pID0+XG4gICAga2V5d29yZCA9PT0gJ3JlcXVpcmVkJyAmJiAocGFyYW1zPy5taXNzaW5nUHJvcGVydHkgPT09ICdAdHlwZScgfHwgcGFyYW1zPy5taXNzaW5nUHJvcGVydHkgPT09ICdAaWQnKVxuICApO1xuIl19
284
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtZXJyb3IubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtZXJyb3IubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBUSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBNkJoRCxNQUFNLGVBQWUsR0FBRyx5Q0FBeUMsQ0FBQztBQUVsRSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxRQUFRLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDN0MsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEYsQ0FBQyxDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLElBQWtCLEVBQUUsSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsT0FBTyxFQUFFLHNCQUFzQixJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxSSxNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBaUIsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBSyxDQUFDLENBQUM7QUFDakcsTUFBTSxpQkFBaUIsR0FDckIsZ0RBQWdELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7QUFDaEgsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFVLEVBQUUsS0FBVyxFQUFFLEVBQUUsQ0FBQzthQUNsQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUNoQyxLQUFLLENBQUMsSUFBSTs7O0NBR2xDLENBQUM7QUFDRixNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFFN0QsTUFBTSxTQUFTLEdBQWtCLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7QUFDekUsTUFBTSxZQUFZLEdBQWtCLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7QUFFbEYsTUFBTSx3QkFBd0IsR0FBRzt5QkFDUixJQUFJLENBQUMsTUFBTSxDQUFDLGtDQUFrQyxJQUFJLENBQUMsV0FBVyxDQUFDO3lCQUMvRCxJQUFJLENBQUMsS0FBSyxDQUFDLHlCQUF5QixJQUFJLENBQUMsVUFBVSxDQUFDO0NBQzVFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFFVCxNQUFNLGVBQWUsR0FBb0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxFQUFFO0lBQzFFLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDcEcsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RyxPQUFPOztNQUdILE1BQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQ3hDLE1BQU0sRUFBRSxRQUFRO1FBQ2QsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsK0NBQStDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUc7UUFDekcsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUNBQW1DLFlBQVksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQ2xILENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUNqQjtNQUNFLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLEVBQUU7R0FDM0QsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLHlDQUF5QztBQUN6QyxNQUFNLGtCQUFrQixHQUVwQjtJQUNGLHVDQUF1QyxFQUFFLGVBQWU7SUFDeEQseUNBQXlDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUNuRCxzQ0FBc0MsRUFBRSxlQUFlO0lBQ3ZELDBDQUEwQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7SUFDcEQsbUNBQW1DLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTtJQUM3Qyw0QkFBNEIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO0lBQ3RDLHVDQUF1QyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUNsRSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDaEIsdUNBQXVDLE1BQU0sRUFBRSxrQkFBa0Isa0NBQWtDLENBQUMsQ0FBQztRQUNyRyx3Q0FBd0M7SUFDNUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFLENBQUMsa0NBQWtDO0lBQy9ELGtDQUFrQyxFQUFFLEdBQUcsRUFBRSxDQUFDLGtDQUFrQztJQUM1RSwyREFBMkQsRUFBRSxHQUFHLEVBQUUsQ0FBQyxpQkFBaUI7SUFDcEYsK0RBQStELEVBQUUsR0FBRyxFQUFFLENBQUMsaUJBQWlCO0lBQ3hGLHNJQUFzSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGlCQUFpQjtJQUMvSixzQ0FBc0MsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUNyRCx3Q0FBd0MsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLFNBQVMsSUFBSSxDQUFDLE1BQU0sTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQzsrQ0FDdEQsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLHlDQUF5QyxJQUFJLENBQUMsT0FBTyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO3dDQUNqRyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksWUFBWSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRztJQUM3Riw0QkFBNEIsRUFBRSxHQUFHLEVBQUUsQ0FBQzt1RUFDaUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLEdBQUc7SUFDekcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUNsQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztpRkFDb0QsWUFBWSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25IOzREQUN3RCxZQUFZLENBQUMsbUJBQW1CLENBQUMsR0FBRztJQUM5RixpRUFBaUUsRUFDL0QsR0FBRyxFQUFFLENBQUMseUZBQXlGO0lBQ2pHLDhCQUE4QixFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUN6RCxHQUNFLFVBQVUsS0FBSyxDQUFDO1FBQ2QsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJO1lBQ1YsQ0FBQyxDQUFDLGlCQUFpQixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztpREFDNUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsdUJBQXVCLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHO1lBQ3hKLENBQUMsQ0FBQyxvRUFBb0U7UUFDMUUsQ0FBQyxDQUFDO2tJQUVOO01BRUUsVUFBVSxLQUFLLENBQUM7UUFDZCxDQUFDLENBQUMsMkhBQTJIO1FBQzdILENBQUMsQ0FBQyxpSUFDTixFQUFFO0lBQ0osOENBQThDLEVBQzVDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsa0NBQWtDLE1BQU0sRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUNoRyw2QkFBNkIsRUFDM0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQUU7SUFDMUQsZ0RBQWdELEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQzNFLEdBQUcsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25CLEdBQ0UsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QiwrQ0FBK0MsTUFBTSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3RixzREFBc0QsYUFBYSxFQUFFLGtCQUN6RSxHQUFHLENBQUMsQ0FBQztRQUNMLDBEQUEwRDtnRkFDZ0I7SUFDOUUsNkJBQTZCLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7UUFDOUMsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLFFBQVMsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4QixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksb0JBQW9CLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xILE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCwwQkFBMEIsRUFBRSxHQUFHLEVBQUUsQ0FBQyw2RUFBNkU7SUFDL0csNkJBQTZCLEVBQUUsR0FBRyxFQUFFLENBQ2xDLHNEQUFzRCxJQUFJLENBQUMsS0FBSyxDQUFDO3lEQUNaLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsR0FBRztJQUNwRyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQywrRUFBK0U7SUFDekcsY0FBYyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRTtRQUMzQyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsUUFBUyxDQUFDLENBQUM7UUFDdkMsT0FBTyxrQkFBa0IsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUc7O3VFQUViLENBQUM7SUFDdEUsQ0FBQztJQUNELDhGQUE4RixFQUFFLEdBQUcsRUFBRSxDQUNuRyxxQkFBcUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7cUNBQzdELElBQUksQ0FBQyxJQUFJLENBQUM7OytEQUVnQjtJQUM3RCw2Q0FBNkMsRUFBRSxHQUFHLEVBQUUsQ0FDbEQ7O2lEQUU2QztJQUMvQyw4Q0FBOEMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FDekUsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLGtCQUFrQixTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyw0Q0FBNEMsTUFBTSxFQUFFLE9BQU87K0RBQ2hELENBQUMsQ0FBQztRQUMzRDsrREFDeUQ7SUFDN0QsNERBQTRELEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQ3ZGLDJCQUEyQixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDaEQsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7OENBRTdFLFVBQVUsS0FBSyxDQUFDO1FBQ2QsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLG9DQUFvQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7VUFDbEgsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTs7O3dCQUcvRCxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVE7OztjQUcvQjtRQUNOLENBQUMsQ0FBQyx1Q0FDTixFQUFFO0lBQ0osNENBQTRDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQ3ZFLDBCQUEwQixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDL0MsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7OENBRTdFLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxvQ0FBb0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1VBQ2hILE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkYsdUNBQ0osRUFBRTtJQUNKLDJEQUEyRCxFQUFFLEdBQUcsRUFBRSxDQUNoRTtNQUNFLElBQUksQ0FBQyxnRkFBZ0YsQ0FBQyxFQUFFO0lBQzVGLG1EQUFtRCxFQUFFLEdBQUcsRUFBRSxDQUN4RDswRkFDc0Y7SUFDeEYsMEVBQTBFLEVBQUUsR0FBRyxFQUFFLENBQy9FOzttRUFFK0Q7SUFDakUsOEJBQThCLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQ3pEO01BRUUsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLHdCQUNFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FDekIsU0FDRSxDQUFDLE1BQU0sRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDcEUsR0FBRyxDQUFDLENBQUM7UUFDTCxFQUNKO2dFQUM0RDtJQUM5RCx5Q0FBeUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FDcEUsR0FDRSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDaEIsd0JBQXdCLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyx3Q0FDOUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FDckQsRUFBRSxDQUFBLENBQUM7UUFDSCw0REFDSjs7dUVBRW1FO0lBQ3JFLGtEQUFrRCxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FDcEYsR0FDRSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDaEIsMEJBQTBCLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQywyREFBMkQsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdJLHFFQUNKOztNQUdFLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQztRQUNqQiwwRUFBMEUsQ0FBQyxDQUFDO1FBQzVFLDBDQUNKLEVBQUU7SUFDSix5Q0FBeUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUN4RDt3REFFRSxDQUFDLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQzFDLEVBQUU7SUFDSixzQ0FBc0MsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FDL0QsaUJBQWlCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLDZCQUE2QixJQUFJLENBQUMsT0FBTyxDQUFDOzBCQUNwRSxNQUFNLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsTUFBTSxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUc7SUFDdEgsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FDL0Isa0NBQWtDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQzs4QkFDbkMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7dUNBRWpHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUN6QyxnQ0FDRSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FDNUMsR0FBRztJQUNMLCtDQUErQyxFQUFFLEdBQUcsRUFBRSxDQUNwRDs7Z0ZBRTRFLFVBQVUsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQztzQkFDM0csSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLE9BQU8sQ0FBQztvQkFDckQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsMEJBQTBCLFlBQVksQ0FBQywwQkFBMEIsRUFBRSxvQkFBb0IsQ0FBQztVQUMxSTtJQUNSLCtCQUErQixFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQzlDLDhCQUE4QixNQUFNLEVBQUUsUUFBUTs4REFDWTtJQUM1RCx1RUFBdUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtRQUN4RixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsUUFBUyxDQUFDLENBQUM7UUFDdkMsT0FBTzs2REFDa0QsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7K0NBQzVCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLGdFQUFnRSxDQUFDO0lBQzVILENBQUM7SUFDRCxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUUsQ0FBQyxzREFBc0Q7SUFDOUYsOENBQThDLEVBQUUsR0FBRyxFQUFFLENBQ25ELHdFQUF3RSxRQUFRLENBQUMsU0FBUyxDQUFDO2tEQUM3QztJQUNoRCxtQ0FBbUMsRUFBRSxHQUFHLEVBQUUsQ0FDeEM7cUJBQ2lCLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWTtJQUNyRSwyQ0FBMkMsRUFBRSxHQUFHLEVBQUUsQ0FDaEQsMkJBQTJCLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsNENBQTRDO0lBQy9HLDZDQUE2QyxFQUFFLEdBQUcsRUFBRSxDQUNsRCxjQUFjLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsNkJBQTZCO0lBQ25GLGtEQUFrRCxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQ2pFO01BQ0UsQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7cUdBQ2tDO0lBQ25HLHFDQUFxQyxFQUFFLEdBQUcsRUFBRSxDQUFDLHVFQUF1RTtJQUNwSCw0REFBNEQ7SUFDNUQsK0JBQStCLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUNwRSx1Q0FBdUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFHLENBQUMsT0FDdEUsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQy9DLHFCQUFxQjtJQUN2QixrREFBa0QsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FDN0UsNkRBQ0UsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQy9DLHFCQUFxQjtJQUN2Qix1Q0FBdUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FDbEUsa0RBQ0UsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQy9DLHFCQUFxQjtJQUN2QixxQkFBcUIsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUNwQztxQ0FDaUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7c0lBQzRFO0lBQ3BJLGtEQUFrRCxFQUFFLEdBQUcsRUFBRSxDQUN2RDs7O2dEQUc0QztJQUM5QywwQ0FBMEMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FDckUsR0FDRSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDaEIsZUFBZSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RyxpRUFDSjsyRUFDdUU7SUFDekUsa0ZBQWtGLEVBQUUsR0FBRyxFQUFFLENBQ3ZGOzZGQUN5RjtJQUMzRiwrQ0FBK0MsRUFBRSxHQUFHLEVBQUUsQ0FDcEQ7O3dHQUVvRztJQUN0Ryw4Q0FBOEMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FDekUsR0FDRSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLHNCQUMzRCxpREFBaUQsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLHFCQUN0RixJQUFJLENBQUMsdUNBQXVDLENBQzlDLHlCQUF5QjtJQUMzQix3Q0FBd0MsRUFBRSxHQUFHLEVBQUUsQ0FDN0MsK0VBQStFLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7NENBQzVFLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEdBQUc7SUFDOUYsK0NBQStDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FDOUQsc0JBQXNCLE1BQU0sRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7NENBQ3hCLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7V0FDeEUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHO0lBQ2xFLDRDQUE0QyxFQUFFLEdBQUcsRUFBRSxDQUNqRCw4Q0FBOEMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFDdEQsVUFBVSxDQUFDLHNCQUFzQixFQUFFLGlCQUFpQixDQUN0RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO3dEQUNpQixJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QjtJQUN6Rix1Q0FBdUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUN0RCxZQUFZLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQywrQkFBK0IsUUFBUSxDQUFDLFlBQVksQ0FBQzs4REFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7eUVBQ1Y7SUFDdkUsZ0RBQWdELEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FDL0Qsa0JBQWtCLFFBQVEsQ0FBQyxZQUFZLENBQUMsNEJBQTRCLE1BQU0sQ0FBQyxRQUFRLElBQUk7SUFDekYsZ0NBQWdDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQ2xFLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDbEYsT0FDRSxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQzdDLFVBQ0UsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFDekMsTUFDRSxLQUFLLEdBQUcsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUNsQyxJQUNFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNwRyxRQUNFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FDOUQsWUFDRSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQzNCLDBCQUEwQixDQUMzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDOzt3REFFbUM7SUFDdEQsNkJBQTZCLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FDNUMsNEJBQTRCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQztnRkFDRztJQUM5RSxzQ0FBc0MsRUFBRSxHQUFHLEVBQUUsQ0FDM0MsbUZBQW1GLElBQUksQ0FBQyxJQUFJLENBQUM7Ozs7O1VBS3ZGLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSx3QkFBd0IsRUFBRSxJQUFJLEVBQUUsMkJBQTJCLEVBQUUsQ0FBQztVQUM3RSxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsNkJBQTZCLEVBQUUsSUFBSSxFQUFFLGlDQUFpQyxFQUFFLENBQUM7Ozs7O2NBS3BGLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQztjQUNwRCxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDOztLQUVuRDtJQUNILHdDQUF3QyxFQUFFLEdBQUcsRUFBRSxDQUM3Qzs7OztjQUlVLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQztjQUNwRCxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDOztzQkFFbEMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxzRkFBc0Y7SUFDM0osb0RBQW9ELEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FDbkUsZ0JBQWdCLE1BQU0sRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVE7NEJBQ2pELE1BQU0sRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVE7aUJBQ3BFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxNQUFNLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUc7SUFDdEYsbUNBQW1DLEVBQUUsR0FBRyxFQUFFLENBQ3hDO3FCQUNpQixVQUFVLENBQUMscUJBQXFCLEVBQUUsUUFBUSxDQUFDLDREQUE0RDtJQUMxSCx3Q0FBd0MsRUFBRSxHQUFHLEVBQUUsQ0FDN0M7cUJBQ2lCLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLENBQUMsNERBQTREO0lBQzFILDJEQUEyRCxFQUFFLEdBQUcsRUFBRSxDQUNoRSwwREFBMEQsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsWUFBWSxDQUFDOzBKQUNzRCxJQUFJLENBQUMsT0FBTyxDQUFDO2tDQUNySSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsZ0RBQWdELElBQUksQ0FBQyxPQUFPLENBQUMsNkRBQTZEO0lBQ2pNLG1DQUFtQyxFQUFFLEdBQUcsRUFBRSxDQUN6Qzt3QkFDcUIsVUFBVSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUM7MklBQ21GO0NBQzFJLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLE9BQWdCLEVBQUUsS0FBd0IsRUFBRSxZQUFnQyxFQUFFLEVBQUUsRUFBRTtJQUN6SCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sSUFBSSxPQUFPLElBQUksa0JBQWtCLENBQUMsQ0FBQztRQUNqRSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sQ0FBQztJQUNWLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixnQkFBZ0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDaEYsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBd0IsRUFBRSxZQUFnQyxFQUFFLEVBQWdDLEVBQUUsQ0FDeEgsS0FBSztJQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0QsS0FBSyxFQUFFLE9BQU87UUFDZCxHQUFHLEtBQUs7UUFDUixRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU8sS0FBSyxlQUFlO1FBQzNDLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUM7S0FDbkUsQ0FBQztJQUNGLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFFaEIsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBd0IsRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFOUcsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsS0FBd0IsRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDO0FBRWhHLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsRUFBRSxNQUFNLEVBQW9CLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksaUJBQWlCLElBQUksTUFBTSxDQUFDO0FBRWhILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFvQixFQUFFLEVBQUUsQ0FDL0UsT0FBTyxLQUFLLFVBQVUsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFakUsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLGdCQUFnQixJQUFJLE1BQU0sQ0FBQztBQUV2RyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUF1QixFQUFFLEVBQUUsQ0FBQztJQUN0RCxxQkFBcUI7Q0FDdEIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBRTlCLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBMEIsRUFBRSxFQUFFLENBQzlELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQ3BDLE9BQU8sS0FBSyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsZUFBZSxLQUFLLE9BQU8sSUFBSSxNQUFNLEVBQUUsZUFBZSxLQUFLLEtBQUssQ0FBQyxDQUNyRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0IHsgU2NoZW1hVHlwZSwgU2l0ZVNpdGVUeXBlLCBUZXJtLCBUZXJtVGVybVR5cGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyB0b1ByZWNpc2lvbiwga2V5VG9MYWJlbCwgdW5pcXVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5cbmltcG9ydCB7IHRlcm1UeXBlTGFiZWwgfSBmcm9tICcuLi90ZXJtcy90ZXJtcy5tb2RlbCc7XG5pbXBvcnQgeyBwYXRoVG9BcGlEb2NzUGF0aCB9IGZyb20gJy4uL2VuZ2luZS9lbmdpbmUuc2VydmljZSc7XG5pbXBvcnQgeyBiYXNlVXJsLCBjb2RlLCBjb250YWN0VXNMaW5rLCBleHRlcm5hbExpbmssIGdsb3NzYXJ5TGluaywgc2NoZW1hTGluayB9IGZyb20gJy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBwbHVyYWxpemUgfSBmcm9tICcuLi9jb21tb24vcGx1cmFsaXplJztcblxuLy8gVE9ETzogYWRkIG1vcmUgdmFsaWRhdGlvbiBrZXl3b3JkIGFuZCBwYXJhbXNcbmV4cG9ydCB0eXBlIHZhbGlkYXRpb25FcnJvckxldmVsID0gJ2Vycm9yJyB8ICd3YXJuaW5nJztcbmV4cG9ydCB0eXBlIHZhbGlkYXRpb25FcnJvclBhcmFtID0gJ21pc3NpbmdQcm9wZXJ0eScgfCAndHlwZScgfCAndGVybScgfCAnbW9kZWwnIHwgJ3Byb2R1Y3QnIHwgJ3JhbmdlJyB8ICdub2RlJyB8XG4gICdhbGxvd2VkVmFsdWVzJyB8ICdhbGxvd2VkVmFsdWUnIHwgJ2FkZGl0aW9uYWxQcm9wZXJ0eScgfCAnZXhwZWN0ZWQnIHwgJ2RlZmF1bHQnIHwgJ2N1cnJlbnQnIHwgJ3BlcmNlbnRhZ2UnIHwgJ2tleXMnIHxcbiAgJ3RocmVzaG9sZCcgfCAnb3V0bGllcnMnIHwgJ2NvdW50cnknIHwgJ21pbicgfCAnbWF4JyB8ICdkZWZhdWx0U291cmNlJyB8ICdncm91cCcgfCAnbWVzc2FnZSc7XG5leHBvcnQgdHlwZSB2YWxpZGF0aW9uRXJyb3JLZXl3b3JkID0gJ3JlcXVpcmVkJyB8ICd0eXBlJyB8ICdpZicgfCAndGhlbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZhbGlkYXRpb25FcnJvciB7XG4gIGluZGV4PzogbnVtYmVyO1xuICBub2RlSW5kZXg/OiBudW1iZXI7XG4gIGxldmVsPzogdmFsaWRhdGlvbkVycm9yTGV2ZWw7XG4gIGRhdGFQYXRoPzogc3RyaW5nO1xuICBzY2hlbWFQYXRoPzogc3RyaW5nO1xuICBrZXl3b3JkPzogdmFsaWRhdGlvbkVycm9yS2V5d29yZDtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBwYXJhbXM/OiB7IFtrZXkgaW4gdmFsaWRhdGlvbkVycm9yUGFyYW1dPzogYW55IH07XG4gIG1hcEVycm9yPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmFsaWRhdGlvbkVycm9yV2l0aEluZGV4IHtcbiAgZXJyb3I6IElWYWxpZGF0aW9uRXJyb3JbXTtcbiAgaW5kZXg6IG51bWJlcjtcbiAgY2hhbmdlZD86IGJvb2xlYW47XG59XG5cbnR5cGUgaGFuZGxlRXJyb3JGdW5jID0gKGVycm9yOiBJVmFsaWRhdGlvbkVycm9yLCBlcnJvckNvdW50PzogbnVtYmVyLCBhbGxFcnJvcnM/OiBJVmFsaWRhdGlvbkVycm9yW10pID0+IHN0cmluZztcblxuY29uc3QgbWFwRXJyb3JNZXNzYWdlID0gJ2RvZXMgbm90IGNvbnRhaW4gbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSc7XG5cbmV4cG9ydCBjb25zdCBwYXJzZURhdGFQYXRoID0gKGRhdGFQYXRoID0gJycpID0+IHtcbiAgY29uc3QgW18sIC4uLnBhdGhzXSA9IGRhdGFQYXRoLnNwbGl0KCcuJyk7XG4gIHJldHVybiBwYXRocy5tYXAocGF0aCA9PiAoeyBwYXRoLCBsYWJlbDoga2V5VG9MYWJlbChwYXRoLnJlcGxhY2UoL1xcW1xcZCtcXF0vZywgJycpKSB9KSk7XG59O1xuXG5jb25zdCBnbG9zc2FyeVR5cGVMaW5rID0gKHR5cGU6IFRlcm1UZXJtVHlwZSwgdGV4dCA9IHRlcm1UeXBlTGFiZWwodHlwZSkpID0+IGV4dGVybmFsTGluayhgJHtiYXNlVXJsKCl9L2dsb3NzYXJ5P3Rlcm1UeXBlPSR7dHlwZX1gLCB0ZXh0KTtcbmNvbnN0IHRlcm1MaW5rID0gKHsgaWQsIG5hbWUgfTogUGFydGlhbDxUZXJtPikgPT4gZXh0ZXJuYWxMaW5rKGAke2Jhc2VVcmwoKX0vdGVybS8ke2lkfWAsIG5hbWUhKTtcbmNvbnN0IGRhdGVGb3JtYXRNZXNzYWdlID1cbiAgYHNob3VsZCBmb2xsb3cgdGhlIElTTyA4NjAxIGRhdGUgZm9ybWF0LCBlLmcuICR7Y29kZSgyMDAwKX0sIG9yICR7Y29kZSgnMjAwMC0xMicpfSwgb3IgJHtjb2RlKCcyMDAwLTEyLTMwJyl9YDtcbmNvbnN0IG1vZGVsTGluayA9ICh0ZXJtOiBUZXJtLCBtb2RlbDogVGVybSkgPT4gYFxuICA8YSBocmVmPVwiJHtwYXRoVG9BcGlEb2NzUGF0aChtb2RlbFsnQGlkJ10sIHRlcm1bJ0BpZCddKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICA8c3BhbiBjbGFzcz1cInByLTFcIj4ke21vZGVsLm5hbWV9PC9zcGFuPlxuICAgIDxzcGFuPihWaWV3IERvY3MpPC9zcGFuPlxuICA8L2E+XG5gO1xuY29uc3QgdGhyZXNob2xkID0gKHZhbHVlOiBudW1iZXIpID0+IGNvZGUoYCR7dmFsdWUgKiAxMDB9JWApO1xuXG5jb25zdCBub1RpbGxhZ2U6IFBhcnRpYWw8VGVybT4gPSB7IGlkOiAnbm9UaWxsYWdlJywgbmFtZTogJ05vIHRpbGxhZ2UnIH07XG5jb25zdCBwYXN0dXJlR3Jhc3M6IFBhcnRpYWw8VGVybT4gPSB7IGlkOiAncGFzdHVyZUdyYXNzJywgbmFtZTogJ1Bhc3R1cmUgZ3Jhc3MnIH07XG5cbmNvbnN0IGlkTm90Rm91bmREZWZhdWx0TWVzc2FnZSA9IGBcbiAgSWYgeW91IGFyZSB1c2luZyB0aGUgJHtjb2RlKCduYW1lJyl9IG9mIHRoZSBUZXJtLCBtYWtlIHN1cmUgdG8gdXNlICR7Y29kZSgndGVybS5uYW1lJyl9IGNvbHVtbjtcbiAgaWYgeW91IGFyZSB1c2luZyB0aGUgJHtjb2RlKCdAaWQnKX0gb2YgdGhlIFRlcm0sIHVzZSB0aGUgJHtjb2RlKCd0ZXJtLkBpZCcpfSBjb2x1bW4gaW5zdGVhZC5cbmAudHJpbSgpO1xuXG5jb25zdCBpZE5vdEZvdW5kRXJyb3I6IGhhbmRsZUVycm9yRnVuYyA9IChfZXJyb3IsIF9lcnJvckNvdW50LCBhbGxFcnJvcnMpID0+IHtcbiAgY29uc3QgbWlncmF0aW9uRXJyb3JzID0gYWxsRXJyb3JzLmZpbHRlcigoeyBwYXJhbXMgfSkgPT4gcGFyYW1zPy5jdXJyZW50ICYmICgnZXhwZWN0ZWQnIGluIHBhcmFtcykpO1xuICBjb25zdCBub01pZ3JhdGlvbkVycm9ycyA9IGFsbEVycm9ycy5maWx0ZXIoKHsgcGFyYW1zIH0pID0+ICFwYXJhbXM/LmN1cnJlbnQgfHwgISgnZXhwZWN0ZWQnIGluIHBhcmFtcykpO1xuICByZXR1cm4gYFxuICAgIDxwPkRvZXMgbm90IGV4aXN0IGluIEhlc3RpYS48L3A+XG4gICAgJHtcbiAgICAgIHVuaXF1ZShtaWdyYXRpb25FcnJvcnMubWFwKCh7IHBhcmFtcyB9KSA9PlxuICAgICAgICBwYXJhbXM/LmV4cGVjdGVkXG4gICAgICAgICAgPyBgVGhlIFRlcm0gJHtjb2RlKHBhcmFtcy5jdXJyZW50KX0gd2FzIHVwZGF0ZWQsIHBsZWFzZSB1c2UgdGhpcyBUZXJtIGluc3RlYWQ6ICR7Y29kZShwYXJhbXMuZXhwZWN0ZWQpfS5gXG4gICAgICAgICAgOiBgVGhlIFRlcm0gJHtjb2RlKHBhcmFtcy5jdXJyZW50KX0gd2FzIGRlbGV0ZWQuIFBsZWFzZSBzZWFyY2ggdGhlICR7Z2xvc3NhcnlMaW5rKCdHbG9zc2FyeScpfSBmb3IgYSBuZXcgVGVybS5gXG4gICAgICApKS5qb2luKCc8L2JyPicpXG4gICAgfVxuICAgICR7bm9NaWdyYXRpb25FcnJvcnMubGVuZ3RoID8gaWROb3RGb3VuZERlZmF1bHRNZXNzYWdlIDogJyd9XG4gIGA7XG59O1xuXG4vLyBzZXQgbWVzc2FnZSBhcyBlbXB0eSB0byBub3QgZGlzcGxheSBpdFxuY29uc3QgY3VzdG9tRXJyb3JNZXNzYWdlOiB7XG4gIFtrZXk6IHN0cmluZ106IGhhbmRsZUVycm9yRnVuYztcbn0gPSB7XG4gICdzaG91bGQgaGF2ZSByZXF1aXJlZCBwcm9wZXJ0eSBcXCdAaWRcXCcnOiBpZE5vdEZvdW5kRXJyb3IsXG4gICdzaG91bGQgaGF2ZSByZXF1aXJlZCBwcm9wZXJ0eSBcXCdAdHlwZVxcJyc6ICgpID0+ICcnLFxuICAnc2hvdWxkIGhhdmUgcmVxdWlyZWQgcHJvcGVydHkgXFwnaWRcXCcnOiBpZE5vdEZvdW5kRXJyb3IsXG4gICdzaG91bGQgbWF0Y2ggZXhhY3RseSBvbmUgc2NoZW1hIGluIG9uZU9mJzogKCkgPT4gJycsXG4gICdzaG91bGQgbWF0Y2ggc29tZSBzY2hlbWEgaW4gYW55T2YnOiAoKSA9PiAnJyxcbiAgJ3Nob3VsZCBtYXRjaCBcInRoZW5cIiBzY2hlbWEnOiAoKSA9PiAnJyxcbiAgJ3Nob3VsZCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMnOiAoeyBwYXJhbXMgfSwgZXJyb3JDb3VudCkgPT5cbiAgICBlcnJvckNvdW50ID09PSAxID9cbiAgICAgIGBUaGUgZm9sbG93aW5nIGZpZWxkIGRvZXMgbm90IGV4aXN0OiAke3BhcmFtcz8uYWRkaXRpb25hbFByb3BlcnR5fSBvciBpcyBub3QgYWxsb3dlZCBpbiB0aGlzIGNhc2UuYCA6XG4gICAgICBgU2hvdWxkIG5vdCBoYXZlIGFkZGl0aW9uYWwgcHJvcGVydGllcy5gLFxuICAnc2hvdWxkIE5PVCBiZSB2YWxpZCc6ICgpID0+ICdTaG91bGQgbm90IGJlIHVzZWQgaW4gdGhpcyBjYXNlLicsXG4gICdzaG91bGQgbWF0Y2ggcGF0dGVybiBcIl5cXFxcZHsxM30kXCInOiAoKSA9PiBgc2hvdWxkIGJlIGNvbXBvc2VkIG9mIDEzIG51bWJlcnNgLFxuICAnc2hvdWxkIG1hdGNoIHBhdHRlcm4gXCJeWzAtOV17NH0oLVswLTldezJ9KT8oLVswLTldezJ9KT8kXCInOiAoKSA9PiBkYXRlRm9ybWF0TWVzc2FnZSxcbiAgJ3Nob3VsZCBtYXRjaCBwYXR0ZXJuIFwiXihbMC05XXs0fXwtKSgtWzAtOV17Mn0pPygtWzAtOV17Mn0pPyRcIic6ICgpID0+IGRhdGVGb3JtYXRNZXNzYWdlLFxuICAnc2hvdWxkIG1hdGNoIHBhdHRlcm4gXCJeKFswLTldezR9fC0pKC1bMC05XXsyfSk/KC1bMC05XXsyfSk/KFtUXVswLTJdWzAtOV1cXDpbMC01XVswLTldXFw6WzAtNV1bMC05XSgoXFwrfFxcLSlbMC0xXVswLTldOlswLTVdWzAtOV0pPyk/JFwiJzogKCkgPT4gZGF0ZUZvcm1hdE1lc3NhZ2UsXG4gICdzaG91bGQgYmUgbGlua2VkIHRvIGFuIGV4aXN0aW5nIG5vZGUnOiAoeyBwYXJhbXMgfSkgPT5cbiAgICBgWW91ciBzdWJtaXNzaW9uIGRvZXMgbm90IGNvbnRhaW4gdGhlICR7cGFyYW1zPy5ub2RlPy50eXBlfSB3aXRoICR7Y29kZShgaWQ9JHtwYXJhbXM/Lm5vZGU/LmlkfWApfS5cbiAgICBJZiB5b3UgYXJlIHRyeWluZyB0byBsaW5rIHRvIGFuIGV4aXN0aW5nICR7cGFyYW1zPy5ub2RlPy50eXBlfSBvbiB0aGUgSGVzdGlhIHBsYXRmb3JtLCB5b3UgbXVzdCB1c2UgJHtjb2RlKGBAaWQ9JHtwYXJhbXM/Lm5vZGU/LmlkfWApfSBpbnN0ZWFkLlxuICAgIE90aGVyd2lzZSB5b3UgbXVzdCBpbmNsdWRlIGEgZnVsbCAke3BhcmFtcz8ubm9kZT8udHlwZX0gd2l0aCBpZCAke2NvZGUocGFyYW1zPy5ub2RlPy5pZCl9LmAsXG4gICdtdXN0IGJlIHdpdGhpbiB0aGUgY291bnRyeSc6ICgpID0+IGBUaGUgY291bnRyeSBwcm92aWRlZCBkb2VzIG5vdCBjb250YWluIHRoZSByZWdpb24gcHJvdmlkZWQuIFBsZWFzZSBjaGVja1xuICB0aGUgY291bnRyeSBmb3IgZXJyb3JzIG9yIHRoZSByZWdpb24gZm9yIGVycm9ycywgYW5kIHJlZmVyZW5jZSB0aGUgJHtnbG9zc2FyeUxpbmsoJ0dsb3NzYXJ5IG9mIFRlcm1zJyl9LmAsXG4gIFttYXBFcnJvck1lc3NhZ2VdOiAoeyBkYXRhUGF0aCB9KSA9PlxuICAgIGRhdGFQYXRoID09PSAnLnJlZ2lvbicgPyBgVGhlIHJlZ2lvbiBwcm92aWRlZCBkb2VzIG5vdCBjb250YWluIHRoZSBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIHByb3ZpZGVkLiBQbGVhc2UgY2hlY2sgdGhlXG4gIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgZm9yIGVycm9ycyBvciB0aGUgcmVnaW9uIGZvciBlcnJvciwgYW5kIHJlZmVyZW5jZSB0aGUgJHtnbG9zc2FyeUxpbmsoJ0dsb3NzYXJ5IG9mIFRlcm1zJyl9LmAgOlxuICAgIGBUaGUgY291bnRyeSBwcm92aWRlZCBkb2VzIG5vdCBjb250YWluIHRoZSBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIHByb3ZpZGVkLiBQbGVhc2UgY2hlY2sgdGhlIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGVcbiAgZm9yIGVycm9ycyBvciB0aGUgY291bnRyeSBmb3IgZXJyb3JzLCBhbmQgcmVmZXJlbmNlIHRoZSAke2dsb3NzYXJ5TGluaygnR2xvc3Nhcnkgb2YgVGVybXMnKX0uYCxcbiAgJ3N1bSBub3QgZXF1YWwgdG8gMTAwJSBmb3Igc2FuZENvbnRlbnQsIHNpbHRDb250ZW50LCBjbGF5Q29udGVudCc6XG4gICAgKCkgPT4gYFRoZSBzdW0gb2YgU2FuZCwgU2lsdCwgYW5kIENsYXkgY29udGVudCBzaG91bGQgZXF1YWwgMTAwJSBmb3IgZWFjaCBzb2lsIGRlcHRoIGludGVydmFsLmAsXG4gICdpcyBvdXRzaWRlIHRoZSBhbGxvd2VkIHJhbmdlJzogKHsgcGFyYW1zIH0sIGVycm9yQ291bnQpID0+XG4gICAgYCR7XG4gICAgICBlcnJvckNvdW50ID09PSAxXG4gICAgICAgID8gcGFyYW1zPy50ZXJtXG4gICAgICAgICAgICA/IGBUaGUgdmFsdWUgZm9yICR7Y29kZShwYXJhbXM/LnRlcm1bJ0BpZCddIHx8IHBhcmFtcz8udGVybS5uYW1lKX0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgZXN0YWJsaXNoZWQgZm9yIHRoZSBzb2lsIHRleHR1cmUgeW91IHByb3ZpZGVkLlxuICAgICAgICAgICAgRm9yIHRoaXMgc29pbCB0ZXh0dXJlLCB0aGUgbWF4aW11bSAke2NvZGUocGFyYW1zPy50ZXJtWydAaWQnXSB8fCBwYXJhbXM/LnRlcm0ubmFtZSl9IGlzICR7cGFyYW1zPy5yYW5nZT8ubWF4fSBhbmQgdGhlIG1pbmltdW0gaXMgJHtwYXJhbXM/LnJhbmdlPy5taW59LmBcbiAgICAgICAgICAgIDogYERvZXMgbm90IG1hdGNoIHRoZSBwb3NzaWJsZSByYW5nZXMgb2Ygc2FuZCwgc2lsdCBhbmQgY2xheSBjb250ZW50LmBcbiAgICAgICAgOiBgRWFjaCBzb2lsIHRleHR1cmUgaGFzIGEgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZSBmb3Igc2FuZCwgc2lsdCwgYW5kIGNsYXkgY29udGVudC5cbiAgICAgICAgQXQgbGVhc3Qgb25lIG1lYXN1cmVtZW50IG9mIHNhbmQsIHNpbHQsIG9yIGNsYXkgY29udGVudCBkb2VzIG5vdCBtYXRjaCB0aGUgcG9zc2libGUgcmFuZ2UgZm9yIHRoZSBzcGVjaWZpZWQgc29pbCB0ZXh0dXJlLmBcbiAgICB9XG4gICAgJHtcbiAgICAgIGVycm9yQ291bnQgPT09IDFcbiAgICAgICAgPyBgUGxlYXNlIGNoZWNrIHRoZSBtZWFzdXJlbWVudCwgaXRzIGRlcHRoIGludGVydmFscywgYW5kIHRoZSBkYXRlcyBvZiB0aGUgbWVhc3VyZW1lbnQgb3IgdXBkYXRlIHRoZSBzb2lsIHRleHR1cmUgaWYgbmVlZGVkLmBcbiAgICAgICAgOiBgUGxlYXNlIGNoZWNrIHlvdXIgbWVhc3VyZW1lbnRzLCB0aGVpciBkZXB0aCBpbnRlcnZhbHMsIGFuZCB0aGUgZGF0ZXMgb2YgdGhlIG1lYXN1cmVtZW50cyBvciB1cGRhdGUgdGhlIHNvaWwgdGV4dHVyZXMgaWYgbmVlZGVkLmBcbiAgICB9YCxcbiAgJ3Nob3VsZCBiZSBlcXVhbCB0byBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzJzpcbiAgICAoeyBwYXJhbXMgfSkgPT4gYE11c3QgaGF2ZSBvbmUgb2YgdGhlc2UgdmFsdWVzOiAke3BhcmFtcz8uYWxsb3dlZFZhbHVlcy5tYXAoY29kZSkuam9pbignLCAnKX1gLFxuICAnc2hvdWxkIGJlIGVxdWFsIHRvIGNvbnN0YW50JzpcbiAgICAoeyBwYXJhbXMgfSkgPT4gYE11c3QgYmU6ICR7Y29kZShwYXJhbXM/LmFsbG93ZWRWYWx1ZSl9YCxcbiAgJ2lzIG5vdCBhbGxvd2VkIGZvciB0aGlzIGNoYXJhY3RlcmlzZWRJbmRpY2F0b3InOiAoeyBwYXJhbXMgfSwgZXJyb3JDb3VudCkgPT5cbiAgICBgJHtlcnJvckNvdW50ID09PSAxID9cbiAgICAgIGAke1xuICAgICAgICBwYXJhbXM/LmFsbG93ZWRWYWx1ZXMubGVuZ3RoID9cbiAgICAgICAgICBgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIG9uZSBvZiB0aGVzZSBtZXRob2RzOiAke3BhcmFtcz8uYWxsb3dlZFZhbHVlcy5tYXAoY29kZSkuam9pbignLCAnKX1gIDpcbiAgICAgICAgICBgZG9lcyBub3QgY3VycmVudGx5IGhhdmUgYW55IG1ldGhvZCBhbGxvd2VkLiBQbGVhc2UgJHtjb250YWN0VXNMaW5rKCl9IHRvIGNoYW5nZSB0aGlzLmBcbiAgICAgIH0uYCA6XG4gICAgICBgU29tZSBUZXJtcyBhcmUgbm90IGFsbG93ZWQgd2l0aCB0aGUgbWV0aG9kIHlvdSBzZWxlY3RlZC5gfVxuICAgIFlvdSBjYW4gZmluZCB0aGUgbGlzdCBvZiBhbGxvd2VkIG1ldGhvZHMgZm9yIGVhY2ggVGVybSBieSBjbGlja2luZyBvbiB0aGVtLmAsXG4gICdzaG91bGQgY29udGFpbiBhIHZhbGlkIGl0ZW0nOiAoeyBkYXRhUGF0aCB9KSA9PiB7XG4gICAgY29uc3QgcGF0aHMgPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoISk7XG4gICAgcmV0dXJuIHBhdGhzLmxlbmd0aCA+PSAyID9cbiAgICAgIGBUaGUgJHtwYXRoc1twYXRocy5sZW5ndGggLSAxXS5wYXRofSByZWxhdGVkIHRvIHRoaXMgJHtwbHVyYWxpemUocGF0aHNbcGF0aHMubGVuZ3RoIC0gMl0ubGFiZWwsIDEpfSBhcmUgaW52YWxpZGAgOlxuICAgICAgYFRoZSAke3BhdGhzWzBdLnBhdGh9IGFyZSBpbnZhbGlkYDtcbiAgfSxcbiAgJ21heSBiZSBiZXR3ZWVuIDAgYW5kIDEwMCc6ICgpID0+ICdQZXJjZW50YWdlcyBzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCAxMDAsIG5vdCAwIGFuZCAxLiBUaGlzIG1heSBiZSBhbiBlcnJvci4nLFxuICAnbWF5IG5vdCBhbGwgYmUgc2V0IHRvIGZhbHNlJzogKCkgPT5cbiAgICBgRXZlcnkgdmFsdWUgaW4gdGhlIGRhdGEgY29tcGxldGVuZXNzIGFzc2Vzc21lbnQgaXMgJHtjb2RlKGZhbHNlKX0uIFlvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gZmlsbCBpdCBpbi5cbiAgRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBmaWxsIGl0IGluLCBwbGVhc2Ugc2VlIHRoZSAke3NjaGVtYUxpbmsoJ0N5Y2xlI2NvbXBsZXRlbmVzcycsICdzY2hlbWEnKX0uYCxcbiAgJ21heSBub3QgYmUgZW1wdHknOiAoKSA9PiAnaWYgdGhpcyB2YWx1ZSBzaWduaWZpZXMgbm8gZGF0YSwgSGVzdGlhIG9ubHkgYWNjZXB0cyBcIi1cIiBvciBlbXB0eSBmb3Igbm8gZGF0YScsXG4gICdtYXkgbm90IGJlIDAnOiAoeyBkYXRhUGF0aCB9LCBlcnJvckNvdW50KSA9PiB7XG4gICAgY29uc3QgcGF0aHMgPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoISk7XG4gICAgcmV0dXJuIGBBZGRpbmcgYSB2YWx1ZSAke2Vycm9yQ291bnQgPT09IDEgPyBgIHRvIGV2ZXJ5ICR7cGF0aHNbMF0ubGFiZWx9IGAgOiAnICd9IGlzIGhpZ2hseSByZWNvbW1lbmRlZFxuICAgICAgYXMgd2l0aG91dCB0aGlzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYWxjdWxhdGUgdGhlIEltcGFjdCBBc3Nlc3NtZW50LlxuICAgICAgSWYgdGhlIGFtb3VudCBwcm9kdWNlZCBpcyB6ZXJvLCB3ZSByZWNvbW1lbmQgc2V0dGluZyB2YWx1ZSB0byAwLmA7XG4gIH0sXG4gICd0aGUgc3VtIG9mIGFib3ZlIGdyb3VuZCBjcm9wIHJlc2lkdWUgYW5kIGJlbG93IGdyb3VuZCBjcm9wIHJlc2lkdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyc6ICgpID0+XG4gICAgYEZvciBzaXRlcyBvZiB0eXBlICR7Y29kZShTaXRlU2l0ZVR5cGUuY3JvcGxhbmQpfSBvciAke2NvZGUoU2l0ZVNpdGVUeXBlWydwZXJtYW5lbnQgcGFzdHVyZSddKX0sXG4gICAgaWYgZGF0YSBjb21wbGV0ZW5lc3MgaXMgbWFya2VkICR7Y29kZSh0cnVlKX0gZm9yIGNyb3AgcmVzaWR1ZSxcbiAgICB0aGUgc3VtIG9mIHRoZSBBYm92ZSBncm91bmQgY3JvcCByZXNpZHVlIHRlcm1zIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gemVybyxcbiAgICBhbmQgQmVsb3cgZ3JvdW5kIGNyb3AgcmVzaWR1ZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHplcm8uYCxcbiAgJ2xvbmdGYWxsb3dQZXJpb2QgbXVzdCBiZSBsb3dlciB0aGFuIDUgeWVhcnMnOiAoKSA9PlxuICAgIGBZb3VyIGxvbmdGYWxsb3dQZXJpb2QgaXMgZ3JlYXRlciB0aGFuIGZpdmUgeWVhcnMuXG4gICAgRmFsbG93IGlzIGRlZmluZWQgYnkgRkFPU1RBVCBhcyBsYW5kIGxlZnQgdW5jdWx0aXZhdGVkIGZvciBiZXR3ZWVuIDEgYW5kIDUgeWVhcnMsXG4gICAgYW5kIHRoaXMgZGVmaW5pdGlvbiBpcyB1c2VkIGZvciBIZXN0aWEgYWxzby5gLFxuICAnc2hvdWxkIGJlIHdpdGhpbiBwZXJjZW50YWdlIG9mIGRlZmF1bHQgdmFsdWUnOiAoeyBwYXJhbXMgfSwgZXJyb3JDb3VudCkgPT5cbiAgICBlcnJvckNvdW50ID09PSAxID9cbiAgICAgIGBUaGlzIHZhbHVlIGlzIMKxJHt0aHJlc2hvbGQocGFyYW1zPy50aHJlc2hvbGQpfSBkaWZmZXJlbnQgdG8gb3VyIGRlZmF1bHQgdmFsdWUgd2hpY2ggaXMgJHtwYXJhbXM/LmRlZmF1bHR9LlxuICAgICAgUGxlYXNlIGNoZWNrIHlvdXIgdXBsb2FkZWQgZGF0YSBhcyB0aGlzIG1heSBiZSBhbiBlcnJvci5gIDpcbiAgICAgIGBUaGlzIHZhbHVlIGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50IHRoYW4gb3VyIGRlZmF1bHQgdmFsdWUuXG4gICAgICBQbGVhc2UgY2hlY2sgeW91ciB1cGxvYWRlZCBkYXRhIGFzIHRoaXMgbWF5IGJlIGFuIGVycm9yLmAsXG4gICd0aGUgdmFsdWUgcHJvdmlkZWQgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgbW9kZWwgcmVzdWx0JzogKHsgcGFyYW1zIH0sIGVycm9yQ291bnQpID0+XG4gICAgYFRoZSBleHBlY3RlZCByZXN1bHQgZm9yICR7Y29kZShwYXJhbXM/LnRlcm0ubmFtZSl9XG4gICAgJHtwYXJhbXM/Lm1vZGVsPy5uYW1lID8gYHVzaW5nICR7bW9kZWxMaW5rKHBhcmFtcz8udGVybSwgcGFyYW1zPy5tb2RlbCl9IGAgOiAnJ31cbiAgICBmcm9tIHRoZSBkYXRhIHByb3ZpZGVkIGluIHRoZSB1cGxvYWQgaXMgJHtcbiAgICAgIGVycm9yQ291bnQgPT09IDFcbiAgICAgICAgPyBgJHtjb2RlKHRvUHJlY2lzaW9uKHBhcmFtcz8uZXhwZWN0ZWQsIDMpKX0sIGJ1dCB0aGUgdmFsdWUgaW4gdGhlIHVwbG9hZCBpcyAke2NvZGUodG9QcmVjaXNpb24ocGFyYW1zPy5jdXJyZW50LCAzKSl9LlxuICAgICAgICAke3BhcmFtcz8udGhyZXNob2xkID8gYE91ciB0aHJlc2hvbGQgaXMgwrEke3RocmVzaG9sZChwYXJhbXM/LnRocmVzaG9sZCl9LmAgOiAnJ31cbiAgICAgICAgUGxlYXNlIGVpdGhlcjpcbiAgICAgICAgPHVsIGNsYXNzPVwiaXMtcGwtMyBpcy1saXN0LXN0eWxlLWRlY2ltYWxcIj5cbiAgICAgICAgPGxpPkNoZWNrIHRoZSAke3BhcmFtcz8udGVybS50ZXJtVHlwZX0gdmFsdWUgeW91IHByb3ZpZGVkOzwvbGk+XG4gICAgICAgIDxsaT5DaGVjayB0aGUgZGF0YSB5b3UgcHJvdmlkZWQgd2hpY2ggaXMgdGhlIGlucHV0IGludG8gdGhpcyBtb2RlbDs8L2xpPlxuICAgICAgICA8bGk+Q2FyZWZ1bGx5IHJlYWQgdGhlIGRvY3VtZW50YXRpb24gdG8gdW5kZXJzdGFuZCBpZiB3ZSB1c2VkIGEgZGVmYXVsdCBwcm9wZXJ0eSBhcyBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbnMuPC9saT5cbiAgICAgICAgPC91bD5gXG4gICAgICAgIDogJ25vdCBjb25zaXN0ZW50IHdpdGggdGhlIG1vZGVsIHJlc3VsdC4nXG4gICAgfWAsXG4gICd0aGUgbWVhc3VyZW1lbnQgcHJvdmlkZWQgbWlnaHQgYmUgaW4gZXJyb3InOiAoeyBwYXJhbXMgfSwgZXJyb3JDb3VudCkgPT5cbiAgICBgVGhlIGV4cGVjdGVkIHZhbHVlIGZvciAke2NvZGUocGFyYW1zPy50ZXJtLm5hbWUpfVxuICAgICR7cGFyYW1zPy5tb2RlbD8ubmFtZSA/IGB1c2luZyAke21vZGVsTGluayhwYXJhbXM/LnRlcm0sIHBhcmFtcz8ubW9kZWwpfSBgIDogJyd9XG4gICAgZnJvbSB0aGUgZGF0YSBwcm92aWRlZCBpbiB0aGUgdXBsb2FkIGlzICR7XG4gICAgICBlcnJvckNvdW50ID09PSAxID9cbiAgICAgICAgYCR7Y29kZSh0b1ByZWNpc2lvbihwYXJhbXM/LmV4cGVjdGVkLCAzKSl9LCBidXQgdGhlIHZhbHVlIGluIHRoZSB1cGxvYWQgaXMgJHtjb2RlKHRvUHJlY2lzaW9uKHBhcmFtcz8uY3VycmVudCwgMykpfS5cbiAgICAgICAgJHtwYXJhbXM/LnRocmVzaG9sZCA/IGBPdXIgdGhyZXNob2xkIGlzIMKxJHt0aHJlc2hvbGQocGFyYW1zPy50aHJlc2hvbGQpfS5gIDogJyd9YCA6XG4gICAgICAgIGBub3QgY29uc2lzdGVudCB3aXRoIHRoZSBtb2RlbCByZXN1bHQuYFxuICAgIH1gLFxuICAnbXVzdCBiZSBlcXVhbCB0byBwcmV2aW91cyBwcm9kdWN0IG11bHRpcGxpZWQgYnkgdGhlIHNoYXJlJzogKCkgPT5cbiAgICBgUHJvZHVjdHMgZnJvbSBhIHRyYW5zZm9ybWF0aW9uIHdoaWNoIGFyZSBhbiBJbnB1dCBpbiB0byB0aGUgbmV4dCB0cmFuc2Zvcm1hdGlvbiBtdXN0IGZvbGxvdyB0aGUgZm9sbG93aW5nIHJ1bGU6XG4gICAgJHtjb2RlKCdwcmV2aW91cy5wcm9kdWN0LnZhbHVlICogY3VycmVudC50cmFuc2Zvcm1lZFNoYXJlIC8gMTAwID09IGN1cnJlbnQuaW5wdXQudmFsdWUnKX1gLFxuICAnYXQgbGVhc3Qgb25lIElucHV0IG11c3QgYmUgYSBQcm9kdWN0IG9mIHRoZSBDeWNsZSc6ICgpID0+XG4gICAgYEEgVHJhbnNmb3JtYXRpb24gY29udmVydHMgYSBQcm9kdWN0IGZyb20gYSBDeWNsZSBpbnRvIGFub3RoZXIgUHJvZHVjdC5cbiAgICBUaGVyZWZvcmUsIGF0IGxlYXN0IG9uZSBJbnB1dCBpbnRvIHRoZSBUcmFuc2Zvcm1hdGlvbiBtdXN0IGJlIGEgUHJvZHVjdCBvZiB0aGUgQ3ljbGUuYCxcbiAgJ211c3QgaGF2ZSBvbmx5IG9uZSBlbnRyeSB3aXRoIHRoZSBzYW1lIHRlcm0udGVybVR5cGUgPSBleGNyZXRhTWFuYWdlbWVudCc6ICgpID0+XG4gICAgYFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBQcmFjdGljZSBvZiB0eXBlIGV4Y3JldGFNYW5hZ2VtZW50IGluIGEgQ3ljbGUuXG4gICAgVG8gcmVwcmVzZW50IG11bHRpcGxlIGV4Y3JldGEgbWFuYWdlbWVudCBzeXN0ZW1zIGVpdGhlciB1c2UgbXVsdGlwbGUgQ3ljbGVzIGFuZCBsaW5rIHRoZW0gdG9nZXRoZXIsXG4gICAgb3IgdXNlIFRyYW5zZm9ybWF0aW9ucyB3aXRoaW4gYSBDeWNsZSBhbmQgbGluayB0aG9zZSB0b2dldGhlci5gLFxuICAnbXVzdCBiZSBpbmNsdWRlZCBhcyBhbiBJbnB1dCc6ICh7IHBhcmFtcyB9LCBlcnJvckNvdW50KSA9PlxuICAgIGBUaGUgZXhjcmV0YSBQcm9kdWN0cyBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGV4Y3JldGEgSW5wdXRzLlxuICAgICR7XG4gICAgICBlcnJvckNvdW50ID09PSAxID9cbiAgICAgICAgYEUuZy4sIHlvdSBjYW5ub3QgZ2V0ICR7XG4gICAgICAgICAgY29kZShwYXJhbXM/LnRlcm0/Lm5hbWUpXG4gICAgICAgIH0gZnJvbSAke1xuICAgICAgICAgIChwYXJhbXM/LmV4cGVjdGVkIHx8IFtdKS5tYXAodiA9PiBjb2RlKGtleVRvTGFiZWwodikpKS5qb2luKCcgb3IgJylcbiAgICAgICAgfS5gIDpcbiAgICAgICAgJydcbiAgICB9XG4gICAgUGxlYXNlIGNoZWNrIHRoZSBJbnB1dHMgYW5kIFByb2R1Y3RzIG9mIHRoZSBUcmFuc2Zvcm1hdGlvbi5gLFxuICAnbXVzdCBhZGQgdGhlIGxpbmtlZCBpbnB1dHMgdG8gdGhlIGN5Y2xlJzogKHsgcGFyYW1zIH0sIGVycm9yQ291bnQpID0+XG4gICAgYCR7XG4gICAgICBlcnJvckNvdW50ID09PSAxID9cbiAgICAgICAgYFlvdSBoYXZlIHN0YXRlZCB0aGF0ICR7Y29kZShwYXJhbXM/LnRlcm0/Lm5hbWUpfSB3YXMgY3JlYXRlZCBieSB0aGUgZm9sbG93aW5nIElucHV0cyAke1xuICAgICAgICAgIHBhcmFtcz8uZXhwZWN0ZWQ/Lm1hcChlID0+IGNvZGUoZS5uYW1lKSkuam9pbignICwgJylcbiAgICAgICAgfWA6XG4gICAgICAgICdZb3UgaGF2ZSBzdGF0ZWQgc29tZSBFbWlzc2lvbnMgd2VyZSBjcmVhdGVkIGJ5IHNvbWUgSW5wdXRzJ1xuICAgIH0uXG4gICAgSG93ZXZlciwgdGhlc2UgSW5wdXRzIGRvIG5vdCBleGlzdCBpbiB0aGUgQ3ljbGUuXG4gICAgUGxlYXNlIGFkZCB0aGVzZSBJbnB1dHMsIGV2ZW4gaWYgeW91IGRvIG5vdCBoYXZlIGEgdmFsdWUgZm9yIHRoZW0uYCxcbiAgJ211c3QgYWRkIHRoZSBsaW5rZWQgdHJhbnNmb3JtYXRpb25zIHRvIHRoZSBjeWNsZSc6ICh7IGxldmVsLCBwYXJhbXMgfSwgZXJyb3JDb3VudCkgPT5cbiAgICBgJHtcbiAgICAgIGVycm9yQ291bnQgPT09IDEgP1xuICAgICAgICBgWW91IGhhdmUgc3BlY2lmaWVkIHRoYXQke2NvZGUocGFyYW1zPy50ZXJtPy5uYW1lKX0gd2FzIGNyZWF0ZWQgZHVyaW5nIGEgVHJhbnNmb3JtYXRpb24gd2l0aCB0aGUgVGVybSBuYW1lICR7Y29kZShwYXJhbXM/LmV4cGVjdGVkPy5uYW1lKX1gIDpcbiAgICAgICAgJ1lvdSBoYXZlIHN0YXRlZCBzb21lIEVtaXNzaW9ucyB3ZXJlIGNyZWF0ZWQgYnkgc29tZSBUcmFuc2Zvcm1hdGlvbnMnXG4gICAgfS5cbiAgICBIb3dldmVyLCB3ZSBjYW5ub3QgZmluZCBhIFRyYW5zZm9ybWF0aW9uIHdpdGhpbiB0aGUgQ3ljbGUgd2l0aCB0aGlzIFRlcm0gbmFtZS5cbiAgICAke1xuICAgICAgbGV2ZWwgPT09ICdlcnJvcicgP1xuICAgICAgICAnUGxlYXNlIGNoZWNrIHRoZSBUZXJtcyB1c2VkIGluIHRoZSBFbWlzc2lvbnMgYW5kL29yIHRoZSBUcmFuc2Zvcm1hdGlvbnMuJyA6XG4gICAgICAgICdZb3UgbWF5IHdhbnQgdG8gYWRkIHRoaXMgVHJhbnNmb3JtYXRpb24uJ1xuICAgIH1gLFxuICAnZXZlcnkgaXRlbSBpbiB0aGUgbGlzdCBzaG91bGQgYmUgdW5pcXVlJzogKHsgcGFyYW1zIH0pID0+XG4gICAgYFRoaXMgQmxhbmsgTm9kZSBpcyBkdXBsaWNhdGVkLiBFdmVyeSBCbGFuayBOb2RlIHNob3VsZCBiZSB1bmlxdWUuXG4gICAgVW5pcXVlbmVzcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmb2xsb3dpbmcgZmllbGRzOiAke1xuICAgICAgKHBhcmFtcz8ua2V5cyB8fCBbXSkubWFwKGNvZGUpLmpvaW4oJywgJylcbiAgICB9YCxcbiAgJ211c3QgY29udGFpbiBhcyBtYW55IGl0ZW1zIGFzIHZhbHVlcyc6ICh7IHBhcmFtcywgZGF0YVBhdGggfSkgPT5cbiAgICBgVGhlIG51bWJlciBvZiAke2NvZGUoZGF0YVBhdGguc3BsaXQoJy4nKS5wb3AoKSl9IG11c3QgbWF0Y2ggdGhlIG51bWJlciBvZiAke2NvZGUoJ3ZhbHVlJyl9LlxuICAgIEN1cnJlbnRseSB0aGVyZSBhcmUgJHtwYXJhbXM/LmN1cnJlbnR9ICR7Y29kZShkYXRhUGF0aC5zcGxpdCgnLicpLnBvcCgpKX0gYnV0ICR7cGFyYW1zPy5leHBlY3RlZH0gJHtjb2RlKCd2YWx1ZScpfS5gLFxuICAnaXMgdG9vIGdlbmVyaWMnOiAoeyBwYXJhbXMgfSkgPT5cbiAgICBgWW91IGhhdmUgdGhlIGZvbGxvd2luZyBQcm9kdWN0ICR7Y29kZShwYXJhbXM/LnByb2R1Y3Q/Lm5hbWUpfSBob3dldmVyLFxuICAgIHlvdSBoYXZlIHVzZWQgYSBnZW5lcmljICR7Z2xvc3NhcnlUeXBlTGluayhwYXJhbXM/LnRlcm0/LnRlcm1UeXBlKX0gdGVybSAke2NvZGUocGFyYW1zPy50ZXJtPy5uYW1lKX0uXG4gICAgVXNlIGEgbW9yZSBzcGVjaWZpYyB0ZXJtIGZvciB0aGUgJHtcbiAgICAgIGdsb3NzYXJ5VHlwZUxpbmsocGFyYW1zPy50ZXJtPy50ZXJtVHlwZSlcbiAgICB9IHdoaWNoIHJlZmxlY3RzIHRoZSBzcGVjaWZpYyAke1xuICAgICAgZ2xvc3NhcnlUeXBlTGluayhwYXJhbXM/LnByb2R1Y3Q/LnRlcm1UeXBlKVxuICAgIH0uYCxcbiAgJ2lzIG1pc3NpbmcgcmVxdWlyZWQgYmlibGlvZ3JhcGhpYyBpbmZvcm1hdGlvbic6ICgpID0+XG4gICAgYFRoZSBhdXRvbWF0aWMgYmlibGlvZ3JhcGh5IHNlYXJjaCBmYWlsZWQgZm9yIHRoaXMgQmlibGlvZ3JhcGh5LiBFaXRoZXI6XG4gICAgPHVsIGNsYXNzPVwiaXMtcGwtMyBpcy1saXN0LXN0eWxlLWRlY2ltYWxcIj5cbiAgICA8bGk+TWFudWFsbHkgZmlsbC1pbiB0aGUgPGI+cmVxdWlyZWQ8L2I+IGJpYmxpb2dyYXBoaWMgaW5mb3JtYXRpb24gYXMgcGVyICR7c2NoZW1hTGluayhTY2hlbWFUeXBlLkJpYmxpb2dyYXBoeSwgJ291ciBzY2hlbWEnKX0uPC9saT5cbiAgICA8bGk+UHJvdmlkZSB0aGUgJHtjb2RlKCdkb2N1bWVudERPSScpfSBhcyB3ZWxsIGFzIHRoZSAke2NvZGUoJ3RpdGxlJyl9LjwvbGk+XG4gICAgPGxpPkNoZWNrIHRoZSAke2NvZGUoJ2RvY3VtZW50RE9JJyl9IGFuZCAke2NvZGUoJ3RpdGxlJyl9IGZvciB0eXBvcyBhZ2FpbnN0IHRoZSAke2V4dGVybmFsTGluaygnaHR0cHM6Ly93d3cubWVuZGVsZXkuY29tJywgJ01lbmRlbGV5IGNhdGFsb2d1ZScpfS48L2xpPlxuICAgIDwvdWw+YCxcbiAgJ3Nob3VsZCBiZSBsb3dlciB0aGFuIG1heCBzaXplJzogKHsgcGFyYW1zIH0pID0+XG4gICAgYFRoZSBib3VuZGFyeSBvciByZWdpb24gaXMgPiR7cGFyYW1zPy5leHBlY3RlZH1rbTIgYW5kIGlzIHRvbyBsYXJnZSB0byByZWxpYWJseSBnYXAgZmlsbCBNZWFzdXJlbWVudHMuXG4gICAgSWYgeW91IGFyZSBhYmxlIHRvIHVzZSBhIG1vcmUgc3BlY2lmaWMgcmVnaW9uLCBwbGVhc2UgZG8uYCxcbiAgJ2FuIGV4Y3JldGEgaW5wdXQgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyBhbiBleGNyZXRhTWFuYWdlbWVudCBwcmFjdGljZSc6ICh7IGRhdGFQYXRoIH0pID0+IHtcbiAgICBjb25zdCBwYXRocyA9IHBhcnNlRGF0YVBhdGgoZGF0YVBhdGghKTtcbiAgICByZXR1cm4gYEV4Y3JldGEgbWFuYWdlbWVudCBpcyB0aGUgY29udmVyc2lvbiBvZiBleGNyZXRhIHRvIGFub3RoZXIgdHlwZSBvZiBleGNyZXRhLlxuICAgICAgWW91IGhhdmUgYWRkZWQgYW4gZXhjcmV0YU1hbmFnZW1lbnQgUHJhY3RpY2UgdG8gdGhpcyAke3BhdGhzWzBdLmxhYmVsfSBidXQgdGhlcmUgaXMgbm8gZXhjcmV0YSBJbnB1dC5cbiAgICAgIFRvIHJlcHJlc2VudCBleGNyZXRhIG1hbmFnZW1lbnQsIHVzZSBhICR7cGF0aHNbMF0ubGFiZWx9IHdpdGggZXhjcmV0YSBhcyBhbiBJbnB1dCBhbmQgZXhjcmV0YU1hbmFnZW1lbnQgYXMgYSBQcmFjdGljZS5gO1xuICB9LFxuICAnb25seSAxIHByaW1hcnkgcHJvZHVjdCBhbGxvd2VkJzogKCkgPT4gJ1RoZXJlIGNhbiBvbmx5IGJlIG9uZSBwcmltYXJ5IHByb2R1Y3QgaW4gZWFjaCBDeWNsZS4nLFxuICAnaXMgbm90IGFsbG93ZWQgaW4gY29tYmluYXRpb24gd2l0aCBub1RpbGxhZ2UnOiAoKSA9PlxuICAgIGBUaGlzIG9wZXJhdGlvbiBpbnZvbHZlcyB0aWxsYWdlLCB5ZXQgeW91IGhhdmUgc3BlY2lmaWVkIHRoZSBQcmFjdGljZSAke3Rlcm1MaW5rKG5vVGlsbGFnZSl9LlxuICAgIEVpdGhlciBjaGFuZ2UgdGhpcyBvcGVyYXRpb24gb3IgdGhlIFByYWN0aWNlLmAsXG4gICdzaG91bGQgY29udGFpbiBhIHRpbGxhZ2UgcHJhY3RpY2UnOiAoKSA9PlxuICAgIGBXZSByZWNvbW1lbmQgc3BlY2lmeWluZyB0aGUgdHlwZSBvZiB0aWxsYWdlIHVzZWQgZm9yIHRoaXMgQ3ljbGUuXG4gICAgUGxlYXNlIHNlZSB0aGUgJHtnbG9zc2FyeVR5cGVMaW5rKFRlcm1UZXJtVHlwZS50aWxsYWdlKX0gZ2xvc3NhcnkuYCxcbiAgJ211c3Qgc2V0IHZhbHVlIGZvciBldmVyeSB0aWxsYWdlIHByYWN0aWNlJzogKCkgPT5cbiAgICBgRWl0aGVyIHNwZWNpZnkgYSBzaW5nbGUgJHtnbG9zc2FyeVR5cGVMaW5rKFRlcm1UZXJtVHlwZS50aWxsYWdlKX0gcHJhY3RpY2Ugb3IgYWRkIGEgdmFsdWUgdG8gYWxsIHByYWN0aWNlcy5gLFxuICAnc3VtIG5vdCBlcXVhbCB0byAxMDAlIGZvciB0aWxsYWdlIHByYWN0aWNlcyc6ICgpID0+XG4gICAgYFRoZSBzdW0gb2YgJHtnbG9zc2FyeVR5cGVMaW5rKFRlcm1UZXJtVHlwZS50aWxsYWdlKX0gcHJhY3RpY2VzIG11c3QgZXF1YWwgMTAwJS5gLFxuICAnY2FuIG9ubHkgaGF2ZSAxIHRpbGxhZ2UgcHJhY3RpY2Ugd2l0aG91dCBhIHZhbHVlJzogKHsgcGFyYW1zIH0pID0+XG4gICAgYEl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYSBDeWNsZSB0byBoYXZlIHRoZSBmb2xsb3dpbmcgdGlsbGFnZSBQcmFjdGljZXM6XG4gICAgJHsocGFyYW1zPy5jdXJyZW50ID8/IFtdKS5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKS5qb2luKCcgYW5kICcpfSBhdCB0aGUgc2FtZSB0aW1lLlxuICAgIElmIG11bHRpcGxlIHRpbGxhZ2UgcHJhY3RpY2VzIGRpZCBvY2N1ciwgcGxlYXNlIHNwZWNpZnkgdGhlIHBlcmNlbnRhZ2Ugb2YgYXJlYSB0aGV5IG9jY3VycmVkIG9uLmAsXG4gICdjYW4gbm90IGJlIGxpbmtlZCB0byB0aGUgc2FtZSBDeWNsZSc6ICgpID0+ICdZb3UgY2FuIG5vdCBsaW5rIGFuIElucHV0IHRvIHRoZSBJbXBhY3QgQXNzZXNzbWVudCBvZiB0aGUgc2FtZSBDeWNsZS4nLFxuICAvLyBkZXByZWNhdGVkLCByZW1vdmUgd2hlbiBtZXNzYWdlIGlzIG5vdCBiZWluZyB1c2VkIGFueW1vcmVcbiAgJ211c3QgYmUgMCBmb3IgcHJvZHVjdCB2YWx1ZSAwJzogKHsgZGF0YVBhdGgsIHBhcmFtcyB9LCBlcnJvckNvdW50KSA9PlxuICAgIGBJZiB0aGUgYW1vdW50IHByb2R1Y2VkIGlzIHplcm8sIHRoZSAke2NvZGUoZGF0YVBhdGg/LnNwbGl0KCcuJykucG9wKCkhKX0gb2YgJHtcbiAgICAgIGVycm9yQ291bnQgPT09IDEgPyBjb2RlKHBhcmFtcz8udGVybS5uYW1lKSA6ICd0aGF0IHByb2R1Y3QnXG4gICAgfSBtdXN0IGFsc28gYmUgemVyby5gLFxuICAnZWNvbm9taWNWYWx1ZVNoYXJlIG11c3QgYmUgMCBmb3IgcHJvZHVjdCB2YWx1ZSAwJzogKHsgcGFyYW1zIH0sIGVycm9yQ291bnQpID0+XG4gICAgYElmIHRoZSBhbW91bnQgcHJvZHVjZWQgaXMgemVybywgdGhlIGVjb25vbWljVmFsdWVTaGFyZSBvZiAke1xuICAgICAgZXJyb3JDb3VudCA9PT0gMSA/IGNvZGUocGFyYW1zPy50ZXJtLm5hbWUpIDogJ3RoYXQgcHJvZHVjdCdcbiAgICB9IG11c3QgYWxzbyBiZSB6ZXJvLmAsXG4gICdyZXZlbnVlIG11c3QgYmUgMCBmb3IgcHJvZHVjdCB2YWx1ZSAwJzogKHsgcGFyYW1zIH0sIGVycm9yQ291bnQpID0+XG4gICAgYElmIHRoZSBhbW91bnQgcHJvZHVjZWQgaXMgemVybywgdGhlIHJldmVudWUgb2YgJHtcbiAgICAgIGVycm9yQ291bnQgPT09IDEgPyBjb2RlKHBhcmFtcz8udGVybS5uYW1lKSA6ICd0aGF0IHByb2R1Y3QnXG4gICAgfSBtdXN0IGFsc28gYmUgemVyby5gLFxuICAnc2hvdWxkIGFkZCBhIHNvdXJjZSc6ICh7IHBhcmFtcyB9KSA9PlxuICAgIGBXZSByZWNvbW1lbmQgYWRkaW5nIGEgU291cmNlIHRvIGFsbCBkYXRhIGl0ZW1zLlxuICAgIFRoaXMgY2FuIGJlIGRvbmUgYnkgYWRkaW5nIHRoZSAke2NvZGUocGFyYW1zPy5jdXJyZW50KX0gZmllbGQuXG4gICAgU291cmNlcyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggZGF0YSBpdGVtIChpLmUuLCBlYWNoIElucHV0LCBFbWlzc2lvbiwgUHJvZHVjdCwgUHJhY3RpY2UsIE1lYXN1cmVtZW50LCBvciBJbmZyYXN0cnVjdHVyZSkuYCxcbiAgJ2NvdmVyIGNyb3AgY3ljbGUgY29udGFpbnMgbm9uIGNvdmVyIGNyb3AgcHJvZHVjdCc6ICgpID0+XG4gICAgYFlvdSBoYXZlIHNwZWNpZmllZCB0aGF0IHRoaXMgY3JvcCBpcyBhIGNvdmVyIGNyb3AgdXNpbmcgYSBQcmFjdGljZS5cbiAgICBBIGNvdmVyIGNyb3AgaXMgZGVmaW5lZCBhcyBcImEgY3JvcCB3aGljaCBpcyBsZWZ0IGluIHRoZSBmaWVsZCB3aXRob3V0IGFueSBmcmFjdGlvbiBoYXJ2ZXN0ZWQgYnkgdGhlIGVuZCBvZiB0aGUgQ3ljbGVcIi5cbiAgICBUaGUgUHJvZHVjdHMgb2YgdGhpcyBDeWNsZSBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhpcyBjcm9wIGJlaW5nIGEgY292ZXIgY3JvcC5cbiAgICBQbGVhc2UgY2hlY2sgdGhlIFByb2R1Y3RzIG9yIHRoZSBQcmFjdGljZXMuYCxcbiAgJ3Nob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgY3ljbGUgcHJvZHVjdHMnOiAoeyBwYXJhbXMgfSwgZXJyb3JDb3VudCkgPT5cbiAgICBgJHtcbiAgICAgIGVycm9yQ291bnQgPT09IDEgP1xuICAgICAgICBgVGhlIFByb2R1Y3QgJHtjb2RlKHBhcmFtcy5wcm9kdWN0Lm5hbWUpfSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgQ3ljbGUgd2l0aCBpZCAke2NvZGUocGFyYW1zLm5vZGUuaWQpfWAgOlxuICAgICAgICAnVGhlIEltcGFjdEFzc2Vzc21lbnQgUHJvZHVjdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbGlua2VkIEN5Y2xlJ1xuICAgIH0uXG4gICAgUGxlYXNlIGFkZCB0aGUgUHJvZHVjdCBpbiB0aGUgQ3ljbGUgb3IgcmVtb3ZlIHRoZSBsaW5rIHdpdGggdGhlIEN5Y2xlLmAsXG4gICdtdWx0aXBsZSBJbXBhY3RBc3Nlc3NtZW50IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgUHJvZHVjdCBvZiB0aGUgc2FtZSBDeWNsZSc6ICgpID0+XG4gICAgYE9ubHkgMSBJbXBhY3QgQXNzZXNzbWVudCBjYW4gYmUgcmVsYXRlZCB0byB0aGlzIFByb2R1Y3QuXG4gICAgUGxlYXNlIG1ha2Ugc3VyZSB0aGUgcHJvZHVjdCBpcyBjb3JyZWN0IG9yIHRoZSBjeWNsZS5pZCB5b3UgYXJlIHJlZmVycmluZyB0byBpcyBjb3JyZWN0LmAsXG4gICdtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBsYW5kIG9jY3VwYXRpb24nOiAoKSA9PlxuICAgIGBMYW5kIHRyYW5zZm9ybWF0aW9uIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbGFuZCBvY2N1cGF0aW9uXG4gICAgKGxhbmQgdHJhbnNmb3JtYXRpb24gaXMgdGhlIGFtb3VudCBvZiBsYW5kIGNvbnZlcnRlZCBiZXR3ZWVuIHNvbWUgZGF0ZSBpbiB0aGUgcGFzdCBhbmQgdGhlIGN1cnJlbnQgeWVhcixcbiAgICBkaXZpZGVkIGJ5IGFuIGFtb3J0aXphdGlvbiBwZXJpb2QsIHNvIGl0IHNob3VsZCBhbHdheXMgYmUgbGVzcyB0aGFuIGxhbmQgb2NjdXBhdGlvbiBieSBkZWZpbml0aW9uKS5gLFxuICAnc2hvdWxkIGJlIGxpbmtlZCB0byBhbiBlbWlzc2lvbiBpbiB0aGUgQ3ljbGUnOiAoeyBwYXJhbXMgfSwgZXJyb3JDb3VudCkgPT5cbiAgICBgJHtcbiAgICAgIGVycm9yQ291bnQgPT09IDEgPyBgJHtjb2RlKHBhcmFtcz8udGVybS5uYW1lKX0gZXhpc3RzYCA6ICdTb21lIEVtaXNzaW9ucyBleGlzdCdcbiAgICB9IGluIGJvdGggdGhlIEN5Y2xlIGFuZCB0aGUgVHJhbnNmb3JtYXRpb24gYnV0ICR7ZXJyb3JDb3VudCA9PT0gMSA/ICdpdCBpcycgOiAndGhleSBhcmUnfSBub3QgbGlua2VkIHVzaW5nICR7XG4gICAgICBjb2RlKCdjeWNsZS5lbWlzc2lvbnMuWC50cmFuc2Zvcm1hdGlvbi50ZXJtJylcbiAgICB9LiBUaGlzIG1heSBiZSBhbiBlcnJvci5gLFxuICAnc2hvdWxkIGFkZCBhbiBhbmltYWwgcHJvZHVjdGlvbiBzeXN0ZW0nOiAoKSA9PlxuICAgIGBGb3IgYW5pbWFsIHByb2R1Y3Rpb24gY3ljbGVzLCB3ZSByZWNvbW1lbmQgc3BlY2lmeWluZyB0aGUgYW5pbWFsIHByb2R1Y3Rpb24gJHtnbG9zc2FyeVR5cGVMaW5rKFRlcm1UZXJtVHlwZS5zeXN0ZW0pfSBhcyBhIFByYWN0aWNlLlxuICAgIFlvdSBjYW4gZmluZCBhIGxpc3Qgb2Ygc3lzdGVtcyBpbiB0aGUgJHtnbG9zc2FyeVR5cGVMaW5rKFRlcm1UZXJtVHlwZS5zeXN0ZW0sICdHbG9zc2FyeScpfS5gLFxuICAnbXVzdCBiZSBzZXQgdG8gZmFsc2Ugd2hlbiBzcGVjaWZ5aW5nIGZ1ZWwgdXNlJzogKHsgcGFyYW1zIH0pID0+XG4gICAgYElmIG1hY2hpbmVyeSBmdWVsICgke3BhcmFtcz8uYWxsb3dlZFZhbHVlcy5tYXAoY29kZSkuam9pbignLCAnKX0pIGlzIHVzZWQgZHVyaW5nIGEgQ3ljbGUsXG4gICAgYnV0IHRoZXJlIGlzIG5vIGRhdGEgb24gdGhlIGFtb3VudCBvZiAke2dsb3NzYXJ5VHlwZUxpbmsoVGVybVRlcm1UeXBlLm1hdGVyaWFsKX0gdXNlZCBmb3IgYWdyaWN1bHR1cmFsIGVxdWlwbWVudCxcbiAgICB0aGVuICR7Y29kZSgnY29tcGxldGVuZXNzLm1hdGVyaWFsJyl9IG11c3QgYmUgJHtjb2RlKCdmYWxzZScpfS5gLFxuICAnbXVzdCBiZSBiZWxvdyBvciBlcXVhbCB0byAxIGZvciB1bml0IGluIGhhJzogKCkgPT5cbiAgICBgVGhlIG1heGltdW0gdmFsdWUgZm9yIGEgcHJvZHVjdCB3aXRoIHVuaXRzICR7Y29kZSgnaGEnKX0gb24gYSBDeWNsZSB3aXRoIGEgJHtcbiAgICAgIHNjaGVtYUxpbmsoJ0N5Y2xlI2Z1bmN0aW9uYWxVbml0JywgJ2Z1bmN0aW9uYWwgdW5pdCcpXG4gICAgfSBvZiAke2NvZGUoJzEgaGEnKX0gaXMgJHtjb2RlKCcxJyl9LlxuICAgIElmIHlvdSBhcmUgdHJ5aW5nIHRvIGFkZCBhIHByb2R1Y3Qgd2l0aCB0aGUgdW5pdHMgJHtjb2RlKCdrZycpfSwgdXNlIGEgZGlmZmVyZW50IHRlcm0uYCxcbiAgJ3Bhc3R1cmVHcmFzcyBrZXkgdW5pdHMgbXVzdCBiZSBcXCdoYVxcJyc6ICh7IHBhcmFtcyB9KSA9PlxuICAgIGBUaGUgVGVybSAke2NvZGUocGFyYW1zPy50ZXJtLm5hbWUpfSBjYW4ndCBiZSB1c2VkIGFzIGEga2V5IGZvciAke3Rlcm1MaW5rKHBhc3R1cmVHcmFzcyl9LlxuICAgIFBsZWFzZSB1c2UgdGhlIFRlcm0gZGVzY3JpYmluZyB0aGUgcGxhbnQgd2l0aCB0aGUgdW5pdHMgJHtjb2RlKHBhcmFtcy5leHBlY3RlZCl9IGluc3RlYWQuXG4gICAgVGhpcyB3aWxsIGhlbHAgdXMgZ2FwLWZpbGwgdGhlIGFtb3VudCBvZiBncmFzcyBjb25zdW1lZCBieSB0aGUgaGVyZC5gLFxuICAndGhlIHN1bSBvZiBhbGwgcGFzdHVyZUdyYXNzIHZhbHVlcyBtdXN0IGJlIDEwMCc6ICh7IHBhcmFtcyB9KSA9PlxuICAgIGBUaGUgc3VtIG9mIGFsbCAke3Rlcm1MaW5rKHBhc3R1cmVHcmFzcyl9IHZhbHVlcyBtdXN0IGJlIGVxdWFsIHRvICR7cGFyYW1zLmV4cGVjdGVkfSUuYCxcbiAgJ2lzIG91dHNpZGUgY29uZmlkZW5jZSBpbnRlcnZhbCc6IChfZXJyb3IsIGVycm9yQ291bnQsIGFsbEVycm9ycykgPT5cbiAgICBgJHt1bmlxdWUoYWxsRXJyb3JzLmZsYXRNYXAoKHsgZGF0YVBhdGgsIHBhcmFtcyB9KSA9PiBwYXJhbXM/Lm91dGxpZXJzPy5tYXAodmFsdWUgPT5cbiAgICAgIGBUaGUgJHtcbiAgICAgICAgZGF0YVBhdGguaW5jbHVkZXMoJ3Byb2R1Y3QnKSA/ICdwcm9kdWN0JyA6ICdpbnB1dCdcbiAgICAgIH0gdmFsdWUgJHtcbiAgICAgICAgZXJyb3JDb3VudCA9PT0gMSA/IGAke2NvZGUodmFsdWUpfSBgIDogJydcbiAgICAgIH1pcyAke1xuICAgICAgICB2YWx1ZSA+IHBhcmFtcz8ubWluID8gJ2Fib3ZlJyA6ICdiZWxvdydcbiAgICAgIH0gJHtcbiAgICAgICAgcGFyYW1zPy50aHJlc2hvbGQgPyBgJHtjb2RlKGAkeyhwYXJhbXMudGhyZXNob2xkICsgKCgxIC0gcGFyYW1zLnRocmVzaG9sZCkgLyAyKSkgKiAxMDB9JWApfSBvZmAgOiAnJ1xuICAgICAgfSBhbGwgJHtcbiAgICAgICAgcGFyYW1zPy5ncm91cCA/IGNvZGUocGFyYW1zLmdyb3VwKSA6IGNvZGUocGFyYW1zPy50ZXJtPy5uYW1lKVxuICAgICAgfSBkYXRhIGluICR7XG4gICAgICAgIGNvZGUocGFyYW1zPy5jb3VudHJ5Lm5hbWUpXG4gICAgICB9IG9uIHRoZSBIZXN0aWEgcGxhdGZvcm0uYFxuICAgICkpKS5qb2luKCc8L2JyPicpfVxuICAgIDwvYnI+XG4gICAgUGxlYXNlIGRvdWJsZS1jaGVjayB0aGVzZSB2YWx1ZXMgYmVmb3JlIHN1Ym1pdHRpbmcuYCxcbiAgJ3Nob3VsZCBiZSBlcXVhbCB0byBib3VuZGFyeSc6ICh7IHBhcmFtcyB9KSA9PlxuICAgIGBUaGUgY2FsY3VsYXRlZCBhcmVhIGZyb20gJHtjb2RlKCdib3VuZGFyeScpfSBpcyAke2NvZGUocGFyYW1zPy5leHBlY3RlZCl9LlxuICAgIFRoaXMgbWF5IGJlIGFuIGVycm9yIGlmIHRoZSBib3VuZGFyeSByZXByZXNlbnRzIHRoZSBhcmVhIHVuZGVyIGN1bHRpdmF0aW9uLmAsXG4gICdtdXN0IHNwZWNpZnkgdGhlIGZhdGUgb2YgY3JvcFJlc2lkdWUnOiAoKSA9PlxuICAgIGBGb3Igc2l0ZXMgb2YgdHlwZSBjcm9wbGFuZCBvciBwZXJtYW5lbnQgcGFzdHVyZSwgaWYgZGF0YSBjb21wbGV0ZW5lc3MgaXMgbWFya2VkICR7Y29kZSh0cnVlKX0gZm9yIGNyb3AgcmVzaWR1ZSwgdGhlIGZhdGVzIGFuZCBxdWFudGl0aWVzIG9mIHRoZSByZXNpZHVlIG11c3QgYmUgc3BlY2lmaWVkLlxuICAgIDxici8+XG4gICAgVGhlIHF1YW50aXR5IG11c3QgaW5jbHVkZSBib3RoIGFib3ZlIGFuZCBiZWxvdyBncm91bmQgY3JvcCByZXNpZHVlLCB3aGVyZSB0aGUgc3VtIG9mIGFib3ZlIGdyb3VuZCBjcm9wIHJlc2lkdWUgYW5kIGJlbG93IGdyb3VuZCBjcm9wIHJlc2lkdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby5cbiAgICBUaGlzIGNhbiBiZSBhZGRlZCB1c2luZyB0aGUgdGVybXM6XG4gICAgPHVsIGNsYXNzPVwiaXMtcGwtMyBpcy1saXN0LXN0eWxlLWRpc2MgaXMtbm93cmFwXCI+XG4gICAgPGxpPiR7dGVybUxpbmsoeyBpZDogJ2JlbG93R3JvdW5kQ3JvcFJlc2lkdWUnLCBuYW1lOiAnQmVsb3cgZ3JvdW5kIGNyb3AgcmVzaWR1ZScgfSl9OyBhbmQ8L2xpPlxuICAgIDxsaT4ke3Rlcm1MaW5rKHsgaWQ6ICdhYm92ZUdyb3VuZENyb3BSZXNpZHVlVG90YWwnLCBuYW1lOiAnQWJvdmUgZ3JvdW5kIGNyb3AgcmVzaWR1ZSB0b3RhbCcgfSl9LjwvbGk+XG4gICAgPC91bD5cbiAgICA8YnIvPlxuICAgIFRoZSBmYXRlIGNhbiBiZSBhZGRlZCB1c2luZzpcbiAgICA8dWwgY2xhc3M9XCJpcy1wbC0zIGlzLWxpc3Qtc3R5bGUtZGlzYyBpcy1ub3dyYXBcIj5cbiAgICA8bGk+dGhlICR7Z2xvc3NhcnlUeXBlTGluayhUZXJtVGVybVR5cGUuY3JvcFJlc2lkdWVNYW5hZ2VtZW50KX0gcHJhY3RpY2VzOyBhbmQvb3I8L2xpPlxuICAgIDxsaT50aGUgJHtnbG9zc2FyeVR5cGVMaW5rKFRlcm1UZXJtVHlwZS5jcm9wUmVzaWR1ZSl9IHByb2R1Y3RzPC9saT5cbiAgICA8L3VsPlxuICAgIGAsXG4gICdzaG91bGQgc3BlY2lmeSB0aGUgZmF0ZSBvZiBjcm9wUmVzaWR1ZSc6ICgpID0+XG4gICAgYFlvdSBoYXZlIG5vdCBzcGVjaWZpZWQgdGhlIGZhdGUgb2YgdGhlIGNyb3AgcmVzaWR1ZS5cbiAgICBBZGRpbmcgdGhpcyBpbmZvcm1hdGlvbiB3aWxsIGltcHJvdmUgZW1pc3Npb25zIGFuZCBzb2lsIGNhcmJvbiBzdG9jayBjYWxjdWxhdGlvbnMuXG4gICAgVGhlIGZhdGUgY2FuIGJlIGFkZGVkIHVzaW5nOlxuICAgIDx1bCBjbGFzcz1cImlzLXBsLTMgaXMtbGlzdC1zdHlsZS1kaXNjIGlzLW5vd3JhcFwiPlxuICAgIDxsaT50aGUgJHtnbG9zc2FyeVR5cGVMaW5rKFRlcm1UZXJtVHlwZS5jcm9wUmVzaWR1ZU1hbmFnZW1lbnQpfSBwcmFjdGljZXM7IGFuZC9vcjwvbGk+XG4gICAgPGxpPnRoZSAke2dsb3NzYXJ5VHlwZUxpbmsoVGVybVRlcm1UeXBlLmNyb3BSZXNpZHVlKX0gcHJvZHVjdHM7PC9saT5cbiAgICA8L3VsPlxuICAgIFJlbWVtYmVyIHRvIHNldCAke2NvZGUoJ2NvbXBsZXRlbmVzcy5jcm9wUmVzaWR1ZScpfSB0byAke2NvZGUodHJ1ZSl9IGlmIGJvdGggdGhlIGFib3ZlIGFuZCBiZWxvdyBncm91bmQgY3JvcCByZXNpZHVlIHF1YW50aXRpZXMgYW5kIGZhdGVzIGFyZSBzcGVjaWZpZWQuYCxcbiAgJ3Nob3VsZCBoYXZlIHRoZSBzYW1lIHByaXZhY3kgYXMgdGhlIHJlbGF0ZWQgc291cmNlJzogKHsgcGFyYW1zIH0pID0+XG4gICAgYFRvIGxpbmsgdG8gYSAke3BhcmFtcz8uZGVmYXVsdFNvdXJjZT8uZGF0YVByaXZhdGUgPyAncHJpdmF0ZScgOiAncHVibGljJ30gU291cmNlLFxuICAgIHRoaXMgTm9kZSBuZWVkcyB0byBiZSAke3BhcmFtcz8uZGVmYXVsdFNvdXJjZT8uZGF0YVByaXZhdGUgPyAncHJpdmF0ZScgOiAncHVibGljJ30gYXMgd2VsbC5cbiAgICBQbGVhc2Ugc2V0ICR7Y29kZSgnZGF0YVByaXZhdGUnKX09JHtjb2RlKGAke3BhcmFtcz8uZGVmYXVsdFNvdXJjZT8uZGF0YVByaXZhdGV9YCl9LmAsXG4gICdzaG91bGQgbm90IHVzZSBub3QgcmVsZXZhbnQgbW9kZWwnOiAoKSA9PlxuICAgIGBBbGwgZW1pc3Npb25zIHNob3VsZCBnZW5lcmFsbHkgaGF2ZSBhIG1ldGhvZCB0aWVyLCB3aGljaCBzdGF0ZXMgaG93IHRoZSBkYXRhIHdlcmUgbW9kZWxsZWQgb3IgaG93IHRoZSBkYXRhIHdlcmUgY29sbGVjdGVkLlxuICAgIFBsZWFzZSBzZWUgdGhlICR7c2NoZW1hTGluaygnRW1pc3Npb24jbWV0aG9kVGllcicsICdzY2hlbWEnKX0gZm9yIHRoZSBvcHRpb25zIGF2YWlsYWJsZSBhbmQgZGVmaW5pdGlvbnMgb2YgdGhlIG9wdGlvbnMuYCxcbiAgJ3Nob3VsZCBub3QgdXNlIG5vdCByZWxldmFudCBtZXRob2RUaWVyJzogKCkgPT5cbiAgICBgQWxsIGVtaXNzaW9ucyBzaG91bGQgZ2VuZXJhbGx5IGhhdmUgYSBtZXRob2QgdGllciwgd2hpY2ggc3RhdGVzIGhvdyB0aGUgZGF0YSB3ZXJlIG1vZGVsbGVkIG9yIGhvdyB0aGUgZGF0YSB3ZXJlIGNvbGxlY3RlZC5cbiAgICBQbGVhc2Ugc2VlIHRoZSAke3NjaGVtYUxpbmsoJ0VtaXNzaW9uI21ldGhvZFRpZXInLCAnc2NoZW1hJyl9IGZvciB0aGUgb3B0aW9ucyBhdmFpbGFibGUgYW5kIGRlZmluaXRpb25zIG9mIHRoZSBvcHRpb25zLmAsXG4gICdtdXN0IGhhdmUgaW5wdXRzIHJlcHJlc2VudGluZyB0aGUgZm9yYWdlIHdoZW4gc2V0IHRvIHRydWUnOiAoKSA9PlxuICAgIGBUaGlzIEN5Y2xlIGluY2x1ZGVzIGFuaW1hbHMgYW5kIGNvbXBsZXRlbmVzcyBpcyBzZXQgdG8gJHsoY29kZSh0cnVlKSl9IGZvciAke2NvZGUoJ2FuaW1hbEZlZWQnKX0uXG4gICAgSG93ZXZlciwgdGhlcmUgYXJlIG5vIElucHV0cyByZXByZXNlbnRpbmcgdGhlIGZvcmFnZSBpbnRha2UgYnkgYW5pbWFscyBpbiB0aGUgQ3ljbGUgKElucHV0cyB3aXRoIHRlcm1zIHdoaWNoIGNvbnRhaW4gdGhlIHdvcmRzIFwiZnJlc2ggZm9yYWdlXCIgYW5kIGEgJHtjb2RlKCd2YWx1ZScpfSkuXG4gICAgRWl0aGVyLCBzZXQgY29tcGxldGVuZXNzIHRvICR7KGNvZGUoZmFsc2UpKX0gZm9yICR7Y29kZSgnYW5pbWFsRmVlZCcpfSwgbWFrZSBzdXJlIGFsbCBcImZyZXNoIGZvcmFnZVwiIElucHV0cyBoYXZlIGEgJHtjb2RlKCd2YWx1ZScpfSwgb3IgYWRkIG9uZSBvciBtb3JlIElucHV0cyByZXByZXNlbnRpbmcgdGhlIGZvcmFnZSBpbnRha2UuYCxcbiAgJ211c3Qgc3BlY2lmeSB0aGUgZmF0ZSBvZiB0aGUgZmVlZCc6ICgpID0+XG4gICBgVGhpcyBDeWNsZSBpcyBhbiBhbmltYWwgcHJvZHVjdGlvbiBDeWNsZSBhbmQgdGhpcyBJbnB1dCBjb3VsZCBiZSBhbiBhbmltYWwgZmVlZCBvciBjb3VsZCBiZSBmb3IgYW5vdGhlciB1c2UuXG4gICBQbGVhc2Ugc3BlY2lmeSB0aGUgJHtzY2hlbWFMaW5rKCdJbnB1dCNmYXRlJywgJ2ZhdGUnKX0gZmllbGQgb24gdGhpcyBJbnB1dC5cbiAgIEtub3dpbmcgdGhlIGZhdGUgaXMgZXNzZW50aWFsIHRvIGRpc3Rpbmd1aXNoIElucHV0cyBiZXR3ZWVuIHRob3NlIHdoaWNoIGFyZSBmZWQgdG8gYW5pbWFscyBhbmQgdGhvc2Ugd2hpY2ggYXJlIHVzZWQgZm9yIG90aGVyIHB1cnBvc2VzLmBcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRDdXN0b21FcnJvck1lc3NhZ2UgPSAobWVzc2FnZT86IHN0cmluZywgZXJyb3I/OiBJVmFsaWRhdGlvbkVycm9yLCBhbGxFcnJvcnM6IElWYWxpZGF0aW9uRXJyb3JbXSA9IFtdKSA9PiB7XG4gIGNvbnN0IGZvcm1hdHRlZE1lc3NhZ2UgPSBtZXNzYWdlICYmIG1lc3NhZ2UgaW4gY3VzdG9tRXJyb3JNZXNzYWdlID9cbiAgICBjdXN0b21FcnJvck1lc3NhZ2VbbWVzc2FnZV0oZXJyb3IhLCBhbGxFcnJvcnMubGVuZ3RoLCBhbGxFcnJvcnMpIDpcbiAgICBtZXNzYWdlO1xuICByZXR1cm4gZm9ybWF0dGVkTWVzc2FnZSA/IGA8cCBjbGFzcz1cImlzLW5vcm1hbFwiPiR7Zm9ybWF0dGVkTWVzc2FnZX08L3A+YCA6ICcnO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdEVycm9yID0gKGVycm9yPzogSVZhbGlkYXRpb25FcnJvciwgYWxsRXJyb3JzOiBJVmFsaWRhdGlvbkVycm9yW10gPSBbXSk6IElWYWxpZGF0aW9uRXJyb3IgfCB1bmRlZmluZWQgPT5cbiAgZXJyb3JcbiAgICA/ICh7XG4gICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgIC4uLmVycm9yLFxuICAgICAgbWFwRXJyb3I6IGVycm9yLm1lc3NhZ2UgPT09IG1hcEVycm9yTWVzc2FnZSxcbiAgICAgIG1lc3NhZ2U6IGZvcm1hdEN1c3RvbUVycm9yTWVzc2FnZShlcnJvci5tZXNzYWdlLCBlcnJvciwgYWxsRXJyb3JzKVxuICAgIH0pXG4gICAgOiB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBlcnJvckhhc0Vycm9yID0gKGVycm9yPzogSVZhbGlkYXRpb25FcnJvcikgPT4gZXJyb3IgJiYgKGVycm9yLmxldmVsID09PSAnZXJyb3InIHx8ICFlcnJvci5sZXZlbCk7XG5cbmV4cG9ydCBjb25zdCBlcnJvckhhc1dhcm5pbmcgPSAoZXJyb3I/OiBJVmFsaWRhdGlvbkVycm9yKSA9PiBlcnJvciAmJiBlcnJvci5sZXZlbCA9PT0gJ3dhcm5pbmcnO1xuXG5leHBvcnQgY29uc3QgaXNNaXNzaW5nUHJvcGVydHlFcnJvciA9ICh7IHBhcmFtcyB9OiBJVmFsaWRhdGlvbkVycm9yKSA9PiAhIXBhcmFtcyAmJiAnbWlzc2luZ1Byb3BlcnR5JyBpbiBwYXJhbXM7XG5cbmV4cG9ydCBjb25zdCBpc01pc3NpbmdPbmVPZkVycm9yID0gKHsga2V5d29yZCwgc2NoZW1hUGF0aCB9OiBJVmFsaWRhdGlvbkVycm9yKSA9PlxuICBrZXl3b3JkID09PSAncmVxdWlyZWQnICYmIChzY2hlbWFQYXRoIHx8ICcnKS5pbmNsdWRlcygnb25lT2YnKTtcblxuY29uc3QgaXNGYWlsaW5nS2V5d29yZEVycm9yID0gKHsgcGFyYW1zIH06IElWYWxpZGF0aW9uRXJyb3IpID0+ICEhcGFyYW1zICYmICdmYWlsaW5nS2V5d29yZCcgaW4gcGFyYW1zO1xuXG5leHBvcnQgY29uc3QgZmlsdGVyRXJyb3IgPSAoZXJyb3I6IElWYWxpZGF0aW9uRXJyb3IpID0+IFtcbiAgaXNGYWlsaW5nS2V5d29yZEVycm9yXG5dLmV2ZXJ5KGZ1bmMgPT4gIWZ1bmMoZXJyb3IpKTtcblxuZXhwb3J0IGNvbnN0IG1pc3NpbmdOb2RlRXJyb3JzID0gKGVycm9yczogSVZhbGlkYXRpb25FcnJvcltdKSA9PlxuICBlcnJvcnMuZmlsdGVyKCh7IGtleXdvcmQsIHBhcmFtcyB9KSA9PlxuICAgIGtleXdvcmQgPT09ICdyZXF1aXJlZCcgJiYgKHBhcmFtcz8ubWlzc2luZ1Byb3BlcnR5ID09PSAnQHR5cGUnIHx8IHBhcmFtcz8ubWlzc2luZ1Byb3BlcnR5ID09PSAnQGlkJylcbiAgKTtcbiJdfQ==
@@ -6795,18 +6795,19 @@ const modelLink = (term, model) => `
6795
6795
  `;
6796
6796
  const threshold = (value) => code(`${value * 100}%`);
6797
6797
  const noTillage = { id: 'noTillage', name: 'No tillage' };
6798
+ const pastureGrass = { id: 'pastureGrass', name: 'Pasture grass' };
6798
6799
  const idNotFoundDefaultMessage = `
6799
6800
  If you are using the ${code('name')} of the Term, make sure to use ${code('term.name')} column;
6800
6801
  if you are using the ${code('@id')} of the Term, use the ${code('term.@id')} column instead.
6801
6802
  `.trim();
6802
6803
  const idNotFoundError = (_error, _errorCount, allErrors) => {
6803
- const migrationErrors = allErrors.filter(({ params }) => (params === null || params === void 0 ? void 0 : params.current) || (params === null || params === void 0 ? void 0 : params.expected));
6804
- const noMigrationErrors = allErrors.filter(({ params }) => !(params === null || params === void 0 ? void 0 : params.current) && !(params === null || params === void 0 ? void 0 : params.expected));
6804
+ const migrationErrors = allErrors.filter(({ params }) => (params === null || params === void 0 ? void 0 : params.current) && ('expected' in params));
6805
+ const noMigrationErrors = allErrors.filter(({ params }) => !(params === null || params === void 0 ? void 0 : params.current) || !('expected' in params));
6805
6806
  return `
6806
6807
  <p>Does not exist in Hestia.</p>
6807
- ${migrationErrors.map(({ params }) => (params === null || params === void 0 ? void 0 : params.expected)
6808
+ ${unique(migrationErrors.map(({ params }) => (params === null || params === void 0 ? void 0 : params.expected)
6808
6809
  ? `The Term ${code(params.current)} was updated, please use this Term instead: ${code(params.expected)}.`
6809
- : `The Term ${code(params.current)} was deleted. Please search the ${glossaryLink('Glossary')} for a new Term.`)}
6810
+ : `The Term ${code(params.current)} was deleted. Please search the ${glossaryLink('Glossary')} for a new Term.`)).join('</br>')}
6810
6811
  ${noMigrationErrors.length ? idNotFoundDefaultMessage : ''}
6811
6812
  `;
6812
6813
  };
@@ -6817,9 +6818,11 @@ const customErrorMessage = {
6817
6818
  'should have required property \'id\'': idNotFoundError,
6818
6819
  'should match exactly one schema in oneOf': () => '',
6819
6820
  'should match some schema in anyOf': () => '',
6821
+ 'should match "then" schema': () => '',
6820
6822
  'should NOT have additional properties': ({ params }, errorCount) => errorCount === 1 ?
6821
6823
  `The following field does not exist: ${params === null || params === void 0 ? void 0 : params.additionalProperty} or is not allowed in this case.` :
6822
- `should not have additional properties`,
6824
+ `Should not have additional properties.`,
6825
+ 'should NOT be valid': () => 'Should not be used in this case.',
6823
6826
  'should match pattern "^\\d{13}$"': () => `should be composed of 13 numbers`,
6824
6827
  'should match pattern "^[0-9]{4}(-[0-9]{2})?(-[0-9]{2})?$"': () => dateFormatMessage,
6825
6828
  'should match pattern "^([0-9]{4}|-)(-[0-9]{2})?(-[0-9]{2})?$"': () => dateFormatMessage,
@@ -6850,7 +6853,8 @@ const customErrorMessage = {
6850
6853
  ? `Please check the measurement, its depth intervals, and the dates of the measurement or update the soil texture if needed.`
6851
6854
  : `Please check your measurements, their depth intervals, and the dates of the measurements or update the soil textures if needed.`}`;
6852
6855
  },
6853
- 'should be equal to one of the allowed values': ({ params }) => `must have one of these values: ${params === null || params === void 0 ? void 0 : params.allowedValues.map(code).join(', ')}`,
6856
+ 'should be equal to one of the allowed values': ({ params }) => `Must have one of these values: ${params === null || params === void 0 ? void 0 : params.allowedValues.map(code).join(', ')}`,
6857
+ 'should be equal to constant': ({ params }) => `Must be: ${code(params === null || params === void 0 ? void 0 : params.allowedValue)}`,
6854
6858
  'is not allowed for this characterisedIndicator': ({ params }, errorCount) => `${errorCount === 1 ?
6855
6859
  `${(params === null || params === void 0 ? void 0 : params.allowedValues.length) ?
6856
6860
  `can only be used with one of these methods: ${params === null || params === void 0 ? void 0 : params.allowedValues.map(code).join(', ')}` :
@@ -6863,8 +6867,8 @@ const customErrorMessage = {
6863
6867
  `The ${paths[paths.length - 1].path} related to this ${pluralize(paths[paths.length - 2].label, 1)} are invalid` :
6864
6868
  `The ${paths[0].path} are invalid`;
6865
6869
  },
6866
- 'may be between 0 and 100': () => 'percentages should be between 0 and 100, not 0 and 1. This may be an error.',
6867
- 'may not all be set to false': () => `Every value in the data completeness assessment is ${code('false')}. You may have forgotten to fill it in.
6870
+ 'may be between 0 and 100': () => 'Percentages should be between 0 and 100, not 0 and 1. This may be an error.',
6871
+ 'may not all be set to false': () => `Every value in the data completeness assessment is ${code(false)}. You may have forgotten to fill it in.
6868
6872
  For information on how to fill it in, please see the ${schemaLink('Cycle#completeness', 'schema')}.`,
6869
6873
  'may not be empty': () => 'if this value signifies no data, Hestia only accepts "-" or empty for no data',
6870
6874
  'may not be 0': ({ dataPath }, errorCount) => {
@@ -6874,16 +6878,17 @@ const customErrorMessage = {
6874
6878
  If the amount produced is zero, we recommend setting value to 0.`;
6875
6879
  },
6876
6880
  'the sum of above ground crop residue and below ground crop residue must be greater than zero': () => `For sites of type ${code(SiteSiteType.cropland)} or ${code(SiteSiteType['permanent pasture'])},
6877
- if data completeness is marked true for crop residue,
6881
+ if data completeness is marked ${code(true)} for crop residue,
6878
6882
  the sum of the Above ground crop residue terms should be greater than zero,
6879
6883
  and Below ground crop residue should be greater than zero.`,
6880
6884
  'longFallowPeriod must be lower than 5 years': () => `Your longFallowPeriod is greater than five years.
6881
6885
  Fallow is defined by FAOSTAT as land left uncultivated for between 1 and 5 years,
6882
6886
  and this definition is used for Hestia also.`,
6883
6887
  'should be within percentage of default value': ({ params }, errorCount) => errorCount === 1 ?
6884
- `is ±${threshold(params === null || params === void 0 ? void 0 : params.threshold)} different to our default value which is ${params === null || params === void 0 ? void 0 : params.default}.
6888
+ `This value is ±${threshold(params === null || params === void 0 ? void 0 : params.threshold)} different to our default value which is ${params === null || params === void 0 ? void 0 : params.default}.
6885
6889
  Please check your uploaded data as this may be an error.` :
6886
- `is substantially different than our default value. Please check your uploaded data as this may be an error.`,
6890
+ `This value is substantially different than our default value.
6891
+ Please check your uploaded data as this may be an error.`,
6887
6892
  'the value provided is not consistent with the model result': ({ params }, errorCount) => {
6888
6893
  var _a;
6889
6894
  return `The expected result for ${code(params === null || params === void 0 ? void 0 : params.term.name)}
@@ -7007,33 +7012,38 @@ const customErrorMessage = {
7007
7012
  then ${code('completeness.material')} must be ${code('false')}.`,
7008
7013
  'must be below or equal to 1 for unit in ha': () => `The maximum value for a product with units ${code('ha')} on a Cycle with a ${schemaLink('Cycle#functionalUnit', 'functional unit')} of ${code('1 ha')} is ${code('1')}.
7009
7014
  If you are trying to add a product with the units ${code('kg')}, use a different term.`,
7010
- 'pastureGrass key units must be \'ha\'': ({ params }) => `The Term ${code(params === null || params === void 0 ? void 0 : params.term.name)} can't be used as a key for Pasture grass.
7015
+ 'pastureGrass key units must be \'ha\'': ({ params }) => `The Term ${code(params === null || params === void 0 ? void 0 : params.term.name)} can't be used as a key for ${termLink(pastureGrass)}.
7011
7016
  Please use the Term describing the plant with the units ${code(params.expected)} instead.
7012
7017
  This will help us gap-fill the amount of grass consumed by the herd.`,
7018
+ 'the sum of all pastureGrass values must be 100': ({ params }) => `The sum of all ${termLink(pastureGrass)} values must be equal to ${params.expected}%.`,
7013
7019
  'is outside confidence interval': (_error, errorCount, allErrors) => `${unique(allErrors.flatMap(({ dataPath, params }) => { var _a; return (_a = params === null || params === void 0 ? void 0 : params.outliers) === null || _a === void 0 ? void 0 : _a.map(value => { var _a; return `The ${dataPath.includes('product') ? 'product' : 'input'} value ${errorCount === 1 ? `${code(value)} ` : ''}is ${value > (params === null || params === void 0 ? void 0 : params.min) ? 'above' : 'below'} ${(params === null || params === void 0 ? void 0 : params.threshold) ? `${code(`${(params.threshold + ((1 - params.threshold) / 2)) * 100}%`)} of` : ''} all ${(params === null || params === void 0 ? void 0 : params.group) ? code(params.group) : code((_a = params === null || params === void 0 ? void 0 : params.term) === null || _a === void 0 ? void 0 : _a.name)} data in ${code(params === null || params === void 0 ? void 0 : params.country.name)} on the Hestia platform.`; }); })).join('</br>')}
7020
+ </br>
7014
7021
  Please double-check these values before submitting.`,
7015
7022
  'should be equal to boundary': ({ params }) => `The calculated area from ${code('boundary')} is ${code(params === null || params === void 0 ? void 0 : params.expected)}.
7016
7023
  This may be an error if the boundary represents the area under cultivation.`,
7017
- 'must specify the fate of cropResidue': () => `For sites of type cropland or permanent pasture, if data completeness is marked true for crop residue,
7018
- the fate of the residue must be fully specified.
7019
- The fate must be added using:
7024
+ 'must specify the fate of cropResidue': () => `For sites of type cropland or permanent pasture, if data completeness is marked ${code(true)} for crop residue, the fates and quantities of the residue must be specified.
7025
+ <br/>
7026
+ The quantity must include both above and below ground crop residue, where the sum of above ground crop residue and below ground crop residue must be greater than zero.
7027
+ This can be added using the terms:
7020
7028
  <ul class="is-pl-3 is-list-style-disc is-nowrap">
7021
- <li>the ${glossaryTypeLink(TermTermType.cropResidueManagement)} practices;</li>
7029
+ <li>${termLink({ id: 'belowGroundCropResidue', name: 'Below ground crop residue' })}; and</li>
7030
+ <li>${termLink({ id: 'aboveGroundCropResidueTotal', name: 'Above ground crop residue total' })}.</li>
7031
+ </ul>
7032
+ <br/>
7033
+ The fate can be added using:
7034
+ <ul class="is-pl-3 is-list-style-disc is-nowrap">
7035
+ <li>the ${glossaryTypeLink(TermTermType.cropResidueManagement)} practices; and/or</li>
7022
7036
  <li>the ${glossaryTypeLink(TermTermType.cropResidue)} products</li>
7023
7037
  </ul>
7024
- where the sum of above ground crop residue and below ground crop residue must be greater than zero;
7025
7038
  `,
7026
- 'should specify the fate of cropResidue': () => `
7027
- You have not specified the fate of the crop residue.
7039
+ 'should specify the fate of cropResidue': () => `You have not specified the fate of the crop residue.
7028
7040
  Adding this information will improve emissions and soil carbon stock calculations.
7029
7041
  The fate can be added using:
7030
7042
  <ul class="is-pl-3 is-list-style-disc is-nowrap">
7031
- <li>the ${glossaryTypeLink(TermTermType.cropResidueManagement)} practices;</li>
7043
+ <li>the ${glossaryTypeLink(TermTermType.cropResidueManagement)} practices; and/or</li>
7032
7044
  <li>the ${glossaryTypeLink(TermTermType.cropResidue)} products;</li>
7033
7045
  </ul>
7034
- Remember to set ${code('completeness.cropResidue')} to ${code('true')}
7035
- if the above and below ground crop residue quantities and fates are specified.
7036
- `,
7046
+ Remember to set ${code('completeness.cropResidue')} to ${code(true)} if both the above and below ground crop residue quantities and fates are specified.`,
7037
7047
  'should have the same privacy as the related source': ({ params }) => {
7038
7048
  var _a, _b, _c;
7039
7049
  return `To link to a ${((_a = params === null || params === void 0 ? void 0 : params.defaultSource) === null || _a === void 0 ? void 0 : _a.dataPrivate) ? 'private' : 'public'} Source,
@@ -7041,7 +7051,15 @@ const customErrorMessage = {
7041
7051
  Please set ${code('dataPrivate')}=${code(`${(_c = params === null || params === void 0 ? void 0 : params.defaultSource) === null || _c === void 0 ? void 0 : _c.dataPrivate}`)}.`;
7042
7052
  },
7043
7053
  'should not use not relevant model': () => `All emissions should generally have a method tier, which states how the data were modelled or how the data were collected.
7044
- Please see the ${schemaLink('Emission#methodTier', 'schema')} for the options available and definitions of the options.`
7054
+ Please see the ${schemaLink('Emission#methodTier', 'schema')} for the options available and definitions of the options.`,
7055
+ 'should not use not relevant methodTier': () => `All emissions should generally have a method tier, which states how the data were modelled or how the data were collected.
7056
+ Please see the ${schemaLink('Emission#methodTier', 'schema')} for the options available and definitions of the options.`,
7057
+ 'must have inputs representing the forage when set to true': () => `This Cycle includes animals and completeness is set to ${(code(true))} for ${code('animalFeed')}.
7058
+ However, there are no Inputs representing the forage intake by animals in the Cycle (Inputs with terms which contain the words "fresh forage" and a ${code('value')}).
7059
+ Either, set completeness to ${(code(false))} for ${code('animalFeed')}, make sure all "fresh forage" Inputs have a ${code('value')}, or add one or more Inputs representing the forage intake.`,
7060
+ 'must specify the fate of the feed': () => `This Cycle is an animal production Cycle and this Input could be an animal feed or could be for another use.
7061
+ Please specify the ${schemaLink('Input#fate', 'fate')} field on this Input.
7062
+ Knowing the fate is essential to distinguish Inputs between those which are fed to animals and those which are used for other purposes.`
7045
7063
  };
7046
7064
  const formatCustomErrorMessage = (message, error, allErrors = []) => {
7047
7065
  const formattedMessage = message && message in customErrorMessage ?