@magicx-eng/ai-autocomplete-angular 0.26.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/README.md +1 -0
  2. package/esm2020/lib/ai-autocomplete/ai-autocomplete.component.mjs +14 -3
  3. package/esm2020/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.mjs +7 -3
  4. package/esm2020/lib/controller/ai-autocomplete.controller.mjs +11 -1
  5. package/esm2020/lib/internal/date-grid/date-grid.component.mjs +7 -3
  6. package/esm2020/lib/internal/suggestion-grid/suggestion-grid.component.mjs +7 -3
  7. package/esm2020/lib/internal/suggestion-item/suggestion-item.component.mjs +14 -3
  8. package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs +54 -10
  9. package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs.map +1 -1
  10. package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs +54 -10
  11. package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs.map +1 -1
  12. package/lib/ai-autocomplete/ai-autocomplete.component.d.ts +9 -1
  13. package/lib/ai-autocomplete/ai-autocomplete.component.d.ts.map +1 -1
  14. package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts +1 -0
  15. package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts.map +1 -1
  16. package/lib/controller/ai-autocomplete.controller.d.ts +6 -0
  17. package/lib/controller/ai-autocomplete.controller.d.ts.map +1 -1
  18. package/lib/internal/date-grid/date-grid.component.d.ts +3 -1
  19. package/lib/internal/date-grid/date-grid.component.d.ts.map +1 -1
  20. package/lib/internal/suggestion-grid/suggestion-grid.component.d.ts +3 -1
  21. package/lib/internal/suggestion-grid/suggestion-grid.component.d.ts.map +1 -1
  22. package/lib/internal/suggestion-item/suggestion-item.component.d.ts +8 -1
  23. package/lib/internal/suggestion-item/suggestion-item.component.d.ts.map +1 -1
  24. package/package.json +2 -2
package/README.md CHANGED
@@ -427,6 +427,7 @@ Standalone-first apps don't need this — import the components/directive direct
427
427
  | `productsLayout` | `"row" \| "list"` | `"row"` | How the strip lays its cards out: a horizontally scrolling row, or the same cards stacked as full-width rows — see [Product strip](#product-strip). |
428
428
  | `productImageFallback` | `"image" \| "initial"` | `"image"` | Fallback for a missing or blank product image URL, or an image load error. `"image"` shows the placeholder pictogram; `"initial"` shows the title initial. A working image still takes priority. See [Product strip](#product-strip). |
429
429
  | `products` | `ProductsConfig` | — | Custom source for the product strip — see [Your own product search](#your-own-product-search-products). Bind a stable reference (a component field, not an inline object literal). Omit it and the strip shows the items the `/suggest` response reports. |
430
+ | `resetOnSubmit` | `boolean` | `true` | Clear the editor and start a new session after `(submitted)` emits. Set to `false` to keep the query in place — e.g. when the handler navigates away — and call `reset()` yourself. |
430
431
  | `submitButton` | `TemplateRef<unknown> \| null` | — | Custom submit button. Pass a `<ng-template>` to replace the default arrow button. Pass `null` to render no button. Clicks bubble up and trigger submit, so consumer-supplied buttons work without re-wiring. |
431
432
 
432
433
  | Output | Payload | Description |
@@ -66,6 +66,14 @@ export class AIAutocompleteComponent {
66
66
  * and run no custom search.
67
67
  */
68
68
  this.showProducts = true;
69
+ /**
70
+ * When true (default), the editor is cleared and a new session starts after
71
+ * `submitted` emits — on Enter and on the submit button. Set to false to
72
+ * leave the query in place: when the handler navigates away, a cleared field
73
+ * flashes empty until the next page paints. Call `reset()` yourself when you
74
+ * want a fresh session.
75
+ */
76
+ this.resetOnSubmit = true;
69
77
  // === Outputs ===
70
78
  /** Called on Enter or submit-button click. */
71
79
  this.submitted = new EventEmitter();
@@ -350,7 +358,8 @@ export class AIAutocompleteComponent {
350
358
  isReady: state.isReady,
351
359
  customFields: state.customFields,
352
360
  }));
353
- this.controller.reset();
361
+ if (this.resetOnSubmit)
362
+ this.controller.reset();
354
363
  }
355
364
  handleSubmitFromUserAction() {
356
365
  const state = this.controller.getState();
@@ -392,7 +401,7 @@ export class AIAutocompleteComponent {
392
401
  }
393
402
  }
394
403
  AIAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
395
- AIAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AIAutocompleteComponent, isStandalone: true, selector: "ai-autocomplete", inputs: { apiConfig: "apiConfig", additionalContext: "additionalContext", optionOverrides: "optionOverrides", maskCompletedText: "maskCompletedText", columns: "columns", pillPlacement: "pillPlacement", mode: "mode", optionsPosition: "optionsPosition", animations: "animations", dropdownTrigger: "dropdownTrigger", closeDropdownOnBlur: "closeDropdownOnBlur", showNonTappableOptions: "showNonTappableOptions", showSkipButton: "showSkipButton", showOptionIcons: "showOptionIcons", showOptionImages: "showOptionImages", showOptionCounts: "showOptionCounts", productsLayout: "productsLayout", productImageFallback: "productImageFallback", showChipIcons: "showChipIcons", showChipImages: "showChipImages", autoFocus: "autoFocus", value: "value", completedParams: "completedParams", showProducts: "showProducts", products: "products", submitButton: "submitButton" }, outputs: { submitted: "submitted", resultChange: "resultChange", errored: "errored", valueChange: "valueChange", completedParamsChange: "completedParamsChange", focused: "focused", blurred: "blurred", productSelect: "productSelect" }, providers: [
404
+ AIAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AIAutocompleteComponent, isStandalone: true, selector: "ai-autocomplete", inputs: { apiConfig: "apiConfig", additionalContext: "additionalContext", optionOverrides: "optionOverrides", maskCompletedText: "maskCompletedText", columns: "columns", pillPlacement: "pillPlacement", mode: "mode", optionsPosition: "optionsPosition", animations: "animations", dropdownTrigger: "dropdownTrigger", closeDropdownOnBlur: "closeDropdownOnBlur", showNonTappableOptions: "showNonTappableOptions", showSkipButton: "showSkipButton", showOptionIcons: "showOptionIcons", showOptionImages: "showOptionImages", showOptionCounts: "showOptionCounts", productsLayout: "productsLayout", productImageFallback: "productImageFallback", showChipIcons: "showChipIcons", showChipImages: "showChipImages", autoFocus: "autoFocus", value: "value", completedParams: "completedParams", showProducts: "showProducts", products: "products", submitButton: "submitButton", resetOnSubmit: "resetOnSubmit" }, outputs: { submitted: "submitted", resultChange: "resultChange", errored: "errored", valueChange: "valueChange", completedParamsChange: "completedParamsChange", focused: "focused", blurred: "blurred", productSelect: "productSelect" }, providers: [
396
405
  {
397
406
  provide: NG_VALUE_ACCESSOR,
398
407
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
@@ -468,6 +477,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
468
477
  type: Input
469
478
  }], submitButton: [{
470
479
  type: Input
480
+ }], resetOnSubmit: [{
481
+ type: Input
471
482
  }], submitted: [{
472
483
  type: Output
473
484
  }], resultChange: [{
@@ -510,4 +521,4 @@ function resolveInitialMode(mode) {
510
521
  return "dark";
511
522
  return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
512
523
  }
513
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlL2FpLWF1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS9haS1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEVBR1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTZCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUlMLGlCQUFpQixFQUVqQixnQkFBZ0IsRUFDaEIsY0FBYyxFQU1kLGVBQWUsR0FDaEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQzs7O0FBRTFGOzs7Ozs7O0dBT0c7QUF3QkgsTUFBTSxPQUFPLHVCQUF1QjtJQXZCcEM7UUFxQ1csc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRW5DLHdEQUF3RDtRQUMvQyxr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QkFBdkMsTUFBTTtnQkFDWSxPQUFPO3NCQUF6QixNQUFNO2dCQUNZLE9BQU87c0JBQXpCLE1BQU07Z0JBTVksYUFBYTtzQkFBL0IsTUFBTTtnQkFJbUMsWUFBWTtzQkFBckQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNBLFNBQVM7c0JBQWhELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDVixnQkFBZ0I7c0JBQTNDLFNBQVM7dUJBQUMsZUFBZTs7QUEwVjVCLFNBQVMsSUFBSTtJQUNYLG1DQUFtQztBQUNyQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLElBQW9CO0lBQzlDLElBQUksSUFBSSxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUNqQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNqRCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsOEJBQThCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3RGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgdHlwZSBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgdHlwZSBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBpbmplY3QsXG4gIE5nWm9uZSxcbiAgdHlwZSBPbkNoYW5nZXMsXG4gIHR5cGUgT25EZXN0cm95LFxuICB0eXBlIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgdHlwZSBTaW1wbGVDaGFuZ2VzLFxuICB0eXBlIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgdHlwZSBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQVBJQ29uZmlnLFxuICB0eXBlIEFwcGVhcmFuY2VNb2RlLFxuICB0eXBlIEF1dG9jb21wbGV0ZVJlc3VsdCxcbiAgYnVpbGRTdWJtaXRSZXN1bHQsXG4gIHR5cGUgQ29tcGxldGVkUGFyYW1TdGF0ZSxcbiAgZXh0cmFjdFBsYWluVGV4dCxcbiAgTW9kZUNvbnRyb2xsZXIsXG4gIHR5cGUgT3B0aW9uT3ZlcnJpZGVzLFxuICB0eXBlIFByb2R1Y3QsXG4gIHR5cGUgUHJvZHVjdEltYWdlRmFsbGJhY2ssXG4gIHR5cGUgUHJvZHVjdHNDb25maWcsXG4gIHR5cGUgUHJvZHVjdHNMYXlvdXQsXG4gIHNldEN1cnNvck9mZnNldCxcbn0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5pbXBvcnQgeyBBSUF1dG9jb21wbGV0ZURyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSBcIi4uL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlci9haS1hdXRvY29tcGxldGUuY29udHJvbGxlclwiO1xuaW1wb3J0IHsgQUlBdXRvY29tcGxldGVFZGl0b3JIb3N0RGlyZWN0aXZlIH0gZnJvbSBcIi4uL2ludGVybmFsL2VkaXRvci1ob3N0L2VkaXRvci1ob3N0LmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgUGlsbExpc3RDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvcGlsbC1saXN0L3BpbGwtbGlzdC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFN1Ym1pdEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9zdWJtaXQtYnV0dG9uL3N1Ym1pdC1idXR0b24uY29tcG9uZW50XCI7XG5cbi8qKlxuICogVGllciAxIGNvbXBvbmVudCDigJQgYDxhaS1hdXRvY29tcGxldGU+YC4gVGhlIEFuZ3VsYXIgZXF1aXZhbGVudCBvZiBSZWFjdCdzXG4gKiBgPEFJQXV0b2NvbXBsZXRlIC8+YC4gT3ducyB0aGUgY29udGVudEVkaXRhYmxlIGVkaXRvciwgaW5saW5lIHBpbGxzLCBtb2RlXG4gKiBjb250cm9sbGVyLCBzdWJtaXQgYnV0dG9uIHNsb3QsIGFuZCBhbiBlbWJlZGRlZFxuICoge0BsaW5rIEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcn0gdGhhdCBkcml2ZXMgdGhlIGRyb3Bkb3duLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFpLWF1dG9jb21wbGV0ZVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEFJQXV0b2NvbXBsZXRlRHJvcGRvd25Db21wb25lbnQsXG4gICAgQUlBdXRvY29tcGxldGVFZGl0b3JIb3N0RGlyZWN0aXZlLFxuICAgIFBpbGxMaXN0Q29tcG9uZW50LFxuICAgIFN1Ym1pdEJ1dHRvbkNvbXBvbmVudCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9haS1hdXRvY29tcGxldGUuY29tcG9uZW50LmNzc1wiXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBSUF1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBSUF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG57XG4gIC8vID09PSBJbnB1dHMgKG1pcnJvcnMgUmVhY3QncyBBSUF1dG9jb21wbGV0ZVByb3BzKSA9PT1cblxuICBASW5wdXQoKSBhcGlDb25maWc/OiBBUElDb25maWc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCB1c2VyIGNvbnRleHQuIEluY2x1ZGUgd2hhdGV2ZXIgeW91IGtub3cgYWJvdXQgdGhlIHVzZXIg4oCUIGFcbiAgICogcHJvZmlsZSwgcHJlZmVyZW5jZXMsIHdvcmtzcGFjZSwgYW55dGhpbmcg4oCUIHRvIHBlcnNvbmFsaXplIHN1Z2dlc3RlZFxuICAgKiBwYXJhbWV0ZXJzIGFuZCBvcHRpb25zIHRvIHRoZW0uIEJpbmQgYSBzdGFibGUgcmVmZXJlbmNlOyB0aGUgc2FtZSBzd2FwXG4gICAqIHJ1bGUgdGhhdCBhcHBsaWVzIHRvIGBhcGlDb25maWdgIGFwcGxpZXMgaGVyZS5cbiAgICovXG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxDb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBJbnB1dCgpIG9wdGlvbk92ZXJyaWRlcz86IE9wdGlvbk92ZXJyaWRlcztcbiAgQElucHV0KCkgbWFza0NvbXBsZXRlZFRleHQgPSBmYWxzZTtcbiAgQElucHV0KCkgY29sdW1ucz86IG51bWJlcjtcbiAgLyoqIFdoZXJlIHVuZmlsbGVkIHBpbGxzIHJlbmRlci4gRGVmYXVsdDogXCJkcm9wZG93blwiLiAqL1xuICBASW5wdXQoKSBwaWxsUGxhY2VtZW50OiBcImlubGluZVwiIHwgXCJkcm9wZG93blwiIHwgXCJoaWRkZW5cIiA9IFwiZHJvcGRvd25cIjtcbiAgLyoqIENvbG9yIG1vZGUuIFwiYXV0b1wiIGZvbGxvd3MgcHJlZmVycy1jb2xvci1zY2hlbWUuIERlZmF1bHQ6IFwiYXV0b1wiLiAqL1xuICBASW5wdXQoKSBtb2RlOiBBcHBlYXJhbmNlTW9kZSA9IFwiYXV0b1wiO1xuICBASW5wdXQoKSBvcHRpb25zUG9zaXRpb246IFwiYWJvdmVcIiB8IFwiYmVsb3dcIiA9IFwiYmVsb3dcIjtcbiAgQElucHV0KCkgYW5pbWF0aW9ucyA9IHRydWU7XG4gIEBJbnB1dCgpIGRyb3Bkb3duVHJpZ2dlcj86IFwiYXV0b1wiIHwgXCJtYW51YWxcIiB8IFwiaGlkZGVuXCI7XG4gIEBJbnB1dCgpIGNsb3NlRHJvcGRvd25PbkJsdXI/OiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93Tm9uVGFwcGFibGVPcHRpb25zPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIHRoZSBkcm9wZG93bidzIHBpbGwgYmFyIGVuZHMgaW4gYSBzbWFsbCBcInNraXBcIiBidXR0b25cbiAgICogdGhhdCBkaXNtaXNzZXMgdGhlIGFjdGl2ZSBwaWxsIOKAlCBzYW1lIGFjdGlvbiBhcyBwcmVzc2luZyDihpIgYXQgdGhlIGVuZCBvZlxuICAgKiB0aGUgaW5wdXQuIFNldCB0byBmYWxzZSB0byBoaWRlIGl0LiBXaGVuIHBpbGxzIHJlbmRlciBlbHNld2hlcmVcbiAgICogKGBwaWxsUGxhY2VtZW50OiBcImlubGluZVwiYCAvIGBcImhpZGRlblwiYCkgdGhlIGJhciByZW5kZXJzIGFzIGEgc2tpcC1vbmx5XG4gICAqIHJvdyBob2xkaW5nIGp1c3QgdGhlIGJ1dHRvbi4gSGlkZGVuIHdoaWxlIHRoZSBpbnB1dCBpcyBlbXB0eSDigJQgaXQgYXBwZWFyc1xuICAgKiBhbG9uZ3NpZGUgdGhlIGZvb3RlcidzIFwi4oaSIHRvIHNraXBcIiBoaW50IG9uY2UgdGhlIHVzZXIgaGFzIHR5cGVkLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd1NraXBCdXR0b24gPSB0cnVlO1xuICAvKiogV2hlbiB0cnVlIChkZWZhdWx0KSwgYW4gb3B0aW9uIHRoYXQgY2FycmllcyBhbiBgaWNvbl9zdmdgIGRyYXdzIGl0cyBpY29uIGJlZm9yZSBpdHMgdGV4dCBpbiB0aGUgZHJvcGRvd24uIFNldCB0byBmYWxzZSB0byByZW5kZXIgb3B0aW9uIHJvd3MgYXMgdGV4dCBvbmx5LiAqL1xuICBASW5wdXQoKSBzaG93T3B0aW9uSWNvbnMgPSB0cnVlO1xuICAvKiogV2hlbiB0cnVlIChkZWZhdWx0KSwgYW4gb3B0aW9uIHRoYXQgY2FycmllcyBhbiBgaW1hZ2VfdXJsYCBkcmF3cyBpdCBhcyBhIHNxdWFyZSB0aHVtYm5haWwgYmVmb3JlIGl0cyB0ZXh0IGluIHRoZSBkcm9wZG93biAoaW4gcGxhY2Ugb2YgaXRzIGBpY29uX3N2Z2ApLiBTZXQgdG8gZmFsc2UgdG8gcmVuZGVyIG9wdGlvbiByb3dzIHdpdGhvdXQgcGljdHVyZXMuICovXG4gIEBJbnB1dCgpIHNob3dPcHRpb25JbWFnZXMgPSB0cnVlO1xuICAvKiogV2hlbiB0cnVlIChkZWZhdWx0KSwgYW4gb3B0aW9uIHRoYXQgY2FycmllcyBhbiBgaXRlbV9jb3VudGAgc2hvd3MgaXQgYXMgYSBtdXRlZCBsYWJlbCBhdCB0aGUgcm93J3MgdHJhaWxpbmcgZWRnZSAoXCIxMiBpdGVtc1wiKS4gU2V0IHRvIGZhbHNlIHRvIGhpZGUgdGhlIGNvdW50cy4gKi9cbiAgQElucHV0KCkgc2hvd09wdGlvbkNvdW50cyA9IHRydWU7XG4gIC8qKlxuICAgKiBIb3cgdGhlIHByb2R1Y3Qgc3RyaXAgbGF5cyBpdHMgY2FyZHMgb3V0LiBgXCJyb3dcImAgKHRoZSBkZWZhdWx0KSBpcyBhXG4gICAqIGhvcml6b250YWxseSBzY3JvbGxpbmcgc2hlbGYgb2YgY2FyZHMuIGBcImxpc3RcImAgc3RhY2tzIHRoZSBzYW1lIGNhcmRzIGFzXG4gICAqIGZ1bGwtd2lkdGggcm93cyDigJQgdGh1bWJuYWlsIG9uIHRoZSBsZWZ0LCB0aXRsZSwgdmVuZG9yIGFuZCBwcmljZSBvbiB0aGVcbiAgICogcmlnaHQg4oCUIGZvciByZXN1bHRzIHRoYXQgcmVhZCBhcyBhIGxpc3QgKGNvdXJzZXMsIGxpc3RpbmdzLCBkb2N1bWVudHMpXG4gICAqIHJhdGhlciB0aGFuIHByb2R1Y3RzIG9uIGEgc2hlbGY7IHRoZSBjb2x1bW4gc2Nyb2xscyB2ZXJ0aWNhbGx5IGluc2lkZVxuICAgKiBgLS1haWEtcHJvZHVjdC1saXN0LW1heC1oZWlnaHRgLlxuICAgKi9cbiAgQElucHV0KCkgcHJvZHVjdHNMYXlvdXQ6IFByb2R1Y3RzTGF5b3V0ID0gXCJyb3dcIjtcbiAgLyoqIE1pc3NpbmcvZmFpbGVkIGltYWdlIGZhbGxiYWNrLiBTdHlsZSBpbml0aWFscyB3aXRoIGBbZGF0YS1haWEtcHJvZHVjdC1pbml0aWFsXWAuICovXG4gIEBJbnB1dCgpIHByb2R1Y3RJbWFnZUZhbGxiYWNrOiBQcm9kdWN0SW1hZ2VGYWxsYmFjayA9IFwiaW1hZ2VcIjtcbiAgLyoqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIGEgY29tcGxldGVkIGNoaXAgaW4gdGhlIGlucHV0IGRyYXdzIHRoZSBpY29uIG9mIHRoZSBvcHRpb24gdGhhdCBhbnN3ZXJlZCBpdC4gU2V0IHRvIGZhbHNlIHRvIHJlbmRlciBjaGlwcyBhcyB0ZXh0IG9ubHkuICovXG4gIEBJbnB1dCgpIHNob3dDaGlwSWNvbnMgPSB0cnVlO1xuICAvKiogV2hlbiB0cnVlIChkZWZhdWx0KSwgYSBjb21wbGV0ZWQgY2hpcCBpbiB0aGUgaW5wdXQgZHJhd3MgdGhlIHBpY3R1cmUgKGBpbWFnZV91cmxgKSBvZiB0aGUgb3B0aW9uIHRoYXQgYW5zd2VyZWQgaXQsIGluIHBsYWNlIG9mIGl0cyBpY29uLiBTZXQgdG8gZmFsc2UgdG8gcmVuZGVyIGNoaXBzIHdpdGhvdXQgcGljdHVyZXMuICovXG4gIEBJbnB1dCgpIHNob3dDaGlwSW1hZ2VzID0gdHJ1ZTtcbiAgLyoqIEZvY3VzIHRoZSBlZGl0b3Igb24gbW91bnQuIERlZmF1bHQ6IHRydWUuICovXG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IHRydWU7XG4gIC8qKiBDb250cm9sbGVkLW1vZGUgdGV4dCB2YWx1ZS4gKi9cbiAgQElucHV0KCkgdmFsdWU/OiBzdHJpbmc7XG4gIC8qKiBDb250cm9sbGVkLW1vZGUgY29tcGxldGVkIHBhcmFtcy4gKi9cbiAgQElucHV0KCkgY29tcGxldGVkUGFyYW1zPzogQ29tcGxldGVkUGFyYW1TdGF0ZVtdO1xuICAvKipcbiAgICogV2hlbiB0cnVlIChkZWZhdWx0KSwgdGhlIGRyb3Bkb3duIHJlbmRlcnMgYSBob3Jpem9udGFsIHJvdyBvZiBwcm9kdWN0XG4gICAqIGNhcmRzIGJlbG93IHRoZSBvcHRpb25zIGdyaWQgd2hlbmV2ZXIgaXQgaGFzIHByb2R1Y3RzIHRvIHNob3c6IGJ5IGRlZmF1bHRcbiAgICogdGhlIGl0ZW1zIHRoZSBgL3N1Z2dlc3RgIHJlc3BvbnNlIHJlcG9ydHMgYXMgbWF0Y2hpbmcgdGhlIHF1ZXJ5LCBvciB0aGVcbiAgICogcmVzdWx0cyBvZiBhIGN1c3RvbSBgcHJvZHVjdHNgIHNlYXJjaC4gU2V0IHRvIGZhbHNlIHRvIHJlbmRlciBubyBzdHJpcFxuICAgKiBhbmQgcnVuIG5vIGN1c3RvbSBzZWFyY2guXG4gICAqL1xuICBASW5wdXQoKSBzaG93UHJvZHVjdHMgPSB0cnVlO1xuICAvKipcbiAgICogQ3VzdG9tIHNvdXJjZSBmb3IgdGhlIHByb2R1Y3Qgc3RyaXAuIE9taXQgaXQgYW5kIHRoZSBzdHJpcCBzaG93cyB0aGVcbiAgICogaXRlbXMgdGhlIGAvc3VnZ2VzdGAgcmVzcG9uc2UgaXRzZWxmIHJlcG9ydHMgYXMgbWF0Y2hpbmcgdGhlIHF1ZXJ5LCB3aXRoXG4gICAqIG5vIGV4dHJhIHJlcXVlc3QuIFNldCBpdCBhbmQgdGhlIGRyb3Bkb3duIGlzIGZlZCBieSB5b3VyIG93biBzZWFyY2hcbiAgICogZW5kcG9pbnQgb24gdGhlIFNESydzIGV4aXN0aW5nIGZldGNoIGNhZGVuY2UgaW5zdGVhZDsgdGhlIHNlcnZlcidzIGl0ZW1zXG4gICAqIGFyZSB0aGVuIG5vdCByZW5kZXJlZC5cbiAgICpcbiAgICogQmluZCBhIHN0YWJsZSByZWZlcmVuY2UgKGEgY29tcG9uZW50IGZpZWxkLCBub3QgYW4gaW5saW5lIG9iamVjdCBsaXRlcmFsKTpcbiAgICogYSBuZXcgb2JqZWN0IG9uIGVhY2ggY2hhbmdlLWRldGVjdGlvbiBwYXNzIHJlYWRzIGFzIGEgc3dhcHBlZCBpbnRlZ3JhdGlvblxuICAgKiBhbmQgY2xlYXJzIHRoZSBjdXJyZW50IGNhcmRzIOKAlCB0aGUgc2FtZSBydWxlIHRoYXQgYWxyZWFkeSBhcHBsaWVzIHRvXG4gICAqIGBhcGlDb25maWdgIGFuZCBgb3B0aW9uT3ZlcnJpZGVzYC5cbiAgICovXG4gIEBJbnB1dCgpIHByb2R1Y3RzPzogUHJvZHVjdHNDb25maWc7XG4gIC8qKlxuICAgKiBDdXN0b20gc3VibWl0IGJ1dHRvbi4gUGFzcyBhIGA8bmctdGVtcGxhdGU+YCB0byByZXBsYWNlIHRoZSBkZWZhdWx0IGFycm93XG4gICAqIGJ1dHRvbi4gUGFzcyBgbnVsbGAgdG8gcmVuZGVyIG5vIGJ1dHRvbi4gRGVmYXVsdCAoYHVuZGVmaW5lZGApIHJlbmRlcnNcbiAgICogdGhlIGJ1aWx0LWluIGFycm93LlxuICAgKi9cbiAgQElucHV0KCkgc3VibWl0QnV0dG9uPzogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsO1xuXG4gIC8vID09PSBPdXRwdXRzID09PVxuXG4gIC8qKiBDYWxsZWQgb24gRW50ZXIgb3Igc3VibWl0LWJ1dHRvbiBjbGljay4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHN1Ym1pdHRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QXV0b2NvbXBsZXRlUmVzdWx0PigpO1xuICAvKipcbiAgICogRmlyZXMgYWZ0ZXIgZXZlcnkgc3VjY2Vzc2Z1bCBzdWdnZXN0aW9uIHJvdW5kLXRyaXAgd2l0aCB0aGUgc3RydWN0dXJlZFxuICAgKiBxdWVyeSBhcyB0aGUgU0RLIG5vdyB1bmRlcnN0YW5kcyBpdCDigJQgdGhlIHNhbWUgYEF1dG9jb21wbGV0ZVJlc3VsdGAgc2hhcGVcbiAgICogYHN1Ym1pdHRlZGAgY2Fycmllcywgc28geW91IGNhbiBtaXJyb3IgdGhlIHF1ZXJ5IGFzIGl0IGlzIGJ1aWx0IChhIGxpdmVcbiAgICogcHJldmlldywgYSBkcmFmdCwgYW5hbHl0aWNzKSB3aXRob3V0IHdhaXRpbmcgZm9yIHN1Ym1pdC4gRmlyZXMgb25jZSBwZXJcbiAgICogYXBwbGllZCByZXNwb25zZSwgaW5jbHVkaW5nIHRoZSBpbml0aWFsIHJlcXVlc3Qgb24gaW5pdCAoYW4gZW1wdHlcbiAgICogcmVzdWx0KTsgbmV2ZXIgZm9yIGEgZmFpbGVkLCBhYm9ydGVkIG9yIHN1cGVyc2VkZWQgcmVxdWVzdC5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSByZXN1bHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEF1dG9jb21wbGV0ZVJlc3VsdD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGVycm9yZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEVycm9yPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGNvbXBsZXRlZFBhcmFtc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcGxldGVkUGFyYW1TdGF0ZVtdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgYWN0aXZhdGVzIGEgcHJvZHVjdCBjYXJkLiBUaGUgU0RLIGRvZXMgbm90XG4gICAqIG5hdmlnYXRlIOKAlCB5b3UgZGVjaWRlIHdoYXQgYSBzZWxlY3Rpb24gbWVhbnMuIE1vZGlmaWVyIC8gbWlkZGxlIGNsaWNrcyBhcmVcbiAgICogbGVmdCB0byB0aGUgYnJvd3NlciAoY21kLWNsaWNrIHN0aWxsIG9wZW5zIGEgdGFiKSBhbmQgZG9uJ3QgZW1pdC5cbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBwcm9kdWN0U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9kdWN0PigpO1xuXG4gIC8vID09PSBWaWV3IHJlZnMgPT09XG5cbiAgQFZpZXdDaGlsZChcImNvbnRhaW5lclwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBjb250YWluZXJSZWYhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChcImVkaXRvclwiLCB7IHN0YXRpYzogZmFsc2UgfSkgZWRpdG9yUmVmPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoXCJwaWxsQ29udGFpbmVyXCIpIHBpbGxDb250YWluZXJSZWY/OiBFbGVtZW50UmVmPEhUTUxTcGFuRWxlbWVudD47XG5cbiAgLy8gPT09IFB1YmxpYyBzdGF0ZSBmb3IgdGhlIHRlbXBsYXRlID09PVxuXG4gIGNvbnRyb2xsZXIhOiBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXI7XG4gIC8qKlxuICAgKiBDb25jcmV0ZSBsaWdodC9kYXJrIHZhbHVlIGJvdW5kIHRvIGBbYXR0ci5kYXRhLW1vZGVdYC4gU2VlZGVkIGluIG5nT25Jbml0XG4gICAqIHNvIHRoZSBhdHRyaWJ1dGUgaXMgcHJlc2VudCBkdXJpbmcgU1NSICh3aGVyZSBNb2RlQ29udHJvbGxlciwgZ2F0ZWQgYmVoaW5kXG4gICAqIGlzUGxhdGZvcm1Ccm93c2VyIGluIG5nQWZ0ZXJWaWV3SW5pdCwgbmV2ZXIgcnVucykuIE9uIHRoZSBicm93c2VyIHRoZVxuICAgKiBNb2RlQ29udHJvbGxlcidzIHJlc29sdmUgY2FsbGJhY2sga2VlcHMgdGhpcyBpbiBzeW5jIOKAlCBzbyBpdHMgcnVudGltZVxuICAgKiBwcmVmZXJzLWNvbG9yLXNjaGVtZSB1cGRhdGVzIGFuZCB0aGlzIGJpbmRpbmcgYWx3YXlzIGFncmVlIChubyBjbG9iYmVyKS5cbiAgICovXG4gIHJlc29sdmVkTW9kZTogXCJsaWdodFwiIHwgXCJkYXJrXCIgPSBcImRhcmtcIjtcblxuICAvLyA9PT0gSW50ZXJuYWwgPT09XG5cbiAgcHJpdmF0ZSBtb2RlQ29udHJvbGxlcj86IE1vZGVDb250cm9sbGVyO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG4gIHByaXZhdGUgb25DaGFuZ2VGbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIG9uVG91Y2hlZEZuOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgLy8gSG9sZHMgYSB2YWx1ZSB3cml0dGVuIGJ5IFJlYWN0aXZlIEZvcm1zIGJlZm9yZSBuZ09uSW5pdCByYW4uIFJlYWN0aXZlXG4gIC8vIEZvcm1zIGNhbiBjYWxsIHdyaXRlVmFsdWUoKSBkdXJpbmcgZHluYW1pYyBmb3JtIGNvbnN0cnVjdGlvbiAoZS5nLiB3aGVuXG4gIC8vIGEgRm9ybUNvbnRyb2wgYWxyZWFkeSBob2xkcyBhIHZhbHVlIGF0IHRoZSBtb21lbnQgdGhlIGRpcmVjdGl2ZSBpc1xuICAvLyBjcmVhdGVkKS4gV2Ugc3Rhc2ggdGhlIHZhbHVlIGhlcmUgYW5kIGZsdXNoIGl0IGluIG5nT25Jbml0ICphZnRlcipcbiAgLy8gdGhlIGNvbnRyb2xsZXIgZXhpc3RzIOKAlCBvdGhlcndpc2UgdGhlIGVkaXRvciByZW5kZXJzIGVtcHR5IGV2ZW4gdGhvdWdoXG4gIC8vIHRoZSBmb3JtIGhhZCBhIHZhbHVlLiBgdW5kZWZpbmVkYCBtZWFucyBcIm5vIHBlbmRpbmcgd3JpdGVcIi5cbiAgcHJpdmF0ZSBwZW5kaW5nV3JpdGVWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIMKnMTYuOTogcHJlZmVyIGBpbmplY3QoKWAgb3ZlciBjb25zdHJ1Y3Rvci1wYXJhbWV0ZXIgREkgZm9yIGNvbXBvbmVudHMuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gU2VlZCBiZWZvcmUgdGhlIGJyb3dzZXIgZ3VhcmQgc28gU1NSIHJlbmRlcnMgYSBjb25jcmV0ZSBkYXRhLW1vZGUuXG4gICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlSW5pdGlhbE1vZGUodGhpcy5tb2RlKTtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcblxuICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIoe1xuICAgICAgYXBpQ29uZmlnOiB0aGlzLmFwaUNvbmZpZyxcbiAgICAgIGFkZGl0aW9uYWxDb250ZXh0OiB0aGlzLmFkZGl0aW9uYWxDb250ZXh0LFxuICAgICAgb3B0aW9uT3ZlcnJpZGVzOiB0aGlzLm9wdGlvbk92ZXJyaWRlcyxcbiAgICAgIG1hc2tDb21wbGV0ZWRUZXh0OiB0aGlzLm1hc2tDb21wbGV0ZWRUZXh0LFxuICAgICAgY29sdW1uczogdGhpcy5jb2x1bW5zLFxuICAgICAgZHJvcGRvd25UcmlnZ2VyOiB0aGlzLmRyb3Bkb3duVHJpZ2dlcixcbiAgICAgIG9wdGlvbnNQb3NpdGlvbjogdGhpcy5vcHRpb25zUG9zaXRpb24sXG4gICAgICBjbG9zZURyb3Bkb3duT25CbHVyOiB0aGlzLmNsb3NlRHJvcGRvd25PbkJsdXIsXG4gICAgICBzaG93Tm9uVGFwcGFibGVPcHRpb25zOiB0aGlzLnNob3dOb25UYXBwYWJsZU9wdGlvbnMsXG4gICAgICBzaG93UHJvZHVjdHM6IHRoaXMuc2hvd1Byb2R1Y3RzLFxuICAgICAgc291cmNlOiBcImZ1bGwtc2RrXCIsXG4gICAgICBwcm9kdWN0czogdGhpcy5wcm9kdWN0cyxcbiAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgY29tcGxldGVkUGFyYW1zOiB0aGlzLmNvbXBsZXRlZFBhcmFtcyxcbiAgICAgIG9uU3VibWl0OiAocmVzdWx0KSA9PiB0aGlzLmhhbmRsZVN1Ym1pdChyZXN1bHQpLFxuICAgICAgb25SZXN1bHQ6IChyZXN1bHQpID0+IHRoaXMucmVzdWx0Q2hhbmdlLmVtaXQocmVzdWx0KSxcbiAgICAgIG9uRXJyb3I6IChlcnJvcikgPT4gdGhpcy5lcnJvcmVkLmVtaXQoZXJyb3IpLFxuICAgICAgb25DaGFuZ2U6ICh0ZXh0KSA9PiB7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0ZXh0KTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUZuKHRleHQpO1xuICAgICAgfSxcbiAgICAgIG9uUGFyYW1zQ2hhbmdlOiAocGFyYW1zKSA9PiB0aGlzLmNvbXBsZXRlZFBhcmFtc0NoYW5nZS5lbWl0KHBhcmFtcyksXG4gICAgICBvbkZvY3VzOiAoKSA9PiB0aGlzLmZvY3VzZWQuZW1pdCgpLFxuICAgICAgb25Qcm9kdWN0U2VsZWN0OiAocHJvZHVjdCkgPT4gdGhpcy5wcm9kdWN0U2VsZWN0LmVtaXQocHJvZHVjdCksXG4gICAgICBvbkJsdXI6ICgpID0+IHtcbiAgICAgICAgdGhpcy5ibHVycmVkLmVtaXQoKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRGbigpO1xuICAgICAgfSxcbiAgICAgIHNldEN1cnNvcjogKG9mZnNldCkgPT4ge1xuICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaWYgKCFlZGl0b3IpIHJldHVybjtcbiAgICAgICAgZWRpdG9yLmZvY3VzKCk7XG4gICAgICAgIHNldEN1cnNvck9mZnNldChlZGl0b3IsIG9mZnNldCk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucGVuZGluZ1dyaXRlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKHRoaXMucGVuZGluZ1dyaXRlVmFsdWUpO1xuICAgICAgdGhpcy5wZW5kaW5nV3JpdGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG4gICAgLy8gTW9kZUNvbnRyb2xsZXIgd3JpdGVzIGBkYXRhLW1vZGVgIHRvIHRoZSBlbGVtZW50IGl0J3MgZ2l2ZW4uIFRoZSBDU1NcbiAgICAvLyBzZWxlY3RvcnMgYXJlIHNjb3BlZCB0byBgLm1hZ2ljeC1haWFbZGF0YS1tb2RlPVwiLi4uXCJdYCDigJQgd2hpY2ggbGl2ZXMgb25cbiAgICAvLyB0aGUgaW5uZXIgYDxkaXYgY2xhc3M9XCJtYWdpY3gtYWlhIG1hZ2ljeC1haWEtY29udGFpbmVyXCIgI2NvbnRhaW5lcj5gLFxuICAgIC8vIE5PVCB0aGUgaG9zdCBgPGFpLWF1dG9jb21wbGV0ZT5gIGVsZW1lbnQuIFRoZSByZXNvbHZlIGNhbGxiYWNrIG1pcnJvcnNcbiAgICAvLyB0aGUgdmFsdWUgaW50byBgcmVzb2x2ZWRNb2RlYCBzbyB0aGUgYFthdHRyLmRhdGEtbW9kZV1gIGJpbmRpbmcgc3RheXMgaW5cbiAgICAvLyBsb2Nrc3RlcCB3aXRoIE1vZGVDb250cm9sbGVyIOKAlCB0aGUgYmluZGluZyBoYW5kbGVzIFNTUiwgTW9kZUNvbnRyb2xsZXJcbiAgICAvLyBoYW5kbGVzIHJ1bnRpbWUgcHJlZmVycy1jb2xvci1zY2hlbWUgc3dpdGNoZXMsIGFuZCBiZWNhdXNlIHRoZXkgYWx3YXlzXG4gICAgLy8gYWdyZWUgbmVpdGhlciBjbG9iYmVycyB0aGUgb3RoZXIuXG4gICAgdGhpcy5tb2RlQ29udHJvbGxlciA9IG5ldyBNb2RlQ29udHJvbGxlcihcbiAgICAgIHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLm1vZGUsXG4gICAgICAocmVzb2x2ZWQpID0+IHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlZDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBQaWxsLXdyYXAgZGV0ZWN0aW9uIOKAlCB3aGVuIHRoZSBwaWxsIGxpc3Qgd3JhcHMgYmVsb3cgdGhlIGVkaXRvcidzIGxhc3RcbiAgICAvLyBsaW5lLCBkcm9wIGl0cyA4cHggbGVmdCBtYXJnaW4gdmlhIGEgZGF0YSBhdHRyaWJ1dGUgdGhlIENTUyBrZXlzIG9mZi5cbiAgICAvLyBNaXJyb3JzIHRoZSBSZWFjdCBjb21wb25lbnQncyB1c2VMYXlvdXRFZmZlY3QuXG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLm1lYXN1cmVQaWxsV3JhcCgpKTtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChlZGl0b3IpIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlZGl0b3IpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1lYXN1cmVQaWxsV3JhcCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlcikgcmV0dXJuO1xuICAgIC8vIGBTaW1wbGVDaGFuZ2VzYCBpcyBgeyBba2V5OiBzdHJpbmddOiBTaW1wbGVDaGFuZ2UgfWAsIHNvIHBlclxuICAgIC8vIGBub1Byb3BlcnR5QWNjZXNzRnJvbUluZGV4U2lnbmF0dXJlYCBlYWNoIGtleSBsb29rdXAgdXNlcyBicmFja2V0XG4gICAgLy8gbm90YXRpb24g4oCUIHRoaXMga2VlcHMgdGhlIHN0cmljdG5lc3MgY29udHJhY3QgdGhhdCB0aGUgcmVzdCBvZiB0aGVcbiAgICAvLyB3b3Jrc3BhY2UgZW5mb3JjZXMuXG4gICAgLy8gQ29udHJvbGxlZC1tb2RlIHByb3BhZ2F0aW9uXG4gICAgaWYgKGNoYW5nZXNbXCJ2YWx1ZVwiXSAmJiB0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbXCJjb21wbGV0ZWRQYXJhbXNcIl0gJiYgdGhpcy5jb21wbGV0ZWRQYXJhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnNldENvbXBsZXRlZFBhcmFtcyh0aGlzLmNvbXBsZXRlZFBhcmFtcyk7XG4gICAgfVxuICAgIC8vIFJlYWN0aXZlIG9wdGlvbnNcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzW1wiYXBpQ29uZmlnXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wiYWRkaXRpb25hbENvbnRleHRcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJvcHRpb25PdmVycmlkZXNcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJkcm9wZG93blRyaWdnZXJcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJvcHRpb25zUG9zaXRpb25cIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJjbG9zZURyb3Bkb3duT25CbHVyXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wic2hvd05vblRhcHBhYmxlT3B0aW9uc1wiXSB8fFxuICAgICAgY2hhbmdlc1tcInNob3dQcm9kdWN0c1wiXSB8fFxuICAgICAgY2hhbmdlc1tcInByb2R1Y3RzXCJdXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIudXBkYXRlKHtcbiAgICAgICAgYXBpQ29uZmlnOiB0aGlzLmFwaUNvbmZpZyxcbiAgICAgICAgYWRkaXRpb25hbENvbnRleHQ6IHRoaXMuYWRkaXRpb25hbENvbnRleHQsXG4gICAgICAgIG9wdGlvbk92ZXJyaWRlczogdGhpcy5vcHRpb25PdmVycmlkZXMsXG4gICAgICAgIGRyb3Bkb3duVHJpZ2dlcjogdGhpcy5kcm9wZG93blRyaWdnZXIsXG4gICAgICAgIG9wdGlvbnNQb3NpdGlvbjogdGhpcy5vcHRpb25zUG9zaXRpb24sXG4gICAgICAgIGNsb3NlRHJvcGRvd25PbkJsdXI6IHRoaXMuY2xvc2VEcm9wZG93bk9uQmx1cixcbiAgICAgICAgc2hvd05vblRhcHBhYmxlT3B0aW9uczogdGhpcy5zaG93Tm9uVGFwcGFibGVPcHRpb25zLFxuICAgICAgICBzaG93UHJvZHVjdHM6IHRoaXMuc2hvd1Byb2R1Y3RzLFxuICAgICAgICAvLyBTYW1lIHJlZmVyZW5jZSBvbiBhbiB1bnJlbGF0ZWQgY2hhbmdlIGlzIGEgbm8tb3AgaW4gdGhlIGNvcmU7IG9ubHkgYVxuICAgICAgICAvLyBnZW51aW5lbHkgc3dhcHBlZCAob3IgcmVtb3ZlZCkgaW50ZWdyYXRpb24gY2xlYXJzIHRoZSBzdHJpcC5cbiAgICAgICAgcHJvZHVjdHM6IHRoaXMucHJvZHVjdHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbXCJtb2RlXCJdKSB7XG4gICAgICAvLyBLZWVwIHRoZSBiaW5kaW5nIGNvcnJlY3QgZXZlbiB3aGVuIE1vZGVDb250cm9sbGVyIGRvZXNuJ3QgZXhpc3QgeWV0XG4gICAgICAvLyAoU1NSIC8gcHJlLW5nQWZ0ZXJWaWV3SW5pdCkuIE9uIHRoZSBicm93c2VyLCBzZXRNb2RlIHRyaWdnZXJzIHRoZVxuICAgICAgLy8gcmVzb2x2ZSBjYWxsYmFjayB3aGljaCBzZXRzIHRoZSBzYW1lIHZhbHVlLlxuICAgICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlSW5pdGlhbE1vZGUodGhpcy5tb2RlKTtcbiAgICAgIHRoaXMubW9kZUNvbnRyb2xsZXI/LnNldE1vZGUodGhpcy5tb2RlKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5tb2RlQ29udHJvbGxlcj8uZGVzdHJveSgpO1xuICAgIHRoaXMuY29udHJvbGxlcj8uZGVzdHJveSgpO1xuICB9XG5cbiAgLy8gPT09IEltcGVyYXRpdmUgQVBJIChleHBvc2VkIG9uIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgdmlhIEBWaWV3Q2hpbGQpID09PVxuXG4gIC8qKiBQcm9ncmFtbWF0aWNhbGx5IGZvY3VzIHRoZSBlZGl0b3IuICovXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICAvKiogUHJvZ3JhbW1hdGljYWxseSBibHVyIHRoZSBlZGl0b3IuICovXG4gIGJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBzdGF0ZSwgcm90YXRlIHNlc3Npb24sIGFuZCByZS1mZXRjaC4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyPy5yZXNldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXAgdGhlIGFjdGl2ZSBwaWxsIOKAlCBzYW1lIGFjdGlvbiBhcyB0aGUgZHJvcGRvd24ncyBza2lwIGJ1dHRvbiAvIOKGki5cbiAgICogTGV0cyBhIGNvbnN1bWVyIHdobyBoaWRlcyB0aGUgYnVpbHQtaW4gYnV0dG9uIChgc2hvd1NraXBCdXR0b249ZmFsc2VgKVxuICAgKiBkcml2ZSBza2lwcGluZyBmcm9tIHRoZWlyIG93biBVSS5cbiAgICovXG4gIHNraXBBY3RpdmVQaWxsKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlcj8uc2tpcEFjdGl2ZVBpbGwoKTtcbiAgfVxuXG4gIC8qKiBTd2l0Y2ggY29sb3IgbW9kZSBhdCBydW50aW1lLiAqL1xuICBzZXRNb2RlKG1vZGU6IEFwcGVhcmFuY2VNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLnJlc29sdmVkTW9kZSA9IHJlc29sdmVJbml0aWFsTW9kZShtb2RlKTtcbiAgICB0aGlzLm1vZGVDb250cm9sbGVyPy5zZXRNb2RlKG1vZGUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8gPT09IFRlbXBsYXRlIGhlbHBlcnMgPT09XG5cbiAgLyoqXG4gICAqICdkZWZhdWx0JyDihpIgcmVuZGVyIHRoZSBidWlsdC1pbiBhcnJvdyBidXR0b24uXG4gICAqICdjdXN0b20nICDihpIgcHJvamVjdCB0aGUgY29uc3VtZXItc3VwcGxpZWQgVGVtcGxhdGVSZWYuXG4gICAqICdoaWRkZW4nICDihpIgbm8gYnV0dG9uLlxuICAgKi9cbiAgZ2V0IHN1Ym1pdEJ1dHRvblN0YXRlKCk6IFwiZGVmYXVsdFwiIHwgXCJjdXN0b21cIiB8IFwiaGlkZGVuXCIge1xuICAgIGlmICh0aGlzLnN1Ym1pdEJ1dHRvbiA9PT0gbnVsbCkgcmV0dXJuIFwiaGlkZGVuXCI7XG4gICAgaWYgKHRoaXMuc3VibWl0QnV0dG9uID09PSB1bmRlZmluZWQpIHJldHVybiBcImRlZmF1bHRcIjtcbiAgICByZXR1cm4gXCJjdXN0b21cIjtcbiAgfVxuXG4gIC8qKiBOYXJyb3dlZCBhY2Nlc3NvciBmb3IgKm5nVGVtcGxhdGVPdXRsZXQg4oCUIG5ldmVyIHVuZGVmaW5lZC4gKi9cbiAgZ2V0IGN1c3RvbVN1Ym1pdFRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPHVua25vd24+IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc3VibWl0QnV0dG9uID8/IG51bGw7XG4gIH1cblxuICBnZXQgc2hvd0lubGluZVBpbGxzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBpbGxQbGFjZW1lbnQgPT09IFwiaW5saW5lXCI7XG4gIH1cblxuICBnZXQgc2hvd0Ryb3Bkb3duUGlsbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGlsbFBsYWNlbWVudCA9PT0gXCJkcm9wZG93blwiO1xuICB9XG5cbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIHRoZXJlJ3Mgc29tZXRoaW5nIHRvIHN1Ym1pdCDigJQgZHJpdmVuIGJ5IGN1cnJlbnQgc2VnbWVudHNcbiAgICogYW5kIGNvbXBsZXRlZCBwYXJhbXMuIFJlYWQgb2ZmIHRoZSBsaXZlIGVkaXRvciB2aWEgdGhlIGNvbnRyb2xsZXIgc3RhdGUuXG4gICAqL1xuICBjYW5TdWJtaXQoc3RhdGU6IHsgc2VnbWVudHM6IHsgbGVuZ3RoOiBudW1iZXIgfTsgY29tcGxldGVkUGFyYW1zOiB7IGxlbmd0aDogbnVtYmVyIH0gfSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGF0ZS5zZWdtZW50cy5sZW5ndGggPiAwIHx8IHN0YXRlLmNvbXBsZXRlZFBhcmFtcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgb25XcmFwcGVyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBDbGlja2luZyBhIHBpbGwgc2hvdWxkIGFjdGl2YXRlIGl0IHdpdGhvdXQgc3RlYWxpbmcgZm9jdXMgZWxzZXdoZXJlLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKHRhcmdldD8uY2xvc2VzdChcIltkYXRhLWFpYS1waWxsXVwiKSkgcmV0dXJuO1xuICAgIHRoaXMuZm9jdXMoKTtcbiAgfVxuXG4gIG9uU3VibWl0QnV0dG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmhhbmRsZVN1Ym1pdEZyb21Vc2VyQWN0aW9uKCk7XG4gIH1cblxuICBvblN1Ym1pdFNsb3RDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaGFuZGxlU3VibWl0RnJvbVVzZXJBY3Rpb24oKTtcbiAgfVxuXG4gIG9uU2VsZWN0UGlsbChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sbGVyLnNldEFjdGl2ZVBpbGwoaW5kZXgpO1xuICB9XG5cbiAgLy8gPT09IENvbnRyb2xWYWx1ZUFjY2Vzc29yID09PVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdmFsdWUgPz8gXCJcIjtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlcikge1xuICAgICAgLy8gUmVhY3RpdmUgRm9ybXMgY2FuIGNhbGwgd3JpdGVWYWx1ZSgpIGJlZm9yZSBuZ09uSW5pdCBjcmVhdGVzIHRoZVxuICAgICAgLy8gY29udHJvbGxlciAoZHluYW1pYyBmb3JtIGNvbnN0cnVjdGlvbiwgb3IgYSBGb3JtQ29udHJvbCB0aGF0IGFscmVhZHlcbiAgICAgIC8vIGhhZCBhIHZhbHVlIGF0IGRpcmVjdGl2ZS1jcmVhdGlvbiB0aW1lKS4gQnVmZmVyIHRoZSB2YWx1ZTsgbmdPbkluaXRcbiAgICAgIC8vIGZsdXNoZXMgaXQgYXMgc29vbiBhcyB0aGUgY29udHJvbGxlciBleGlzdHMuXG4gICAgICB0aGlzLnBlbmRpbmdXcml0ZVZhbHVlID0gbmV4dDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb250cm9sbGVyLnNldFZhbHVlKG5leHQpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWRGbiA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShfZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBUaGUgY29udGVudEVkaXRhYmxlIGhvc3QgZG9lc24ndCBoYXZlIGEgbmF0aXZlIGRpc2FibGVkIGF0dHJpYnV0ZS4gRm9yXG4gICAgLy8gdjAuMSB3ZSBhY2NlcHQgdGhlIGNhbGwgc28gQW5ndWxhcidzIGZvcm1zIGxheWVyIGRvZXNuJ3QgdGhyb3csIGJ1dFxuICAgIC8vIHRoZSBlZGl0b3Igc3RheXMgaW50ZXJhY3RpdmUuIEEgZnV0dXJlIGVuaGFuY2VtZW50IGNhbiB0b2dnbGVcbiAgICAvLyBjb250ZW50RWRpdGFibGUgKyBBUklBIGRpc2FibGVkIGhlcmUuXG4gIH1cblxuICAvLyA9PT0gU3VibWl0IGZsb3cgPT09XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgY29udHJvbGxlcidzIG9uU3VibWl0IGNhbGxiYWNrICh3aGljaCBmaXJlcyBmcm9tIHRoZVxuICAgKiBrZXlib2FyZCBjb250cm9sbGVyIG9uIEVudGVyKS4gUmVhZHMgdGhlIGxpdmUgZWRpdG9yIHRleHQg4oCUIHNhbWUgdHJpY2tcbiAgICogdGhlIFJlYWN0IGNvbXBvbmVudCB1c2VzIOKAlCBzbyB0aGUgZW1pdHRlZCBxdWVyeSByZWZsZWN0cyB3aGF0ZXZlcidzIGluXG4gICAqIHRoZSBET00gcmlnaHQgbm93LCBub3QgYSBwb3NzaWJseS1zdGFsZSBzdGF0ZSBzbmFwc2hvdC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlU3VibWl0KF9yZXN1bHQ6IEF1dG9jb21wbGV0ZVJlc3VsdCk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWRpdG9yKSByZXR1cm47XG4gICAgY29uc3QgdGV4dCA9IGV4dHJhY3RQbGFpblRleHQoZWRpdG9yKTtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY29udHJvbGxlci5nZXRTdGF0ZSgpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuY29tcGxldGVkUGFyYW1zID8/IHN0YXRlLmNvbXBsZXRlZFBhcmFtcztcbiAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KFxuICAgICAgYnVpbGRTdWJtaXRSZXN1bHQodGV4dCwgcGFyYW1zLCBzdGF0ZS5za2lwcGVkUGFyYW1zLCB7XG4gICAgICAgIGlkZW50aWZpZWRQYXJhbXM6IHN0YXRlLmlkZW50aWZpZWRQYXJhbXMsXG4gICAgICAgIGlzUmVhZHk6IHN0YXRlLmlzUmVhZHksXG4gICAgICAgIGN1c3RvbUZpZWxkczogc3RhdGUuY3VzdG9tRmllbGRzLFxuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLmNvbnRyb2xsZXIucmVzZXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3VibWl0RnJvbVVzZXJBY3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0U3RhdGUoKTtcbiAgICBpZiAoIXRoaXMuY2FuU3VibWl0KHN0YXRlKSkgcmV0dXJuO1xuICAgIC8vIFN5bnRoZXNpemUgdGhlIHJlc3VsdCBmb3IgdGhlIHN1Ym1pdC1idXR0b24gY2xpY2sgcGF0aDsgc2FtZSBzaGFwZVxuICAgIC8vIHRoZSBjb250cm9sbGVyIHdvdWxkIGRlbGl2ZXIgZnJvbSBhIGtleWJvYXJkIEVudGVyLCBzbyBoYW5kbGVTdWJtaXRcbiAgICAvLyBjYW4gdGFrZSBlaXRoZXIgZW50cnkgcG9pbnQuXG4gICAgdGhpcy5oYW5kbGVTdWJtaXQoe1xuICAgICAgcXVlcnk6IHN0YXRlLnRleHQudHJpbSgpLFxuICAgICAgcmF3X3F1ZXJ5OiBcIlwiLFxuICAgICAgY29tcGxldGVkX3BhcmFtczogW10sXG4gICAgICBpZGVudGlmaWVkX3BhcmFtczogW10sXG4gICAgICBpc19yZWFkeTogc3RhdGUuaXNSZWFkeSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWVhc3VyZVBpbGxXcmFwKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMucGlsbENvbnRhaW5lclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lciB8fCAhZWRpdG9yKSByZXR1cm47XG4gICAgY29uc3QgaW5uZXIgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghaW5uZXIpIHJldHVybjtcbiAgICAvLyBXcmFwIGRldGVjdGlvbjogdGhlIHBpbGwgcm93J3MgdG9wIHZzIHRoZSBlZGl0b3IncyBib3R0b20uIFdoZW4gdGhlXG4gICAgLy8gcGlsbHMgc2l0IG9uIChvciBhYm92ZSkgdGhlIGVkaXRvcidzIGxhc3QgbGluZSB0aGV5J3JlIE5PVCB3cmFwcGVkIOKAlFxuICAgIC8vIGtlZXAgdGhlIDhweCBtYXJnaW4gc28gdGhleSBkb24ndCBidXR0IGFnYWluc3QgdHlwZWQgdGV4dCBvciB0aGVcbiAgICAvLyBwbGFjZWhvbGRlci4gVGhpcyBoYW5kbGVzIHRoZSBlbXB0eS1lZGl0b3IgKyBwbGFjZWhvbGRlciBjYXNlXG4gICAgLy8gbmF0dXJhbGx5OiB0aGUgcGxhY2Vob2xkZXIgc3RpbGwgb2NjdXBpZXMgdGhlIGVkaXRvcidzIGxpbmUgYm94LlxuICAgIGNvbnN0IGNSZWN0ID0gaW5uZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZVJlY3QgPSBlZGl0b3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd3JhcHBlZCA9IGNSZWN0LnRvcCA+PSBlUmVjdC5ib3R0b20gLSAyO1xuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgaWYgKHdyYXBwZWQpIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWFpYS1waWxsLXdyYXBwZWRcIiwgXCJcIik7XG4gICAgICBlbHNlIGNvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLWFpYS1waWxsLXdyYXBwZWRcIik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9vcCgpOiB2b2lkIHtcbiAgLy8gRGVmYXVsdCBuby1vcCBmb3IgQ1ZBIGNhbGxiYWNrcy5cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgY29uY3JldGUgbGlnaHQvZGFyayB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmVkIG1vZGUuIFVzZWQgdG8gc2VlZFxuICogdGhlIGBkYXRhLW1vZGVgIGF0dHJpYnV0ZSBzeW5jaHJvbm91c2x5IChpbmNsdWRpbmcgZHVyaW5nIFNTUiwgd2hlcmVcbiAqIE1vZGVDb250cm9sbGVyIG5ldmVyIHJ1bnMpLiBPbiB0aGUgc2VydmVyIGB3aW5kb3dgIGlzIHVuZGVmaW5lZCDihpIgZGVmYXVsdHNcbiAqIHRvIFwiZGFya1wiIChtYXRjaGVzIHRoZSB2YW5pbGxhL1JlYWN0IGJlaGF2aW9yKS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUluaXRpYWxNb2RlKG1vZGU6IEFwcGVhcmFuY2VNb2RlKTogXCJsaWdodFwiIHwgXCJkYXJrXCIge1xuICBpZiAobW9kZSAhPT0gXCJhdXRvXCIpIHJldHVybiBtb2RlO1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIFwiZGFya1wiO1xuICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspXCIpLm1hdGNoZXMgPyBcImRhcmtcIiA6IFwibGlnaHRcIjtcbn1cbiIsIjxkaXZcbiAgI2NvbnRhaW5lclxuICBjbGFzcz1cIm1hZ2ljeC1haWEgbWFnaWN4LWFpYS1jb250YWluZXJcIlxuICBbYXR0ci5kYXRhLXBpbGwtcGxhY2VtZW50XT1cInBpbGxQbGFjZW1lbnRcIlxuICBbYXR0ci5kYXRhLW9wdGlvbnMtcG9zaXRpb25dPVwib3B0aW9uc1Bvc2l0aW9uXCJcbiAgW2F0dHIuZGF0YS1hbmltYXRpb25zXT1cImFuaW1hdGlvbnMgPyAnb24nIDogJ29mZidcIlxuICBbYXR0ci5kYXRhLW1vZGVdPVwicmVzb2x2ZWRNb2RlXCJcbj5cbiAgPGFpLWF1dG9jb21wbGV0ZS1kcm9wZG93blxuICAgICpuZ0lmPVwiY29udHJvbGxlclwiXG4gICAgW2NvbnRyb2xsZXJdPVwiY29udHJvbGxlclwiXG4gICAgW3Nob3dQaWxsc109XCJzaG93RHJvcGRvd25QaWxsc1wiXG4gICAgW3Nob3dTa2lwQnV0dG9uXT1cInNob3dTa2lwQnV0dG9uXCJcbiAgICBbc2hvd09wdGlvbkljb25zXT1cInNob3dPcHRpb25JY29uc1wiXG4gICAgW3Nob3dPcHRpb25JbWFnZXNdPVwic2hvd09wdGlvbkltYWdlc1wiXG4gICAgW3Nob3dPcHRpb25Db3VudHNdPVwic2hvd09wdGlvbkNvdW50c1wiXG4gICAgW3Byb2R1Y3RzTGF5b3V0XT1cInByb2R1Y3RzTGF5b3V0XCJcbiAgICBbcHJvZHVjdEltYWdlRmFsbGJhY2tdPVwicHJvZHVjdEltYWdlRmFsbGJhY2tcIlxuICA+PC9haS1hdXRvY29tcGxldGUtZHJvcGRvd24+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwibWFnaWN4LWFpYS1pbnB1dC13cmFwcGVyXCJcbiAgICBkYXRhLWFpYS1pbnB1dC13cmFwcGVyPVwiXCJcbiAgICAoY2xpY2spPVwib25XcmFwcGVyQ2xpY2soJGV2ZW50KVwiXG4gICAgKGtleXVwKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibWFnaWN4LWFpYS1lZGl0b3ItYXJlYVwiIGRhdGEtYWlhLWVkaXRvcj1cIlwiPlxuICAgICAgPGRpdlxuICAgICAgICAjZWRpdG9yXG4gICAgICAgICpuZ0lmPVwiY29udHJvbGxlclwiXG4gICAgICAgIFthaWFFZGl0b3JIb3N0XT1cImNvbnRyb2xsZXJcIlxuICAgICAgICBbYXV0b0ZvY3VzXT1cImF1dG9Gb2N1c1wiXG4gICAgICAgIFtzaG93Q2hpcEljb25zXT1cInNob3dDaGlwSWNvbnNcIlxuICAgICAgICBbc2hvd0NoaXBJbWFnZXNdPVwic2hvd0NoaXBJbWFnZXNcIlxuICAgICAgICBjbGFzcz1cIm1hZ2ljeC1haWEtaW5wdXRcIlxuICAgICAgICBkYXRhLWFpYS1pbnB1dD1cIlwiXG4gICAgICA+PC9kaXY+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sbGVyICYmIHNob3dJbmxpbmVQaWxsc1wiPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICNwaWxsQ29udGFpbmVyXG4gICAgICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLXBpbGwtbGlzdC1jb250YWluZXJcIlxuICAgICAgICAgIGRhdGEtYWlhLXBpbGwtbGlzdC1jb250YWluZXI9XCJcIlxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAoY29udHJvbGxlci5pc0xvYWRpbmckIHwgYXN5bmMpIHx8XG4gICAgICAgICAgICAgICgoY29udHJvbGxlci5zdWdnZXN0aW9uUGlsbHMkIHwgYXN5bmMpPy5sZW5ndGggPz8gMCkgPiAwXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxhaWEtcGlsbC1saXN0XG4gICAgICAgICAgICBbcGlsbHNdPVwiKGNvbnRyb2xsZXIuc3VnZ2VzdGlvblBpbGxzJCB8IGFzeW5jKSA/PyBbXVwiXG4gICAgICAgICAgICBbYWN0aXZlUGlsbEluZGV4XT1cIjBcIlxuICAgICAgICAgICAgW2FjdGl2ZVNlbGVjdGVkXT1cIihjb250cm9sbGVyLmlzQWN0aXZlUGlsbFNlbGVjdGVkJCB8IGFzeW5jKSA/PyBmYWxzZVwiXG4gICAgICAgICAgICBbbG9hZGluZ109XCIoY29udHJvbGxlci5pc0xvYWRpbmckIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgICAgIChzZWxlY3RQaWxsKT1cIm9uU2VsZWN0UGlsbCgkZXZlbnQpXCJcbiAgICAgICAgICA+PC9haWEtcGlsbC1saXN0PlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInN1Ym1pdEJ1dHRvblN0YXRlXCI+XG4gICAgICA8YWlhLXN1Ym1pdC1idXR0b25cbiAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidkZWZhdWx0J1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAhKFxuICAgICAgICAgICAgY29udHJvbGxlciAmJlxuICAgICAgICAgICAgY2FuU3VibWl0KHtcbiAgICAgICAgICAgICAgc2VnbWVudHM6IChjb250cm9sbGVyLnNlZ21lbnRzJCB8IGFzeW5jKSA/PyBbXSxcbiAgICAgICAgICAgICAgY29tcGxldGVkUGFyYW1zOiAoY29udHJvbGxlci5jb21wbGV0ZWRQYXJhbXMkIHwgYXN5bmMpID8/IFtdXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgXCJcbiAgICAgICAgKHN1Ym1pdCk9XCJvblN1Ym1pdEJ1dHRvbkNsaWNrKCRldmVudClcIlxuICAgICAgPjwvYWlhLXN1Ym1pdC1idXR0b24+XG5cbiAgICAgIDxzcGFuXG4gICAgICAgICpuZ1N3aXRjaENhc2U9XCInY3VzdG9tJ1wiXG4gICAgICAgIGRhdGEtYWlhLXN1Ym1pdD1cIlwiXG4gICAgICAgIGRhdGEtYWlhLXN1Ym1pdC1zbG90PVwiXCJcbiAgICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLXN1Ym1pdC1zbG90XCJcbiAgICAgICAgKGNsaWNrKT1cIm9uU3VibWl0U2xvdENsaWNrKCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tU3VibWl0VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
524
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYWktYXV0b2NvbXBsZXRlL2FpLWF1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2FpLWF1dG9jb21wbGV0ZS9haS1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEVBR1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQTZCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUlMLGlCQUFpQixFQUVqQixnQkFBZ0IsRUFDaEIsY0FBYyxFQU1kLGVBQWUsR0FDaEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNqSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQzs7O0FBRTFGOzs7Ozs7O0dBT0c7QUF3QkgsTUFBTSxPQUFPLHVCQUF1QjtJQXZCcEM7UUFxQ1csc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRW5DLHdEQUF3RDtRQUMvQyxr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QixNQUFNO2dCQVNZLFlBQVk7c0JBQTlCLE1BQU07Z0JBQ1ksT0FBTztzQkFBekIsTUFBTTtnQkFDWSxXQUFXO3NCQUE3QixNQUFNO2dCQUNZLHFCQUFxQjtzQkFBdkMsTUFBTTtnQkFDWSxPQUFPO3NCQUF6QixNQUFNO2dCQUNZLE9BQU87c0JBQXpCLE1BQU07Z0JBTVksYUFBYTtzQkFBL0IsTUFBTTtnQkFJbUMsWUFBWTtzQkFBckQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNBLFNBQVM7c0JBQWhELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDVixnQkFBZ0I7c0JBQTNDLFNBQVM7dUJBQUMsZUFBZTs7QUEwVjVCLFNBQVMsSUFBSTtJQUNYLG1DQUFtQztBQUNyQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLElBQW9CO0lBQzlDLElBQUksSUFBSSxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUNqQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNqRCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsOEJBQThCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3RGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgdHlwZSBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgdHlwZSBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBpbmplY3QsXG4gIE5nWm9uZSxcbiAgdHlwZSBPbkNoYW5nZXMsXG4gIHR5cGUgT25EZXN0cm95LFxuICB0eXBlIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgdHlwZSBTaW1wbGVDaGFuZ2VzLFxuICB0eXBlIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgdHlwZSBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQVBJQ29uZmlnLFxuICB0eXBlIEFwcGVhcmFuY2VNb2RlLFxuICB0eXBlIEF1dG9jb21wbGV0ZVJlc3VsdCxcbiAgYnVpbGRTdWJtaXRSZXN1bHQsXG4gIHR5cGUgQ29tcGxldGVkUGFyYW1TdGF0ZSxcbiAgZXh0cmFjdFBsYWluVGV4dCxcbiAgTW9kZUNvbnRyb2xsZXIsXG4gIHR5cGUgT3B0aW9uT3ZlcnJpZGVzLFxuICB0eXBlIFByb2R1Y3QsXG4gIHR5cGUgUHJvZHVjdEltYWdlRmFsbGJhY2ssXG4gIHR5cGUgUHJvZHVjdHNDb25maWcsXG4gIHR5cGUgUHJvZHVjdHNMYXlvdXQsXG4gIHNldEN1cnNvck9mZnNldCxcbn0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5pbXBvcnQgeyBBSUF1dG9jb21wbGV0ZURyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSBcIi4uL2FpLWF1dG9jb21wbGV0ZS1kcm9wZG93bi9haS1hdXRvY29tcGxldGUtZHJvcGRvd24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlci9haS1hdXRvY29tcGxldGUuY29udHJvbGxlclwiO1xuaW1wb3J0IHsgQUlBdXRvY29tcGxldGVFZGl0b3JIb3N0RGlyZWN0aXZlIH0gZnJvbSBcIi4uL2ludGVybmFsL2VkaXRvci1ob3N0L2VkaXRvci1ob3N0LmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgUGlsbExpc3RDb21wb25lbnQgfSBmcm9tIFwiLi4vaW50ZXJuYWwvcGlsbC1saXN0L3BpbGwtbGlzdC5jb21wb25lbnRcIjtcbmltcG9ydCB7IFN1Ym1pdEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9pbnRlcm5hbC9zdWJtaXQtYnV0dG9uL3N1Ym1pdC1idXR0b24uY29tcG9uZW50XCI7XG5cbi8qKlxuICogVGllciAxIGNvbXBvbmVudCDigJQgYDxhaS1hdXRvY29tcGxldGU+YC4gVGhlIEFuZ3VsYXIgZXF1aXZhbGVudCBvZiBSZWFjdCdzXG4gKiBgPEFJQXV0b2NvbXBsZXRlIC8+YC4gT3ducyB0aGUgY29udGVudEVkaXRhYmxlIGVkaXRvciwgaW5saW5lIHBpbGxzLCBtb2RlXG4gKiBjb250cm9sbGVyLCBzdWJtaXQgYnV0dG9uIHNsb3QsIGFuZCBhbiBlbWJlZGRlZFxuICoge0BsaW5rIEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcn0gdGhhdCBkcml2ZXMgdGhlIGRyb3Bkb3duLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFpLWF1dG9jb21wbGV0ZVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEFJQXV0b2NvbXBsZXRlRHJvcGRvd25Db21wb25lbnQsXG4gICAgQUlBdXRvY29tcGxldGVFZGl0b3JIb3N0RGlyZWN0aXZlLFxuICAgIFBpbGxMaXN0Q29tcG9uZW50LFxuICAgIFN1Ym1pdEJ1dHRvbkNvbXBvbmVudCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vYWktYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9haS1hdXRvY29tcGxldGUuY29tcG9uZW50LmNzc1wiXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBSUF1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBSUF1dG9jb21wbGV0ZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG57XG4gIC8vID09PSBJbnB1dHMgKG1pcnJvcnMgUmVhY3QncyBBSUF1dG9jb21wbGV0ZVByb3BzKSA9PT1cblxuICBASW5wdXQoKSBhcGlDb25maWc/OiBBUElDb25maWc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCB1c2VyIGNvbnRleHQuIEluY2x1ZGUgd2hhdGV2ZXIgeW91IGtub3cgYWJvdXQgdGhlIHVzZXIg4oCUIGFcbiAgICogcHJvZmlsZSwgcHJlZmVyZW5jZXMsIHdvcmtzcGFjZSwgYW55dGhpbmcg4oCUIHRvIHBlcnNvbmFsaXplIHN1Z2dlc3RlZFxuICAgKiBwYXJhbWV0ZXJzIGFuZCBvcHRpb25zIHRvIHRoZW0uIEJpbmQgYSBzdGFibGUgcmVmZXJlbmNlOyB0aGUgc2FtZSBzd2FwXG4gICAqIHJ1bGUgdGhhdCBhcHBsaWVzIHRvIGBhcGlDb25maWdgIGFwcGxpZXMgaGVyZS5cbiAgICovXG4gIEBJbnB1dCgpIGFkZGl0aW9uYWxDb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBJbnB1dCgpIG9wdGlvbk92ZXJyaWRlcz86IE9wdGlvbk92ZXJyaWRlcztcbiAgQElucHV0KCkgbWFza0NvbXBsZXRlZFRleHQgPSBmYWxzZTtcbiAgQElucHV0KCkgY29sdW1ucz86IG51bWJlcjtcbiAgLyoqIFdoZXJlIHVuZmlsbGVkIHBpbGxzIHJlbmRlci4gRGVmYXVsdDogXCJkcm9wZG93blwiLiAqL1xuICBASW5wdXQoKSBwaWxsUGxhY2VtZW50OiBcImlubGluZVwiIHwgXCJkcm9wZG93blwiIHwgXCJoaWRkZW5cIiA9IFwiZHJvcGRvd25cIjtcbiAgLyoqIENvbG9yIG1vZGUuIFwiYXV0b1wiIGZvbGxvd3MgcHJlZmVycy1jb2xvci1zY2hlbWUuIERlZmF1bHQ6IFwiYXV0b1wiLiAqL1xuICBASW5wdXQoKSBtb2RlOiBBcHBlYXJhbmNlTW9kZSA9IFwiYXV0b1wiO1xuICBASW5wdXQoKSBvcHRpb25zUG9zaXRpb246IFwiYWJvdmVcIiB8IFwiYmVsb3dcIiA9IFwiYmVsb3dcIjtcbiAgQElucHV0KCkgYW5pbWF0aW9ucyA9IHRydWU7XG4gIEBJbnB1dCgpIGRyb3Bkb3duVHJpZ2dlcj86IFwiYXV0b1wiIHwgXCJtYW51YWxcIiB8IFwiaGlkZGVuXCI7XG4gIEBJbnB1dCgpIGNsb3NlRHJvcGRvd25PbkJsdXI/OiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93Tm9uVGFwcGFibGVPcHRpb25zPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIHRoZSBkcm9wZG93bidzIHBpbGwgYmFyIGVuZHMgaW4gYSBzbWFsbCBcInNraXBcIiBidXR0b25cbiAgICogdGhhdCBkaXNtaXNzZXMgdGhlIGFjdGl2ZSBwaWxsIOKAlCBzYW1lIGFjdGlvbiBhcyBwcmVzc2luZyDihpIgYXQgdGhlIGVuZCBvZlxuICAgKiB0aGUgaW5wdXQuIFNldCB0byBmYWxzZSB0byBoaWRlIGl0LiBXaGVuIHBpbGxzIHJlbmRlciBlbHNld2hlcmVcbiAgICogKGBwaWxsUGxhY2VtZW50OiBcImlubGluZVwiYCAvIGBcImhpZGRlblwiYCkgdGhlIGJhciByZW5kZXJzIGFzIGEgc2tpcC1vbmx5XG4gICAqIHJvdyBob2xkaW5nIGp1c3QgdGhlIGJ1dHRvbi4gSGlkZGVuIHdoaWxlIHRoZSBpbnB1dCBpcyBlbXB0eSDigJQgaXQgYXBwZWFyc1xuICAgKiBhbG9uZ3NpZGUgdGhlIGZvb3RlcidzIFwi4oaSIHRvIHNraXBcIiBoaW50IG9uY2UgdGhlIHVzZXIgaGFzIHR5cGVkLlxuICAgKi9cbiAgQElucHV0KCkgc2hvd1NraXBCdXR0b24gPSB0cnVlO1xuICAvKiogV2hlbiB0cnVlIChkZWZhdWx0KSwgYW4gb3B0aW9uIHRoYXQgY2FycmllcyBhbiBgaWNvbl9zdmdgIGRyYXdzIGl0cyBpY29uIGJlZm9yZSBpdHMgdGV4dCBpbiB0aGUgZHJvcGRvd24uIFNldCB0byBmYWxzZSB0byByZW5kZXIgb3B0aW9uIHJvd3MgYXMgdGV4dCBvbmx5LiAqL1xuICBASW5wdXQoKSBzaG93T3B0aW9uSWNvbnMgPSB0cnVlO1xuICAvKiogV2hlbiB0cnVlIChkZWZhdWx0KSwgYW4gb3B0aW9uIHRoYXQgY2FycmllcyBhbiBgaW1hZ2VfdXJsYCBkcmF3cyBpdCBhcyBhIHNxdWFyZSB0aHVtYm5haWwgYmVmb3JlIGl0cyB0ZXh0IGluIHRoZSBkcm9wZG93biAoaW4gcGxhY2Ugb2YgaXRzIGBpY29uX3N2Z2ApLiBTZXQgdG8gZmFsc2UgdG8gcmVuZGVyIG9wdGlvbiByb3dzIHdpdGhvdXQgcGljdHVyZXMuICovXG4gIEBJbnB1dCgpIHNob3dPcHRpb25JbWFnZXMgPSB0cnVlO1xuICAvKiogV2hlbiB0cnVlIChkZWZhdWx0KSwgYW4gb3B0aW9uIHRoYXQgY2FycmllcyBhbiBgaXRlbV9jb3VudGAgc2hvd3MgaXQgYXMgYSBtdXRlZCBsYWJlbCBhdCB0aGUgcm93J3MgdHJhaWxpbmcgZWRnZSAoXCIxMiBpdGVtc1wiKS4gU2V0IHRvIGZhbHNlIHRvIGhpZGUgdGhlIGNvdW50cy4gKi9cbiAgQElucHV0KCkgc2hvd09wdGlvbkNvdW50cyA9IHRydWU7XG4gIC8qKlxuICAgKiBIb3cgdGhlIHByb2R1Y3Qgc3RyaXAgbGF5cyBpdHMgY2FyZHMgb3V0LiBgXCJyb3dcImAgKHRoZSBkZWZhdWx0KSBpcyBhXG4gICAqIGhvcml6b250YWxseSBzY3JvbGxpbmcgc2hlbGYgb2YgY2FyZHMuIGBcImxpc3RcImAgc3RhY2tzIHRoZSBzYW1lIGNhcmRzIGFzXG4gICAqIGZ1bGwtd2lkdGggcm93cyDigJQgdGh1bWJuYWlsIG9uIHRoZSBsZWZ0LCB0aXRsZSwgdmVuZG9yIGFuZCBwcmljZSBvbiB0aGVcbiAgICogcmlnaHQg4oCUIGZvciByZXN1bHRzIHRoYXQgcmVhZCBhcyBhIGxpc3QgKGNvdXJzZXMsIGxpc3RpbmdzLCBkb2N1bWVudHMpXG4gICAqIHJhdGhlciB0aGFuIHByb2R1Y3RzIG9uIGEgc2hlbGY7IHRoZSBjb2x1bW4gc2Nyb2xscyB2ZXJ0aWNhbGx5IGluc2lkZVxuICAgKiBgLS1haWEtcHJvZHVjdC1saXN0LW1heC1oZWlnaHRgLlxuICAgKi9cbiAgQElucHV0KCkgcHJvZHVjdHNMYXlvdXQ6IFByb2R1Y3RzTGF5b3V0ID0gXCJyb3dcIjtcbiAgLyoqIE1pc3NpbmcvZmFpbGVkIGltYWdlIGZhbGxiYWNrLiBTdHlsZSBpbml0aWFscyB3aXRoIGBbZGF0YS1haWEtcHJvZHVjdC1pbml0aWFsXWAuICovXG4gIEBJbnB1dCgpIHByb2R1Y3RJbWFnZUZhbGxiYWNrOiBQcm9kdWN0SW1hZ2VGYWxsYmFjayA9IFwiaW1hZ2VcIjtcbiAgLyoqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIGEgY29tcGxldGVkIGNoaXAgaW4gdGhlIGlucHV0IGRyYXdzIHRoZSBpY29uIG9mIHRoZSBvcHRpb24gdGhhdCBhbnN3ZXJlZCBpdC4gU2V0IHRvIGZhbHNlIHRvIHJlbmRlciBjaGlwcyBhcyB0ZXh0IG9ubHkuICovXG4gIEBJbnB1dCgpIHNob3dDaGlwSWNvbnMgPSB0cnVlO1xuICAvKiogV2hlbiB0cnVlIChkZWZhdWx0KSwgYSBjb21wbGV0ZWQgY2hpcCBpbiB0aGUgaW5wdXQgZHJhd3MgdGhlIHBpY3R1cmUgKGBpbWFnZV91cmxgKSBvZiB0aGUgb3B0aW9uIHRoYXQgYW5zd2VyZWQgaXQsIGluIHBsYWNlIG9mIGl0cyBpY29uLiBTZXQgdG8gZmFsc2UgdG8gcmVuZGVyIGNoaXBzIHdpdGhvdXQgcGljdHVyZXMuICovXG4gIEBJbnB1dCgpIHNob3dDaGlwSW1hZ2VzID0gdHJ1ZTtcbiAgLyoqIEZvY3VzIHRoZSBlZGl0b3Igb24gbW91bnQuIERlZmF1bHQ6IHRydWUuICovXG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IHRydWU7XG4gIC8qKiBDb250cm9sbGVkLW1vZGUgdGV4dCB2YWx1ZS4gKi9cbiAgQElucHV0KCkgdmFsdWU/OiBzdHJpbmc7XG4gIC8qKiBDb250cm9sbGVkLW1vZGUgY29tcGxldGVkIHBhcmFtcy4gKi9cbiAgQElucHV0KCkgY29tcGxldGVkUGFyYW1zPzogQ29tcGxldGVkUGFyYW1TdGF0ZVtdO1xuICAvKipcbiAgICogV2hlbiB0cnVlIChkZWZhdWx0KSwgdGhlIGRyb3Bkb3duIHJlbmRlcnMgYSBob3Jpem9udGFsIHJvdyBvZiBwcm9kdWN0XG4gICAqIGNhcmRzIGJlbG93IHRoZSBvcHRpb25zIGdyaWQgd2hlbmV2ZXIgaXQgaGFzIHByb2R1Y3RzIHRvIHNob3c6IGJ5IGRlZmF1bHRcbiAgICogdGhlIGl0ZW1zIHRoZSBgL3N1Z2dlc3RgIHJlc3BvbnNlIHJlcG9ydHMgYXMgbWF0Y2hpbmcgdGhlIHF1ZXJ5LCBvciB0aGVcbiAgICogcmVzdWx0cyBvZiBhIGN1c3RvbSBgcHJvZHVjdHNgIHNlYXJjaC4gU2V0IHRvIGZhbHNlIHRvIHJlbmRlciBubyBzdHJpcFxuICAgKiBhbmQgcnVuIG5vIGN1c3RvbSBzZWFyY2guXG4gICAqL1xuICBASW5wdXQoKSBzaG93UHJvZHVjdHMgPSB0cnVlO1xuICAvKipcbiAgICogQ3VzdG9tIHNvdXJjZSBmb3IgdGhlIHByb2R1Y3Qgc3RyaXAuIE9taXQgaXQgYW5kIHRoZSBzdHJpcCBzaG93cyB0aGVcbiAgICogaXRlbXMgdGhlIGAvc3VnZ2VzdGAgcmVzcG9uc2UgaXRzZWxmIHJlcG9ydHMgYXMgbWF0Y2hpbmcgdGhlIHF1ZXJ5LCB3aXRoXG4gICAqIG5vIGV4dHJhIHJlcXVlc3QuIFNldCBpdCBhbmQgdGhlIGRyb3Bkb3duIGlzIGZlZCBieSB5b3VyIG93biBzZWFyY2hcbiAgICogZW5kcG9pbnQgb24gdGhlIFNESydzIGV4aXN0aW5nIGZldGNoIGNhZGVuY2UgaW5zdGVhZDsgdGhlIHNlcnZlcidzIGl0ZW1zXG4gICAqIGFyZSB0aGVuIG5vdCByZW5kZXJlZC5cbiAgICpcbiAgICogQmluZCBhIHN0YWJsZSByZWZlcmVuY2UgKGEgY29tcG9uZW50IGZpZWxkLCBub3QgYW4gaW5saW5lIG9iamVjdCBsaXRlcmFsKTpcbiAgICogYSBuZXcgb2JqZWN0IG9uIGVhY2ggY2hhbmdlLWRldGVjdGlvbiBwYXNzIHJlYWRzIGFzIGEgc3dhcHBlZCBpbnRlZ3JhdGlvblxuICAgKiBhbmQgY2xlYXJzIHRoZSBjdXJyZW50IGNhcmRzIOKAlCB0aGUgc2FtZSBydWxlIHRoYXQgYWxyZWFkeSBhcHBsaWVzIHRvXG4gICAqIGBhcGlDb25maWdgIGFuZCBgb3B0aW9uT3ZlcnJpZGVzYC5cbiAgICovXG4gIEBJbnB1dCgpIHByb2R1Y3RzPzogUHJvZHVjdHNDb25maWc7XG4gIC8qKlxuICAgKiBDdXN0b20gc3VibWl0IGJ1dHRvbi4gUGFzcyBhIGA8bmctdGVtcGxhdGU+YCB0byByZXBsYWNlIHRoZSBkZWZhdWx0IGFycm93XG4gICAqIGJ1dHRvbi4gUGFzcyBgbnVsbGAgdG8gcmVuZGVyIG5vIGJ1dHRvbi4gRGVmYXVsdCAoYHVuZGVmaW5lZGApIHJlbmRlcnNcbiAgICogdGhlIGJ1aWx0LWluIGFycm93LlxuICAgKi9cbiAgQElucHV0KCkgc3VibWl0QnV0dG9uPzogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBudWxsO1xuICAvKipcbiAgICogV2hlbiB0cnVlIChkZWZhdWx0KSwgdGhlIGVkaXRvciBpcyBjbGVhcmVkIGFuZCBhIG5ldyBzZXNzaW9uIHN0YXJ0cyBhZnRlclxuICAgKiBgc3VibWl0dGVkYCBlbWl0cyDigJQgb24gRW50ZXIgYW5kIG9uIHRoZSBzdWJtaXQgYnV0dG9uLiBTZXQgdG8gZmFsc2UgdG9cbiAgICogbGVhdmUgdGhlIHF1ZXJ5IGluIHBsYWNlOiB3aGVuIHRoZSBoYW5kbGVyIG5hdmlnYXRlcyBhd2F5LCBhIGNsZWFyZWQgZmllbGRcbiAgICogZmxhc2hlcyBlbXB0eSB1bnRpbCB0aGUgbmV4dCBwYWdlIHBhaW50cy4gQ2FsbCBgcmVzZXQoKWAgeW91cnNlbGYgd2hlbiB5b3VcbiAgICogd2FudCBhIGZyZXNoIHNlc3Npb24uXG4gICAqL1xuICBASW5wdXQoKSByZXNldE9uU3VibWl0ID0gdHJ1ZTtcblxuICAvLyA9PT0gT3V0cHV0cyA9PT1cblxuICAvKiogQ2FsbGVkIG9uIEVudGVyIG9yIHN1Ym1pdC1idXR0b24gY2xpY2suICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBzdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEF1dG9jb21wbGV0ZVJlc3VsdD4oKTtcbiAgLyoqXG4gICAqIEZpcmVzIGFmdGVyIGV2ZXJ5IHN1Y2Nlc3NmdWwgc3VnZ2VzdGlvbiByb3VuZC10cmlwIHdpdGggdGhlIHN0cnVjdHVyZWRcbiAgICogcXVlcnkgYXMgdGhlIFNESyBub3cgdW5kZXJzdGFuZHMgaXQg4oCUIHRoZSBzYW1lIGBBdXRvY29tcGxldGVSZXN1bHRgIHNoYXBlXG4gICAqIGBzdWJtaXR0ZWRgIGNhcnJpZXMsIHNvIHlvdSBjYW4gbWlycm9yIHRoZSBxdWVyeSBhcyBpdCBpcyBidWlsdCAoYSBsaXZlXG4gICAqIHByZXZpZXcsIGEgZHJhZnQsIGFuYWx5dGljcykgd2l0aG91dCB3YWl0aW5nIGZvciBzdWJtaXQuIEZpcmVzIG9uY2UgcGVyXG4gICAqIGFwcGxpZWQgcmVzcG9uc2UsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCByZXF1ZXN0IG9uIGluaXQgKGFuIGVtcHR5XG4gICAqIHJlc3VsdCk7IG5ldmVyIGZvciBhIGZhaWxlZCwgYWJvcnRlZCBvciBzdXBlcnNlZGVkIHJlcXVlc3QuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgcmVzdWx0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBdXRvY29tcGxldGVSZXN1bHQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBlcnJvcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxFcnJvcj4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBjb21wbGV0ZWRQYXJhbXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENvbXBsZXRlZFBhcmFtU3RhdGVbXT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGZvY3VzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBibHVycmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIGFjdGl2YXRlcyBhIHByb2R1Y3QgY2FyZC4gVGhlIFNESyBkb2VzIG5vdFxuICAgKiBuYXZpZ2F0ZSDigJQgeW91IGRlY2lkZSB3aGF0IGEgc2VsZWN0aW9uIG1lYW5zLiBNb2RpZmllciAvIG1pZGRsZSBjbGlja3MgYXJlXG4gICAqIGxlZnQgdG8gdGhlIGJyb3dzZXIgKGNtZC1jbGljayBzdGlsbCBvcGVucyBhIHRhYikgYW5kIGRvbid0IGVtaXQuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgcHJvZHVjdFNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvZHVjdD4oKTtcblxuICAvLyA9PT0gVmlldyByZWZzID09PVxuXG4gIEBWaWV3Q2hpbGQoXCJjb250YWluZXJcIiwgeyBzdGF0aWM6IHRydWUgfSkgY29udGFpbmVyUmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoXCJlZGl0b3JcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIGVkaXRvclJlZj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKFwicGlsbENvbnRhaW5lclwiKSBwaWxsQ29udGFpbmVyUmVmPzogRWxlbWVudFJlZjxIVE1MU3BhbkVsZW1lbnQ+O1xuXG4gIC8vID09PSBQdWJsaWMgc3RhdGUgZm9yIHRoZSB0ZW1wbGF0ZSA9PT1cblxuICBjb250cm9sbGVyITogQUlBdXRvY29tcGxldGVDb250cm9sbGVyO1xuICAvKipcbiAgICogQ29uY3JldGUgbGlnaHQvZGFyayB2YWx1ZSBib3VuZCB0byBgW2F0dHIuZGF0YS1tb2RlXWAuIFNlZWRlZCBpbiBuZ09uSW5pdFxuICAgKiBzbyB0aGUgYXR0cmlidXRlIGlzIHByZXNlbnQgZHVyaW5nIFNTUiAod2hlcmUgTW9kZUNvbnRyb2xsZXIsIGdhdGVkIGJlaGluZFxuICAgKiBpc1BsYXRmb3JtQnJvd3NlciBpbiBuZ0FmdGVyVmlld0luaXQsIG5ldmVyIHJ1bnMpLiBPbiB0aGUgYnJvd3NlciB0aGVcbiAgICogTW9kZUNvbnRyb2xsZXIncyByZXNvbHZlIGNhbGxiYWNrIGtlZXBzIHRoaXMgaW4gc3luYyDigJQgc28gaXRzIHJ1bnRpbWVcbiAgICogcHJlZmVycy1jb2xvci1zY2hlbWUgdXBkYXRlcyBhbmQgdGhpcyBiaW5kaW5nIGFsd2F5cyBhZ3JlZSAobm8gY2xvYmJlcikuXG4gICAqL1xuICByZXNvbHZlZE1vZGU6IFwibGlnaHRcIiB8IFwiZGFya1wiID0gXCJkYXJrXCI7XG5cbiAgLy8gPT09IEludGVybmFsID09PVxuXG4gIHByaXZhdGUgbW9kZUNvbnRyb2xsZXI/OiBNb2RlQ29udHJvbGxlcjtcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIG9uQ2hhbmdlRm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBvblRvdWNoZWRGbjogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIC8vIEhvbGRzIGEgdmFsdWUgd3JpdHRlbiBieSBSZWFjdGl2ZSBGb3JtcyBiZWZvcmUgbmdPbkluaXQgcmFuLiBSZWFjdGl2ZVxuICAvLyBGb3JtcyBjYW4gY2FsbCB3cml0ZVZhbHVlKCkgZHVyaW5nIGR5bmFtaWMgZm9ybSBjb25zdHJ1Y3Rpb24gKGUuZy4gd2hlblxuICAvLyBhIEZvcm1Db250cm9sIGFscmVhZHkgaG9sZHMgYSB2YWx1ZSBhdCB0aGUgbW9tZW50IHRoZSBkaXJlY3RpdmUgaXNcbiAgLy8gY3JlYXRlZCkuIFdlIHN0YXNoIHRoZSB2YWx1ZSBoZXJlIGFuZCBmbHVzaCBpdCBpbiBuZ09uSW5pdCAqYWZ0ZXIqXG4gIC8vIHRoZSBjb250cm9sbGVyIGV4aXN0cyDigJQgb3RoZXJ3aXNlIHRoZSBlZGl0b3IgcmVuZGVycyBlbXB0eSBldmVuIHRob3VnaFxuICAvLyB0aGUgZm9ybSBoYWQgYSB2YWx1ZS4gYHVuZGVmaW5lZGAgbWVhbnMgXCJubyBwZW5kaW5nIHdyaXRlXCIuXG4gIHByaXZhdGUgcGVuZGluZ1dyaXRlVmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyDCpzE2Ljk6IHByZWZlciBgaW5qZWN0KClgIG92ZXIgY29uc3RydWN0b3ItcGFyYW1ldGVyIERJIGZvciBjb21wb25lbnRzLlxuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICBwcml2YXRlIHJlYWRvbmx5IHpvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFNlZWQgYmVmb3JlIHRoZSBicm93c2VyIGd1YXJkIHNvIFNTUiByZW5kZXJzIGEgY29uY3JldGUgZGF0YS1tb2RlLlxuICAgIHRoaXMucmVzb2x2ZWRNb2RlID0gcmVzb2x2ZUluaXRpYWxNb2RlKHRoaXMubW9kZSk7XG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgQUlBdXRvY29tcGxldGVDb250cm9sbGVyKHtcbiAgICAgIGFwaUNvbmZpZzogdGhpcy5hcGlDb25maWcsXG4gICAgICBhZGRpdGlvbmFsQ29udGV4dDogdGhpcy5hZGRpdGlvbmFsQ29udGV4dCxcbiAgICAgIG9wdGlvbk92ZXJyaWRlczogdGhpcy5vcHRpb25PdmVycmlkZXMsXG4gICAgICBtYXNrQ29tcGxldGVkVGV4dDogdGhpcy5tYXNrQ29tcGxldGVkVGV4dCxcbiAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1ucyxcbiAgICAgIGRyb3Bkb3duVHJpZ2dlcjogdGhpcy5kcm9wZG93blRyaWdnZXIsXG4gICAgICBvcHRpb25zUG9zaXRpb246IHRoaXMub3B0aW9uc1Bvc2l0aW9uLFxuICAgICAgY2xvc2VEcm9wZG93bk9uQmx1cjogdGhpcy5jbG9zZURyb3Bkb3duT25CbHVyLFxuICAgICAgc2hvd05vblRhcHBhYmxlT3B0aW9uczogdGhpcy5zaG93Tm9uVGFwcGFibGVPcHRpb25zLFxuICAgICAgc2hvd1Byb2R1Y3RzOiB0aGlzLnNob3dQcm9kdWN0cyxcbiAgICAgIHNvdXJjZTogXCJmdWxsLXNka1wiLFxuICAgICAgcHJvZHVjdHM6IHRoaXMucHJvZHVjdHMsXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgIGNvbXBsZXRlZFBhcmFtczogdGhpcy5jb21wbGV0ZWRQYXJhbXMsXG4gICAgICBvblN1Ym1pdDogKHJlc3VsdCkgPT4gdGhpcy5oYW5kbGVTdWJtaXQocmVzdWx0KSxcbiAgICAgIG9uUmVzdWx0OiAocmVzdWx0KSA9PiB0aGlzLnJlc3VsdENoYW5nZS5lbWl0KHJlc3VsdCksXG4gICAgICBvbkVycm9yOiAoZXJyb3IpID0+IHRoaXMuZXJyb3JlZC5lbWl0KGVycm9yKSxcbiAgICAgIG9uQ2hhbmdlOiAodGV4dCkgPT4ge1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGV4dCk7XG4gICAgICAgIHRoaXMub25DaGFuZ2VGbih0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBvblBhcmFtc0NoYW5nZTogKHBhcmFtcykgPT4gdGhpcy5jb21wbGV0ZWRQYXJhbXNDaGFuZ2UuZW1pdChwYXJhbXMpLFxuICAgICAgb25Gb2N1czogKCkgPT4gdGhpcy5mb2N1c2VkLmVtaXQoKSxcbiAgICAgIG9uUHJvZHVjdFNlbGVjdDogKHByb2R1Y3QpID0+IHRoaXMucHJvZHVjdFNlbGVjdC5lbWl0KHByb2R1Y3QpLFxuICAgICAgb25CbHVyOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuYmx1cnJlZC5lbWl0KCk7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkRm4oKTtcbiAgICAgIH0sXG4gICAgICBzZXRDdXJzb3I6IChvZmZzZXQpID0+IHtcbiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmICghZWRpdG9yKSByZXR1cm47XG4gICAgICAgIGVkaXRvci5mb2N1cygpO1xuICAgICAgICBzZXRDdXJzb3JPZmZzZXQoZWRpdG9yLCBvZmZzZXQpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnBlbmRpbmdXcml0ZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zZXRWYWx1ZSh0aGlzLnBlbmRpbmdXcml0ZVZhbHVlKTtcbiAgICAgIHRoaXMucGVuZGluZ1dyaXRlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuICAgIC8vIE1vZGVDb250cm9sbGVyIHdyaXRlcyBgZGF0YS1tb2RlYCB0byB0aGUgZWxlbWVudCBpdCdzIGdpdmVuLiBUaGUgQ1NTXG4gICAgLy8gc2VsZWN0b3JzIGFyZSBzY29wZWQgdG8gYC5tYWdpY3gtYWlhW2RhdGEtbW9kZT1cIi4uLlwiXWAg4oCUIHdoaWNoIGxpdmVzIG9uXG4gICAgLy8gdGhlIGlubmVyIGA8ZGl2IGNsYXNzPVwibWFnaWN4LWFpYSBtYWdpY3gtYWlhLWNvbnRhaW5lclwiICNjb250YWluZXI+YCxcbiAgICAvLyBOT1QgdGhlIGhvc3QgYDxhaS1hdXRvY29tcGxldGU+YCBlbGVtZW50LiBUaGUgcmVzb2x2ZSBjYWxsYmFjayBtaXJyb3JzXG4gICAgLy8gdGhlIHZhbHVlIGludG8gYHJlc29sdmVkTW9kZWAgc28gdGhlIGBbYXR0ci5kYXRhLW1vZGVdYCBiaW5kaW5nIHN0YXlzIGluXG4gICAgLy8gbG9ja3N0ZXAgd2l0aCBNb2RlQ29udHJvbGxlciDigJQgdGhlIGJpbmRpbmcgaGFuZGxlcyBTU1IsIE1vZGVDb250cm9sbGVyXG4gICAgLy8gaGFuZGxlcyBydW50aW1lIHByZWZlcnMtY29sb3Itc2NoZW1lIHN3aXRjaGVzLCBhbmQgYmVjYXVzZSB0aGV5IGFsd2F5c1xuICAgIC8vIGFncmVlIG5laXRoZXIgY2xvYmJlcnMgdGhlIG90aGVyLlxuICAgIHRoaXMubW9kZUNvbnRyb2xsZXIgPSBuZXcgTW9kZUNvbnRyb2xsZXIoXG4gICAgICB0aGlzLmNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgdGhpcy5tb2RlLFxuICAgICAgKHJlc29sdmVkKSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x2ZWRNb2RlID0gcmVzb2x2ZWQ7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gUGlsbC13cmFwIGRldGVjdGlvbiDigJQgd2hlbiB0aGUgcGlsbCBsaXN0IHdyYXBzIGJlbG93IHRoZSBlZGl0b3IncyBsYXN0XG4gICAgLy8gbGluZSwgZHJvcCBpdHMgOHB4IGxlZnQgbWFyZ2luIHZpYSBhIGRhdGEgYXR0cmlidXRlIHRoZSBDU1Mga2V5cyBvZmYuXG4gICAgLy8gTWlycm9ycyB0aGUgUmVhY3QgY29tcG9uZW50J3MgdXNlTGF5b3V0RWZmZWN0LlxuICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5tZWFzdXJlUGlsbFdyYXAoKSk7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAoZWRpdG9yKSB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWRpdG9yKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tZWFzdXJlUGlsbFdyYXAoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRyb2xsZXIpIHJldHVybjtcbiAgICAvLyBgU2ltcGxlQ2hhbmdlc2AgaXMgYHsgW2tleTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlIH1gLCBzbyBwZXJcbiAgICAvLyBgbm9Qcm9wZXJ0eUFjY2Vzc0Zyb21JbmRleFNpZ25hdHVyZWAgZWFjaCBrZXkgbG9va3VwIHVzZXMgYnJhY2tldFxuICAgIC8vIG5vdGF0aW9uIOKAlCB0aGlzIGtlZXBzIHRoZSBzdHJpY3RuZXNzIGNvbnRyYWN0IHRoYXQgdGhlIHJlc3Qgb2YgdGhlXG4gICAgLy8gd29ya3NwYWNlIGVuZm9yY2VzLlxuICAgIC8vIENvbnRyb2xsZWQtbW9kZSBwcm9wYWdhdGlvblxuICAgIGlmIChjaGFuZ2VzW1widmFsdWVcIl0gJiYgdGhpcy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZXIuc2V0VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzW1wiY29tcGxldGVkUGFyYW1zXCJdICYmIHRoaXMuY29tcGxldGVkUGFyYW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY29udHJvbGxlci5zZXRDb21wbGV0ZWRQYXJhbXModGhpcy5jb21wbGV0ZWRQYXJhbXMpO1xuICAgIH1cbiAgICAvLyBSZWFjdGl2ZSBvcHRpb25zXG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1tcImFwaUNvbmZpZ1wiXSB8fFxuICAgICAgY2hhbmdlc1tcImFkZGl0aW9uYWxDb250ZXh0XCJdIHx8XG4gICAgICBjaGFuZ2VzW1wib3B0aW9uT3ZlcnJpZGVzXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wiZHJvcGRvd25UcmlnZ2VyXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wib3B0aW9uc1Bvc2l0aW9uXCJdIHx8XG4gICAgICBjaGFuZ2VzW1wiY2xvc2VEcm9wZG93bk9uQmx1clwiXSB8fFxuICAgICAgY2hhbmdlc1tcInNob3dOb25UYXBwYWJsZU9wdGlvbnNcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJzaG93UHJvZHVjdHNcIl0gfHxcbiAgICAgIGNoYW5nZXNbXCJwcm9kdWN0c1wiXVxuICAgICkge1xuICAgICAgdGhpcy5jb250cm9sbGVyLnVwZGF0ZSh7XG4gICAgICAgIGFwaUNvbmZpZzogdGhpcy5hcGlDb25maWcsXG4gICAgICAgIGFkZGl0aW9uYWxDb250ZXh0OiB0aGlzLmFkZGl0aW9uYWxDb250ZXh0LFxuICAgICAgICBvcHRpb25PdmVycmlkZXM6IHRoaXMub3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgICBkcm9wZG93blRyaWdnZXI6IHRoaXMuZHJvcGRvd25UcmlnZ2VyLFxuICAgICAgICBvcHRpb25zUG9zaXRpb246IHRoaXMub3B0aW9uc1Bvc2l0aW9uLFxuICAgICAgICBjbG9zZURyb3Bkb3duT25CbHVyOiB0aGlzLmNsb3NlRHJvcGRvd25PbkJsdXIsXG4gICAgICAgIHNob3dOb25UYXBwYWJsZU9wdGlvbnM6IHRoaXMuc2hvd05vblRhcHBhYmxlT3B0aW9ucyxcbiAgICAgICAgc2hvd1Byb2R1Y3RzOiB0aGlzLnNob3dQcm9kdWN0cyxcbiAgICAgICAgLy8gU2FtZSByZWZlcmVuY2Ugb24gYW4gdW5yZWxhdGVkIGNoYW5nZSBpcyBhIG5vLW9wIGluIHRoZSBjb3JlOyBvbmx5IGFcbiAgICAgICAgLy8gZ2VudWluZWx5IHN3YXBwZWQgKG9yIHJlbW92ZWQpIGludGVncmF0aW9uIGNsZWFycyB0aGUgc3RyaXAuXG4gICAgICAgIHByb2R1Y3RzOiB0aGlzLnByb2R1Y3RzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzW1wibW9kZVwiXSkge1xuICAgICAgLy8gS2VlcCB0aGUgYmluZGluZyBjb3JyZWN0IGV2ZW4gd2hlbiBNb2RlQ29udHJvbGxlciBkb2Vzbid0IGV4aXN0IHlldFxuICAgICAgLy8gKFNTUiAvIHByZS1uZ0FmdGVyVmlld0luaXQpLiBPbiB0aGUgYnJvd3Nlciwgc2V0TW9kZSB0cmlnZ2VycyB0aGVcbiAgICAgIC8vIHJlc29sdmUgY2FsbGJhY2sgd2hpY2ggc2V0cyB0aGUgc2FtZSB2YWx1ZS5cbiAgICAgIHRoaXMucmVzb2x2ZWRNb2RlID0gcmVzb2x2ZUluaXRpYWxNb2RlKHRoaXMubW9kZSk7XG4gICAgICB0aGlzLm1vZGVDb250cm9sbGVyPy5zZXRNb2RlKHRoaXMubW9kZSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMubW9kZUNvbnRyb2xsZXI/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmNvbnRyb2xsZXI/LmRlc3Ryb3koKTtcbiAgfVxuXG4gIC8vID09PSBJbXBlcmF0aXZlIEFQSSAoZXhwb3NlZCBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHZpYSBAVmlld0NoaWxkKSA9PT1cblxuICAvKiogUHJvZ3JhbW1hdGljYWxseSBmb2N1cyB0aGUgZWRpdG9yLiAqL1xuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgLyoqIFByb2dyYW1tYXRpY2FsbHkgYmx1ciB0aGUgZWRpdG9yLiAqL1xuICBibHVyKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yUmVmPy5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgfVxuXG4gIC8qKiBDbGVhciBhbGwgc3RhdGUsIHJvdGF0ZSBzZXNzaW9uLCBhbmQgcmUtZmV0Y2guICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlcj8ucmVzZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTa2lwIHRoZSBhY3RpdmUgcGlsbCDigJQgc2FtZSBhY3Rpb24gYXMgdGhlIGRyb3Bkb3duJ3Mgc2tpcCBidXR0b24gLyDihpIuXG4gICAqIExldHMgYSBjb25zdW1lciB3aG8gaGlkZXMgdGhlIGJ1aWx0LWluIGJ1dHRvbiAoYHNob3dTa2lwQnV0dG9uPWZhbHNlYClcbiAgICogZHJpdmUgc2tpcHBpbmcgZnJvbSB0aGVpciBvd24gVUkuXG4gICAqL1xuICBza2lwQWN0aXZlUGlsbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXI/LnNraXBBY3RpdmVQaWxsKCk7XG4gIH1cblxuICAvKiogU3dpdGNoIGNvbG9yIG1vZGUgYXQgcnVudGltZS4gKi9cbiAgc2V0TW9kZShtb2RlOiBBcHBlYXJhbmNlTW9kZSk6IHZvaWQge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5yZXNvbHZlZE1vZGUgPSByZXNvbHZlSW5pdGlhbE1vZGUobW9kZSk7XG4gICAgdGhpcy5tb2RlQ29udHJvbGxlcj8uc2V0TW9kZShtb2RlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vID09PSBUZW1wbGF0ZSBoZWxwZXJzID09PVxuXG4gIC8qKlxuICAgKiAnZGVmYXVsdCcg4oaSIHJlbmRlciB0aGUgYnVpbHQtaW4gYXJyb3cgYnV0dG9uLlxuICAgKiAnY3VzdG9tJyAg4oaSIHByb2plY3QgdGhlIGNvbnN1bWVyLXN1cHBsaWVkIFRlbXBsYXRlUmVmLlxuICAgKiAnaGlkZGVuJyAg4oaSIG5vIGJ1dHRvbi5cbiAgICovXG4gIGdldCBzdWJtaXRCdXR0b25TdGF0ZSgpOiBcImRlZmF1bHRcIiB8IFwiY3VzdG9tXCIgfCBcImhpZGRlblwiIHtcbiAgICBpZiAodGhpcy5zdWJtaXRCdXR0b24gPT09IG51bGwpIHJldHVybiBcImhpZGRlblwiO1xuICAgIGlmICh0aGlzLnN1Ym1pdEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gXCJkZWZhdWx0XCI7XG4gICAgcmV0dXJuIFwiY3VzdG9tXCI7XG4gIH1cblxuICAvKiogTmFycm93ZWQgYWNjZXNzb3IgZm9yICpuZ1RlbXBsYXRlT3V0bGV0IOKAlCBuZXZlciB1bmRlZmluZWQuICovXG4gIGdldCBjdXN0b21TdWJtaXRUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnN1Ym1pdEJ1dHRvbiA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IHNob3dJbmxpbmVQaWxscygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5waWxsUGxhY2VtZW50ID09PSBcImlubGluZVwiO1xuICB9XG5cbiAgZ2V0IHNob3dEcm9wZG93blBpbGxzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBpbGxQbGFjZW1lbnQgPT09IFwiZHJvcGRvd25cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBgdHJ1ZWAgd2hlbiB0aGVyZSdzIHNvbWV0aGluZyB0byBzdWJtaXQg4oCUIGRyaXZlbiBieSBjdXJyZW50IHNlZ21lbnRzXG4gICAqIGFuZCBjb21wbGV0ZWQgcGFyYW1zLiBSZWFkIG9mZiB0aGUgbGl2ZSBlZGl0b3IgdmlhIHRoZSBjb250cm9sbGVyIHN0YXRlLlxuICAgKi9cbiAgY2FuU3VibWl0KHN0YXRlOiB7IHNlZ21lbnRzOiB7IGxlbmd0aDogbnVtYmVyIH07IGNvbXBsZXRlZFBhcmFtczogeyBsZW5ndGg6IG51bWJlciB9IH0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RhdGUuc2VnbWVudHMubGVuZ3RoID4gMCB8fCBzdGF0ZS5jb21wbGV0ZWRQYXJhbXMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIG9uV3JhcHBlckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gQ2xpY2tpbmcgYSBwaWxsIHNob3VsZCBhY3RpdmF0ZSBpdCB3aXRob3V0IHN0ZWFsaW5nIGZvY3VzIGVsc2V3aGVyZS5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICh0YXJnZXQ/LmNsb3Nlc3QoXCJbZGF0YS1haWEtcGlsbF1cIikpIHJldHVybjtcbiAgICB0aGlzLmZvY3VzKCk7XG4gIH1cblxuICBvblN1Ym1pdEJ1dHRvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5oYW5kbGVTdWJtaXRGcm9tVXNlckFjdGlvbigpO1xuICB9XG5cbiAgb25TdWJtaXRTbG90Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmhhbmRsZVN1Ym1pdEZyb21Vc2VyQWN0aW9uKCk7XG4gIH1cblxuICBvblNlbGVjdFBpbGwoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRBY3RpdmVQaWxsKGluZGV4KTtcbiAgfVxuXG4gIC8vID09PSBDb250cm9sVmFsdWVBY2Nlc3NvciA9PT1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHZhbHVlID8/IFwiXCI7XG4gICAgaWYgKCF0aGlzLmNvbnRyb2xsZXIpIHtcbiAgICAgIC8vIFJlYWN0aXZlIEZvcm1zIGNhbiBjYWxsIHdyaXRlVmFsdWUoKSBiZWZvcmUgbmdPbkluaXQgY3JlYXRlcyB0aGVcbiAgICAgIC8vIGNvbnRyb2xsZXIgKGR5bmFtaWMgZm9ybSBjb25zdHJ1Y3Rpb24sIG9yIGEgRm9ybUNvbnRyb2wgdGhhdCBhbHJlYWR5XG4gICAgICAvLyBoYWQgYSB2YWx1ZSBhdCBkaXJlY3RpdmUtY3JlYXRpb24gdGltZSkuIEJ1ZmZlciB0aGUgdmFsdWU7IG5nT25Jbml0XG4gICAgICAvLyBmbHVzaGVzIGl0IGFzIHNvb24gYXMgdGhlIGNvbnRyb2xsZXIgZXhpc3RzLlxuICAgICAgdGhpcy5wZW5kaW5nV3JpdGVWYWx1ZSA9IG5leHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29udHJvbGxlci5zZXRWYWx1ZShuZXh0KTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZUZuID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoX2Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVGhlIGNvbnRlbnRFZGl0YWJsZSBob3N0IGRvZXNuJ3QgaGF2ZSBhIG5hdGl2ZSBkaXNhYmxlZCBhdHRyaWJ1dGUuIEZvclxuICAgIC8vIHYwLjEgd2UgYWNjZXB0IHRoZSBjYWxsIHNvIEFuZ3VsYXIncyBmb3JtcyBsYXllciBkb2Vzbid0IHRocm93LCBidXRcbiAgICAvLyB0aGUgZWRpdG9yIHN0YXlzIGludGVyYWN0aXZlLiBBIGZ1dHVyZSBlbmhhbmNlbWVudCBjYW4gdG9nZ2xlXG4gICAgLy8gY29udGVudEVkaXRhYmxlICsgQVJJQSBkaXNhYmxlZCBoZXJlLlxuICB9XG5cbiAgLy8gPT09IFN1Ym1pdCBmbG93ID09PVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIGNvbnRyb2xsZXIncyBvblN1Ym1pdCBjYWxsYmFjayAod2hpY2ggZmlyZXMgZnJvbSB0aGVcbiAgICoga2V5Ym9hcmQgY29udHJvbGxlciBvbiBFbnRlcikuIFJlYWRzIHRoZSBsaXZlIGVkaXRvciB0ZXh0IOKAlCBzYW1lIHRyaWNrXG4gICAqIHRoZSBSZWFjdCBjb21wb25lbnQgdXNlcyDigJQgc28gdGhlIGVtaXR0ZWQgcXVlcnkgcmVmbGVjdHMgd2hhdGV2ZXIncyBpblxuICAgKiB0aGUgRE9NIHJpZ2h0IG5vdywgbm90IGEgcG9zc2libHktc3RhbGUgc3RhdGUgc25hcHNob3QuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVN1Ym1pdChfcmVzdWx0OiBBdXRvY29tcGxldGVSZXN1bHQpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWVkaXRvcikgcmV0dXJuO1xuICAgIGNvbnN0IHRleHQgPSBleHRyYWN0UGxhaW5UZXh0KGVkaXRvcik7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0U3RhdGUoKTtcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmNvbXBsZXRlZFBhcmFtcyA/PyBzdGF0ZS5jb21wbGV0ZWRQYXJhbXM7XG4gICAgdGhpcy5zdWJtaXR0ZWQuZW1pdChcbiAgICAgIGJ1aWxkU3VibWl0UmVzdWx0KHRleHQsIHBhcmFtcywgc3RhdGUuc2tpcHBlZFBhcmFtcywge1xuICAgICAgICBpZGVudGlmaWVkUGFyYW1zOiBzdGF0ZS5pZGVudGlmaWVkUGFyYW1zLFxuICAgICAgICBpc1JlYWR5OiBzdGF0ZS5pc1JlYWR5LFxuICAgICAgICBjdXN0b21GaWVsZHM6IHN0YXRlLmN1c3RvbUZpZWxkcyxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgaWYgKHRoaXMucmVzZXRPblN1Ym1pdCkgdGhpcy5jb250cm9sbGVyLnJlc2V0KCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1Ym1pdEZyb21Vc2VyQWN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jb250cm9sbGVyLmdldFN0YXRlKCk7XG4gICAgaWYgKCF0aGlzLmNhblN1Ym1pdChzdGF0ZSkpIHJldHVybjtcbiAgICAvLyBTeW50aGVzaXplIHRoZSByZXN1bHQgZm9yIHRoZSBzdWJtaXQtYnV0dG9uIGNsaWNrIHBhdGg7IHNhbWUgc2hhcGVcbiAgICAvLyB0aGUgY29udHJvbGxlciB3b3VsZCBkZWxpdmVyIGZyb20gYSBrZXlib2FyZCBFbnRlciwgc28gaGFuZGxlU3VibWl0XG4gICAgLy8gY2FuIHRha2UgZWl0aGVyIGVudHJ5IHBvaW50LlxuICAgIHRoaXMuaGFuZGxlU3VibWl0KHtcbiAgICAgIHF1ZXJ5OiBzdGF0ZS50ZXh0LnRyaW0oKSxcbiAgICAgIHJhd19xdWVyeTogXCJcIixcbiAgICAgIGNvbXBsZXRlZF9wYXJhbXM6IFtdLFxuICAgICAgaWRlbnRpZmllZF9wYXJhbXM6IFtdLFxuICAgICAgaXNfcmVhZHk6IHN0YXRlLmlzUmVhZHksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1lYXN1cmVQaWxsV3JhcCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnBpbGxDb250YWluZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3JSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFjb250YWluZXIgfHwgIWVkaXRvcikgcmV0dXJuO1xuICAgIGNvbnN0IGlubmVyID0gY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIWlubmVyKSByZXR1cm47XG4gICAgLy8gV3JhcCBkZXRlY3Rpb246IHRoZSBwaWxsIHJvdydzIHRvcCB2cyB0aGUgZWRpdG9yJ3MgYm90dG9tLiBXaGVuIHRoZVxuICAgIC8vIHBpbGxzIHNpdCBvbiAob3IgYWJvdmUpIHRoZSBlZGl0b3IncyBsYXN0IGxpbmUgdGhleSdyZSBOT1Qgd3JhcHBlZCDigJRcbiAgICAvLyBrZWVwIHRoZSA4cHggbWFyZ2luIHNvIHRoZXkgZG9uJ3QgYnV0dCBhZ2FpbnN0IHR5cGVkIHRleHQgb3IgdGhlXG4gICAgLy8gcGxhY2Vob2xkZXIuIFRoaXMgaGFuZGxlcyB0aGUgZW1wdHktZWRpdG9yICsgcGxhY2Vob2xkZXIgY2FzZVxuICAgIC8vIG5hdHVyYWxseTogdGhlIHBsYWNlaG9sZGVyIHN0aWxsIG9jY3VwaWVzIHRoZSBlZGl0b3IncyBsaW5lIGJveC5cbiAgICBjb25zdCBjUmVjdCA9IGlubmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVSZWN0ID0gZWRpdG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdyYXBwZWQgPSBjUmVjdC50b3AgPj0gZVJlY3QuYm90dG9tIC0gMjtcbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIGlmICh3cmFwcGVkKSBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS1haWEtcGlsbC13cmFwcGVkXCIsIFwiXCIpO1xuICAgICAgZWxzZSBjb250YWluZXIucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1haWEtcGlsbC13cmFwcGVkXCIpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG4gIC8vIERlZmF1bHQgbm8tb3AgZm9yIENWQSBjYWxsYmFja3MuXG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGNvbmNyZXRlIGxpZ2h0L2RhcmsgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJlZCBtb2RlLiBVc2VkIHRvIHNlZWRcbiAqIHRoZSBgZGF0YS1tb2RlYCBhdHRyaWJ1dGUgc3luY2hyb25vdXNseSAoaW5jbHVkaW5nIGR1cmluZyBTU1IsIHdoZXJlXG4gKiBNb2RlQ29udHJvbGxlciBuZXZlciBydW5zKS4gT24gdGhlIHNlcnZlciBgd2luZG93YCBpcyB1bmRlZmluZWQg4oaSIGRlZmF1bHRzXG4gKiB0byBcImRhcmtcIiAobWF0Y2hlcyB0aGUgdmFuaWxsYS9SZWFjdCBiZWhhdmlvcikuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVJbml0aWFsTW9kZShtb2RlOiBBcHBlYXJhbmNlTW9kZSk6IFwibGlnaHRcIiB8IFwiZGFya1wiIHtcbiAgaWYgKG1vZGUgIT09IFwiYXV0b1wiKSByZXR1cm4gbW9kZTtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBcImRhcmtcIjtcbiAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKFwiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKVwiKS5tYXRjaGVzID8gXCJkYXJrXCIgOiBcImxpZ2h0XCI7XG59XG4iLCI8ZGl2XG4gICNjb250YWluZXJcbiAgY2xhc3M9XCJtYWdpY3gtYWlhIG1hZ2ljeC1haWEtY29udGFpbmVyXCJcbiAgW2F0dHIuZGF0YS1waWxsLXBsYWNlbWVudF09XCJwaWxsUGxhY2VtZW50XCJcbiAgW2F0dHIuZGF0YS1vcHRpb25zLXBvc2l0aW9uXT1cIm9wdGlvbnNQb3NpdGlvblwiXG4gIFthdHRyLmRhdGEtYW5pbWF0aW9uc109XCJhbmltYXRpb25zID8gJ29uJyA6ICdvZmYnXCJcbiAgW2F0dHIuZGF0YS1tb2RlXT1cInJlc29sdmVkTW9kZVwiXG4+XG4gIDxhaS1hdXRvY29tcGxldGUtZHJvcGRvd25cbiAgICAqbmdJZj1cImNvbnRyb2xsZXJcIlxuICAgIFtjb250cm9sbGVyXT1cImNvbnRyb2xsZXJcIlxuICAgIFtzaG93UGlsbHNdPVwic2hvd0Ryb3Bkb3duUGlsbHNcIlxuICAgIFtzaG93U2tpcEJ1dHRvbl09XCJzaG93U2tpcEJ1dHRvblwiXG4gICAgW3Nob3dPcHRpb25JY29uc109XCJzaG93T3B0aW9uSWNvbnNcIlxuICAgIFtzaG93T3B0aW9uSW1hZ2VzXT1cInNob3dPcHRpb25JbWFnZXNcIlxuICAgIFtzaG93T3B0aW9uQ291bnRzXT1cInNob3dPcHRpb25Db3VudHNcIlxuICAgIFtwcm9kdWN0c0xheW91dF09XCJwcm9kdWN0c0xheW91dFwiXG4gICAgW3Byb2R1Y3RJbWFnZUZhbGxiYWNrXT1cInByb2R1Y3RJbWFnZUZhbGxiYWNrXCJcbiAgPjwvYWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duPlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cIm1hZ2ljeC1haWEtaW5wdXQtd3JhcHBlclwiXG4gICAgZGF0YS1haWEtaW5wdXQtd3JhcHBlcj1cIlwiXG4gICAgKGNsaWNrKT1cIm9uV3JhcHBlckNsaWNrKCRldmVudClcIlxuICAgIChrZXl1cCk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cIm1hZ2ljeC1haWEtZWRpdG9yLWFyZWFcIiBkYXRhLWFpYS1lZGl0b3I9XCJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgI2VkaXRvclxuICAgICAgICAqbmdJZj1cImNvbnRyb2xsZXJcIlxuICAgICAgICBbYWlhRWRpdG9ySG9zdF09XCJjb250cm9sbGVyXCJcbiAgICAgICAgW2F1dG9Gb2N1c109XCJhdXRvRm9jdXNcIlxuICAgICAgICBbc2hvd0NoaXBJY29uc109XCJzaG93Q2hpcEljb25zXCJcbiAgICAgICAgW3Nob3dDaGlwSW1hZ2VzXT1cInNob3dDaGlwSW1hZ2VzXCJcbiAgICAgICAgY2xhc3M9XCJtYWdpY3gtYWlhLWlucHV0XCJcbiAgICAgICAgZGF0YS1haWEtaW5wdXQ9XCJcIlxuICAgICAgPjwvZGl2PlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbGxlciAmJiBzaG93SW5saW5lUGlsbHNcIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAjcGlsbENvbnRhaW5lclxuICAgICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1waWxsLWxpc3QtY29udGFpbmVyXCJcbiAgICAgICAgICBkYXRhLWFpYS1waWxsLWxpc3QtY29udGFpbmVyPVwiXCJcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgKGNvbnRyb2xsZXIuaXNMb2FkaW5nJCB8IGFzeW5jKSB8fFxuICAgICAgICAgICAgICAoKGNvbnRyb2xsZXIuc3VnZ2VzdGlvblBpbGxzJCB8IGFzeW5jKT8ubGVuZ3RoID8/IDApID4gMFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8YWlhLXBpbGwtbGlzdFxuICAgICAgICAgICAgW3BpbGxzXT1cIihjb250cm9sbGVyLnN1Z2dlc3Rpb25QaWxscyQgfCBhc3luYykgPz8gW11cIlxuICAgICAgICAgICAgW2FjdGl2ZVBpbGxJbmRleF09XCIwXCJcbiAgICAgICAgICAgIFthY3RpdmVTZWxlY3RlZF09XCIoY29udHJvbGxlci5pc0FjdGl2ZVBpbGxTZWxlY3RlZCQgfCBhc3luYykgPz8gZmFsc2VcIlxuICAgICAgICAgICAgW2xvYWRpbmddPVwiKGNvbnRyb2xsZXIuaXNMb2FkaW5nJCB8IGFzeW5jKSA/PyBmYWxzZVwiXG4gICAgICAgICAgICAoc2VsZWN0UGlsbCk9XCJvblNlbGVjdFBpbGwoJGV2ZW50KVwiXG4gICAgICAgICAgPjwvYWlhLXBpbGwtbGlzdD5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzdWJtaXRCdXR0b25TdGF0ZVwiPlxuICAgICAgPGFpYS1zdWJtaXQtYnV0dG9uXG4gICAgICAgICpuZ1N3aXRjaENhc2U9XCInZGVmYXVsdCdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgIShcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgJiZcbiAgICAgICAgICAgIGNhblN1Ym1pdCh7XG4gICAgICAgICAgICAgIHNlZ21lbnRzOiAoY29udHJvbGxlci5zZWdtZW50cyQgfCBhc3luYykgPz8gW10sXG4gICAgICAgICAgICAgIGNvbXBsZXRlZFBhcmFtczogKGNvbnRyb2xsZXIuY29tcGxldGVkUGFyYW1zJCB8IGFzeW5jKSA/PyBbXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIFwiXG4gICAgICAgIChzdWJtaXQpPVwib25TdWJtaXRCdXR0b25DbGljaygkZXZlbnQpXCJcbiAgICAgID48L2FpYS1zdWJtaXQtYnV0dG9uPlxuXG4gICAgICA8c3BhblxuICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2N1c3RvbSdcIlxuICAgICAgICBkYXRhLWFpYS1zdWJtaXQ9XCJcIlxuICAgICAgICBkYXRhLWFpYS1zdWJtaXQtc2xvdD1cIlwiXG4gICAgICAgIGNsYXNzPVwibWFnaWN4LWFpYS1zdWJtaXQtc2xvdFwiXG4gICAgICAgIChjbGljayk9XCJvblN1Ym1pdFNsb3RDbGljaygkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVN1Ym1pdFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=