@odigos/aws-cdk 0.0.11 → 0.0.12

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.
@@ -187,10 +187,11 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
187
187
  // Suppress the signals the destination does not accept. A signal with no collector pipeline is refused
188
188
  // at the receiver on every batch, so telling the SDK not to produce it is the half that stops the
189
189
  // error loop; the pipeline being absent is the half that stops the export.
190
+ const enabled = (0, collector_config_1.resolvedSignals)(destination);
190
191
  const overrides = [
191
- [collector_config_1.ENV_TRACES_EXPORTER, (0, collector_config_1.exporterOverrideFor)((0, collector_config_1.signalEnabled)(destination.traces))],
192
- [collector_config_1.ENV_METRICS_EXPORTER, (0, collector_config_1.exporterOverrideFor)((0, collector_config_1.signalEnabled)(destination.metrics))],
193
- [collector_config_1.ENV_LOGS_EXPORTER, (0, collector_config_1.exporterOverrideFor)((0, collector_config_1.signalEnabled)(destination.logs))],
192
+ [collector_config_1.ENV_TRACES_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.traces)],
193
+ [collector_config_1.ENV_METRICS_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.metrics)],
194
+ [collector_config_1.ENV_LOGS_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.logs)],
194
195
  ];
195
196
  for (const [name, value] of overrides) {
196
197
  if (value !== undefined) {
@@ -238,7 +239,7 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
238
239
  }
239
240
  exports.OdigosLambdaInstrumentation = OdigosLambdaInstrumentation;
240
241
  _a = JSII_RTTI_SYMBOL_1;
241
- OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.11" };
242
+ OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.12" };
242
243
  /**
243
244
  * Applies Odigos instrumentation to every `lambda.Function` in a scope.
244
245
  *
@@ -276,5 +277,5 @@ class OdigosInstrumentationAspect {
276
277
  }
277
278
  exports.OdigosInstrumentationAspect = OdigosInstrumentationAspect;
278
279
  _b = JSII_RTTI_SYMBOL_1;
279
- OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.11" };
280
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFpRTtBQUNqRSxpREFBaUQ7QUFDakQsMkNBQW1EO0FBQ25ELHlEQVE0QjtBQUM1QiwrQ0FBb0Q7QUFDcEQscURBQXVEO0FBQ3ZELHVDQUFrRztBQUNsRyxtQ0FLaUI7QUFFakIsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7QUFDbkQsa0VBQWtFO0FBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7QUFDN0MsMkZBQTJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFFNUM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFFNUM7OztHQUdHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRXpCOzs7Ozs7R0FNRztBQUNILE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEVBQW1CO0lBQzdDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBOEMsQ0FBQztJQUNuRSxNQUFNLFFBQVEsR0FBRyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEYsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDckYsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNE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WUFBWSxLQUFnQixFQUFFLEtBQXVDO1FBQ25FLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsNkJBQTZCLEVBQUU7WUFDM0YsdUJBQXVCLEVBQUUsSUFBSTtZQUM3QixHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQWdCO1FBQzNCLElBQUksSUFBSSxZQUFZLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQzs7QUFuQkgsa0VBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIElBc3BlY3QsIFN0YWNrLCBUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtcbiAgRU5WX0NPTExFQ1RPUl9DT05GSUdfVVJJLFxuICBFTlZfTE9HU19FWFBPUlRFUixcbiAgRU5WX01FVFJJQ1NfRVhQT1JURVIsXG4gIEVOVl9UUkFDRVNfRVhQT1JURVIsXG4gIGV4cG9ydGVyT3ZlcnJpZGVGb3IsXG4gIHJlbmRlckNvbGxlY3RvckNvbmZpZyxcbiAgc2lnbmFsRW5hYmxlZCxcbn0gZnJvbSAnLi9jb2xsZWN0b3ItY29uZmlnJztcbmltcG9ydCB7IE9ESUdPU19WRVJTSU9OIH0gZnJvbSAnLi9nZW5lcmF0ZWQvbGF5ZXJzJztcbmltcG9ydCB7IE9kaWdvc0xheWVyUmVzb2x2ZXIgfSBmcm9tICcuL2xheWVyLXJlc29sdmVyJztcbmltcG9ydCB7IGV4ZWNXcmFwcGVyRm9yLCBsYW5ndWFnZUZyb21SdW50aW1lLCB3ZWJTZXJ2ZXJFbnYsIHdlYlNlcnZlckxvYWRlcktleSB9IGZyb20gJy4vcnVudGltZSc7XG5pbXBvcnQge1xuICBPZGlnb3NEZXN0aW5hdGlvbixcbiAgT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZSxcbiAgT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8sXG4gIE9kaWdvc0xheWVyU291cmNlLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAg4oCUIHRoZSBsYXllcidzIGVudHJ5IHBvaW50IGluIGhhbmRsZXIgbW9kZS4gKi9cbmNvbnN0IEVOVl9FWEVDX1dSQVBQRVIgPSAnQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVInO1xuLyoqIFNlcnZpY2UgbmFtZSByZXBvcnRlZCBvbiBldmVyeSBzcGFuLCBtZXRyaWMgYW5kIGxvZyByZWNvcmQuICovXG5jb25zdCBFTlZfU0VSVklDRV9OQU1FID0gJ09URUxfU0VSVklDRV9OQU1FJztcbi8qKiBSYWlzZXMgaW4tZnVuY3Rpb24gT3BlblRlbGVtZXRyeSB2ZXJib3NpdHkgaW50byB0aGUgZnVuY3Rpb24ncyBDbG91ZFdhdGNoIGxvZyBncm91cC4gKi9cbmNvbnN0IEVOVl9PVEVMX0xPR19MRVZFTCA9ICdPVEVMX0xPR19MRVZFTCc7XG5cbi8qKlxuICogYE9ESUdPU19NQU5BR0VEYCDigJQgdGhlIGNvbm5lY3RvcidzIE9XTkVSU0hJUCBNQVJLRVIsIHdyaXR0ZW4gb25seSB3aGVuIGByZWNvcmRPd25lcnNoaXBNYXJrZXJgIGlzIHNldC5cbiAqXG4gKiBUaGUgY29ubmVjdG9yIGRlcml2ZXMgb3duZXJzaGlwIGZyb20gdGhpcyB2YXJpYWJsZSBhbG9uZTogYHN0b3JlLk9kaWdvc0luc3RydW1lbnRlZGAgY2hlY2tzIGZvciBpdHNcbiAqIHByZXNlbmNlLCBhbmQgYSBmdW5jdGlvbiB3aXRob3V0IGl0IGlzIHJlcG9ydGVkIGBBYnNlbnRgIOKAlCBcImF3YWl0aW5nIHlvdXIgZGVwbG95bWVudFwiIOKAlCBiZWZvcmUgYW55IG90aGVyXG4gKiBjb21wb25lbnQgaXMgY29tcGFyZWQsIGhvd2V2ZXIgY29tcGxldGVseSB0aGUgcmVzdCBpcyBhcHBsaWVkLiBTbyBhIG1hbnVhbC1tb2RlIChJYUMpIGZ1bmN0aW9uIHRoYXQgaXNcbiAqIG1lYW50IHRvIHNob3cgdXAgYXMgaW5zdHJ1bWVudGVkIGluIE9kaWdvcyBoYXMgdG8gY2FycnkgaXQsIGFuZCBub3RoaW5nIGVsc2UgY2FuIHN0YW5kIGluIGZvciBpdC5cbiAqL1xuY29uc3QgRU5WX09ESUdPU19NQU5BR0VEID0gJ09ESUdPU19NQU5BR0VEJztcblxuLyoqXG4gKiBTY2hlbWEgdmVyc2lvbiBvZiB0aGUgbWFya2VyIHBheWxvYWQuIE11c3QgbWF0Y2ggYG1hbmFnZWRNYW5pZmVzdFZlcnNpb25gIGluIHRoZSBjb25uZWN0b3Ig4oCUIGl0IGlzIHdoYXRcbiAqIHRlbGxzIHRoZSBjb25uZWN0b3IgaG93IHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIG9iamVjdCwgc28gYSBidW1wZWQgdmVyc2lvbiB0aGVyZSBpcyBhIGNoYW5nZSBoZXJlLlxuICovXG5jb25zdCBNQVJLRVJfVkVSU0lPTiA9IDE7XG5cbi8qKlxuICogTWFya2VyIHJlY29yZGluZyB0aGF0IHRoaXMgZnVuY3Rpb24gd2FzIGluc3RydW1lbnRlZCBieSBJYUMsIGFuZCBieSB3aGljaCB2ZXJzaW9uLlxuICpcbiAqIERpc3RpbmN0IGZyb20gYE9ESUdPU19NQU5BR0VEYCwgYW5kIG5vdCBhIHN1YnN0aXR1dGUgZm9yIGl0OiB0aGlzIG9uZSBpcyBpbmZvcm1hdGlvbmFsIGFuZCBub3RoaW5nIHJlYWRzXG4gKiBpdCwgd2hpbGUgdGhhdCBvbmUgaXMgdGhlIGNvbm5lY3RvcidzIG93bmVyc2hpcCBwcm9vZiAoc2VlIGByZWNvcmRPd25lcnNoaXBNYXJrZXJgKS4gVGhlIGNvbm5lY3RvclxuICogaWdub3JlcyB2YXJpYWJsZXMgaXQgZG9lcyBub3QgZXhwZWN0LCBzbyB0aGlzIGlzIG5ldmVyIHJlcG9ydGVkIGFzIGRyaWZ0LlxuICovXG5jb25zdCBFTlZfSUFDX01BUktFUiA9ICdPRElHT1NfSUFDJztcblxuLyoqXG4gKiBUaGUgc2VydmljZSBhIGZ1bmN0aW9uIHJlcG9ydHMgYXMsIHdoZW4gdGhlIGNhbGxlciBoYXMgbm90IG5hbWVkIG9uZS5cbiAqXG4gKiBSRUFEIEZST00gVEhFIEwxLCBOT1QgRlJPTSBgZm4uZnVuY3Rpb25OYW1lYC4gVGhlIEwyIHByb3BlcnR5IGlzIGEgY3Jvc3MtZW52aXJvbm1lbnQtYXdhcmUgdG9rZW4gdGhhdFxuICogcmVzb2x2ZXMgdG8gYSBgUmVmYCB0byB0aGUgZnVuY3Rpb24gaXRzZWxmIGV2ZW4gd2hlbiB0aGUgc3RhY2sgc2V0IGBmdW5jdGlvbk5hbWVgIGV4cGxpY2l0bHkg4oCUIHNvIHRoZVxuICogb2J2aW91cyBgU3RhY2sub2YoZm4pLnJlc29sdmUoZm4uZnVuY3Rpb25OYW1lKWAgbmV2ZXIgeWllbGRzIGEgbGl0ZXJhbCwgYW5kIGV2ZXJ5IGZ1bmN0aW9uIHNpbGVudGx5IGZlbGxcbiAqIGJhY2sgdG8gaXRzIGNvbnN0cnVjdCBpZC4gYENmbkZ1bmN0aW9uLmZ1bmN0aW9uTmFtZWAgaXMgdGhlIHJhdyB0ZW1wbGF0ZSB2YWx1ZTogdGhlIGxpdGVyYWwgdGhlIHN0YWNrXG4gKiBwYXNzZWQsIG9yIHVuZGVmaW5lZCB3aGVuIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlcyB0aGUgbmFtZS5cbiAqXG4gKiBXaHkgdGhlIGZhbGxiYWNrIGlzIHRoZSBjb25zdHJ1Y3QgaWQgcmF0aGVyIHRoYW4gdGhlIGdlbmVyYXRlZCBuYW1lOiBhIGdlbmVyYXRlZCBuYW1lIGlzIGEgYFJlZmAgdG8gdGhlXG4gKiBmdW5jdGlvbiwgYW5kIHB1dHRpbmcgdGhhdCBpbiB0aGUgZnVuY3Rpb24ncyBvd24gZW52aXJvbm1lbnQgbWFrZXMgdGhlIHJlc291cmNlIGRlcGVuZCBvbiBpdHMgb3duXG4gKiBjcmVhdGlvbiDigJQgQ2xvdWRGb3JtYXRpb24gcmVqZWN0cyB0aGUgdGVtcGxhdGUgd2l0aCBhIGRlcGVuZGVuY3kgY3ljbGUsIGF0IGRlcGxveSB0aW1lLlxuICpcbiAqIFRoaXMgbWF0dGVycyBiZXlvbmQgY29zbWV0aWNzLiBUaGUgY29ubmVjdG9yIGNvbXBhcmVzIGBPVEVMX1NFUlZJQ0VfTkFNRWAgYWdhaW5zdCB0aGUgd29ya2xvYWQncyBuYW1lIGluXG4gKiBPZGlnb3MsIHdoaWNoIGlzIHRoZSByZWFsIEFXUyBmdW5jdGlvbiBuYW1lLCBzbyBhIGZ1bmN0aW9uIHJlcG9ydGluZyBpdHMgY29uc3RydWN0IGlkIGlzIHJlcG9ydGVkIGFzXG4gKiBkcmlmdGVkIG9uIHRoZSBzZXJ2aWNlLW5hbWUgY29tcG9uZW50LiBOYW1pbmcgdGhlIGZ1bmN0aW9uIGluIHlvdXIgc3RhY2sgaXMgbm93IGVub3VnaCB0byBsaW5lIHRoZSB0d29cbiAqIHVwOyBhIGZ1bmN0aW9uIHdob3NlIG5hbWUgQ2xvdWRGb3JtYXRpb24gZ2VuZXJhdGVzIHN0aWxsIG5lZWRzIGBzZXJ2aWNlTmFtZWAgcGFzc2VkIGV4cGxpY2l0bHkuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRTZXJ2aWNlTmFtZShmbjogbGFtYmRhLkZ1bmN0aW9uKTogc3RyaW5nIHtcbiAgY29uc3QgY2ZuID0gZm4ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgbGFtYmRhLkNmbkZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCByZXNvbHZlZCA9IGNmbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU3RhY2sub2YoZm4pLnJlc29sdmUoY2ZuLmZ1bmN0aW9uTmFtZSk7XG4gIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09ICdzdHJpbmcnICYmIHJlc29sdmVkICE9PSAnJyAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHJlc29sdmVkKSkge1xuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuICByZXR1cm4gZm4ubm9kZS5pZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHNoYXJlZCBieSB0aGUgY29uc3RydWN0IGFuZCB0aGUgYXNwZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hlcmUgdGhlIGluLUxhbWJkYSBjb2xsZWN0b3IgZXhwb3J0cyB0by5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBPZGlnb3NEZXN0aW5hdGlvbjtcblxuICAvKipcbiAgICogV2hlcmUgdGhlIE9kaWdvcyBsYXllciBjb21lcyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPZGlnb3NMYXllclNvdXJjZS5PRElHT1NfUFVCTElDXG4gICAqL1xuICByZWFkb25seSBsYXllclNvdXJjZT86IE9kaWdvc0xheWVyU291cmNlO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIG1vZGUgb3Igd2ViLXNlcnZlciAoTGFtYmRhIFdlYiBBZGFwdGVyKSBtb2RlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBhdXRvLWRldGVjdGlvbiwgYW5kIHRoYXQgaXMgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhbiBvbWlzc2lvbjogZGV0ZWN0aW5nIHRoZSB3ZWIgYWRhcHRlclxuICAgKiBtZWFucyBpbnNwZWN0aW5nIHRoZSBmdW5jdGlvbidzIG90aGVyIGxheWVycywgd2hpY2ggYXQgc3ludGggdGltZSBhcmUgZnJlcXVlbnRseSB1bnJlc29sdmVkIHRva2Vucy5cbiAgICogQSBkZXRlY3RvciB0aGF0IGlzIHJpZ2h0IG1vc3Qgb2YgdGhlIHRpbWUgd291bGQgc2lsZW50bHkgYnJlYWsgdGhlIGZ1bmN0aW9ucyBpdCBnb3Qgd3JvbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuSEFORExFUlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGU7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBKYXZhIGxheWVyJ3MgZm91ciB3cmFwcGVyIHNjcmlwdHMgdG8gdXNlLiBJZ25vcmVkIGZvciBvdGhlciBsYW5ndWFnZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IE9kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUlxuICAgKi9cbiAgcmVhZG9ubHkgamF2YUhhbmRsZXJEaXN0cm8/OiBPZGlnb3NKYXZhSGFuZGxlckRpc3RybztcblxuICAvKipcbiAgICogYE9URUxfU0VSVklDRV9OQU1FYCBmb3IgZXZlcnkgZnVuY3Rpb24gdGhpcyBpbnN0cnVtZW50cy5cbiAgICpcbiAgICogVXN1YWxseSB3cm9uZyB0byBzZXQgd2hlbiBpbnN0cnVtZW50aW5nIG1vcmUgdGhhbiBvbmUgZnVuY3Rpb24g4oCUIHRoZXkgd291bGQgYWxsIHJlcG9ydCBhcyB0aGUgc2FtZVxuICAgKiBzZXJ2aWNlLlxuICAgKlxuICAgKiBMZWZ0IHVuc2V0LCBhIGZ1bmN0aW9uIHJlcG9ydHMgYXMgaXRzIGV4cGxpY2l0bHktc2V0IHBoeXNpY2FsIG5hbWUgaWYgaXQgaGFzIG9uZSwgYW5kIG90aGVyd2lzZSBhc1xuICAgKiBpdHMgY29uc3RydWN0IGlkLiBJdCBkZWxpYmVyYXRlbHkgZG9lcyBub3QgZGVmYXVsdCB0byB0aGUgZ2VuZXJhdGVkIHBoeXNpY2FsIG5hbWU6IHRoYXQgdmFsdWUgaXMgYVxuICAgKiBgUmVmYCB0byB0aGUgZnVuY3Rpb24gaXRzZWxmLCBhbmQgYSBmdW5jdGlvbiByZWZlcmVuY2luZyBpdHNlbGYgaW4gaXRzIG93biBlbnZpcm9ubWVudCBpcyBhXG4gICAqIENsb3VkRm9ybWF0aW9uIGRlcGVuZGVuY3kgY3ljbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZ1bmN0aW9uJ3MgcGh5c2ljYWwgbmFtZSBpZiBleHBsaWNpdGx5IHNldCwgb3RoZXJ3aXNlIGl0cyBjb25zdHJ1Y3QgaWRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSYWlzZSBpbi1mdW5jdGlvbiBPcGVuVGVsZW1ldHJ5IHZlcmJvc2l0eSAoYE9URUxfTE9HX0xFVkVMPWRlYnVnYCkuXG4gICAqXG4gICAqIFRoZSBsYXllciwgU0RLIGFuZCBjb2xsZWN0b3IgdGhlbiBlbWl0IHNwYW4gYW5kIE9UTFAtZXhwb3J0IGRpYWdub3N0aWNzIGludG8gdGhlIGZ1bmN0aW9uJ3MgQ2xvdWRXYXRjaFxuICAgKiBsb2cgZ3JvdXAuIFVzZWZ1bCB3aGlsZSB3aXJpbmcgdXAgYSBkZXN0aW5hdGlvbiwgZXhwZW5zaXZlIHRvIGxlYXZlIG9uLlxuICAgKlxuICAgKiBIYXMgbm8gZWZmZWN0IGluIHdlYi1zZXJ2ZXIgbW9kZSwgbWF0Y2hpbmcgdGhlIGNvbm5lY3Rvciwgd2hpY2ggbmV2ZXIgc2V0cyBhIGxvZyBsZXZlbCB0aGVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQXR0YWNoIHRoaXMgbGF5ZXIgaW5zdGVhZCBvZiByZXNvbHZpbmcgb25lLiBPdmVycmlkZXMgYGxheWVyU291cmNlYCBlbnRpcmVseS5cbiAgICpcbiAgICogVGhlIGVzY2FwZSBoYXRjaCBmb3IgYSBsYXllciBtaXJyb3JlZCBpbnRvIGEgcHJpdmF0ZSByZWdpc3RyeSBvciBhbiBpbnRlcm5hbCBhY2NvdW50LiBUaGUgbGF5ZXIgbXVzdFxuICAgKiBoYXZlIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSBPZGlnb3Mgb25lIOKAlCB0aGUgZW52aXJvbm1lbnQgc2V0IGhlcmUgYXNzdW1lcyBpdHMgZXhhY3Qgc2NyaXB0IGxheW91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSByZXNvbHZlZCBmcm9tIGxheWVyU291cmNlXG4gICAqL1xuICByZWFkb25seSBsYXllclZlcnNpb24/OiBsYW1iZGEuSUxheWVyVmVyc2lvbjtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IG5lZWRzIGluIGl0cyBsYW5ndWFnZSBsb2FkZXIgdmFyaWFibGUgKGBOT0RFX09QVElPTlNgLFxuICAgKiBgSkFWQV9UT09MX09QVElPTlNgIG9yIGBQWVRIT05QQVRIYCksIHdoaWNoIHRoZSBPZGlnb3MgbG9hZGVyIGlzIGpvaW5lZCB0byByYXRoZXIgdGhhbiByZXBsYWNpbmcuXG4gICAqXG4gICAqIE9ubHkgdXNlZCBpbiB3ZWItc2VydmVyIG1vZGUuIEl0IGhhcyB0byBiZSBwYXNzZWQgZXhwbGljaXRseSBiZWNhdXNlIENESydzIGBsYW1iZGEuRnVuY3Rpb25gIGV4cG9zZXNcbiAgICogbm8gd2F5IHRvIHJlYWQgYmFjayBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgZWxzZXdoZXJlIGluIHRoZSBhcHAg4oCUIGFuIG9taXR0ZWQgdmFsdWUgaGVyZSBpc1xuICAgKiBzaWxlbnRseSBvdmVyd3JpdHRlbiwgd2hpY2ggZm9yIGBOT0RFX09QVElPTlNgIGNhbiBtZWFuIGxvc2luZyBhIGZsYWcgdGhlIGFwcCBuZWVkcyB0byBib290LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBsb2FkZXIgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBPZGlnb3MgdmFsdWUgYWxvbmVcbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nTG9hZGVyVmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdyaXRlIGBPRElHT1NfTUFOQUdFRGAsIHRoZSBtYXJrZXIgdGhhdCBtYWtlcyB0aGUgT2RpZ29zIGNvbm5lY3RvciByZWNvZ25pc2UgdGhpcyBmdW5jdGlvbiBhc1xuICAgKiBpbnN0cnVtZW50ZWQuXG4gICAqXG4gICAqIFdJVEhPVVQgSVQgVEhFIEZVTkNUSU9OIElTIFJFUE9SVEVEIEFTIFVOSU5TVFJVTUVOVEVELiBUaGUgY29ubmVjdG9yIGRlcml2ZXMgb3duZXJzaGlwIGZyb20gdGhpc1xuICAgKiB2YXJpYWJsZSBhbG9uZTogbm8gbWFya2VyIG1lYW5zIGBBYnNlbnRgIOKAlCBcImF3YWl0aW5nIHlvdXIgZGVwbG95bWVudFwiIOKAlCBldmVuIHRob3VnaCB0aGUgbGF5ZXIgaXNcbiAgICogYXR0YWNoZWQsIHRoZSB3cmFwcGVyIGlzIHNldCBhbmQgdGhlIGNvbGxlY3RvciBpcyBjb25maWd1cmVkLiBTZXQgdGhpcyB0byBgdHJ1ZWAgZm9yIGEgZnVuY3Rpb24gdGhhdFxuICAgKiBPZGlnb3MgZGlzY292ZXJzIGluIE1BTlVBTCAoSWFDKSBtb2RlLCB3aGljaCBpcyB0aGUgbW9kZSBhIHdvcmtsb2FkIGlzIGluIHVubGVzcyB5b3UgZXhwbGljaXRseSBoYW5kXG4gICAqIGluc3RydW1lbnRhdGlvbiB0byB0aGUgY29ubmVjdG9yLlxuICAgKlxuICAgKiBMZWF2ZSBpdCBgZmFsc2VgICh0aGUgZGVmYXVsdCkgZm9yIGEgZnVuY3Rpb24geW91IGhhdmUgZW5hYmxlZCBhcyBhbiBBVVRPTUFUSUMtbW9kZSBjb25uZWN0b3Igc291cmNlLlxuICAgKiBUaGVyZSwgdGhlIGNvbm5lY3RvciBpbnN0cnVtZW50cyB0aGUgZnVuY3Rpb24gaXRzZWxmIGFuZCBvd25zIHRoaXMgdmFyaWFibGUsIGluY2x1ZGluZyB0aGUgYHByZXZFbnZgXG4gICAqIHNuYXBzaG90IGl0IHJlc3RvcmVzIG9uIHJvbGxiYWNrOyB0d28gd3JpdGVycyBvZiBvbmUgb3duZXJzaGlwIHJlY29yZCBpcyB0aGUgb25lIGNvbWJpbmF0aW9uIHRoYXRcbiAgICogZ2VudWluZWx5IG1pc2JlaGF2ZXMuXG4gICAqXG4gICAqIFRoZSBtYXJrZXIgcmVjb3JkcyB0aGUgZXhhY3QgbGF5ZXIgQVJOIHRoaXMgY29uc3RydWN0IGF0dGFjaGVkLCB3aGljaCBpcyBhbHNvIHdoYXQgdGhlIGNvbm5lY3RvciByZWFkc1xuICAgKiBiYWNrIHRvIGRlY2lkZSB3aGljaCBsYXllciB2ZXJzaW9uIHRoZSBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBjYXJyeSDigJQgc28gYSB2ZXJzaW9uIHlvdSBwaW5uZWQgaXNcbiAgICogcmVzcGVjdGVkIHJhdGhlciB0aGFuIHJlcG9ydGVkIGFzIGRyaWZ0LiBJdCB3b3JrcyBpbiBldmVyeSBsYXllciBtb2RlLCBpbmNsdWRpbmcgYElOX0FDQ09VTlRgLCB3aGVyZSB0aGVcbiAgICogQVJOIGlzIGEgZGVwbG95LXRpbWUgcmVmZXJlbmNlIHlvdXIgb3duIGNvZGUgY2Fubm90IG9idGFpbi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJlY29yZE93bmVyc2hpcE1hcmtlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNraXAgZnVuY3Rpb25zIHdob3NlIHJ1bnRpbWUgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGluc3RlYWQgb2YgdGhyb3dpbmcuXG4gICAqXG4gICAqIGBkb3RuZXQqYCBhbmQgYHByb3ZpZGVkLipgIChHbywgY3VzdG9tIHJ1bnRpbWVzKSBoYXZlIG5vIGxhbmd1YWdlIGxheWVyIHVwc3RyZWFtLiBFeHBsaWNpdGx5XG4gICAqIGluc3RydW1lbnRpbmcgb25lIGlzIGEgbWlzdGFrZSB3b3J0aCBmYWlsaW5nIG9uOyBzd2VlcGluZyBhIHdob2xlIHN0YWNrIHdpdGggdGhlIGFzcGVjdCBhbmQgaGl0dGluZ1xuICAgKiBvbmUgaXMgbm90LCB3aGljaCBpcyB3aHkgdGhlIGFzcGVjdCBkZWZhdWx0cyB0aGlzIHRvIGB0cnVlYCBhbmQgdGhlIGNvbnN0cnVjdCB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFVuc3VwcG9ydGVkUnVudGltZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb25Qcm9wcyBleHRlbmRzIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogRnVuY3Rpb25zIHRvIGluc3RydW1lbnQgb24gY29uc3RydWN0aW9uLiBNb3JlIGNhbiBiZSBhZGRlZCB3aXRoIGBpbnN0cnVtZW50KClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IGxhbWJkYS5GdW5jdGlvbltdO1xufVxuXG4vKipcbiAqIEluc3RydW1lbnRzIEFXUyBMYW1iZGEgZnVuY3Rpb25zIHdpdGggdGhlIE9kaWdvcyBPcGVuVGVsZW1ldHJ5IGxheWVyLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBvZGlnb3MgPSBuZXcgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uKHRoaXMsICdPZGlnb3MnLCB7XG4gKiAgIGRlc3RpbmF0aW9uOiB7IGVuZHBvaW50OiAnb3RscC5leGFtcGxlLmNvbTo0MzE3JyB9LFxuICogICBmdW5jdGlvbnM6IFthcGlGbiwgd29ya2VyRm5dLFxuICogfSk7XG4gKiBvZGlnb3MuaW5zdHJ1bWVudChhbm90aGVyRm4pO1xuICogYGBgXG4gKlxuICogV2hhdCBpdCBkb2VzIHRvIGVhY2ggZnVuY3Rpb246IGF0dGFjaGVzIHRoZSBsYXllciBmb3IgdGhlIGZ1bmN0aW9uJ3MgbGFuZ3VhZ2UgYW5kIGFyY2hpdGVjdHVyZSwgc2V0c1xuICogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCBzbyB0aGUgbGF5ZXIgbG9hZHMgdGhlIFNESywgc2V0cyBgT1RFTF9TRVJWSUNFX05BTUVgLCBhbmQgaGFuZHMgdGhlIGluLUxhbWJkYVxuICogY29sbGVjdG9yIGl0cyBlbnRpcmUgY29uZmlndXJhdGlvbiBpbmxpbmUgdGhyb3VnaCBgT1BFTlRFTEVNRVRSWV9DT0xMRUNUT1JfQ09ORklHX1VSSWAuXG4gKlxuICogVGhlIGZ1bmN0aW9uJ3MgU0RLIGV4cG9ydHMgdG8gdGhlIGNvbGxlY3RvciBvbiBsb2NhbGhvc3QsIG5vdCB0byB5b3VyIGRlc3RpbmF0aW9uLiBUaGUgY29sbGVjdG9yXG4gKiBmb3J3YXJkcyBhZnRlciB0aGUgaGFuZGxlciBoYXMgYWxyZWFkeSByZXR1cm5lZCwgc28gYSBzbG93IGRlc3RpbmF0aW9uIGNvc3RzIGJpbGxlZCBkdXJhdGlvbiByYXRoZXJcbiAqIHRoYW4gY2FsbGVyIGxhdGVuY3kuXG4gKlxuICogIyMgRG8gbm90IGFsc28gaW5zdHJ1bWVudCB0aGVzZSBmdW5jdGlvbnMgd2l0aCB0aGUgY29ubmVjdG9yXG4gKlxuICogVGhlIE9kaWdvcyBBV1MgY29ubmVjdG9yIGluc3RydW1lbnRzIGxpdmUgZnVuY3Rpb25zIGJ5IG11dGF0aW5nIHRoZW0sIGFuZCByZWNvbmNpbGVzIHRoZW0gYmFjayB0byBpdHNcbiAqIG93biBkZXNpcmVkIHN0YXRlIG9uIGV2ZXJ5IHBhc3MuIEEgZnVuY3Rpb24gaW5zdHJ1bWVudGVkIGhlcmUgYW5kIGFsc28gZW5hYmxlZCBhcyBhIGNvbm5lY3RvciBzb3VyY2VcbiAqIGVuZHMgdXAgb3duZWQgYnkgYm90aDogZWFjaCBgY2RrIGRlcGxveWAgcmVhc3NlcnRzIHRoZSBDREsncyBlbnZpcm9ubWVudCwgZWFjaCByZWNvbmNpbGUgcmVhc3NlcnRzIHRoZVxuICogY29ubmVjdG9yJ3MsIGFuZCBldmVyeSByb3VuZCB0cmlwIHB1Ymxpc2hlcyBhIG5ldyBmdW5jdGlvbiB2ZXJzaW9uLlxuICpcbiAqIENob29zZSBvbmUgcGVyIGZ1bmN0aW9uLiBUaGlzIGNvbnN0cnVjdCBuZXZlciBzZXRzIHRoZSBjb25uZWN0b3IncyBgT0RJR09TX01BTkFHRURgIG93bmVyc2hpcCBtYXJrZXIsXG4gKiBzbyBhbiBJYUMtaW5zdHJ1bWVudGVkIGZ1bmN0aW9uIGlzIG5vdCBvbmUgdGhlIGNvbm5lY3RvciB3aWxsIHJvbGwgYmFjayDigJQgYnV0IGl0IHdpbGwgaGFwcGlseSB0YWtlIGl0XG4gKiBvdmVyIGlmIHlvdSBlbmFibGUgaXQgYXMgYSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IE9kaWdvc0xheWVyUmVzb2x2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sbGVjdG9yQ29uZmlnOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1bWVudGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHByb3BzO1xuICAgIHRoaXMucmVzb2x2ZXIgPSBuZXcgT2RpZ29zTGF5ZXJSZXNvbHZlcih0aGlzLCBwcm9wcy5sYXllclNvdXJjZSA/PyBPZGlnb3NMYXllclNvdXJjZS5PRElHT1NfUFVCTElDKTtcblxuICAgIC8vIFJlbmRlcmVkIG9uY2UuIEl0IGRlcGVuZHMgb25seSBvbiB0aGUgZGVzdGluYXRpb24sIGFuZCByZW5kZXJpbmcgaXQgcGVyIGZ1bmN0aW9uIHdvdWxkIG1ha2UgYW5cbiAgICAvLyBhY2NpZGVudGFsIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZnVuY3Rpb25zIHBvc3NpYmxlLlxuICAgIHRoaXMuY29sbGVjdG9yQ29uZmlnID0gcmVuZGVyQ29sbGVjdG9yQ29uZmlnKHByb3BzLmRlc3RpbmF0aW9uKTtcblxuICAgIC8vIEEgd2FybmluZyByYXRoZXIgdGhhbiBhbiBlcnJvciwgYmVjYXVzZSBhIGNvbGxlY3RvciBDQU4gYmUgcmVhY2hlZCBvdmVyIGdSUEMgb24gYSBub24tc3RhbmRhcmQgcG9ydCDigJRcbiAgICAvLyBidXQgdGhlIG92ZXJ3aGVsbWluZ2x5IGxpa2VsaWVyIHJlYWRpbmcgb2YgYGVuZHBvaW50OiBcImhvc3Q6NDMxOFwiYCBpcyBhbiBPVExQL0hUVFAgZW5kcG9pbnQgcGFzc2VkIHRvXG4gICAgLy8gdGhlIGdSUEMgZXhwb3J0ZXIsIHdoaWNoIGJ1aWxkcywgc3RhcnRzLCBhbmQgdGhlbiBuZXZlciBkZWxpdmVycyBhIGJhdGNoLiBTaWxlbnQgZm9yIHRoZSBjYWxsZXIgd2hvXG4gICAgLy8gbWVhbnQgaXQ7IGxvdWQgZm9yIHRoZSBvbmUgd2hvIGRpZCBub3QuXG4gICAgaWYgKHByb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTgnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlSHR0cEVuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gZW5kcG9pbnQgXCIke3Byb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50fVwiIGlzIG9uIDQzMTgsIHRoZSBPVExQL0hUVFAgcG9ydCwgYnV0IGAgK1xuICAgICAgICAgICdgZW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIGdSUEMgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTcpLiBJZiB0aGF0IGlzIGFuIE9UTFAvSFRUUCBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBodHRwRW5kcG9pbnQ6IFwiaHR0cDovL2hvc3Q6NDMxOFwiYCBpbnN0ZWFkIOKAlCB0aGUgZ1JQQyBleHBvcnRlciB3aWxsIGV4cG9ydCBub3RoaW5nIHRvIGl0LicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZGVzdGluYXRpb24uaHR0cEVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTcnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlR3JwY0VuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gaHR0cEVuZHBvaW50IFwiJHtwcm9wcy5kZXN0aW5hdGlvbi5odHRwRW5kcG9pbnR9XCIgaXMgb24gNDMxNywgdGhlIE9UTFAvZ1JQQyBwb3J0LCBgICtcbiAgICAgICAgICAnYnV0IGBodHRwRW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIEhUVFAgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTgpLiBJZiB0aGF0IGlzIGEgZ1JQQyBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBlbmRwb2ludDogXCJob3N0OjQzMTdcImAgaW5zdGVhZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIHByb3BzLmZ1bmN0aW9ucyA/PyBbXSkge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdHJ1bWVudHMgb25lIGZ1bmN0aW9uLiBJZGVtcG90ZW50IOKAlCBpbnN0cnVtZW50aW5nIHRoZSBzYW1lIGZ1bmN0aW9uIHR3aWNlIGlzIGEgbm8tb3AgcmF0aGVyIHRoYW4gYVxuICAgKiBkb3VibGVkIGxvYWRlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBpbnN0cnVtZW50KGZuOiBsYW1iZGEuRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBmbi5ub2RlLnBhdGg7XG4gICAgaWYgKHRoaXMuaW5zdHJ1bWVudGVkLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcnVudGltZU5hbWUgPSBmbi5ydW50aW1lLm5hbWU7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZyb21SdW50aW1lKHJ1bnRpbWVOYW1lKTtcbiAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgYE9kaWdvczogcnVudGltZSBcIiR7cnVudGltZU5hbWV9XCIgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGAgK1xuICAgICAgICAnKHVwc3RyZWFtIHB1Ymxpc2hlcyBsYXllcnMgZm9yIHB5dGhvbiwgbm9kZWpzLCBqYXZhIGFuZCBydWJ5IG9ubHkpLCBzbyB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBpbnN0cnVtZW50ZWQuJztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcFVuc3VwcG9ydGVkUnVudGltZXMpIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnVuc3VwcG9ydGVkUnVudGltZScsIGAke21lc3NhZ2V9IFNraXBwaW5nLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bWVzc2FnZX0gU2V0IHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzOiB0cnVlIHRvIHNraXAgaXQgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmluc3RydW1lbnRlZC5hZGQoa2V5KTtcblxuICAgIGNvbnN0IGFyY2hpdGVjdHVyZSA9IGZuLmFyY2hpdGVjdHVyZS5uYW1lO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5vcHRpb25zLmxheWVyVmVyc2lvbiA/PyB0aGlzLnJlc29sdmVyLnJlc29sdmUobGFuZ3VhZ2UsIGFyY2hpdGVjdHVyZSk7XG4gICAgZm4uYWRkTGF5ZXJzKGxheWVyKTtcblxuICAgIC8vIFRoZSBBUk4sIG5vdCB0aGUgY29uc3RydWN0OiB0aGUgbWFya2VyIGhhcyB0byBuYW1lIHRoZSBleGFjdCBsYXllciB2ZXJzaW9uIHRoZSBmdW5jdGlvbiBjYXJyaWVzLCBhbmRcbiAgICAvLyBpbiBJTl9BQ0NPVU5UIG1vZGUgdGhhdCBpcyBhIG5lc3RlZC1zdGFjayBvdXRwdXQgcmVmZXJlbmNlIHJlc29sdmVkIGF0IGRlcGxveSB0aW1lLlxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudmlyb25tZW50Rm9yKGZuLCBsYW5ndWFnZSwgbGF5ZXIubGF5ZXJWZXJzaW9uQXJuKSkpIHtcbiAgICAgIGZuLmFkZEVudmlyb25tZW50KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogSW5zdHJ1bWVudHMgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIGxpc3QuICovXG4gIHB1YmxpYyBpbnN0cnVtZW50QWxsKGZ1bmN0aW9uczogbGFtYmRhLkZ1bmN0aW9uW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGZ1bmN0aW9ucykge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IGFwcGxpZWQgdG8gb25lIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBNaXJyb3JzIGBhcHBseUhhbmRsZXJFbnZgIC8gYGFwcGx5V2ViU2VydmVyRW52YCBpbiB0aGUgY29ubmVjdG9yLCBpbmNsdWRpbmcgd2hhdCBpcyBkZWxpYmVyYXRlbHkgTk9UXG4gICAqIHNldDogYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgc3RheXMgdW5zZXQgc28gdGhlIFNESyBrZWVwcyBleHBvcnRpbmcgdG8gdGhlIGluLUxhbWJkYSBjb2xsZWN0b3JcbiAgICogb24gbG9jYWxob3N0IHJhdGhlciB0aGFuIGJsb2NraW5nIHRoZSBpbnZvY2F0aW9uIG9uIHRoZSByZW1vdGUgZGVzdGluYXRpb24sIGFuZCBhbiBlbmFibGVkIHNpZ25hbCdzXG4gICAqIGBPVEVMXypfRVhQT1JURVJgIHN0YXlzIHVuc2V0IGJlY2F1c2UgYG90bHBgIGlzIGFscmVhZHkgdGhlIFNESyBkZWZhdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBlbnZpcm9ubWVudEZvcihmbjogbGFtYmRhLkZ1bmN0aW9uLCBsYW5ndWFnZTogc3RyaW5nLCBsYXllckFybjogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgeyBkZXN0aW5hdGlvbiwgbW9kZSwgZGVidWcsIHNlcnZpY2VOYW1lLCBqYXZhSGFuZGxlckRpc3RybywgZXhpc3RpbmdMb2FkZXJWYWx1ZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHdlYlNlcnZlciA9IG1vZGUgPT09IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuV0VCX1NFUlZFUjtcblxuICAgIGNvbnN0IGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIFtFTlZfU0VSVklDRV9OQU1FXTogc2VydmljZU5hbWUgPz8gZGVmYXVsdFNlcnZpY2VOYW1lKGZuKSxcbiAgICAgIFtFTlZfQ09MTEVDVE9SX0NPTkZJR19VUkldOiB0aGlzLmNvbGxlY3RvckNvbmZpZyxcbiAgICAgIFtFTlZfSUFDX01BUktFUl06IEpTT04uc3RyaW5naWZ5KHsgdjogMSwgc291cmNlOiAnY2RrJywgdmVyc2lvbjogT0RJR09TX1ZFUlNJT04gfHwgJ3VucmVsZWFzZWQnIH0pLFxuICAgIH07XG5cbiAgICBpZiAod2ViU2VydmVyKSB7XG4gICAgICAvLyBObyBleGVjIHdyYXBwZXI6IHRoZSBMYW1iZGEgV2ViIEFkYXB0ZXIgb3ducyBpdCwgYW5kIG92ZXJ3cml0aW5nIGl0IHN0b3BzIHRoZSBmdW5jdGlvbiBzZXJ2aW5nLlxuICAgICAgT2JqZWN0LmFzc2lnbihlbnYsIHdlYlNlcnZlckVudihsYW5ndWFnZSwgZXhpc3RpbmdMb2FkZXJWYWx1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnZbRU5WX0VYRUNfV1JBUFBFUl0gPSBleGVjV3JhcHBlckZvcihsYW5ndWFnZSwgamF2YUhhbmRsZXJEaXN0cm8pO1xuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGVudltFTlZfT1RFTF9MT0dfTEVWRUxdID0gJ2RlYnVnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdXBwcmVzcyB0aGUgc2lnbmFscyB0aGUgZGVzdGluYXRpb24gZG9lcyBub3QgYWNjZXB0LiBBIHNpZ25hbCB3aXRoIG5vIGNvbGxlY3RvciBwaXBlbGluZSBpcyByZWZ1c2VkXG4gICAgLy8gYXQgdGhlIHJlY2VpdmVyIG9uIGV2ZXJ5IGJhdGNoLCBzbyB0ZWxsaW5nIHRoZSBTREsgbm90IHRvIHByb2R1Y2UgaXQgaXMgdGhlIGhhbGYgdGhhdCBzdG9wcyB0aGVcbiAgICAvLyBlcnJvciBsb29wOyB0aGUgcGlwZWxpbmUgYmVpbmcgYWJzZW50IGlzIHRoZSBoYWxmIHRoYXQgc3RvcHMgdGhlIGV4cG9ydC5cbiAgICBjb25zdCBvdmVycmlkZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF0+ID0gW1xuICAgICAgW0VOVl9UUkFDRVNfRVhQT1JURVIsIGV4cG9ydGVyT3ZlcnJpZGVGb3Ioc2lnbmFsRW5hYmxlZChkZXN0aW5hdGlvbi50cmFjZXMpKV0sXG4gICAgICBbRU5WX01FVFJJQ1NfRVhQT1JURVIsIGV4cG9ydGVyT3ZlcnJpZGVGb3Ioc2lnbmFsRW5hYmxlZChkZXN0aW5hdGlvbi5tZXRyaWNzKSldLFxuICAgICAgW0VOVl9MT0dTX0VYUE9SVEVSLCBleHBvcnRlck92ZXJyaWRlRm9yKHNpZ25hbEVuYWJsZWQoZGVzdGluYXRpb24ubG9ncykpXSxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBvdmVycmlkZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVudltuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExBU1QsIGJlY2F1c2UgdGhlIG1hcmtlcidzIHNuYXBzaG90IGRlc2NyaWJlcyB0aGUga2V5cyBhYm92ZTogaXQgaXMgYnVpbHQgZnJvbSB3aGF0IHRoaXMgZnVuY3Rpb24gaXNcbiAgICAvLyBhY3R1YWxseSBnZXR0aW5nLCBub3QgZnJvbSBhIGZpeGVkIGxpc3QuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZWNvcmRPd25lcnNoaXBNYXJrZXIpIHtcbiAgICAgIGVudltFTlZfT0RJR09TX01BTkFHRURdID0gdGhpcy5vd25lcnNoaXBNYXJrZXIoZW52LCBsYXllckFybiwgbGFuZ3VhZ2UsIHdlYlNlcnZlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYE9ESUdPU19NQU5BR0VEYCBwYXlsb2FkOiB0aGUgbGF5ZXIgdGhpcyBmdW5jdGlvbiBjYXJyaWVzLCBwbHVzIHRoZSBzbmFwc2hvdCB0aGUgY29ubmVjdG9yIHJlc3RvcmVzXG4gICAqIGZyb20gaWYgaXQgZXZlciByb2xscyB0aGUgZnVuY3Rpb24gYmFjay5cbiAgICpcbiAgICogV0hZIGBwcmV2RW52YCBJUyBOT1QgT1BUSU9OQUwgSEVSRS4gVGhlIGNvbm5lY3RvcidzIHJvbGxiYWNrIGl0ZXJhdGVzIGV4YWN0bHkgdGhpcyBtYXAg4oCUIGEgbnVsbCBlbnRyeVxuICAgKiBtZWFucyBcImRlbGV0ZSBvbiByb2xsYmFja1wiLCBhIHN0cmluZyBtZWFucyBcInJlc3RvcmUgdGhpcyB2YWx1ZSB2ZXJiYXRpbVwiIOKAlCBhbmQgdGhlbiByZW1vdmVzIHRoZSByZWNvcmRlZFxuICAgKiBsYXllci4gQSBtYXJrZXIgd2l0aG91dCBpdCB3b3VsZCB0aGVyZWZvcmUgc3RyaXAgdGhlIExBWUVSIHdoaWxlIGxlYXZpbmcgYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYFxuICAgKiBwb2ludGluZyBhdCBgL29wdC9vdGVsLWhhbmRsZXJgLCBhIHNjcmlwdCB0aGF0IGlzIG5vIGxvbmdlciBtb3VudGVkOiB0aGUgZnVuY3Rpb24gdGhlbiBmYWlscyBhdCBpdHMgbmV4dFxuICAgKiBjb2xkIHN0YXJ0LiBSZWNvcmRpbmcgZXZlcnkga2V5IHRoaXMgY29uc3RydWN0IHNldHMgbWFrZXMgcm9sbGJhY2sgc3RyaXAgdGhlIHdob2xlIHNldCB0b2dldGhlci5cbiAgICpcbiAgICogVGhlIHZhbHVlcyBhcmUgbnVsbCByYXRoZXIgdGhhbiB0aGUgY3VzdG9tZXIncyBwcmlvciB2YWx1ZXMgYmVjYXVzZSBhIENESyBzdGFjayBjYW5ub3QgcmVhZCBhblxuICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZSBiYWNrIOKAlCB3aXRoIG9uZSBleGNlcHRpb24gdGhhdCBtYXR0ZXJzLCB0aGUgd2ViLXNlcnZlciBsb2FkZXIgdmFyaWFibGUsIHdob3NlIHByaW9yXG4gICAqIHZhbHVlIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgaGFkIHRvIHBhc3MgYXMgYGV4aXN0aW5nTG9hZGVyVmFsdWVgIGZvciBleGFjdGx5IHRoZSBzYW1lIHJlYXNvbi5cbiAgICovXG4gIHByaXZhdGUgb3duZXJzaGlwTWFya2VyKFxuICAgIGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICBsYXllckFybjogc3RyaW5nLFxuICAgIGxhbmd1YWdlOiBzdHJpbmcsXG4gICAgd2ViU2VydmVyOiBib29sZWFuLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZXZFbnY6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVsbCB9ID0ge307XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGVudikpIHtcbiAgICAgIC8vIE5vdCBpdHNlbGYsIGFuZCBub3QgdGhlIGluZm9ybWF0aW9uYWwgSWFDIG1hcmtlcjogcm9sbGJhY2sgZGVsZXRlcyBPRElHT1NfTUFOQUdFRCB1bmNvbmRpdGlvbmFsbHksXG4gICAgICAvLyBhbmQgT0RJR09TX0lBQyByZWNvcmRzIHdoZXJlIHRoZSBmdW5jdGlvbiBjYW1lIGZyb20sIHdoaWNoIHN0YXlzIHRydWUgYWZ0ZXIgYW4gdW5pbnN0cnVtZW50LlxuICAgICAgaWYgKG5hbWUgIT09IEVOVl9JQUNfTUFSS0VSKSB7XG4gICAgICAgIHByZXZFbnZbbmFtZV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsb2FkZXJLZXkgPSB3ZWJTZXJ2ZXIgPyB3ZWJTZXJ2ZXJMb2FkZXJLZXkobGFuZ3VhZ2UpIDogdW5kZWZpbmVkO1xuICAgIGlmIChsb2FkZXJLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVzdG9yZSB0aGUgY2FsbGVyJ3Mgb3duIGxvYWRlciB2YWx1ZSByYXRoZXIgdGhhbiBkZWxldGluZyB0aGUgdmFyaWFibGU6IG91cnMgd2FzIGFwcGVuZGVkIHRvIGl0LCBzb1xuICAgICAgLy8gZGVsZXRpbmcgdGhlIGtleSB3b3VsZCB0YWtlIHRoZSBjdXN0b21lcidzIGZsYWdzIOKAlCB0aGUgb25lcyB0aGVpciBhcHAgbmVlZHMgdG8gYm9vdCDigJQgd2l0aCBpdC5cbiAgICAgIHByZXZFbnZbbG9hZGVyS2V5XSA9IHRoaXMub3B0aW9ucy5leGlzdGluZ0xvYWRlclZhbHVlID8/IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHY6IE1BUktFUl9WRVJTSU9OLCBsYXllcjogbGF5ZXJBcm4sIHByZXZFbnYgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wcyBmb3Ige0BsaW5rIE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0UHJvcHMgZXh0ZW5kcyBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zIHt9XG5cbi8qKlxuICogQXBwbGllcyBPZGlnb3MgaW5zdHJ1bWVudGF0aW9uIHRvIGV2ZXJ5IGBsYW1iZGEuRnVuY3Rpb25gIGluIGEgc2NvcGUuXG4gKlxuICogYGBgdHNcbiAqIEFzcGVjdHMub2Yoc3RhY2spLmFkZChuZXcgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0KHN0YWNrLCB7XG4gKiAgIGRlc3RpbmF0aW9uOiB7IGVuZHBvaW50OiAnb3RscC5leGFtcGxlLmNvbTo0MzE3JyB9LFxuICogfSkpO1xuICogYGBgXG4gKlxuICogYHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzYCBkZWZhdWx0cyB0byBgdHJ1ZWAgaGVyZSwgdW5saWtlIHRoZSBjb25zdHJ1Y3Q6IGFuIGFzcGVjdCB2aXNpdHMgZXZlcnkgZnVuY3Rpb25cbiAqIGluIHRoZSBzY29wZSwgaW5jbHVkaW5nIG9uZXMgd2hvc2UgcnVudGltZSBoYXMgbm8gT3BlblRlbGVtZXRyeSBsYXllciwgYW5kIGZhaWxpbmcgdGhlIHdob2xlIHN5bnRoXG4gKiBiZWNhdXNlIGEgc3RhY2sgaGFwcGVucyB0byBjb250YWluIG9uZSBHbyBmdW5jdGlvbiBpcyBub3QgdXNlZnVsLiBFYWNoIHNraXAgaXMgcmVwb3J0ZWQgYXMgYSBzeW50aFxuICogd2FybmluZywgc28gaXQgaXMgdmlzaWJsZSByYXRoZXIgdGhhbiBzaWxlbnQuXG4gKlxuICogVGhlIGFzcGVjdCBpbnN0cnVtZW50cyB3aGF0IGV4aXN0cyBpbiB0aGUgdHJlZSB3aGVuIGl0IHJ1bnMuIEEgZnVuY3Rpb24gYWRkZWQgYnkgYSBsYXRlciBhc3BlY3QgaXMgbm90XG4gKiB2aXNpdGVkOyB1c2UgdGhlIGNvbnN0cnVjdCBkaXJlY3RseSBmb3IgdGhvc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0cnVtZW50YXRpb246IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbjtcblxuICAvKipcbiAgICogQHBhcmFtIHNjb3BlIHdoZXJlIHRoZSBzaGFyZWQgbGF5ZXIgY29uc3RydWN0cyBhcmUgY3JlYXRlZC4gVXN1YWxseSB0aGUgc2FtZSBzY29wZSB0aGUgYXNwZWN0IGlzXG4gICAqIGFwcGxpZWQgdG8uIEl0IGlzIGEgc2VwYXJhdGUgYXJndW1lbnQgZnJvbSB0aGUgdmlzaXRlZCBub2RlcyBiZWNhdXNlIHRoZSBsYXllciAoYW5kLCBpbiBgSU5fQUNDT1VOVGBcbiAgICogbW9kZSwgdGhlIG5lc3RlZCBTQVIgYXBwbGljYXRpb24pIGlzIGNyZWF0ZWQgb25jZSBhbmQgc2hhcmVkIGJ5IGV2ZXJ5IGZ1bmN0aW9uIHRoZSBhc3BlY3QgdmlzaXRzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgcHJvcHM6IE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdFByb3BzKSB7XG4gICAgdGhpcy5pbnN0cnVtZW50YXRpb24gPSBuZXcgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uKHNjb3BlLCAnT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0Jywge1xuICAgICAgc2tpcFVuc3VwcG9ydGVkUnVudGltZXM6IHRydWUsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdChub2RlOiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBsYW1iZGEuRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9uLmluc3RydW1lbnQobm9kZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
280
+ OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.12" };
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFpRTtBQUNqRSxpREFBaUQ7QUFDakQsMkNBQW1EO0FBQ25ELHlEQVE0QjtBQUM1QiwrQ0FBb0Q7QUFDcEQscURBQXVEO0FBQ3ZELHVDQUFrRztBQUNsRyxtQ0FLaUI7QUFFakIsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7QUFDbkQsa0VBQWtFO0FBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7QUFDN0MsMkZBQTJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFFNUM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFFNUM7OztHQUdHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRXpCOzs7Ozs7R0FNRztBQUNILE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUVwQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEVBQW1CO0lBQzdDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBOEMsQ0FBQztJQUNuRSxNQUFNLFFBQVEsR0FBRyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEYsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDckYsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQXFJRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFhLDJCQUE0QixTQUFRLHNCQUFTO0lBTXhELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUM7UUFDL0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUhGLGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUtoRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksb0NBQW1CLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUkseUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFcEcsaUdBQWlHO1FBQ2pHLHdEQUF3RDtRQUN4RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUEsd0NBQXFCLEVBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWhFLHdHQUF3RztRQUN4Ryx3R0FBd0c7UUFDeEcsc0dBQXNHO1FBQ3RHLDBDQUEwQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2xELHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FDL0Isc0NBQXNDLEVBQ3RDLGlDQUFpQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsd0NBQXdDO2dCQUNqRyxvR0FBb0c7Z0JBQ3BHLHNHQUFzRyxDQUN6RyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdEQseUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUMvQixzQ0FBc0MsRUFDdEMscUNBQXFDLEtBQUssQ0FBQyxXQUFXLENBQUMsWUFBWSxvQ0FBb0M7Z0JBQ3JHLHNHQUFzRztnQkFDdEcsNkNBQTZDLENBQ2hELENBQUM7UUFDSixDQUFDO1FBRUQsS0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsRUFBbUI7UUFDbkMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDcEMsTUFBTSxRQUFRLEdBQUcsSUFBQSw2QkFBbUIsRUFBQyxXQUFXLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxNQUFNLE9BQU8sR0FDWCxvQkFBb0IsV0FBVyxzQ0FBc0M7Z0JBQ3JFLDhHQUE4RyxDQUFDO1lBQ2pILElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUN6Qyx5QkFBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxPQUFPLFlBQVksQ0FBQyxDQUFDO2dCQUM5RixPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxPQUFPLHdEQUF3RCxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTNCLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN6RixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBCLHVHQUF1RztRQUN2RyxzRkFBc0Y7UUFDdEYsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCw4Q0FBOEM7SUFDdkMsYUFBYSxDQUFDLFNBQTRCO1FBQy9DLEtBQUssTUFBTSxFQUFFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxjQUFjLENBQUMsRUFBbUIsRUFBRSxRQUFnQixFQUFFLFFBQWdCO1FBQzVFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3ZHLE1BQU0sU0FBUyxHQUFHLElBQUksS0FBSyxpQ0FBeUIsQ0FBQyxVQUFVLENBQUM7UUFFaEUsTUFBTSxHQUFHLEdBQThCO1lBQ3JDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxXQUFXLElBQUksa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQ3pELENBQUMsMkNBQXdCLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNoRCxDQUFDLGNBQWMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLHVCQUFjLElBQUksWUFBWSxFQUFFLENBQUM7U0FDbkcsQ0FBQztRQUVGLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxrR0FBa0c7WUFDbEcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBQSxzQkFBWSxFQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7UUFDbEUsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFBLHdCQUFjLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDcEUsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDcEMsQ0FBQztRQUNILENBQUM7UUFFRCx1R0FBdUc7UUFDdkcsa0dBQWtHO1FBQ2xHLDJFQUEyRTtRQUMzRSxNQUFNLE9BQU8sR0FBRyxJQUFBLGtDQUFlLEVBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQXdDO1lBQ3JELENBQUMsc0NBQW1CLEVBQUUsSUFBQSxzQ0FBbUIsRUFBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUQsQ0FBQyx1Q0FBb0IsRUFBRSxJQUFBLHNDQUFtQixFQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1RCxDQUFDLG9DQUFpQixFQUFFLElBQUEsc0NBQW1CLEVBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3ZELENBQUM7UUFDRixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7WUFDdEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFFRCx1R0FBdUc7UUFDdkcsMkNBQTJDO1FBQzNDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3ZDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSyxlQUFlLENBQ3JCLEdBQThCLEVBQzlCLFFBQWdCLEVBQ2hCLFFBQWdCLEVBQ2hCLFNBQWtCO1FBRWxCLE1BQU0sT0FBTyxHQUFxQyxFQUFFLENBQUM7UUFDckQsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEMscUdBQXFHO1lBQ3JHLCtGQUErRjtZQUMvRixJQUFJLElBQUksS0FBSyxjQUFjLEVBQUUsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBQSw0QkFBa0IsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3ZFLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLHVHQUF1RztZQUN2RyxpR0FBaUc7WUFDakcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDO1FBQ2hFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDOztBQTVLSCxrRUE2S0M7OztBQU9EOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBYSwyQkFBMkI7SUFHdEM7Ozs7T0FJRztJQUNILFlBQVksS0FBZ0IsRUFBRSxLQUF1QztRQUNuRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksMkJBQTJCLENBQUMsS0FBSyxFQUFFLDZCQUE2QixFQUFFO1lBQzNGLHVCQUF1QixFQUFFLElBQUk7WUFDN0IsR0FBRyxLQUFLO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFnQjtRQUMzQixJQUFJLElBQUksWUFBWSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7O0FBbkJILGtFQW9CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBJQXNwZWN0LCBTdGFjaywgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7XG4gIEVOVl9DT0xMRUNUT1JfQ09ORklHX1VSSSxcbiAgRU5WX0xPR1NfRVhQT1JURVIsXG4gIEVOVl9NRVRSSUNTX0VYUE9SVEVSLFxuICBFTlZfVFJBQ0VTX0VYUE9SVEVSLFxuICBleHBvcnRlck92ZXJyaWRlRm9yLFxuICByZW5kZXJDb2xsZWN0b3JDb25maWcsXG4gIHJlc29sdmVkU2lnbmFscyxcbn0gZnJvbSAnLi9jb2xsZWN0b3ItY29uZmlnJztcbmltcG9ydCB7IE9ESUdPU19WRVJTSU9OIH0gZnJvbSAnLi9nZW5lcmF0ZWQvbGF5ZXJzJztcbmltcG9ydCB7IE9kaWdvc0xheWVyUmVzb2x2ZXIgfSBmcm9tICcuL2xheWVyLXJlc29sdmVyJztcbmltcG9ydCB7IGV4ZWNXcmFwcGVyRm9yLCBsYW5ndWFnZUZyb21SdW50aW1lLCB3ZWJTZXJ2ZXJFbnYsIHdlYlNlcnZlckxvYWRlcktleSB9IGZyb20gJy4vcnVudGltZSc7XG5pbXBvcnQge1xuICBPZGlnb3NEZXN0aW5hdGlvbixcbiAgT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZSxcbiAgT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8sXG4gIE9kaWdvc0xheWVyU291cmNlLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAg4oCUIHRoZSBsYXllcidzIGVudHJ5IHBvaW50IGluIGhhbmRsZXIgbW9kZS4gKi9cbmNvbnN0IEVOVl9FWEVDX1dSQVBQRVIgPSAnQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVInO1xuLyoqIFNlcnZpY2UgbmFtZSByZXBvcnRlZCBvbiBldmVyeSBzcGFuLCBtZXRyaWMgYW5kIGxvZyByZWNvcmQuICovXG5jb25zdCBFTlZfU0VSVklDRV9OQU1FID0gJ09URUxfU0VSVklDRV9OQU1FJztcbi8qKiBSYWlzZXMgaW4tZnVuY3Rpb24gT3BlblRlbGVtZXRyeSB2ZXJib3NpdHkgaW50byB0aGUgZnVuY3Rpb24ncyBDbG91ZFdhdGNoIGxvZyBncm91cC4gKi9cbmNvbnN0IEVOVl9PVEVMX0xPR19MRVZFTCA9ICdPVEVMX0xPR19MRVZFTCc7XG5cbi8qKlxuICogYE9ESUdPU19NQU5BR0VEYCDigJQgdGhlIGNvbm5lY3RvcidzIE9XTkVSU0hJUCBNQVJLRVIsIHdyaXR0ZW4gb25seSB3aGVuIGByZWNvcmRPd25lcnNoaXBNYXJrZXJgIGlzIHNldC5cbiAqXG4gKiBUaGUgY29ubmVjdG9yIGRlcml2ZXMgb3duZXJzaGlwIGZyb20gdGhpcyB2YXJpYWJsZSBhbG9uZTogYHN0b3JlLk9kaWdvc0luc3RydW1lbnRlZGAgY2hlY2tzIGZvciBpdHNcbiAqIHByZXNlbmNlLCBhbmQgYSBmdW5jdGlvbiB3aXRob3V0IGl0IGlzIHJlcG9ydGVkIGBBYnNlbnRgIOKAlCBcImF3YWl0aW5nIHlvdXIgZGVwbG95bWVudFwiIOKAlCBiZWZvcmUgYW55IG90aGVyXG4gKiBjb21wb25lbnQgaXMgY29tcGFyZWQsIGhvd2V2ZXIgY29tcGxldGVseSB0aGUgcmVzdCBpcyBhcHBsaWVkLiBTbyBhIG1hbnVhbC1tb2RlIChJYUMpIGZ1bmN0aW9uIHRoYXQgaXNcbiAqIG1lYW50IHRvIHNob3cgdXAgYXMgaW5zdHJ1bWVudGVkIGluIE9kaWdvcyBoYXMgdG8gY2FycnkgaXQsIGFuZCBub3RoaW5nIGVsc2UgY2FuIHN0YW5kIGluIGZvciBpdC5cbiAqL1xuY29uc3QgRU5WX09ESUdPU19NQU5BR0VEID0gJ09ESUdPU19NQU5BR0VEJztcblxuLyoqXG4gKiBTY2hlbWEgdmVyc2lvbiBvZiB0aGUgbWFya2VyIHBheWxvYWQuIE11c3QgbWF0Y2ggYG1hbmFnZWRNYW5pZmVzdFZlcnNpb25gIGluIHRoZSBjb25uZWN0b3Ig4oCUIGl0IGlzIHdoYXRcbiAqIHRlbGxzIHRoZSBjb25uZWN0b3IgaG93IHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIG9iamVjdCwgc28gYSBidW1wZWQgdmVyc2lvbiB0aGVyZSBpcyBhIGNoYW5nZSBoZXJlLlxuICovXG5jb25zdCBNQVJLRVJfVkVSU0lPTiA9IDE7XG5cbi8qKlxuICogTWFya2VyIHJlY29yZGluZyB0aGF0IHRoaXMgZnVuY3Rpb24gd2FzIGluc3RydW1lbnRlZCBieSBJYUMsIGFuZCBieSB3aGljaCB2ZXJzaW9uLlxuICpcbiAqIERpc3RpbmN0IGZyb20gYE9ESUdPU19NQU5BR0VEYCwgYW5kIG5vdCBhIHN1YnN0aXR1dGUgZm9yIGl0OiB0aGlzIG9uZSBpcyBpbmZvcm1hdGlvbmFsIGFuZCBub3RoaW5nIHJlYWRzXG4gKiBpdCwgd2hpbGUgdGhhdCBvbmUgaXMgdGhlIGNvbm5lY3RvcidzIG93bmVyc2hpcCBwcm9vZiAoc2VlIGByZWNvcmRPd25lcnNoaXBNYXJrZXJgKS4gVGhlIGNvbm5lY3RvclxuICogaWdub3JlcyB2YXJpYWJsZXMgaXQgZG9lcyBub3QgZXhwZWN0LCBzbyB0aGlzIGlzIG5ldmVyIHJlcG9ydGVkIGFzIGRyaWZ0LlxuICovXG5jb25zdCBFTlZfSUFDX01BUktFUiA9ICdPRElHT1NfSUFDJztcblxuLyoqXG4gKiBUaGUgc2VydmljZSBhIGZ1bmN0aW9uIHJlcG9ydHMgYXMsIHdoZW4gdGhlIGNhbGxlciBoYXMgbm90IG5hbWVkIG9uZS5cbiAqXG4gKiBSRUFEIEZST00gVEhFIEwxLCBOT1QgRlJPTSBgZm4uZnVuY3Rpb25OYW1lYC4gVGhlIEwyIHByb3BlcnR5IGlzIGEgY3Jvc3MtZW52aXJvbm1lbnQtYXdhcmUgdG9rZW4gdGhhdFxuICogcmVzb2x2ZXMgdG8gYSBgUmVmYCB0byB0aGUgZnVuY3Rpb24gaXRzZWxmIGV2ZW4gd2hlbiB0aGUgc3RhY2sgc2V0IGBmdW5jdGlvbk5hbWVgIGV4cGxpY2l0bHkg4oCUIHNvIHRoZVxuICogb2J2aW91cyBgU3RhY2sub2YoZm4pLnJlc29sdmUoZm4uZnVuY3Rpb25OYW1lKWAgbmV2ZXIgeWllbGRzIGEgbGl0ZXJhbCwgYW5kIGV2ZXJ5IGZ1bmN0aW9uIHNpbGVudGx5IGZlbGxcbiAqIGJhY2sgdG8gaXRzIGNvbnN0cnVjdCBpZC4gYENmbkZ1bmN0aW9uLmZ1bmN0aW9uTmFtZWAgaXMgdGhlIHJhdyB0ZW1wbGF0ZSB2YWx1ZTogdGhlIGxpdGVyYWwgdGhlIHN0YWNrXG4gKiBwYXNzZWQsIG9yIHVuZGVmaW5lZCB3aGVuIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlcyB0aGUgbmFtZS5cbiAqXG4gKiBXaHkgdGhlIGZhbGxiYWNrIGlzIHRoZSBjb25zdHJ1Y3QgaWQgcmF0aGVyIHRoYW4gdGhlIGdlbmVyYXRlZCBuYW1lOiBhIGdlbmVyYXRlZCBuYW1lIGlzIGEgYFJlZmAgdG8gdGhlXG4gKiBmdW5jdGlvbiwgYW5kIHB1dHRpbmcgdGhhdCBpbiB0aGUgZnVuY3Rpb24ncyBvd24gZW52aXJvbm1lbnQgbWFrZXMgdGhlIHJlc291cmNlIGRlcGVuZCBvbiBpdHMgb3duXG4gKiBjcmVhdGlvbiDigJQgQ2xvdWRGb3JtYXRpb24gcmVqZWN0cyB0aGUgdGVtcGxhdGUgd2l0aCBhIGRlcGVuZGVuY3kgY3ljbGUsIGF0IGRlcGxveSB0aW1lLlxuICpcbiAqIFRoaXMgbWF0dGVycyBiZXlvbmQgY29zbWV0aWNzLiBUaGUgY29ubmVjdG9yIGNvbXBhcmVzIGBPVEVMX1NFUlZJQ0VfTkFNRWAgYWdhaW5zdCB0aGUgd29ya2xvYWQncyBuYW1lIGluXG4gKiBPZGlnb3MsIHdoaWNoIGlzIHRoZSByZWFsIEFXUyBmdW5jdGlvbiBuYW1lLCBzbyBhIGZ1bmN0aW9uIHJlcG9ydGluZyBpdHMgY29uc3RydWN0IGlkIGlzIHJlcG9ydGVkIGFzXG4gKiBkcmlmdGVkIG9uIHRoZSBzZXJ2aWNlLW5hbWUgY29tcG9uZW50LiBOYW1pbmcgdGhlIGZ1bmN0aW9uIGluIHlvdXIgc3RhY2sgaXMgbm93IGVub3VnaCB0byBsaW5lIHRoZSB0d29cbiAqIHVwOyBhIGZ1bmN0aW9uIHdob3NlIG5hbWUgQ2xvdWRGb3JtYXRpb24gZ2VuZXJhdGVzIHN0aWxsIG5lZWRzIGBzZXJ2aWNlTmFtZWAgcGFzc2VkIGV4cGxpY2l0bHkuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRTZXJ2aWNlTmFtZShmbjogbGFtYmRhLkZ1bmN0aW9uKTogc3RyaW5nIHtcbiAgY29uc3QgY2ZuID0gZm4ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgbGFtYmRhLkNmbkZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCByZXNvbHZlZCA9IGNmbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU3RhY2sub2YoZm4pLnJlc29sdmUoY2ZuLmZ1bmN0aW9uTmFtZSk7XG4gIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09ICdzdHJpbmcnICYmIHJlc29sdmVkICE9PSAnJyAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHJlc29sdmVkKSkge1xuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuICByZXR1cm4gZm4ubm9kZS5pZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHNoYXJlZCBieSB0aGUgY29uc3RydWN0IGFuZCB0aGUgYXNwZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hlcmUgdGhlIGluLUxhbWJkYSBjb2xsZWN0b3IgZXhwb3J0cyB0by5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBPZGlnb3NEZXN0aW5hdGlvbjtcblxuICAvKipcbiAgICogV2hlcmUgdGhlIE9kaWdvcyBsYXllciBjb21lcyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPZGlnb3NMYXllclNvdXJjZS5PRElHT1NfUFVCTElDXG4gICAqL1xuICByZWFkb25seSBsYXllclNvdXJjZT86IE9kaWdvc0xheWVyU291cmNlO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIG1vZGUgb3Igd2ViLXNlcnZlciAoTGFtYmRhIFdlYiBBZGFwdGVyKSBtb2RlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBhdXRvLWRldGVjdGlvbiwgYW5kIHRoYXQgaXMgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhbiBvbWlzc2lvbjogZGV0ZWN0aW5nIHRoZSB3ZWIgYWRhcHRlclxuICAgKiBtZWFucyBpbnNwZWN0aW5nIHRoZSBmdW5jdGlvbidzIG90aGVyIGxheWVycywgd2hpY2ggYXQgc3ludGggdGltZSBhcmUgZnJlcXVlbnRseSB1bnJlc29sdmVkIHRva2Vucy5cbiAgICogQSBkZXRlY3RvciB0aGF0IGlzIHJpZ2h0IG1vc3Qgb2YgdGhlIHRpbWUgd291bGQgc2lsZW50bHkgYnJlYWsgdGhlIGZ1bmN0aW9ucyBpdCBnb3Qgd3JvbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuSEFORExFUlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGU7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBKYXZhIGxheWVyJ3MgZm91ciB3cmFwcGVyIHNjcmlwdHMgdG8gdXNlLiBJZ25vcmVkIGZvciBvdGhlciBsYW5ndWFnZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IE9kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUlxuICAgKi9cbiAgcmVhZG9ubHkgamF2YUhhbmRsZXJEaXN0cm8/OiBPZGlnb3NKYXZhSGFuZGxlckRpc3RybztcblxuICAvKipcbiAgICogYE9URUxfU0VSVklDRV9OQU1FYCBmb3IgZXZlcnkgZnVuY3Rpb24gdGhpcyBpbnN0cnVtZW50cy5cbiAgICpcbiAgICogVXN1YWxseSB3cm9uZyB0byBzZXQgd2hlbiBpbnN0cnVtZW50aW5nIG1vcmUgdGhhbiBvbmUgZnVuY3Rpb24g4oCUIHRoZXkgd291bGQgYWxsIHJlcG9ydCBhcyB0aGUgc2FtZVxuICAgKiBzZXJ2aWNlLlxuICAgKlxuICAgKiBMZWZ0IHVuc2V0LCBhIGZ1bmN0aW9uIHJlcG9ydHMgYXMgaXRzIGV4cGxpY2l0bHktc2V0IHBoeXNpY2FsIG5hbWUgaWYgaXQgaGFzIG9uZSwgYW5kIG90aGVyd2lzZSBhc1xuICAgKiBpdHMgY29uc3RydWN0IGlkLiBJdCBkZWxpYmVyYXRlbHkgZG9lcyBub3QgZGVmYXVsdCB0byB0aGUgZ2VuZXJhdGVkIHBoeXNpY2FsIG5hbWU6IHRoYXQgdmFsdWUgaXMgYVxuICAgKiBgUmVmYCB0byB0aGUgZnVuY3Rpb24gaXRzZWxmLCBhbmQgYSBmdW5jdGlvbiByZWZlcmVuY2luZyBpdHNlbGYgaW4gaXRzIG93biBlbnZpcm9ubWVudCBpcyBhXG4gICAqIENsb3VkRm9ybWF0aW9uIGRlcGVuZGVuY3kgY3ljbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZ1bmN0aW9uJ3MgcGh5c2ljYWwgbmFtZSBpZiBleHBsaWNpdGx5IHNldCwgb3RoZXJ3aXNlIGl0cyBjb25zdHJ1Y3QgaWRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSYWlzZSBpbi1mdW5jdGlvbiBPcGVuVGVsZW1ldHJ5IHZlcmJvc2l0eSAoYE9URUxfTE9HX0xFVkVMPWRlYnVnYCkuXG4gICAqXG4gICAqIFRoZSBsYXllciwgU0RLIGFuZCBjb2xsZWN0b3IgdGhlbiBlbWl0IHNwYW4gYW5kIE9UTFAtZXhwb3J0IGRpYWdub3N0aWNzIGludG8gdGhlIGZ1bmN0aW9uJ3MgQ2xvdWRXYXRjaFxuICAgKiBsb2cgZ3JvdXAuIFVzZWZ1bCB3aGlsZSB3aXJpbmcgdXAgYSBkZXN0aW5hdGlvbiwgZXhwZW5zaXZlIHRvIGxlYXZlIG9uLlxuICAgKlxuICAgKiBIYXMgbm8gZWZmZWN0IGluIHdlYi1zZXJ2ZXIgbW9kZSwgbWF0Y2hpbmcgdGhlIGNvbm5lY3Rvciwgd2hpY2ggbmV2ZXIgc2V0cyBhIGxvZyBsZXZlbCB0aGVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQXR0YWNoIHRoaXMgbGF5ZXIgaW5zdGVhZCBvZiByZXNvbHZpbmcgb25lLiBPdmVycmlkZXMgYGxheWVyU291cmNlYCBlbnRpcmVseS5cbiAgICpcbiAgICogVGhlIGVzY2FwZSBoYXRjaCBmb3IgYSBsYXllciBtaXJyb3JlZCBpbnRvIGEgcHJpdmF0ZSByZWdpc3RyeSBvciBhbiBpbnRlcm5hbCBhY2NvdW50LiBUaGUgbGF5ZXIgbXVzdFxuICAgKiBoYXZlIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSBPZGlnb3Mgb25lIOKAlCB0aGUgZW52aXJvbm1lbnQgc2V0IGhlcmUgYXNzdW1lcyBpdHMgZXhhY3Qgc2NyaXB0IGxheW91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSByZXNvbHZlZCBmcm9tIGxheWVyU291cmNlXG4gICAqL1xuICByZWFkb25seSBsYXllclZlcnNpb24/OiBsYW1iZGEuSUxheWVyVmVyc2lvbjtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IG5lZWRzIGluIGl0cyBsYW5ndWFnZSBsb2FkZXIgdmFyaWFibGUgKGBOT0RFX09QVElPTlNgLFxuICAgKiBgSkFWQV9UT09MX09QVElPTlNgIG9yIGBQWVRIT05QQVRIYCksIHdoaWNoIHRoZSBPZGlnb3MgbG9hZGVyIGlzIGpvaW5lZCB0byByYXRoZXIgdGhhbiByZXBsYWNpbmcuXG4gICAqXG4gICAqIE9ubHkgdXNlZCBpbiB3ZWItc2VydmVyIG1vZGUuIEl0IGhhcyB0byBiZSBwYXNzZWQgZXhwbGljaXRseSBiZWNhdXNlIENESydzIGBsYW1iZGEuRnVuY3Rpb25gIGV4cG9zZXNcbiAgICogbm8gd2F5IHRvIHJlYWQgYmFjayBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgZWxzZXdoZXJlIGluIHRoZSBhcHAg4oCUIGFuIG9taXR0ZWQgdmFsdWUgaGVyZSBpc1xuICAgKiBzaWxlbnRseSBvdmVyd3JpdHRlbiwgd2hpY2ggZm9yIGBOT0RFX09QVElPTlNgIGNhbiBtZWFuIGxvc2luZyBhIGZsYWcgdGhlIGFwcCBuZWVkcyB0byBib290LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBsb2FkZXIgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBPZGlnb3MgdmFsdWUgYWxvbmVcbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nTG9hZGVyVmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdyaXRlIGBPRElHT1NfTUFOQUdFRGAsIHRoZSBtYXJrZXIgdGhhdCBtYWtlcyB0aGUgT2RpZ29zIGNvbm5lY3RvciByZWNvZ25pc2UgdGhpcyBmdW5jdGlvbiBhc1xuICAgKiBpbnN0cnVtZW50ZWQuXG4gICAqXG4gICAqIFdJVEhPVVQgSVQgVEhFIEZVTkNUSU9OIElTIFJFUE9SVEVEIEFTIFVOSU5TVFJVTUVOVEVELiBUaGUgY29ubmVjdG9yIGRlcml2ZXMgb3duZXJzaGlwIGZyb20gdGhpc1xuICAgKiB2YXJpYWJsZSBhbG9uZTogbm8gbWFya2VyIG1lYW5zIGBBYnNlbnRgIOKAlCBcImF3YWl0aW5nIHlvdXIgZGVwbG95bWVudFwiIOKAlCBldmVuIHRob3VnaCB0aGUgbGF5ZXIgaXNcbiAgICogYXR0YWNoZWQsIHRoZSB3cmFwcGVyIGlzIHNldCBhbmQgdGhlIGNvbGxlY3RvciBpcyBjb25maWd1cmVkLiBTZXQgdGhpcyB0byBgdHJ1ZWAgZm9yIGEgZnVuY3Rpb24gdGhhdFxuICAgKiBPZGlnb3MgZGlzY292ZXJzIGluIE1BTlVBTCAoSWFDKSBtb2RlLCB3aGljaCBpcyB0aGUgbW9kZSBhIHdvcmtsb2FkIGlzIGluIHVubGVzcyB5b3UgZXhwbGljaXRseSBoYW5kXG4gICAqIGluc3RydW1lbnRhdGlvbiB0byB0aGUgY29ubmVjdG9yLlxuICAgKlxuICAgKiBMZWF2ZSBpdCBgZmFsc2VgICh0aGUgZGVmYXVsdCkgZm9yIGEgZnVuY3Rpb24geW91IGhhdmUgZW5hYmxlZCBhcyBhbiBBVVRPTUFUSUMtbW9kZSBjb25uZWN0b3Igc291cmNlLlxuICAgKiBUaGVyZSwgdGhlIGNvbm5lY3RvciBpbnN0cnVtZW50cyB0aGUgZnVuY3Rpb24gaXRzZWxmIGFuZCBvd25zIHRoaXMgdmFyaWFibGUsIGluY2x1ZGluZyB0aGUgYHByZXZFbnZgXG4gICAqIHNuYXBzaG90IGl0IHJlc3RvcmVzIG9uIHJvbGxiYWNrOyB0d28gd3JpdGVycyBvZiBvbmUgb3duZXJzaGlwIHJlY29yZCBpcyB0aGUgb25lIGNvbWJpbmF0aW9uIHRoYXRcbiAgICogZ2VudWluZWx5IG1pc2JlaGF2ZXMuXG4gICAqXG4gICAqIFRoZSBtYXJrZXIgcmVjb3JkcyB0aGUgZXhhY3QgbGF5ZXIgQVJOIHRoaXMgY29uc3RydWN0IGF0dGFjaGVkLCB3aGljaCBpcyBhbHNvIHdoYXQgdGhlIGNvbm5lY3RvciByZWFkc1xuICAgKiBiYWNrIHRvIGRlY2lkZSB3aGljaCBsYXllciB2ZXJzaW9uIHRoZSBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBjYXJyeSDigJQgc28gYSB2ZXJzaW9uIHlvdSBwaW5uZWQgaXNcbiAgICogcmVzcGVjdGVkIHJhdGhlciB0aGFuIHJlcG9ydGVkIGFzIGRyaWZ0LiBJdCB3b3JrcyBpbiBldmVyeSBsYXllciBtb2RlLCBpbmNsdWRpbmcgYElOX0FDQ09VTlRgLCB3aGVyZSB0aGVcbiAgICogQVJOIGlzIGEgZGVwbG95LXRpbWUgcmVmZXJlbmNlIHlvdXIgb3duIGNvZGUgY2Fubm90IG9idGFpbi5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJlY29yZE93bmVyc2hpcE1hcmtlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNraXAgZnVuY3Rpb25zIHdob3NlIHJ1bnRpbWUgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGluc3RlYWQgb2YgdGhyb3dpbmcuXG4gICAqXG4gICAqIGBkb3RuZXQqYCBhbmQgYHByb3ZpZGVkLipgIChHbywgY3VzdG9tIHJ1bnRpbWVzKSBoYXZlIG5vIGxhbmd1YWdlIGxheWVyIHVwc3RyZWFtLiBFeHBsaWNpdGx5XG4gICAqIGluc3RydW1lbnRpbmcgb25lIGlzIGEgbWlzdGFrZSB3b3J0aCBmYWlsaW5nIG9uOyBzd2VlcGluZyBhIHdob2xlIHN0YWNrIHdpdGggdGhlIGFzcGVjdCBhbmQgaGl0dGluZ1xuICAgKiBvbmUgaXMgbm90LCB3aGljaCBpcyB3aHkgdGhlIGFzcGVjdCBkZWZhdWx0cyB0aGlzIHRvIGB0cnVlYCBhbmQgdGhlIGNvbnN0cnVjdCB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFVuc3VwcG9ydGVkUnVudGltZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb25Qcm9wcyBleHRlbmRzIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogRnVuY3Rpb25zIHRvIGluc3RydW1lbnQgb24gY29uc3RydWN0aW9uLiBNb3JlIGNhbiBiZSBhZGRlZCB3aXRoIGBpbnN0cnVtZW50KClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IGxhbWJkYS5GdW5jdGlvbltdO1xufVxuXG4vKipcbiAqIEluc3RydW1lbnRzIEFXUyBMYW1iZGEgZnVuY3Rpb25zIHdpdGggdGhlIE9kaWdvcyBPcGVuVGVsZW1ldHJ5IGxheWVyLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBvZGlnb3MgPSBuZXcgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uKHRoaXMsICdPZGlnb3MnLCB7XG4gKiAgIGRlc3RpbmF0aW9uOiB7IGVuZHBvaW50OiAnb3RscC5leGFtcGxlLmNvbTo0MzE3JyB9LFxuICogICBmdW5jdGlvbnM6IFthcGlGbiwgd29ya2VyRm5dLFxuICogfSk7XG4gKiBvZGlnb3MuaW5zdHJ1bWVudChhbm90aGVyRm4pO1xuICogYGBgXG4gKlxuICogV2hhdCBpdCBkb2VzIHRvIGVhY2ggZnVuY3Rpb246IGF0dGFjaGVzIHRoZSBsYXllciBmb3IgdGhlIGZ1bmN0aW9uJ3MgbGFuZ3VhZ2UgYW5kIGFyY2hpdGVjdHVyZSwgc2V0c1xuICogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCBzbyB0aGUgbGF5ZXIgbG9hZHMgdGhlIFNESywgc2V0cyBgT1RFTF9TRVJWSUNFX05BTUVgLCBhbmQgaGFuZHMgdGhlIGluLUxhbWJkYVxuICogY29sbGVjdG9yIGl0cyBlbnRpcmUgY29uZmlndXJhdGlvbiBpbmxpbmUgdGhyb3VnaCBgT1BFTlRFTEVNRVRSWV9DT0xMRUNUT1JfQ09ORklHX1VSSWAuXG4gKlxuICogVGhlIGZ1bmN0aW9uJ3MgU0RLIGV4cG9ydHMgdG8gdGhlIGNvbGxlY3RvciBvbiBsb2NhbGhvc3QsIG5vdCB0byB5b3VyIGRlc3RpbmF0aW9uLiBUaGUgY29sbGVjdG9yXG4gKiBmb3J3YXJkcyBhZnRlciB0aGUgaGFuZGxlciBoYXMgYWxyZWFkeSByZXR1cm5lZCwgc28gYSBzbG93IGRlc3RpbmF0aW9uIGNvc3RzIGJpbGxlZCBkdXJhdGlvbiByYXRoZXJcbiAqIHRoYW4gY2FsbGVyIGxhdGVuY3kuXG4gKlxuICogIyMgRG8gbm90IGFsc28gaW5zdHJ1bWVudCB0aGVzZSBmdW5jdGlvbnMgd2l0aCB0aGUgY29ubmVjdG9yXG4gKlxuICogVGhlIE9kaWdvcyBBV1MgY29ubmVjdG9yIGluc3RydW1lbnRzIGxpdmUgZnVuY3Rpb25zIGJ5IG11dGF0aW5nIHRoZW0sIGFuZCByZWNvbmNpbGVzIHRoZW0gYmFjayB0byBpdHNcbiAqIG93biBkZXNpcmVkIHN0YXRlIG9uIGV2ZXJ5IHBhc3MuIEEgZnVuY3Rpb24gaW5zdHJ1bWVudGVkIGhlcmUgYW5kIGFsc28gZW5hYmxlZCBhcyBhIGNvbm5lY3RvciBzb3VyY2VcbiAqIGVuZHMgdXAgb3duZWQgYnkgYm90aDogZWFjaCBgY2RrIGRlcGxveWAgcmVhc3NlcnRzIHRoZSBDREsncyBlbnZpcm9ubWVudCwgZWFjaCByZWNvbmNpbGUgcmVhc3NlcnRzIHRoZVxuICogY29ubmVjdG9yJ3MsIGFuZCBldmVyeSByb3VuZCB0cmlwIHB1Ymxpc2hlcyBhIG5ldyBmdW5jdGlvbiB2ZXJzaW9uLlxuICpcbiAqIENob29zZSBvbmUgcGVyIGZ1bmN0aW9uLiBUaGlzIGNvbnN0cnVjdCBuZXZlciBzZXRzIHRoZSBjb25uZWN0b3IncyBgT0RJR09TX01BTkFHRURgIG93bmVyc2hpcCBtYXJrZXIsXG4gKiBzbyBhbiBJYUMtaW5zdHJ1bWVudGVkIGZ1bmN0aW9uIGlzIG5vdCBvbmUgdGhlIGNvbm5lY3RvciB3aWxsIHJvbGwgYmFjayDigJQgYnV0IGl0IHdpbGwgaGFwcGlseSB0YWtlIGl0XG4gKiBvdmVyIGlmIHlvdSBlbmFibGUgaXQgYXMgYSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IE9kaWdvc0xheWVyUmVzb2x2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sbGVjdG9yQ29uZmlnOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1bWVudGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHByb3BzO1xuICAgIHRoaXMucmVzb2x2ZXIgPSBuZXcgT2RpZ29zTGF5ZXJSZXNvbHZlcih0aGlzLCBwcm9wcy5sYXllclNvdXJjZSA/PyBPZGlnb3NMYXllclNvdXJjZS5PRElHT1NfUFVCTElDKTtcblxuICAgIC8vIFJlbmRlcmVkIG9uY2UuIEl0IGRlcGVuZHMgb25seSBvbiB0aGUgZGVzdGluYXRpb24sIGFuZCByZW5kZXJpbmcgaXQgcGVyIGZ1bmN0aW9uIHdvdWxkIG1ha2UgYW5cbiAgICAvLyBhY2NpZGVudGFsIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZnVuY3Rpb25zIHBvc3NpYmxlLlxuICAgIHRoaXMuY29sbGVjdG9yQ29uZmlnID0gcmVuZGVyQ29sbGVjdG9yQ29uZmlnKHByb3BzLmRlc3RpbmF0aW9uKTtcblxuICAgIC8vIEEgd2FybmluZyByYXRoZXIgdGhhbiBhbiBlcnJvciwgYmVjYXVzZSBhIGNvbGxlY3RvciBDQU4gYmUgcmVhY2hlZCBvdmVyIGdSUEMgb24gYSBub24tc3RhbmRhcmQgcG9ydCDigJRcbiAgICAvLyBidXQgdGhlIG92ZXJ3aGVsbWluZ2x5IGxpa2VsaWVyIHJlYWRpbmcgb2YgYGVuZHBvaW50OiBcImhvc3Q6NDMxOFwiYCBpcyBhbiBPVExQL0hUVFAgZW5kcG9pbnQgcGFzc2VkIHRvXG4gICAgLy8gdGhlIGdSUEMgZXhwb3J0ZXIsIHdoaWNoIGJ1aWxkcywgc3RhcnRzLCBhbmQgdGhlbiBuZXZlciBkZWxpdmVycyBhIGJhdGNoLiBTaWxlbnQgZm9yIHRoZSBjYWxsZXIgd2hvXG4gICAgLy8gbWVhbnQgaXQ7IGxvdWQgZm9yIHRoZSBvbmUgd2hvIGRpZCBub3QuXG4gICAgaWYgKHByb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTgnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlSHR0cEVuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gZW5kcG9pbnQgXCIke3Byb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50fVwiIGlzIG9uIDQzMTgsIHRoZSBPVExQL0hUVFAgcG9ydCwgYnV0IGAgK1xuICAgICAgICAgICdgZW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIGdSUEMgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTcpLiBJZiB0aGF0IGlzIGFuIE9UTFAvSFRUUCBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBodHRwRW5kcG9pbnQ6IFwiaHR0cDovL2hvc3Q6NDMxOFwiYCBpbnN0ZWFkIOKAlCB0aGUgZ1JQQyBleHBvcnRlciB3aWxsIGV4cG9ydCBub3RoaW5nIHRvIGl0LicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZGVzdGluYXRpb24uaHR0cEVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTcnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlR3JwY0VuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gaHR0cEVuZHBvaW50IFwiJHtwcm9wcy5kZXN0aW5hdGlvbi5odHRwRW5kcG9pbnR9XCIgaXMgb24gNDMxNywgdGhlIE9UTFAvZ1JQQyBwb3J0LCBgICtcbiAgICAgICAgICAnYnV0IGBodHRwRW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIEhUVFAgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTgpLiBJZiB0aGF0IGlzIGEgZ1JQQyBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBlbmRwb2ludDogXCJob3N0OjQzMTdcImAgaW5zdGVhZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIHByb3BzLmZ1bmN0aW9ucyA/PyBbXSkge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdHJ1bWVudHMgb25lIGZ1bmN0aW9uLiBJZGVtcG90ZW50IOKAlCBpbnN0cnVtZW50aW5nIHRoZSBzYW1lIGZ1bmN0aW9uIHR3aWNlIGlzIGEgbm8tb3AgcmF0aGVyIHRoYW4gYVxuICAgKiBkb3VibGVkIGxvYWRlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBpbnN0cnVtZW50KGZuOiBsYW1iZGEuRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBmbi5ub2RlLnBhdGg7XG4gICAgaWYgKHRoaXMuaW5zdHJ1bWVudGVkLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcnVudGltZU5hbWUgPSBmbi5ydW50aW1lLm5hbWU7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZyb21SdW50aW1lKHJ1bnRpbWVOYW1lKTtcbiAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgYE9kaWdvczogcnVudGltZSBcIiR7cnVudGltZU5hbWV9XCIgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGAgK1xuICAgICAgICAnKHVwc3RyZWFtIHB1Ymxpc2hlcyBsYXllcnMgZm9yIHB5dGhvbiwgbm9kZWpzLCBqYXZhIGFuZCBydWJ5IG9ubHkpLCBzbyB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBpbnN0cnVtZW50ZWQuJztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcFVuc3VwcG9ydGVkUnVudGltZXMpIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnVuc3VwcG9ydGVkUnVudGltZScsIGAke21lc3NhZ2V9IFNraXBwaW5nLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bWVzc2FnZX0gU2V0IHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzOiB0cnVlIHRvIHNraXAgaXQgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmluc3RydW1lbnRlZC5hZGQoa2V5KTtcblxuICAgIGNvbnN0IGFyY2hpdGVjdHVyZSA9IGZuLmFyY2hpdGVjdHVyZS5uYW1lO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5vcHRpb25zLmxheWVyVmVyc2lvbiA/PyB0aGlzLnJlc29sdmVyLnJlc29sdmUobGFuZ3VhZ2UsIGFyY2hpdGVjdHVyZSk7XG4gICAgZm4uYWRkTGF5ZXJzKGxheWVyKTtcblxuICAgIC8vIFRoZSBBUk4sIG5vdCB0aGUgY29uc3RydWN0OiB0aGUgbWFya2VyIGhhcyB0byBuYW1lIHRoZSBleGFjdCBsYXllciB2ZXJzaW9uIHRoZSBmdW5jdGlvbiBjYXJyaWVzLCBhbmRcbiAgICAvLyBpbiBJTl9BQ0NPVU5UIG1vZGUgdGhhdCBpcyBhIG5lc3RlZC1zdGFjayBvdXRwdXQgcmVmZXJlbmNlIHJlc29sdmVkIGF0IGRlcGxveSB0aW1lLlxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudmlyb25tZW50Rm9yKGZuLCBsYW5ndWFnZSwgbGF5ZXIubGF5ZXJWZXJzaW9uQXJuKSkpIHtcbiAgICAgIGZuLmFkZEVudmlyb25tZW50KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogSW5zdHJ1bWVudHMgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIGxpc3QuICovXG4gIHB1YmxpYyBpbnN0cnVtZW50QWxsKGZ1bmN0aW9uczogbGFtYmRhLkZ1bmN0aW9uW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGZ1bmN0aW9ucykge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IGFwcGxpZWQgdG8gb25lIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBNaXJyb3JzIGBhcHBseUhhbmRsZXJFbnZgIC8gYGFwcGx5V2ViU2VydmVyRW52YCBpbiB0aGUgY29ubmVjdG9yLCBpbmNsdWRpbmcgd2hhdCBpcyBkZWxpYmVyYXRlbHkgTk9UXG4gICAqIHNldDogYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgc3RheXMgdW5zZXQgc28gdGhlIFNESyBrZWVwcyBleHBvcnRpbmcgdG8gdGhlIGluLUxhbWJkYSBjb2xsZWN0b3JcbiAgICogb24gbG9jYWxob3N0IHJhdGhlciB0aGFuIGJsb2NraW5nIHRoZSBpbnZvY2F0aW9uIG9uIHRoZSByZW1vdGUgZGVzdGluYXRpb24sIGFuZCBhbiBlbmFibGVkIHNpZ25hbCdzXG4gICAqIGBPVEVMXypfRVhQT1JURVJgIHN0YXlzIHVuc2V0IGJlY2F1c2UgYG90bHBgIGlzIGFscmVhZHkgdGhlIFNESyBkZWZhdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBlbnZpcm9ubWVudEZvcihmbjogbGFtYmRhLkZ1bmN0aW9uLCBsYW5ndWFnZTogc3RyaW5nLCBsYXllckFybjogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgeyBkZXN0aW5hdGlvbiwgbW9kZSwgZGVidWcsIHNlcnZpY2VOYW1lLCBqYXZhSGFuZGxlckRpc3RybywgZXhpc3RpbmdMb2FkZXJWYWx1ZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHdlYlNlcnZlciA9IG1vZGUgPT09IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuV0VCX1NFUlZFUjtcblxuICAgIGNvbnN0IGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIFtFTlZfU0VSVklDRV9OQU1FXTogc2VydmljZU5hbWUgPz8gZGVmYXVsdFNlcnZpY2VOYW1lKGZuKSxcbiAgICAgIFtFTlZfQ09MTEVDVE9SX0NPTkZJR19VUkldOiB0aGlzLmNvbGxlY3RvckNvbmZpZyxcbiAgICAgIFtFTlZfSUFDX01BUktFUl06IEpTT04uc3RyaW5naWZ5KHsgdjogMSwgc291cmNlOiAnY2RrJywgdmVyc2lvbjogT0RJR09TX1ZFUlNJT04gfHwgJ3VucmVsZWFzZWQnIH0pLFxuICAgIH07XG5cbiAgICBpZiAod2ViU2VydmVyKSB7XG4gICAgICAvLyBObyBleGVjIHdyYXBwZXI6IHRoZSBMYW1iZGEgV2ViIEFkYXB0ZXIgb3ducyBpdCwgYW5kIG92ZXJ3cml0aW5nIGl0IHN0b3BzIHRoZSBmdW5jdGlvbiBzZXJ2aW5nLlxuICAgICAgT2JqZWN0LmFzc2lnbihlbnYsIHdlYlNlcnZlckVudihsYW5ndWFnZSwgZXhpc3RpbmdMb2FkZXJWYWx1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnZbRU5WX0VYRUNfV1JBUFBFUl0gPSBleGVjV3JhcHBlckZvcihsYW5ndWFnZSwgamF2YUhhbmRsZXJEaXN0cm8pO1xuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGVudltFTlZfT1RFTF9MT0dfTEVWRUxdID0gJ2RlYnVnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdXBwcmVzcyB0aGUgc2lnbmFscyB0aGUgZGVzdGluYXRpb24gZG9lcyBub3QgYWNjZXB0LiBBIHNpZ25hbCB3aXRoIG5vIGNvbGxlY3RvciBwaXBlbGluZSBpcyByZWZ1c2VkXG4gICAgLy8gYXQgdGhlIHJlY2VpdmVyIG9uIGV2ZXJ5IGJhdGNoLCBzbyB0ZWxsaW5nIHRoZSBTREsgbm90IHRvIHByb2R1Y2UgaXQgaXMgdGhlIGhhbGYgdGhhdCBzdG9wcyB0aGVcbiAgICAvLyBlcnJvciBsb29wOyB0aGUgcGlwZWxpbmUgYmVpbmcgYWJzZW50IGlzIHRoZSBoYWxmIHRoYXQgc3RvcHMgdGhlIGV4cG9ydC5cbiAgICBjb25zdCBlbmFibGVkID0gcmVzb2x2ZWRTaWduYWxzKGRlc3RpbmF0aW9uKTtcbiAgICBjb25zdCBvdmVycmlkZXM6IEFycmF5PFtzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF0+ID0gW1xuICAgICAgW0VOVl9UUkFDRVNfRVhQT1JURVIsIGV4cG9ydGVyT3ZlcnJpZGVGb3IoZW5hYmxlZC50cmFjZXMpXSxcbiAgICAgIFtFTlZfTUVUUklDU19FWFBPUlRFUiwgZXhwb3J0ZXJPdmVycmlkZUZvcihlbmFibGVkLm1ldHJpY3MpXSxcbiAgICAgIFtFTlZfTE9HU19FWFBPUlRFUiwgZXhwb3J0ZXJPdmVycmlkZUZvcihlbmFibGVkLmxvZ3MpXSxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBvdmVycmlkZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVudltuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExBU1QsIGJlY2F1c2UgdGhlIG1hcmtlcidzIHNuYXBzaG90IGRlc2NyaWJlcyB0aGUga2V5cyBhYm92ZTogaXQgaXMgYnVpbHQgZnJvbSB3aGF0IHRoaXMgZnVuY3Rpb24gaXNcbiAgICAvLyBhY3R1YWxseSBnZXR0aW5nLCBub3QgZnJvbSBhIGZpeGVkIGxpc3QuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZWNvcmRPd25lcnNoaXBNYXJrZXIpIHtcbiAgICAgIGVudltFTlZfT0RJR09TX01BTkFHRURdID0gdGhpcy5vd25lcnNoaXBNYXJrZXIoZW52LCBsYXllckFybiwgbGFuZ3VhZ2UsIHdlYlNlcnZlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYE9ESUdPU19NQU5BR0VEYCBwYXlsb2FkOiB0aGUgbGF5ZXIgdGhpcyBmdW5jdGlvbiBjYXJyaWVzLCBwbHVzIHRoZSBzbmFwc2hvdCB0aGUgY29ubmVjdG9yIHJlc3RvcmVzXG4gICAqIGZyb20gaWYgaXQgZXZlciByb2xscyB0aGUgZnVuY3Rpb24gYmFjay5cbiAgICpcbiAgICogV0hZIGBwcmV2RW52YCBJUyBOT1QgT1BUSU9OQUwgSEVSRS4gVGhlIGNvbm5lY3RvcidzIHJvbGxiYWNrIGl0ZXJhdGVzIGV4YWN0bHkgdGhpcyBtYXAg4oCUIGEgbnVsbCBlbnRyeVxuICAgKiBtZWFucyBcImRlbGV0ZSBvbiByb2xsYmFja1wiLCBhIHN0cmluZyBtZWFucyBcInJlc3RvcmUgdGhpcyB2YWx1ZSB2ZXJiYXRpbVwiIOKAlCBhbmQgdGhlbiByZW1vdmVzIHRoZSByZWNvcmRlZFxuICAgKiBsYXllci4gQSBtYXJrZXIgd2l0aG91dCBpdCB3b3VsZCB0aGVyZWZvcmUgc3RyaXAgdGhlIExBWUVSIHdoaWxlIGxlYXZpbmcgYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYFxuICAgKiBwb2ludGluZyBhdCBgL29wdC9vdGVsLWhhbmRsZXJgLCBhIHNjcmlwdCB0aGF0IGlzIG5vIGxvbmdlciBtb3VudGVkOiB0aGUgZnVuY3Rpb24gdGhlbiBmYWlscyBhdCBpdHMgbmV4dFxuICAgKiBjb2xkIHN0YXJ0LiBSZWNvcmRpbmcgZXZlcnkga2V5IHRoaXMgY29uc3RydWN0IHNldHMgbWFrZXMgcm9sbGJhY2sgc3RyaXAgdGhlIHdob2xlIHNldCB0b2dldGhlci5cbiAgICpcbiAgICogVGhlIHZhbHVlcyBhcmUgbnVsbCByYXRoZXIgdGhhbiB0aGUgY3VzdG9tZXIncyBwcmlvciB2YWx1ZXMgYmVjYXVzZSBhIENESyBzdGFjayBjYW5ub3QgcmVhZCBhblxuICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZSBiYWNrIOKAlCB3aXRoIG9uZSBleGNlcHRpb24gdGhhdCBtYXR0ZXJzLCB0aGUgd2ViLXNlcnZlciBsb2FkZXIgdmFyaWFibGUsIHdob3NlIHByaW9yXG4gICAqIHZhbHVlIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgaGFkIHRvIHBhc3MgYXMgYGV4aXN0aW5nTG9hZGVyVmFsdWVgIGZvciBleGFjdGx5IHRoZSBzYW1lIHJlYXNvbi5cbiAgICovXG4gIHByaXZhdGUgb3duZXJzaGlwTWFya2VyKFxuICAgIGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICBsYXllckFybjogc3RyaW5nLFxuICAgIGxhbmd1YWdlOiBzdHJpbmcsXG4gICAgd2ViU2VydmVyOiBib29sZWFuLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZXZFbnY6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVsbCB9ID0ge307XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGVudikpIHtcbiAgICAgIC8vIE5vdCBpdHNlbGYsIGFuZCBub3QgdGhlIGluZm9ybWF0aW9uYWwgSWFDIG1hcmtlcjogcm9sbGJhY2sgZGVsZXRlcyBPRElHT1NfTUFOQUdFRCB1bmNvbmRpdGlvbmFsbHksXG4gICAgICAvLyBhbmQgT0RJR09TX0lBQyByZWNvcmRzIHdoZXJlIHRoZSBmdW5jdGlvbiBjYW1lIGZyb20sIHdoaWNoIHN0YXlzIHRydWUgYWZ0ZXIgYW4gdW5pbnN0cnVtZW50LlxuICAgICAgaWYgKG5hbWUgIT09IEVOVl9JQUNfTUFSS0VSKSB7XG4gICAgICAgIHByZXZFbnZbbmFtZV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsb2FkZXJLZXkgPSB3ZWJTZXJ2ZXIgPyB3ZWJTZXJ2ZXJMb2FkZXJLZXkobGFuZ3VhZ2UpIDogdW5kZWZpbmVkO1xuICAgIGlmIChsb2FkZXJLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVzdG9yZSB0aGUgY2FsbGVyJ3Mgb3duIGxvYWRlciB2YWx1ZSByYXRoZXIgdGhhbiBkZWxldGluZyB0aGUgdmFyaWFibGU6IG91cnMgd2FzIGFwcGVuZGVkIHRvIGl0LCBzb1xuICAgICAgLy8gZGVsZXRpbmcgdGhlIGtleSB3b3VsZCB0YWtlIHRoZSBjdXN0b21lcidzIGZsYWdzIOKAlCB0aGUgb25lcyB0aGVpciBhcHAgbmVlZHMgdG8gYm9vdCDigJQgd2l0aCBpdC5cbiAgICAgIHByZXZFbnZbbG9hZGVyS2V5XSA9IHRoaXMub3B0aW9ucy5leGlzdGluZ0xvYWRlclZhbHVlID8/IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHY6IE1BUktFUl9WRVJTSU9OLCBsYXllcjogbGF5ZXJBcm4sIHByZXZFbnYgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wcyBmb3Ige0BsaW5rIE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0UHJvcHMgZXh0ZW5kcyBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zIHt9XG5cbi8qKlxuICogQXBwbGllcyBPZGlnb3MgaW5zdHJ1bWVudGF0aW9uIHRvIGV2ZXJ5IGBsYW1iZGEuRnVuY3Rpb25gIGluIGEgc2NvcGUuXG4gKlxuICogYGBgdHNcbiAqIEFzcGVjdHMub2Yoc3RhY2spLmFkZChuZXcgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0KHN0YWNrLCB7XG4gKiAgIGRlc3RpbmF0aW9uOiB7IGVuZHBvaW50OiAnb3RscC5leGFtcGxlLmNvbTo0MzE3JyB9LFxuICogfSkpO1xuICogYGBgXG4gKlxuICogYHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzYCBkZWZhdWx0cyB0byBgdHJ1ZWAgaGVyZSwgdW5saWtlIHRoZSBjb25zdHJ1Y3Q6IGFuIGFzcGVjdCB2aXNpdHMgZXZlcnkgZnVuY3Rpb25cbiAqIGluIHRoZSBzY29wZSwgaW5jbHVkaW5nIG9uZXMgd2hvc2UgcnVudGltZSBoYXMgbm8gT3BlblRlbGVtZXRyeSBsYXllciwgYW5kIGZhaWxpbmcgdGhlIHdob2xlIHN5bnRoXG4gKiBiZWNhdXNlIGEgc3RhY2sgaGFwcGVucyB0byBjb250YWluIG9uZSBHbyBmdW5jdGlvbiBpcyBub3QgdXNlZnVsLiBFYWNoIHNraXAgaXMgcmVwb3J0ZWQgYXMgYSBzeW50aFxuICogd2FybmluZywgc28gaXQgaXMgdmlzaWJsZSByYXRoZXIgdGhhbiBzaWxlbnQuXG4gKlxuICogVGhlIGFzcGVjdCBpbnN0cnVtZW50cyB3aGF0IGV4aXN0cyBpbiB0aGUgdHJlZSB3aGVuIGl0IHJ1bnMuIEEgZnVuY3Rpb24gYWRkZWQgYnkgYSBsYXRlciBhc3BlY3QgaXMgbm90XG4gKiB2aXNpdGVkOyB1c2UgdGhlIGNvbnN0cnVjdCBkaXJlY3RseSBmb3IgdGhvc2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0cnVtZW50YXRpb246IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbjtcblxuICAvKipcbiAgICogQHBhcmFtIHNjb3BlIHdoZXJlIHRoZSBzaGFyZWQgbGF5ZXIgY29uc3RydWN0cyBhcmUgY3JlYXRlZC4gVXN1YWxseSB0aGUgc2FtZSBzY29wZSB0aGUgYXNwZWN0IGlzXG4gICAqIGFwcGxpZWQgdG8uIEl0IGlzIGEgc2VwYXJhdGUgYXJndW1lbnQgZnJvbSB0aGUgdmlzaXRlZCBub2RlcyBiZWNhdXNlIHRoZSBsYXllciAoYW5kLCBpbiBgSU5fQUNDT1VOVGBcbiAgICogbW9kZSwgdGhlIG5lc3RlZCBTQVIgYXBwbGljYXRpb24pIGlzIGNyZWF0ZWQgb25jZSBhbmQgc2hhcmVkIGJ5IGV2ZXJ5IGZ1bmN0aW9uIHRoZSBhc3BlY3QgdmlzaXRzLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgcHJvcHM6IE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdFByb3BzKSB7XG4gICAgdGhpcy5pbnN0cnVtZW50YXRpb24gPSBuZXcgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uKHNjb3BlLCAnT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0Jywge1xuICAgICAgc2tpcFVuc3VwcG9ydGVkUnVudGltZXM6IHRydWUsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB2aXNpdChub2RlOiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBsYW1iZGEuRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9uLmluc3RydW1lbnQobm9kZSk7XG4gICAgfVxuICB9XG59XG4iXX0=