igniteui-angular 13.2.14 → 13.2.15

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.
@@ -11,6 +11,7 @@ import { IGX_INPUT_GROUP_TYPE } from '../input-group/inputGroupType';
11
11
  import { IgxInputDirective, IgxInputGroupComponent, IgxInputState } from '../input-group/public_api';
12
12
  import { AbsoluteScrollStrategy, AutoPositionStrategy } from '../services/public_api';
13
13
  import { IgxComboAddItemDirective, IgxComboClearIconDirective, IgxComboEmptyDirective, IgxComboFooterDirective, IgxComboHeaderDirective, IgxComboHeaderItemDirective, IgxComboItemDirective, IgxComboToggleIconDirective } from './combo.directives';
14
+ import { CurrentResourceStrings } from '../core/i18n/resources';
14
15
  import * as i0 from "@angular/core";
15
16
  import * as i1 from "../core/selection";
16
17
  import * as i2 from "./combo.api";
@@ -561,6 +562,21 @@ export class IgxComboBaseDirective extends DisplayDensityBase {
561
562
  set type(val) {
562
563
  this._type = val;
563
564
  }
565
+ /**
566
+ * Gets/Sets the resource strings.
567
+ *
568
+ * @remarks
569
+ * By default it uses EN resources.
570
+ */
571
+ get resourceStrings() {
572
+ if (!this._resourceStrings) {
573
+ this._resourceStrings = CurrentResourceStrings.ComboResStrings;
574
+ }
575
+ return this._resourceStrings;
576
+ }
577
+ set resourceStrings(value) {
578
+ this._resourceStrings = Object.assign({}, this._resourceStrings, value);
579
+ }
564
580
  /** @hidden @internal */
565
581
  get searchValue() {
566
582
  return this._searchValue;
@@ -973,7 +989,7 @@ export class IgxComboBaseDirective extends DisplayDensityBase {
973
989
  }
974
990
  }
975
991
  IgxComboBaseDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: IgxComboBaseDirective, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.IgxSelectionAPIService }, { token: i2.IgxComboAPIService }, { token: i3.IgxIconService }, { token: DisplayDensityToken, optional: true }, { token: IGX_INPUT_GROUP_TYPE, optional: true }, { token: i0.Injector, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
976
- IgxComboBaseDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.2", type: IgxComboBaseDirective, inputs: { showSearchCaseIcon: "showSearchCaseIcon", overlaySettings: "overlaySettings", id: "id", width: "width", allowCustomValues: "allowCustomValues", itemsMaxHeight: "itemsMaxHeight", itemHeight: "itemHeight", itemsWidth: "itemsWidth", placeholder: "placeholder", data: "data", valueKey: "valueKey", displayKey: "displayKey", groupKey: "groupKey", groupSortingDirection: "groupSortingDirection", ariaLabelledBy: "ariaLabelledBy", disabled: "disabled", type: "type" }, outputs: { opening: "opening", opened: "opened", closing: "closing", closed: "closed", addition: "addition", searchInputUpdate: "searchInputUpdate", dataPreLoad: "dataPreLoad" }, host: { listeners: { "keydown.ArrowDown": "onArrowDown($event)", "keydown.Alt.ArrowDown": "onArrowDown($event)" }, properties: { "attr.id": "this.id", "style.width": "this.width", "attr.aria-labelledby": "this.ariaLabelledBy", "class.igx-combo": "this.cssClass", "attr.role": "this.role", "attr.aria-expanded": "this.ariaExpanded", "attr.aria-haspopup": "this.hasPopUp", "attr.aria-owns": "this.ariaOwns" } }, queries: [{ propertyName: "itemTemplate", first: true, predicate: IgxComboItemDirective, descendants: true, read: TemplateRef }, { propertyName: "headerTemplate", first: true, predicate: IgxComboHeaderDirective, descendants: true, read: TemplateRef }, { propertyName: "footerTemplate", first: true, predicate: IgxComboFooterDirective, descendants: true, read: TemplateRef }, { propertyName: "headerItemTemplate", first: true, predicate: IgxComboHeaderItemDirective, descendants: true, read: TemplateRef }, { propertyName: "addItemTemplate", first: true, predicate: IgxComboAddItemDirective, descendants: true, read: TemplateRef }, { propertyName: "emptyTemplate", first: true, predicate: IgxComboEmptyDirective, descendants: true, read: TemplateRef }, { propertyName: "toggleIconTemplate", first: true, predicate: IgxComboToggleIconDirective, descendants: true, read: TemplateRef }, { propertyName: "clearIconTemplate", first: true, predicate: IgxComboClearIconDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "inputGroup", first: true, predicate: ["inputGroup"], descendants: true, read: IgxInputGroupComponent, static: true }, { propertyName: "comboInput", first: true, predicate: ["comboInput"], descendants: true, read: IgxInputDirective, static: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "virtualScrollContainer", first: true, predicate: IgxForOfDirective, descendants: true, static: true }, { propertyName: "virtDir", first: true, predicate: IgxForOfDirective, descendants: true, read: IgxForOfDirective, static: true }, { propertyName: "dropdownContainer", first: true, predicate: ["dropdownItemContainer"], descendants: true, static: true }, { propertyName: "primitiveTemplate", first: true, predicate: ["primitive"], descendants: true, read: TemplateRef, static: true }, { propertyName: "complexTemplate", first: true, predicate: ["complex"], descendants: true, read: TemplateRef, static: true }], usesInheritance: true, ngImport: i0 });
992
+ IgxComboBaseDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.2", type: IgxComboBaseDirective, inputs: { showSearchCaseIcon: "showSearchCaseIcon", overlaySettings: "overlaySettings", id: "id", width: "width", allowCustomValues: "allowCustomValues", itemsMaxHeight: "itemsMaxHeight", itemHeight: "itemHeight", itemsWidth: "itemsWidth", placeholder: "placeholder", data: "data", valueKey: "valueKey", displayKey: "displayKey", groupKey: "groupKey", groupSortingDirection: "groupSortingDirection", ariaLabelledBy: "ariaLabelledBy", disabled: "disabled", type: "type", resourceStrings: "resourceStrings" }, outputs: { opening: "opening", opened: "opened", closing: "closing", closed: "closed", addition: "addition", searchInputUpdate: "searchInputUpdate", dataPreLoad: "dataPreLoad" }, host: { listeners: { "keydown.ArrowDown": "onArrowDown($event)", "keydown.Alt.ArrowDown": "onArrowDown($event)" }, properties: { "attr.id": "this.id", "style.width": "this.width", "attr.aria-labelledby": "this.ariaLabelledBy", "class.igx-combo": "this.cssClass", "attr.role": "this.role", "attr.aria-expanded": "this.ariaExpanded", "attr.aria-haspopup": "this.hasPopUp", "attr.aria-owns": "this.ariaOwns" } }, queries: [{ propertyName: "itemTemplate", first: true, predicate: IgxComboItemDirective, descendants: true, read: TemplateRef }, { propertyName: "headerTemplate", first: true, predicate: IgxComboHeaderDirective, descendants: true, read: TemplateRef }, { propertyName: "footerTemplate", first: true, predicate: IgxComboFooterDirective, descendants: true, read: TemplateRef }, { propertyName: "headerItemTemplate", first: true, predicate: IgxComboHeaderItemDirective, descendants: true, read: TemplateRef }, { propertyName: "addItemTemplate", first: true, predicate: IgxComboAddItemDirective, descendants: true, read: TemplateRef }, { propertyName: "emptyTemplate", first: true, predicate: IgxComboEmptyDirective, descendants: true, read: TemplateRef }, { propertyName: "toggleIconTemplate", first: true, predicate: IgxComboToggleIconDirective, descendants: true, read: TemplateRef }, { propertyName: "clearIconTemplate", first: true, predicate: IgxComboClearIconDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "inputGroup", first: true, predicate: ["inputGroup"], descendants: true, read: IgxInputGroupComponent, static: true }, { propertyName: "comboInput", first: true, predicate: ["comboInput"], descendants: true, read: IgxInputDirective, static: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "virtualScrollContainer", first: true, predicate: IgxForOfDirective, descendants: true, static: true }, { propertyName: "virtDir", first: true, predicate: IgxForOfDirective, descendants: true, read: IgxForOfDirective, static: true }, { propertyName: "dropdownContainer", first: true, predicate: ["dropdownItemContainer"], descendants: true, static: true }, { propertyName: "primitiveTemplate", first: true, predicate: ["primitive"], descendants: true, read: TemplateRef, static: true }, { propertyName: "complexTemplate", first: true, predicate: ["complex"], descendants: true, read: TemplateRef, static: true }], usesInheritance: true, ngImport: i0 });
977
993
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: IgxComboBaseDirective, decorators: [{
978
994
  type: Directive
979
995
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.IgxSelectionAPIService }, { type: i2.IgxComboAPIService }, { type: i3.IgxIconService }, { type: undefined, decorators: [{
@@ -1046,6 +1062,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImpor
1046
1062
  type: Input
1047
1063
  }], type: [{
1048
1064
  type: Input
1065
+ }], resourceStrings: [{
1066
+ type: Input
1049
1067
  }], opening: [{
1050
1068
  type: Output
1051
1069
  }], opened: [{
@@ -1115,4 +1133,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImpor
1115
1133
  type: HostListener,
1116
1134
  args: ['keydown.Alt.ArrowDown', ['$event']]
1117
1135
  }] } });
1118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm8uY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2NvbWJvL2NvbWJvLmNvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsWUFBWSxFQUNaLFNBQVMsRUFHVCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sY0FBYyxFQUVkLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF5QyxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbEUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBMEIsTUFBTSx3QkFBd0IsQ0FBQztBQUV6RyxPQUFPLEVBQThCLFVBQVUsRUFBbUQsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BJLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXZGLE9BQU8sRUFBcUIsb0JBQW9CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFtQixNQUFNLHdCQUF3QixDQUFDO0FBR3ZHLE9BQU8sRUFDSCx3QkFBd0IsRUFBRSwwQkFBMEIs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QUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29udGVudENoaWxkLFxuICAgIERpcmVjdGl2ZSxcbiAgICBEb0NoZWNrLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5qZWN0aW9uVG9rZW4sXG4gICAgSW5qZWN0b3IsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgY2FzZVNlbnNpdGl2ZSB9IGZyb20gJ0BpZ25pdGV1aS9tYXRlcmlhbC1pY29ucy1leHRlbmRlZCc7XG5pbXBvcnQgeyBub29wLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEaXNwbGF5RGVuc2l0eUJhc2UsIERpc3BsYXlEZW5zaXR5VG9rZW4sIElEaXNwbGF5RGVuc2l0eU9wdGlvbnMgfSBmcm9tICcuLi9jb3JlL2Rpc3BsYXlEZW5zaXR5JztcbmltcG9ydCB7IElneFNlbGVjdGlvbkFQSVNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3NlbGVjdGlvbic7XG5pbXBvcnQgeyBDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncywgY2xvbmVBcnJheSwgSUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncywgSUJhc2VFdmVudEFyZ3MsIGlzTmFOdmFsdWUgfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IFNvcnRpbmdEaXJlY3Rpb24gfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvc29ydGluZy1zdHJhdGVneSc7XG5pbXBvcnQgeyBJRm9yT2ZTdGF0ZSwgSWd4Rm9yT2ZEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2Zvci1vZi9mb3Jfb2YuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEljb25TZXJ2aWNlIH0gZnJvbSAnLi4vaWNvbi9wdWJsaWNfYXBpJztcbmltcG9ydCB7IElneElucHV0R3JvdXBUeXBlLCBJR1hfSU5QVVRfR1JPVVBfVFlQRSB9IGZyb20gJy4uL2lucHV0LWdyb3VwL2lucHV0R3JvdXBUeXBlJztcbmltcG9ydCB7IElneElucHV0RGlyZWN0aXZlLCBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50LCBJZ3hJbnB1dFN0YXRlIH0gZnJvbSAnLi4vaW5wdXQtZ3JvdXAvcHVibGljX2FwaSc7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5LCBBdXRvUG9zaXRpb25TdHJhdGVneSwgT3ZlcmxheVNldHRpbmdzIH0gZnJvbSAnLi4vc2VydmljZXMvcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJZ3hDb21ib0Ryb3BEb3duQ29tcG9uZW50IH0gZnJvbSAnLi9jb21iby1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q29tYm9BUElTZXJ2aWNlIH0gZnJvbSAnLi9jb21iby5hcGknO1xuaW1wb3J0IHtcbiAgICBJZ3hDb21ib0FkZEl0ZW1EaXJlY3RpdmUsIElneENvbWJvQ2xlYXJJY29uRGlyZWN0aXZlLCBJZ3hDb21ib0VtcHR5RGlyZWN0aXZlLFxuICAgIElneENvbWJvRm9vdGVyRGlyZWN0aXZlLCBJZ3hDb21ib0hlYWRlckRpcmVjdGl2ZSwgSWd4Q29tYm9IZWFkZXJJdGVtRGlyZWN0aXZlLCBJZ3hDb21ib0l0ZW1EaXJlY3RpdmUsIElneENvbWJvVG9nZ2xlSWNvbkRpcmVjdGl2ZVxufSBmcm9tICcuL2NvbWJvLmRpcmVjdGl2ZXMnO1xuaW1wb3J0IHtcbiAgICBJQ29tYm9GaWx0ZXJpbmdPcHRpb25zLCBJQ29tYm9JdGVtQWRkaXRpb25FdmVudCwgSUNvbWJvU2VhcmNoSW5wdXRFdmVudEFyZ3Ncbn0gZnJvbSAnLi9wdWJsaWNfYXBpJztcblxuZXhwb3J0IGNvbnN0IElHWF9DT01CT19DT01QT05FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48SWd4Q29tYm9CYXNlPignSWd4Q29tYm9Db21wb25lbnRUb2tlbicpO1xuXG4vKiogQGhpZGRlbiBAaW50ZXJuYWwgVE9ETzogRXZhbHVhdGUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWd4Q29tYm9CYXNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGRhdGE6IGFueVtdIHwgbnVsbDtcbiAgICB2YWx1ZUtleTogc3RyaW5nO1xuICAgIGdyb3VwS2V5OiBzdHJpbmc7XG4gICAgaXNSZW1vdGU6IGJvb2xlYW47XG4gICAgZmlsdGVyZWREYXRhOiBhbnlbXSB8IG51bGw7XG4gICAgdG90YWxJdGVtQ291bnQ6IG51bWJlcjtcbiAgICBpdGVtc01heEhlaWdodDogbnVtYmVyO1xuICAgIGl0ZW1IZWlnaHQ6IG51bWJlcjtcbiAgICBzZWFyY2hWYWx1ZTogc3RyaW5nO1xuICAgIHNlYXJjaElucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgIGNvbWJvSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gICAgb3BlbmVkOiBFdmVudEVtaXR0ZXI8SUJhc2VFdmVudEFyZ3M+O1xuICAgIG9wZW5pbmc6IEV2ZW50RW1pdHRlcjxDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncz47XG4gICAgY2xvc2luZzogRXZlbnRFbWl0dGVyPENhbmNlbGFibGVCcm93c2VyRXZlbnRBcmdzPjtcbiAgICBjbG9zZWQ6IEV2ZW50RW1pdHRlcjxJQmFzZUV2ZW50QXJncz47XG4gICAgZm9jdXNTZWFyY2hJbnB1dChvcGVuaW5nPzogYm9vbGVhbik6IHZvaWQ7XG4gICAgdHJpZ2dlckNoZWNrKCk6IHZvaWQ7XG4gICAgYWRkSXRlbVRvQ29sbGVjdGlvbigpOiB2b2lkO1xuICAgIGlzQWRkQnV0dG9uVmlzaWJsZSgpOiBib29sZWFuO1xuICAgIGhhbmRsZUlucHV0Q2hhbmdlKGV2ZW50Pzogc3RyaW5nKTogdm9pZDtcbiAgICBpc0l0ZW1TZWxlY3RlZChpdGVtSUQ6IGFueSk6IGJvb2xlYW47XG4gICAgc2VsZWN0KGl0ZW06IGFueSk6IHZvaWQ7XG4gICAgc2VsZWN0KGl0ZW1JRHM6IGFueVtdLCBjbGVhclNlbGVjdGlvbj86IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpOiB2b2lkO1xuICAgIGRlc2VsZWN0KC4uLmFyZ3M6IFtdIHwgW2l0ZW1JRHM6IGFueVtdLCBldmVudD86IEV2ZW50XSk6IHZvaWQ7XG59XG5cbmxldCBORVhUX0lEID0gMDtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgaXRlbXMgdGhhdCBzaG91bGQgYmUgaW4gdGhlIGNvbWJvJ3NcbiAqIGRyb3AtZG93biBsaXN0IGlmIG5vIGBbaXRlbXNNYXhIZWlnaHRdYCBpcyBzcGVjaWZpZWRcbiAqL1xuY29uc3QgaXRlbXNJbkNvbnRhaW5lciA9IDEwOyAvLyBUT0RPOiBtYWtlIHByaXZhdGUgcmVhZG9ubHlcblxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXG5jb25zdCBJdGVtSGVpZ2h0cyA9IHtcbiAgICBjb21mb3J0YWJsZTogNDAsXG4gICAgY29zeTogMzIsXG4gICAgY29tcGFjdDogMjgsXG59O1xuXG4vKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIERhdGFUeXBlcyB7XG4gICAgRU1QVFkgPSAnZW1wdHknLFxuICAgIFBSSU1JVElWRSA9ICdwcmltaXRpdmUnLFxuICAgIENPTVBMRVggPSAnY29tcGxleCcsXG4gICAgUFJJTUFSWUtFWSA9ICd2YWx1ZUtleSdcbn1cblxuZXhwb3J0IGVudW0gSWd4Q29tYm9TdGF0ZSB7XG4gICAgLyoqXG4gICAgICogQ29tYm8gd2l0aCBpbml0aWFsIHN0YXRlLlxuICAgICAqL1xuICAgIElOSVRJQUwgPSBJZ3hJbnB1dFN0YXRlLklOSVRJQUwsXG4gICAgLyoqXG4gICAgICogQ29tYm8gd2l0aCB2YWxpZCBzdGF0ZS5cbiAgICAgKi9cbiAgICBWQUxJRCA9IElneElucHV0U3RhdGUuVkFMSUQsXG4gICAgLyoqXG4gICAgICogQ29tYm8gd2l0aCBpbnZhbGlkIHN0YXRlLlxuICAgICAqL1xuICAgIElOVkFMSUQgPSBJZ3hJbnB1dFN0YXRlLklOVkFMSURcbn1cblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSWd4Q29tYm9CYXNlRGlyZWN0aXZlIGV4dGVuZHMgRGlzcGxheURlbnNpdHlCYXNlIGltcGxlbWVudHMgSWd4Q29tYm9CYXNlLCBPbkluaXQsIERvQ2hlY2ssXG4gICAgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB3aGV0aGVyIHRoZSBjYXNlU2Vuc2l0aXZlIGljb24gc2hvdWxkIGJlIHNob3duIGluIHRoZSBzZWFyY2ggaW5wdXRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib1Nob3dTZWFyY2hDYXNlSWNvbiA9IHRoaXMuY29tYm8uc2hvd1NlYXJjaENhc2VJY29uO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFtzaG93U2VhcmNoQ2FzZUljb25dPSd0cnVlJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93U2VhcmNoQ2FzZUljb24gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNldCBjdXN0b20gb3ZlcmxheSBzZXR0aW5ncyB0aGF0IGNvbnRyb2wgaG93IHRoZSBjb21ibydzIGxpc3Qgb2YgaXRlbXMgaXMgZGlzcGxheWVkLlxuICAgICAqIFNldDpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyBbb3ZlcmxheVNldHRpbmdzXSA9IFwiY3VzdG9tT3ZlcmxheVNldHRpbmdzXCI+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGNvbnN0IGN1c3RvbVNldHRpbmdzID0geyBwb3NpdGlvblN0cmF0ZWd5OiB7IHNldHRpbmdzOiB7IHRhcmdldDogbXlUYXJnZXQgfSB9IH07XG4gICAgICogIGNvbWJvLm92ZXJsYXlTZXR0aW5ncyA9IGN1c3RvbVNldHRpbmdzO1xuICAgICAqIGBgYFxuICAgICAqIEdldCBhbnkgY3VzdG9tIG92ZXJsYXkgc2V0dGluZ3MgdXNlZCBieSB0aGUgY29tYm86XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBjb25zdCBjb21ib092ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0gbXlDb21iby5vdmVybGF5U2V0dGluZ3M7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9nZXRzIGNvbWJvIGlkLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBpZCA9IHRoaXMuY29tYm8uaWQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2lkXT0nY29tYm8xJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlkID0gYGlneC1jb21iby0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3R5bGUgd2lkdGggb2YgdGhlIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib1dpZHRoID0gdGhpcy5jb21iby53aWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbd2lkdGhdPScyNTBweCc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgd2lkdGg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgY3VzdG9tIHZhbHVlcyBjYW4gYmUgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgY29tYm9BbGxvd3NDdXN0b21WYWx1ZXMgPSB0aGlzLmNvbWJvLmFsbG93Q3VzdG9tVmFsdWVzO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFthbGxvd0N1c3RvbVZhbHVlc109J3RydWUnPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFsbG93Q3VzdG9tVmFsdWVzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBkcm9wIGRvd24gbGlzdCBoZWlnaHRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib0l0ZW1zTWF4SGVpZ2h0ID0gdGhpcy5jb21iby5pdGVtc01heEhlaWdodDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbaXRlbXNNYXhIZWlnaHRdPSczMjAnPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBpdGVtc01heEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5faXRlbXNNYXhIZWlnaHQgPT09IG51bGwgfHwgdGhpcy5faXRlbXNNYXhIZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbUhlaWdodCAqIGl0ZW1zSW5Db250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zTWF4SGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaXRlbXNNYXhIZWlnaHQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5faXRlbXNNYXhIZWlnaHQgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgZHJvcCBkb3duIGxpc3QgaXRlbSBoZWlnaHRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib0l0ZW1IZWlnaHQgPSB0aGlzLmNvbWJvLml0ZW1IZWlnaHQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2l0ZW1IZWlnaHRdPSczMic+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGl0ZW1IZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuX2l0ZW1IZWlnaHQgPT09IG51bGwgfHwgdGhpcy5faXRlbUhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gSXRlbUhlaWdodHNbdGhpcy5kaXNwbGF5RGVuc2l0eV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1IZWlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBpdGVtSGVpZ2h0KHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1IZWlnaHQgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgZHJvcCBkb3duIGxpc3Qgd2lkdGhcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib0l0ZW1zV2lkdGggPSB0aGlzLmNvbWJvLml0ZW1zV2lkdGg7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2l0ZW1zV2lkdGhdID0gJ1wiMTgwcHhcIic+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaXRlbXNXaWR0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUgZm9yIHRoZSBjb21ibyB2YWx1ZSBmaWVsZFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvUGxhY2Vob2xkZXIgPSB0aGlzLmNvbWJvLnBsYWNlaG9sZGVyO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFtwbGFjZWhvbGRlcl09J25ld1BsYWNlSG9sZGVyJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29tYm8gZGF0YSBzb3VyY2UuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2RhdGFdPSdpdGVtcyc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRhdGEoKTogYW55W10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZGF0YSh2YWw6IGFueVtdIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9kYXRhID0gKHZhbCkgPyB2YWwgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHdoaWNoIGNvbHVtbiBpbiB0aGUgZGF0YSBzb3VyY2UgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHZhbHVlLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvVmFsdWVLZXkgPSB0aGlzLmNvbWJvLnZhbHVlS2V5O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFt2YWx1ZUtleV09J215S2V5Jz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2YWx1ZUtleTogc3RyaW5nID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBkaXNwbGF5S2V5KHZhbDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlLZXkgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGljaCBjb2x1bW4gaW4gdGhlIGRhdGEgc291cmNlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkaXNwbGF5IHZhbHVlLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvRGlzcGxheUtleSA9IHRoaXMuY29tYm8uZGlzcGxheUtleTtcbiAgICAgKlxuICAgICAqIC8vIHNldFxuICAgICAqIHRoaXMuY29tYm8uZGlzcGxheUtleSA9ICd2YWwnO1xuICAgICAqXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2Rpc3BsYXlLZXldPSdteURpc3BsYXlLZXknPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGlzcGxheUtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlLZXkgPyB0aGlzLl9kaXNwbGF5S2V5IDogdGhpcy52YWx1ZUtleTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaXRlbSBwcm9wZXJ0eSBieSB3aGljaCBpdGVtcyBzaG91bGQgYmUgZ3JvdXBlZCBpbnNpZGUgdGhlIGl0ZW1zIGxpc3QuIE5vdCB1c2FibGUgaWYgZGF0YSBpcyBub3Qgb2YgdHlwZSBPYmplY3RbXS5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbZ3JvdXBLZXldPSduZXdHcm91cEtleSc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGdyb3VwS2V5KHZhbDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2dyb3VwS2V5ID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpdGVtIHByb3BlcnR5IGJ5IHdoaWNoIGl0ZW1zIHNob3VsZCBiZSBncm91cGVkIGluc2lkZSB0aGUgaXRlbXMgbGlzdC4gTm90IHVzYWJsZSBpZiBkYXRhIGlzIG5vdCBvZiB0eXBlIE9iamVjdFtdLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBjdXJyZW50R3JvdXBLZXkgPSB0aGlzLmNvbWJvLmdyb3VwS2V5O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ3JvdXBLZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VwS2V5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgZ3JvdXBzIHNvcnRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIFtncm91cFNvcnRpbmdEaXJlY3Rpb25dPVwiZ3JvdXBTb3J0aW5nRGlyZWN0aW9uXCI+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBncm91cFNvcnRpbmdEaXJlY3Rpb24gPSBTb3J0aW5nRGlyZWN0aW9uLkFzYztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZ3JvdXBTb3J0aW5nRGlyZWN0aW9uKCk6IFNvcnRpbmdEaXJlY3Rpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdXBTb3J0aW5nRGlyZWN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGdyb3VwU29ydGluZ0RpcmVjdGlvbih2YWw6IFNvcnRpbmdEaXJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fZ3JvdXBTb3J0aW5nRGlyZWN0aW9uID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldCBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gW2FyaWFMYWJlbGxlZEJ5XT1cIidsYWJlbDEnXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbGxlZGJ5JylcbiAgICBwdWJsaWMgYXJpYUxhYmVsbGVkQnk6IHN0cmluZztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNvbWJvJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWNvbWJvJzsgLy8gSW5kZXBlbmRlbnQgb2YgZGlzcGxheSBkZW5zaXR5IGZvciB0aGUgdGltZSBiZWluZ1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKGBhdHRyLnJvbGVgKVxuICAgIHB1YmxpYyByb2xlID0gJ2NvbWJvYm94JztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWV4cGFuZGVkJylcbiAgICBwdWJsaWMgZ2V0IGFyaWFFeHBhbmRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRyb3Bkb3duLmNvbGxhcHNlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1oYXNwb3B1cCcpXG4gICAgcHVibGljIGdldCBoYXNQb3BVcCgpIHtcbiAgICAgICAgcmV0dXJuICdsaXN0Ym94JztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1vd25zJylcbiAgICBwdWJsaWMgZ2V0IGFyaWFPd25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wZG93bi5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBlbmFibGVkL2Rpc2FibGVzIGNvbWJvLiBUaGUgZGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIFtkaXNhYmxlZF09XCIndHJ1ZSdcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyBob3cgdGhlIGNvbWJvIHdpbGwgYmUgc3R5bGVkLlxuICAgICAqIFRoZSBhbGxvd2VkIHZhbHVlcyBhcmUgYGxpbmVgLCBgYm94YCwgYGJvcmRlcmAgYW5kIGBzZWFyY2hgLiBUaGUgZGVmYXVsdCBpcyBgYm94YC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyBbdHlwZV09XCInbGluZSdcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdHlwZSgpOiBJZ3hJbnB1dEdyb3VwVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlIHx8IHRoaXMuX2lucHV0R3JvdXBUeXBlIHx8ICdib3gnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdHlwZSh2YWw6IElneElucHV0R3JvdXBUeXBlKSB7XG4gICAgICAgIHRoaXMuX3R5cGUgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgdGhlIGRyb3Bkb3duIGlzIG9wZW5lZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gb3BlbmluZz0naGFuZGxlT3BlbmluZygkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3BlbmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGRyb3Bkb3duIGlzIG9wZW5lZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gKG9wZW5lZCk9J2hhbmRsZU9wZW5lZCgkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjxJQmFzZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHRoZSBkcm9wZG93biBpcyBjbG9zZWRcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIChjbG9zaW5nKT0naGFuZGxlQ2xvc2luZygkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2xvc2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGRyb3Bkb3duIGlzIGNsb3NlZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gKGNsb3NlZCk9J2hhbmRsZUNsb3NlZCgkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJQmFzZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhbiBpdGVtIGlzIGJlaW5nIGFkZGVkIHRvIHRoZSBkYXRhIGNvbGxlY3Rpb25cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIChhZGRpdGlvbik9J2hhbmRsZUFkZGl0aW9uRXZlbnQoJGV2ZW50KSc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGFkZGl0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29tYm9JdGVtQWRkaXRpb25FdmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIHNlYXJjaCBpbnB1dCBjaGFuZ2VzIChlLmcuIHR5cGluZywgcGFzdGluZywgY2xlYXIsIGV0Yy4pXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyAoc2VhcmNoSW5wdXRVcGRhdGUpPSdoYW5kbGVTZWFyY2hJbnB1dEV2ZW50KCRldmVudCknPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzZWFyY2hJbnB1dFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbWJvU2VhcmNoSW5wdXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gbmV3IGNodW5rIG9mIGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIHZpcnR1YWxpemF0aW9uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyAoZGF0YVByZUxvYWQpPSdoYW5kbGVEYXRhUHJlbG9hZEV2ZW50KCRldmVudCknPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkYXRhUHJlTG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUZvck9mU3RhdGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgSVRFTVMgaW4gdGhlIGNvbWJvIGxpc3RcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5jb21iby5pdGVtVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9JdGVtIGxldC1pdGVtIGxldC1rZXk9XCJ2YWx1ZUtleVwiPlxuICAgICAqICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20taXRlbVwiPlxuICAgICAqICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWl0ZW1fX25hbWVcIj57eyBpdGVtW2tleV0gfX08L2Rpdj5cbiAgICAgKiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1pdGVtX19jb3N0XCI+e3sgaXRlbS5jb3N0IH19PC9kaXY+XG4gICAgICogICAgICAgICAgPC9kaXY+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENvbWJvSXRlbURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBpdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBIRUFERVIgZm9yIHRoZSBjb21ibyBpdGVtcyBsaXN0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8uaGVhZGVyVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9IZWFkZXI+XG4gICAgICogICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvX19oZWFkZXJcIj5cbiAgICAgKiAgICAgICAgICAgICAgVGhpcyBpcyBhIGN1c3RvbSBoZWFkZXJcbiAgICAgKiAgICAgICAgICA8L2Rpdj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9IZWFkZXJEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgaGVhZGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBGT09URVIgZm9yIHRoZSBjb21ibyBpdGVtcyBsaXN0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8uZm9vdGVyVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9Gb290ZXI+XG4gICAgICogICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvX19mb290ZXJcIj5cbiAgICAgKiAgICAgICAgICAgICAgVGhpcyBpcyBhIGN1c3RvbSBmb290ZXJcbiAgICAgKiAgICAgICAgICA8L2Rpdj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9Gb290ZXJEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgZm9vdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIEhFQURFUiBJVEVNUyBmb3IgZ3JvdXBzIGluIHRoZSBjb21ibyBsaXN0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8uaGVhZGVySXRlbVRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvSGVhZGVySXRlbSBsZXQtaXRlbSBsZXQta2V5PVwiZ3JvdXBLZXlcIj5cbiAgICAgKiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWl0ZW0tLWdyb3VwXCI+R3JvdXAgaGVhZGVyIGZvciB7eyBpdGVtW2tleV0gfX08L2Rpdj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9IZWFkZXJJdGVtRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGhlYWRlckl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIEFERCBCVVRUT04gaW4gdGhlIGNvbWJvIGRyb3AgZG93blxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIFNldCBpbiB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG15Q29tcG9uZW50LmN1c3RvbVRlbXBsYXRlO1xuICAgICAqIG15Q29tcG9uZW50LmNvbWJvLmFkZEl0ZW1UZW1wbGF0ZSA9IG15Q3VzdG9tVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gU2V0IGluIG1hcmt1cCAtLT5cbiAgICAgKiAgPGlneC1jb21ibyAjY29tYm8+XG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDb21ib0FkZEl0ZW0+XG4gICAgICogICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbWJvX19hZGQtYnV0dG9uXCI+XG4gICAgICogICAgICAgICAgICAgIENsaWNrIHRvIGFkZCBpdGVtXG4gICAgICogICAgICAgICAgPC9idXR0b24+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENvbWJvQWRkSXRlbURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBhZGRJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBBREQgQlVUVE9OIGluIHRoZSBjb21ibyBkcm9wIGRvd25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5jb21iby5lbXB0eVRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvRW1wdHk+XG4gICAgICogICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvLS1lbXB0eVwiPlxuICAgICAqICAgICAgICAgICAgICBUaGVyZSBhcmUgbm8gaXRlbXMgdG8gZGlzcGxheVxuICAgICAqICAgICAgICAgIDwvZGl2PlxuICAgICAqICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiAgPC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hDb21ib0VtcHR5RGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGVtcHR5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBjb21ibyBUT0dHTEUob3Blbi9jbG9zZSkgYnV0dG9uXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8udG9nZ2xlSWNvblRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvVG9nZ2xlSWNvbiBsZXQtY29sbGFwc2VkPlxuICAgICAqICAgICAgICAgIDxpZ3gtaWNvbj57eyBjb2xsYXBzZWQgPyAncmVtb3ZlX2NpcmNsZScgOiAncmVtb3ZlX2NpcmNsZV9vdXRsaW5lJ319PC9pZ3gtaWNvbj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9Ub2dnbGVJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHRvZ2dsZUljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIGNvbWJvIENMRUFSIGJ1dHRvblxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIFNldCBpbiB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG15Q29tcG9uZW50LmN1c3RvbVRlbXBsYXRlO1xuICAgICAqIG15Q29tcG9uZW50LmNvbWJvLmNsZWFySWNvblRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvQ2xlYXJJY29uPlxuICAgICAqICAgICAgICAgIDxpZ3gtaWNvbj5jbGVhcjwvaWd4LWljb24+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENvbWJvQ2xlYXJJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGNsZWFySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lucHV0R3JvdXAnLCB7IHJlYWQ6IElneElucHV0R3JvdXBDb21wb25lbnQsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZCgnY29tYm9JbnB1dCcsIHsgcmVhZDogSWd4SW5wdXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBjb21ib0lucHV0OiBJZ3hJbnB1dERpcmVjdGl2ZTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0JylcbiAgICBwdWJsaWMgc2VhcmNoSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4gPSBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hGb3JPZkRpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbENvbnRhaW5lcjogSWd4Rm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIEBWaWV3Q2hpbGQoSWd4Rm9yT2ZEaXJlY3RpdmUsIHsgcmVhZDogSWd4Rm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCB2aXJ0RGlyOiBJZ3hGb3JPZkRpcmVjdGl2ZTxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnZHJvcGRvd25JdGVtQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZHJvcGRvd25Db250YWluZXI6IEVsZW1lbnRSZWYgPSBudWxsO1xuXG4gICAgQFZpZXdDaGlsZCgncHJpbWl0aXZlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIHByaW1pdGl2ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29tcGxleCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBjb21wbGV4VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHNlYXJjaFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hWYWx1ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBzZWFyY2hWYWx1ZSh2YWw6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbHRlclZhbHVlID0gdmFsO1xuICAgICAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHZhbDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUmVtb3RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b3RhbEl0ZW1Db3VudCA+IDAgJiZcbiAgICAgICAgICAgIHRoaXMudmFsdWVLZXkgJiZcbiAgICAgICAgICAgIHRoaXMuZGF0YVR5cGUgPT09IERhdGFUeXBlcy5DT01QTEVYO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheUtleSkge1xuICAgICAgICAgICAgcmV0dXJuIERhdGFUeXBlcy5DT01QTEVYO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEYXRhVHlwZXMuUFJJTUlUSVZFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgaWYgY29udHJvbCBpcyB2YWxpZCwgd2hlbiB1c2VkIGluIGEgZm9ybVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCB2YWxpZCA9IHRoaXMuY29tYm8udmFsaWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWxpZCgpOiBJZ3hDb21ib1N0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgaWYgY29udHJvbCBpcyB2YWxpZCwgd2hlbiB1c2VkIGluIGEgZm9ybVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHNldFxuICAgICAqIHRoaXMuY29tYm8udmFsaWQgPSBJZ3hDb21ib1N0YXRlLklOVkFMSUQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCB2YWxpZCh2YWxpZDogSWd4Q29tYm9TdGF0ZSkge1xuICAgICAgICB0aGlzLl92YWxpZCA9IHZhbGlkO1xuICAgICAgICB0aGlzLmNvbWJvSW5wdXQudmFsaWQgPSBJZ3hJbnB1dFN0YXRlW0lneENvbWJvU3RhdGVbdmFsaWRdXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGNvbWJvIGlucHV0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IGNvbWJvVmFsdWUgPSB0aGlzLmNvbWJvLnZhbHVlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZpcnR1YWxpemVkIGRhdGEuIEl0IGNvbnRhaW5zIGBzdGFydEluZGV4YCBhbmQgYGNodW5rU2l6ZWBcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgc3RhdGUgPSB0aGlzLmNvbWJvLnZpcnR1YWxpemF0aW9uU3RhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2aXJ0dWFsaXphdGlvblN0YXRlKCk6IElGb3JPZlN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlydERpci5zdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmlydHVhbGl6ZWQgZGF0YS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBzZXRcbiAgICAgKiB0aGlzLmNvbWJvLnZpcnR1YWxpemF0aW9uU3RhdGUoc3RhdGUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdmlydHVhbGl6YXRpb25TdGF0ZShzdGF0ZTogSUZvck9mU3RhdGUpIHtcbiAgICAgICAgdGhpcy52aXJ0RGlyLnN0YXRlID0gc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBkcm9wIGRvd24gc3RhdGUuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN0YXRlID0gdGhpcy5jb21iby5jb2xsYXBzZWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyb3Bkb3duLmNvbGxhcHNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRvdGFsIGNvdW50IG9mIHRoZSB2aXJ0dWFsIGRhdGEgaXRlbXMsIHdoZW4gdXNpbmcgcmVtb3RlIHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IGNvdW50ID0gdGhpcy5jb21iby50b3RhbEl0ZW1Db3VudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsSXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpcnREaXIudG90YWxJdGVtQ291bnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdG90YWwgY291bnQgb2YgdGhlIHZpcnR1YWwgZGF0YSBpdGVtcywgd2hlbiB1c2luZyByZW1vdGUgc2VydmljZS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBzZXRcbiAgICAgKiB0aGlzLmNvbWJvLnRvdGFsSXRlbUNvdW50KHJlbW90ZVNlcnZpY2UuY291bnQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdG90YWxJdGVtQ291bnQoY291bnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnZpcnREaXIudG90YWxJdGVtQ291bnQgPSBjb3VudDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGU7XG4gICAgICAgIGlmICh0aGlzLml0ZW1UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kYXRhVHlwZSA9PT0gRGF0YVR5cGVzLkNPTVBMRVgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBsZXhUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wcmltaXRpdmVUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgY3VzdG9tVmFsdWVGbGFnID0gdHJ1ZTtcbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZmlsdGVyVmFsdWUgPSAnJztcbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZGVmYXVsdEZhbGxiYWNrR3JvdXAgPSAnT3RoZXInO1xuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBmaWx0ZXJpbmdPcHRpb25zOiBJQ29tYm9GaWx0ZXJpbmdPcHRpb25zID0ge1xuICAgICAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZVxuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2RhdGEgPSBbXTtcbiAgICBwcm90ZWN0ZWQgX3ZhbHVlID0gJyc7XG4gICAgcHJvdGVjdGVkIF9ncm91cEtleSA9ICcnO1xuICAgIHByb3RlY3RlZCBfc2VhcmNoVmFsdWUgPSAnJztcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlcmVkRGF0YSA9IFtdO1xuICAgIHByb3RlY3RlZCBfZGlzcGxheUtleTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfcmVtb3RlU2VsZWN0aW9uID0ge307XG4gICAgcHJvdGVjdGVkIF92YWxpZCA9IElneENvbWJvU3RhdGUuSU5JVElBTDtcbiAgICBwcm90ZWN0ZWQgbmdDb250cm9sOiBOZ0NvbnRyb2wgPSBudWxsO1xuICAgIHByb3RlY3RlZCBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcm90ZWN0ZWQgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgICBwcm90ZWN0ZWQgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuXG4gICAgcHJpdmF0ZSBfdHlwZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZGF0YVR5cGUgPSAnJztcbiAgICBwcml2YXRlIF9pdGVtSGVpZ2h0ID0gbnVsbDtcbiAgICBwcml2YXRlIF9pdGVtc01heEhlaWdodCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3M7XG4gICAgcHJpdmF0ZSBfZ3JvdXBTb3J0aW5nRGlyZWN0aW9uOiBTb3J0aW5nRGlyZWN0aW9uID0gU29ydGluZ0RpcmVjdGlvbi5Bc2M7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgZHJvcGRvd246IElneENvbWJvRHJvcERvd25Db21wb25lbnQ7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3Qgc2VsZWN0aW9uQ2hhbmdpbmc6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIHNlbGVjdGlvblNlcnZpY2U6IElneFNlbGVjdGlvbkFQSVNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBjb21ib0FQSTogSWd4Q29tYm9BUElTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX2ljb25TZXJ2aWNlOiBJZ3hJY29uU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEaXNwbGF5RGVuc2l0eVRva2VuKSBwcm90ZWN0ZWQgX2Rpc3BsYXlEZW5zaXR5T3B0aW9uczogSURpc3BsYXlEZW5zaXR5T3B0aW9ucyxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChJR1hfSU5QVVRfR1JPVVBfVFlQRSkgcHJvdGVjdGVkIF9pbnB1dEdyb3VwVHlwZTogSWd4SW5wdXRHcm91cFR5cGUsXG4gICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uQXJyb3dEb3duJywgWyckZXZlbnQnXSlcbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLkFsdC5BcnJvd0Rvd24nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkFycm93RG93bihldmVudDogRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLl9pbmplY3Rvci5nZXQ8TmdDb250cm9sPihOZ0NvbnRyb2wsIG51bGwpO1xuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0RWxlbWVudCxcbiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IEF1dG9Qb3NpdGlvblN0cmF0ZWd5KCksXG4gICAgICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlLFxuICAgICAgICAgICAgZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2s6IFt0YXJnZXRFbGVtZW50IGFzIEhUTUxFbGVtZW50XVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2V0KHRoaXMuaWQsIG5ldyBTZXQoKSk7XG4gICAgICAgIHRoaXMuX2ljb25TZXJ2aWNlLmFkZFN2Z0ljb25Gcm9tVGV4dChjYXNlU2Vuc2l0aXZlLm5hbWUsIGNhc2VTZW5zaXRpdmUudmFsdWUsICdpbXgtaWNvbnMnKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IFsuLi50aGlzLmRhdGFdO1xuXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHRoaXMub25TdGF0dXNDaGFuZ2VkKTtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlUmVxdWlyZWRBc3RlcmlzaygpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlydERpci5jaHVua1ByZWxvYWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZTogSUZvck9mU3RhdGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUZvck9mU3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBlLCB7IG93bmVyOiB0aGlzIH0pO1xuICAgICAgICAgICAgdGhpcy5kYXRhUHJlTG9hZC5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5jb21ib0FQSS5jbGVhcigpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXIodGhpcy5pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBtZXRob2QgdGhhdCBvcGVucy9jbG9zZXMgdGhlIGNvbWJvLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxidXR0b24gKGNsaWNrKT1cImNvbWJvLnRvZ2dsZSgpXCI+VG9nZ2xlIENvbWJvPC9idXR0b24+XG4gICAgICogPGlneC1jb21ibyAjY29tYm8+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3ZlcmxheVNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fb3ZlcmxheVNldHRpbmdzLCB0aGlzLm92ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuZHJvcGRvd24udG9nZ2xlKG92ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBtZXRob2QgdGhhdCBvcGVucyB0aGUgY29tYm8uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGJ1dHRvbiAoY2xpY2spPVwiY29tYm8ub3BlbigpXCI+T3BlbiBDb21ibzwvYnV0dG9uPlxuICAgICAqIDxpZ3gtY29tYm8gI2NvbWJvPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvdmVybGF5U2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9vdmVybGF5U2V0dGluZ3MsIHRoaXMub3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5kcm9wZG93bi5vcGVuKG92ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBtZXRob2QgdGhhdCBjbG9zZXMgdGhlIGNvbWJvLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxidXR0b24gKGNsaWNrKT1cImNvbWJvLmNsb3NlKClcIj5DbG9zZSBDb21ibzwvYnV0dG9uPlxuICAgICAqIDxpZ3gtY29tYm8gI2NvbWJvPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kcm9wZG93bi5jbG9zZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbWJvIHZpZXdcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJpZ2dlckNoZWNrKCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBzZWxlY3RlZCBpdGVtc1xuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbXlTZWxlY3Rpb24gPSB0aGlzLmNvbWJvLnNlbGVjdGlvbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXQodGhpcy5pZCkpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgc3BlY2lmaWVkIGl0ZW1JRCBpcyBzZWxlY3RlZFxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0l0ZW1TZWxlY3RlZChpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5pc19pdGVtX3NlbGVjdGVkKHRoaXMuaWQsIGl0ZW0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBhZGRJdGVtVG9Db2xsZWN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhZGRlZEl0ZW0gPSB0aGlzLmRpc3BsYXlLZXkgPyB7XG4gICAgICAgICAgICBbdGhpcy52YWx1ZUtleV06IHRoaXMuc2VhcmNoVmFsdWUsXG4gICAgICAgICAgICBbdGhpcy5kaXNwbGF5S2V5XTogdGhpcy5zZWFyY2hWYWx1ZVxuICAgICAgICB9IDogdGhpcy5zZWFyY2hWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBLZXkpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYWRkZWRJdGVtLCB7IFt0aGlzLmdyb3VwS2V5XTogdGhpcy5kZWZhdWx0RmFsbGJhY2tHcm91cCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBleHBvc2Ugc2hhbGxvdyBjb3B5IGluc3RlYWQgb2YgdGhpcy5kYXRhIGluIGV2ZW50IGFyZ3Mgc28gdGhpcy5kYXRhIGNhbid0IGJlIG11dGF0ZWRcbiAgICAgICAgY29uc3Qgb2xkQ29sbGVjdGlvbiA9IFsuLi50aGlzLmRhdGFdO1xuICAgICAgICBjb25zdCBuZXdDb2xsZWN0aW9uID0gWy4uLnRoaXMuZGF0YSwgYWRkZWRJdGVtXTtcbiAgICAgICAgY29uc3QgYXJnczogSUNvbWJvSXRlbUFkZGl0aW9uRXZlbnQgPSB7XG4gICAgICAgICAgICBvbGRDb2xsZWN0aW9uLCBhZGRlZEl0ZW0sIG5ld0NvbGxlY3Rpb24sIG93bmVyOiB0aGlzLCBjYW5jZWw6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWRkaXRpb24uZW1pdChhcmdzKTtcbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhLnB1c2goYXJncy5hZGRlZEl0ZW0pO1xuICAgICAgICAvLyB0cmlnZ2VyIHJlLXJlbmRlclxuICAgICAgICB0aGlzLmRhdGEgPSBjbG9uZUFycmF5KHRoaXMuZGF0YSk7XG4gICAgICAgIHRoaXMuc2VsZWN0KHRoaXMudmFsdWVLZXkgIT09IG51bGwgJiYgdGhpcy52YWx1ZUtleSAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIFthcmdzLmFkZGVkSXRlbVt0aGlzLnZhbHVlS2V5XV0gOiBbYXJncy5hZGRlZEl0ZW1dLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuY3VzdG9tVmFsdWVGbGFnID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5kcm9wZG93bi5mb2N1c2VkSXRlbSA9IG51bGw7XG4gICAgICAgIHRoaXMudmlydERpci5zY3JvbGxUbygwKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgaXNBZGRCdXR0b25WaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBUaGlzIHNob3VsZCBhbHdheXMgcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZS4gSWYgdGhpcy5zZWFyY2hWYWx1ZSB3YXMgJycsIGl0IHJldHVybnMgJycgaW5zdGVhZCBvZiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoVmFsdWUgIT09ICcnICYmIHRoaXMuY3VzdG9tVmFsdWVGbGFnO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBoYW5kbGVJbnB1dENoYW5nZShldmVudD86IGFueSkge1xuICAgICAgICBpZiAoZXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgYXJnczogSUNvbWJvU2VhcmNoSW5wdXRFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoVGV4dDogdHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJyA/IGV2ZW50IDogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgIG93bmVyOiB0aGlzLFxuICAgICAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0VXBkYXRlLmVtaXQoYXJncyk7XG4gICAgICAgICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrTWF0Y2goKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyc1xuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVPcGVuaW5nKGU6IElCYXNlQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgYXJnczogSUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncyA9IHsgb3duZXI6IHRoaXMsIGV2ZW50OiBlLmV2ZW50LCBjYW5jZWw6IGUuY2FuY2VsIH07XG4gICAgICAgIHRoaXMub3BlbmluZy5lbWl0KGFyZ3MpO1xuICAgICAgICBlLmNhbmNlbCA9IGFyZ3MuY2FuY2VsO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBoYW5kbGVDbG9zaW5nKGU6IElCYXNlQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgYXJnczogSUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncyA9IHsgb3duZXI6IHRoaXMsIGV2ZW50OiBlLmV2ZW50LCBjYW5jZWw6IGUuY2FuY2VsIH07XG4gICAgICAgIHRoaXMuY2xvc2luZy5lbWl0KGFyZ3MpO1xuICAgICAgICBlLmNhbmNlbCA9IGFyZ3MuY2FuY2VsO1xuICAgICAgICBpZiAoZS5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgICAgIGlmICghZS5ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5jb21ib0lucHV0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgaGFuZGxlQ2xvc2VkKCkge1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KHsgb3duZXI6IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnIHx8IGV2ZW50LmtleSA9PT0gJ1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG9uQmx1cigpIHtcbiAgICAgICAgaWYgKHRoaXMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICYmIHRoaXMubmdDb250cm9sLmludmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkID0gSWd4Q29tYm9TdGF0ZS5JTlZBTElEO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkID0gSWd4Q29tYm9TdGF0ZS5JTklUSUFMO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHRvZ2dsZUNhc2VTZW5zaXRpdmUoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nT3B0aW9ucyA9IHsgY2FzZVNlbnNpdGl2ZTogIXRoaXMuZmlsdGVyaW5nT3B0aW9ucy5jYXNlU2Vuc2l0aXZlIH07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uU3RhdHVzQ2hhbmdlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCh0aGlzLm5nQ29udHJvbC5jb250cm9sLnRvdWNoZWQgfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5kaXJ0eSkgJiZcbiAgICAgICAgICAgICh0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvciB8fCB0aGlzLm5nQ29udHJvbC5jb250cm9sLmFzeW5jVmFsaWRhdG9yKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbGxhcHNlZCB8fCB0aGlzLmlucHV0R3JvdXAuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRoaXMubmdDb250cm9sLmludmFsaWQgPyBJZ3hDb21ib1N0YXRlLklOVkFMSUQgOiBJZ3hDb21ib1N0YXRlLlZBTElEO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkID0gdGhpcy5uZ0NvbnRyb2wuaW52YWxpZCA/IElneENvbWJvU3RhdGUuSU5WQUxJRCA6IElneENvbWJvU3RhdGUuSU5JVElBTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEIuUC4gMTggTWF5IDIwMjE6IElneERhdGVQaWNrZXIgZG9lcyBub3QgcmVzZXQgaXRzIHN0YXRlIHVwb24gcmVzZXRGb3JtICM5NTI2XG4gICAgICAgICAgICB0aGlzLnZhbGlkID0gSWd4Q29tYm9TdGF0ZS5JTklUSUFMO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFuYWdlUmVxdWlyZWRBc3RlcmlzaygpO1xuICAgIH07XG5cbiAgICAvKiogaWYgdGhlcmUgaXMgYSB2YWx1ZUtleSAtIG1hcCB0aGUga2V5cyB0byBkYXRhIGl0ZW1zLCBlbHNlIC0ganVzdCByZXR1cm4gdGhlIGtleXMgKi9cbiAgICBwcm90ZWN0ZWQgY29udmVydEtleXNUb0l0ZW1zKGtleXM6IGFueVtdKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbWJvQVBJLnZhbHVlS2V5ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1hcCBrZXlzIHZzLiBmaWx0ZXIgZGF0YSB0byByZXRhaW4gdGhlIG9yZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtc1xuICAgICAgICByZXR1cm4ga2V5cy5tYXAoa2V5ID0+IGlzTmFOdmFsdWUoa2V5KVxuICAgICAgICAgICAgPyB0aGlzLmRhdGEuZmluZChlbnRyeSA9PiBpc05hTnZhbHVlKGVudHJ5W3RoaXMudmFsdWVLZXldKSlcbiAgICAgICAgICAgIDogdGhpcy5kYXRhLmZpbmQoZW50cnkgPT4gZW50cnlbdGhpcy52YWx1ZUtleV0gPT09IGtleSkpXG4gICAgICAgIC5maWx0ZXIoZSA9PiBlICE9PSB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja01hdGNoKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtTWF0Y2ggPSB0aGlzLmZpbHRlcmVkRGF0YS5zb21lKHRoaXMuZmluZE1hdGNoKTtcbiAgICAgICAgdGhpcy5jdXN0b21WYWx1ZUZsYWcgPSB0aGlzLmFsbG93Q3VzdG9tVmFsdWVzICYmICFpdGVtTWF0Y2g7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGZpbmRNYXRjaCA9IChlbGVtZW50OiBhbnkpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRpc3BsYXlLZXkgPyBlbGVtZW50W3RoaXMuZGlzcGxheUtleV0gOiBlbGVtZW50O1xuICAgICAgICByZXR1cm4gdmFsdWU/LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5zZWFyY2hWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIG1hbmFnZVJlcXVpcmVkQXN0ZXJpc2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgLy8gUnVuIHRoZSB2YWxpZGF0aW9uIHdpdGggZW1wdHkgb2JqZWN0IHRvIGNoZWNrIGlmIHJlcXVpcmVkIGlzIGVuYWJsZWQuXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvcih7fSBhcyBBYnN0cmFjdENvbnRyb2wpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRHcm91cC5pc1JlcXVpcmVkID0gZXJyb3IgJiYgZXJyb3IucmVxdWlyZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFAuTS4gMTggTWF5IDIwMjI6IElneENvbWJvJ3MgYXN0ZXJpc2sgbm90IHJlbW92ZWQgd2hlbiByZW1vdmluZyByZXF1aXJlZCB2YWxpZGF0b3IgZHluYW1pY2FsbHkgaW4gcmVhY3RpdmUgZm9ybSAjMTE1NDNcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0R3JvdXAuaXNSZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIENvbnRhaW5zIGtleS12YWx1ZSBwYWlycyBvZiB0aGUgc2VsZWN0ZWQgdmFsdWVLZXlzIGFuZCB0aGVpciByZXNwLiBkaXNwbGF5S2V5cyAqL1xuICAgIHByb3RlY3RlZCByZWdpc3RlclJlbW90ZUVudHJpZXMoaWRzOiBhbnlbXSwgYWRkID0gdHJ1ZSkge1xuICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmdldFZhbHVlRGlzcGxheVBhaXJzKGlkcyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW90ZVNlbGVjdGlvbltlbnRyeVt0aGlzLnZhbHVlS2V5XV0gPSBlbnRyeVt0aGlzLmRpc3BsYXlLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBpZHMpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fcmVtb3RlU2VsZWN0aW9uW2VudHJ5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBgaWQ6IGFueVtdYCByZXR1cm5zIGEgbWFwcGVkIGB7IFtjb21iby52YWx1ZUtleV06IGFueSwgW2NvbWJvLmRpc3BsYXlLZXldOiBhbnkgfVtdYFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRWYWx1ZURpc3BsYXlQYWlycyhpZHM6IGFueVtdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZmlsdGVyKGVudHJ5ID0+IGlkcy5pbmRleE9mKGVudHJ5W3RoaXMudmFsdWVLZXldKSA+IC0xKS5tYXAoZSA9PiAoe1xuICAgICAgICAgICAgW3RoaXMudmFsdWVLZXldOiBlW3RoaXMudmFsdWVLZXldLFxuICAgICAgICAgICAgW3RoaXMuZGlzcGxheUtleV06IGVbdGhpcy5kaXNwbGF5S2V5XVxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFJlbW90ZVNlbGVjdGlvbihuZXdTZWxlY3Rpb246IGFueVtdLCBvbGRTZWxlY3Rpb246IGFueVtdKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFuZXdTZWxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBJZiBuZXcgc2VsZWN0aW9uIGlzIGVtcHR5LCBjbGVhciBhbGwgaXRlbXNcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJSZW1vdGVFbnRyaWVzKG9sZFNlbGVjdGlvbiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbW92ZWRJdGVtcyA9IG9sZFNlbGVjdGlvbi5maWx0ZXIoZSA9PiBuZXdTZWxlY3Rpb24uaW5kZXhPZihlKSA8IDApO1xuICAgICAgICBjb25zdCBhZGRlZEl0ZW1zID0gbmV3U2VsZWN0aW9uLmZpbHRlcihlID0+IG9sZFNlbGVjdGlvbi5pbmRleE9mKGUpIDwgMCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJSZW1vdGVFbnRyaWVzKGFkZGVkSXRlbXMpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyUmVtb3RlRW50cmllcyhyZW1vdmVkSXRlbXMsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3JlbW90ZVNlbGVjdGlvbikubWFwKGUgPT4gdGhpcy5fcmVtb3RlU2VsZWN0aW9uW2VdKS5qb2luKCcsICcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXQgZmlsdGVyZWREYXRhKCk6IGFueVtdIHwgbnVsbDtcbiAgICBwdWJsaWMgYWJzdHJhY3Qgc2V0IGZpbHRlcmVkRGF0YSh2YWw6IGFueVtdIHwgbnVsbCk7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgaGFuZGxlT3BlbmVkKCk7XG4gICAgcHVibGljIGFic3RyYWN0IGZvY3VzU2VhcmNoSW5wdXQob3BlbmluZz86IGJvb2xlYW4pO1xuXG4gICAgcHVibGljIGFic3RyYWN0IHNlbGVjdChuZXdJdGVtOiBhbnkpOiB2b2lkO1xuICAgIHB1YmxpYyBhYnN0cmFjdCBzZWxlY3QobmV3SXRlbXM6IEFycmF5PGFueT4gfCBhbnksIGNsZWFyQ3VycmVudFNlbGVjdGlvbj86IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpOiB2b2lkO1xuXG4gICAgcHVibGljIGFic3RyYWN0IGRlc2VsZWN0KC4uLmFyZ3M6IFtdIHwgW2l0ZW1zOiBBcnJheTxhbnk+LCBldmVudD86IEV2ZW50XSk6IHZvaWQ7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3Qgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZDtcblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uOiBTZXQ8YW55PiwgZXZlbnQ/OiBFdmVudCk6IHZvaWQ7XG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZURpc3BsYXlUZXh0KG5ld1NlbGVjdGlvbjogYW55W10sIG9sZFNlbGVjdGlvbjogYW55W10pO1xufVxuIl19
1136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm8uY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaWduaXRldWktYW5ndWxhci9zcmMvbGliL2NvbWJvL2NvbWJvLmNvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsWUFBWSxFQUNaLFNBQVMsRUFHVCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBQ04sY0FBYyxFQUVkLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF5QyxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbEUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBMEIsTUFBTSx3QkFBd0IsQ0FBQztBQUV6RyxPQUFPLEVBQThCLFVBQVUsRUFBbUQsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BJLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBZSxpQkFBaUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXZGLE9BQU8sRUFBcUIsb0JBQW9CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFtQixNQUFNLHdCQUF3QixDQUFDO0FBR3ZHLE9BQU8sRUFDSCx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSxzQkFBc0IsRUFDNUUsdUJBQXVCLEVBQUUsdUJBQXVCLEVBQUUsMkJBQTJCLEVBQUUscUJBQXFCLEVBQUUsMkJBQTJCLEVBQ3BJLE1BQU0sb0JBQW9CLENBQUM7QUFLNUIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7O0FBRWhFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksY0FBYyxDQUFlLHdCQUF3QixDQUFDLENBQUM7QUErQjlGLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztBQUVoQjs7OztHQUlHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsQ0FBQyw4QkFBOEI7QUFFM0Qsd0JBQXdCO0FBQ3hCLE1BQU0sV0FBVyxHQUFHO0lBQ2hCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsSUFBSSxFQUFFLEVBQUU7SUFDUixPQUFPLEVBQUUsRUFBRTtDQUNkLENBQUM7QUFFRix3QkFBd0I7QUFDeEIsTUFBTSxDQUFOLElBQVksU0FLWDtBQUxELFdBQVksU0FBUztJQUNqQiw0QkFBZSxDQUFBO0lBQ2Ysb0NBQXVCLENBQUE7SUFDdkIsZ0NBQW1CLENBQUE7SUFDbkIsb0NBQXVCLENBQUE7QUFDM0IsQ0FBQyxFQUxXLFNBQVMsS0FBVCxTQUFTLFFBS3BCO0FBRUQsTUFBTSxDQUFOLElBQVksYUFhWDtBQWJELFdBQVksYUFBYTtJQUNyQjs7T0FFRztJQUNILHVEQUErQixDQUFBO0lBQy9COztPQUVHO0lBQ0gsbURBQTJCLENBQUE7SUFDM0I7O09BRUc7SUFDSCx1REFBK0IsQ0FBQTtBQUNuQyxDQUFDLEVBYlcsYUFBYSxLQUFiLGFBQWEsUUFheEI7QUFHRCxNQUFNLE9BQWdCLHFCQUFzQixTQUFRLGtCQUFrQjtJQXd4QmxFLFlBQ2MsVUFBc0IsRUFDdEIsR0FBc0IsRUFDdEIsZ0JBQXdDLEVBQ3hDLFFBQTRCLEVBQzVCLFlBQTRCLEVBQ2Esc0JBQThDLEVBQzdDLGVBQWtDLEVBQ2hFLFNBQW1CO1FBQ3pDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBUnBCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF3QjtRQUN4QyxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUM1QixpQkFBWSxHQUFaLFlBQVksQ0FBZ0I7UUFDYSwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzdDLG9CQUFlLEdBQWYsZUFBZSxDQUFtQjtRQUNoRSxjQUFTLEdBQVQsU0FBUyxDQUFVO1FBOXhCN0M7Ozs7Ozs7Ozs7OztXQVlHO1FBRUksdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7V0FlRztRQUVJLG9CQUFlLEdBQW9CLElBQUksQ0FBQztRQUUvQzs7Ozs7Ozs7Ozs7O1dBWUc7UUFHSSxPQUFFLEdBQUcsYUFBYSxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBbUJyQzs7Ozs7Ozs7Ozs7O1dBWUc7UUFFSSxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFvR2pDOzs7Ozs7Ozs7Ozs7V0FZRztRQUVJLGFBQVEsR0FBVyxJQUFJLENBQUM7UUFrRi9CLHdCQUF3QjtRQUVqQixhQUFRLEdBQUcsV0FBVyxDQUFDLENBQUMsb0RBQW9EO1FBRW5GLHdCQUF3QjtRQUVqQixTQUFJLEdBQUcsVUFBVSxDQUFDO1FBb0J6Qjs7Ozs7V0FLRztRQUVJLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFtQ3hCOzs7Ozs7V0FNRztRQUVJLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBbUMsQ0FBQztRQUVyRTs7Ozs7O1dBTUc7UUFFSSxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFbkQ7Ozs7OztXQU1HO1FBRUksWUFBTyxHQUFHLElBQUksWUFBWSxFQUFtQyxDQUFDO1FBRXJFOzs7Ozs7V0FNRztRQUVJLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUVuRDs7Ozs7O1dBTUc7UUFFSSxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQTJCLENBQUM7UUFFOUQ7Ozs7OztXQU1HO1FBRUksc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQThCLENBQUM7UUFFMUU7Ozs7OztXQU1HO1FBRUksZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBRXJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQW9CRztRQUVJLGlCQUFZLEdBQXFCLElBQUksQ0FBQztRQUU3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQW1CRztRQUVJLG1CQUFjLEdBQXFCLElBQUksQ0FBQztRQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQW1CRztRQUVJLG1CQUFjLEdBQXFCLElBQUksQ0FBQztRQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7V0FpQkc7UUFFSSx1QkFBa0IsR0FBcUIsSUFBSSxDQUFDO1FBRW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O1dBbUJHO1FBRUksb0JBQWUsR0FBcUIsSUFBSSxDQUFDO1FBRWhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O1dBbUJHO1FBRUksa0JBQWEsR0FBcUIsSUFBSSxDQUFDO1FBRTlDOzs7Ozs7Ozs7Ozs7Ozs7OztXQWlCRztRQUVJLHVCQUFrQixHQUFxQixJQUFJLENBQUM7UUFFbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7O1dBaUJHO1FBRUksc0JBQWlCLEdBQXFCLElBQUksQ0FBQztRQVVsRCx3QkFBd0I7UUFFakIsZ0JBQVcsR0FBaUMsSUFBSSxDQUFDO1FBVTlDLHNCQUFpQixHQUFlLElBQUksQ0FBQztRQTBJL0Msd0JBQXdCO1FBQ2pCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLHdCQUF3QjtRQUNqQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUN4Qix3QkFBd0I7UUFDakIseUJBQW9CLEdBQUcsT0FBTyxDQUFDO1FBQ3RDLHdCQUF3QjtRQUNqQixxQkFBZ0IsR0FBMkI7WUFDOUMsYUFBYSxFQUFFLEtBQUs7U0FDdkIsQ0FBQztRQUVRLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRW5CLHFCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUV0QixXQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUMvQixjQUFTLEdBQWMsSUFBSSxDQUFDO1FBQzVCLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBQzlCLHVCQUFrQixHQUFlLElBQUksQ0FBQztRQUN0QyxzQkFBaUIsR0FBcUIsSUFBSSxDQUFDO1FBRTdDLFVBQUssR0FBRyxJQUFJLENBQUM7UUFDYixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2YsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFFdkIsMkJBQXNCLEdBQXFCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztRQThROUQsb0JBQWUsR0FBRyxHQUFHLEVBQUU7WUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ2hFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUM3RSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRTtvQkFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztpQkFDckY7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztpQkFDdkY7YUFDSjtpQkFBTTtnQkFDSCxnRkFBZ0Y7Z0JBQ2hGLElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQzthQUN0QztZQUNELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2xDLENBQUMsQ0FBQztRQW9CUSxjQUFTLEdBQUcsQ0FBQyxPQUFZLEVBQVcsRUFBRTtZQUM1QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDbkUsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyRixDQUFDLENBQUM7SUFsU0YsQ0FBQztJQTNzQkQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsSUFDVyxjQUFjO1FBQ3JCLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDckUsT0FBTyxJQUFJLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDO1NBQzdDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFXLGNBQWMsQ0FBQyxHQUFXO1FBQ2pDLElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxJQUNXLFVBQVU7UUFDakIsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUM3RCxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDM0M7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQVcsVUFBVSxDQUFDLEdBQVc7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7SUFDM0IsQ0FBQztJQWtDRDs7Ozs7OztPQU9HO0lBQ0gsSUFDVyxJQUFJO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFXLElBQUksQ0FBQyxHQUFpQjtRQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFrQkQsSUFDVyxVQUFVLENBQUMsR0FBVztRQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSCxJQUFXLFVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQy9ELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFDVyxRQUFRLENBQUMsR0FBVztRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILElBQ1cscUJBQXFCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFXLHFCQUFxQixDQUFDLEdBQXFCO1FBQ2xELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxHQUFHLENBQUM7SUFDdEMsQ0FBQztJQW9CRCx3QkFBd0I7SUFDeEIsSUFDVyxZQUFZO1FBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLElBQ1csUUFBUTtRQUNmLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFDVyxRQUFRO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBV0Q7Ozs7OztPQU1HO0lBQ0gsSUFDVyxJQUFJO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksS0FBSyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUFXLElBQUksQ0FBQyxHQUFzQjtRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUNXLGVBQWU7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsc0JBQXNCLENBQUMsZUFBZSxDQUFDO1NBQ2xFO1FBQ0QsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDakMsQ0FBQztJQUNELElBQVcsZUFBZSxDQUFDLEtBQTRCO1FBQ25ELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQXVSRCx3QkFBd0I7SUFDeEIsSUFBVyxXQUFXO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBVyxXQUFXLENBQUMsR0FBVztRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztJQUM1QixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRO1lBQ2IsSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQzVDLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBVyxRQUFRO1FBQ2YsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQztTQUM1QjtRQUNELE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsS0FBSyxDQUFDLEtBQW9CO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsbUJBQW1CO1FBQzFCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUNEOzs7Ozs7O09BT0c7SUFDSCxJQUFXLG1CQUFtQixDQUFDLEtBQWtCO1FBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFBVyxTQUFTO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUFXLGNBQWM7UUFDckIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztJQUN2QyxDQUFDO0lBQ0Q7Ozs7Ozs7T0FPRztJQUNILElBQVcsY0FBYyxDQUFDLEtBQWE7UUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3hDLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBVyxRQUFRO1FBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDNUI7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLE9BQU8sRUFBRTtZQUN0QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7U0FDL0I7UUFDRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNsQyxDQUFDO0lBa0RELHdCQUF3QjtJQUdqQixXQUFXLENBQUMsS0FBWTtRQUMzQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsd0JBQXdCO0lBQ2pCLFFBQVE7UUFDWCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFZLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUNwRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUc7WUFDcEIsTUFBTSxFQUFFLGFBQWE7WUFDckIsY0FBYyxFQUFFLElBQUksc0JBQXNCLEVBQUU7WUFDNUMsZ0JBQWdCLEVBQUUsSUFBSSxvQkFBb0IsRUFBRTtZQUM1QyxLQUFLLEVBQUUsS0FBSztZQUNaLG1CQUFtQixFQUFFLElBQUk7WUFDekIsdUJBQXVCLEVBQUUsQ0FBQyxhQUE0QixDQUFDO1NBQzFELENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRCx3QkFBd0I7SUFDakIsZUFBZTtRQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbkMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1RixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFjLEVBQUUsRUFBRTtZQUNsRixNQUFNLFNBQVMsR0FBZ0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsd0JBQXdCO0lBQ2pCLFdBQVc7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLE1BQU07UUFDVCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksSUFBSTtRQUNQLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxLQUFLO1FBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZO1FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsU0FBUztRQUNoQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksY0FBYyxDQUFDLElBQVM7UUFDM0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsd0JBQXdCO0lBQ2pCLG1CQUFtQjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNuQixPQUFPO1NBQ1Y7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNoQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVztZQUNqQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVztTQUN0QyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztTQUM1RTtRQUNELHVGQUF1RjtRQUN2RixNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sSUFBSSxHQUE0QjtZQUNsQyxhQUFhLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLO1NBQ3RFLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDYixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0Isb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUM7WUFDL0QsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELHdCQUF3QjtJQUNqQixrQkFBa0I7UUFDckIseUdBQXlHO1FBQ3pHLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUMzRCxDQUFDO0lBRUQsd0JBQXdCO0lBQ2pCLGlCQUFpQixDQUFDLEtBQVc7UUFDaEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxHQUErQjtnQkFDckMsVUFBVSxFQUFFLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUs7Z0JBQ2xFLEtBQUssRUFBRSxJQUFJO2dCQUNYLE1BQU0sRUFBRSxLQUFLO2FBQ2hCLENBQUM7WUFDRixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDYixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzthQUMzQjtTQUNKO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGFBQWEsQ0FBQyxDQUFrQztRQUNuRCxNQUFNLElBQUksR0FBb0MsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzNCLENBQUM7SUFFRCx3QkFBd0I7SUFDakIsYUFBYSxDQUFDLENBQWtDO1FBQ25ELE1BQU0sSUFBSSxHQUFvQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdkIsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQ1YsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7WUFDVixJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUMxQztJQUNMLENBQUM7SUFFRCx3QkFBd0I7SUFDakIsWUFBWTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELHdCQUF3QjtJQUNqQixhQUFhLENBQUMsS0FBb0I7UUFDckMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLElBQUksRUFBRTtZQUMvQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFRCx3QkFBd0I7SUFDakIsZ0JBQWdCLENBQUMsRUFBTztRQUMzQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCx3QkFBd0I7SUFDakIsaUJBQWlCLENBQUMsRUFBTztRQUM1QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCx3QkFBd0I7SUFDakIsZ0JBQWdCLENBQUMsVUFBbUI7UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVELHdCQUF3QjtJQUNqQixPQUFPLENBQUMsS0FBWTtRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNqQjtJQUNMLENBQUM7SUFFRCx3QkFBd0I7SUFDakIsTUFBTTtRQUNULElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQzthQUN0QztpQkFBTTtnQkFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7YUFDdEM7U0FDSjtJQUNMLENBQUM7SUFFRCx3QkFBd0I7SUFDakIsbUJBQW1CO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNwRixDQUFDO0lBaUJELHVGQUF1RjtJQUM3RSxrQkFBa0IsQ0FBQyxJQUFXO1FBQ3BDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO1lBQ2pDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxxRUFBcUU7UUFDckUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUNsQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzNELENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7YUFDM0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFUyxVQUFVO1FBQ2hCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNoRSxDQUFDO0lBT1Msc0JBQXNCO1FBQzVCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtnQkFDbEMsd0VBQXdFO2dCQUN4RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBcUIsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQzthQUN4RDtpQkFBTTtnQkFDSCx5SEFBeUg7Z0JBQ3pILElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQzthQUN0QztTQUNKO0lBQ0wsQ0FBQztJQUVELHFGQUFxRjtJQUMzRSxxQkFBcUIsQ0FBQyxHQUFVLEVBQUUsR0FBRyxHQUFHLElBQUk7UUFDbEQsSUFBSSxHQUFHLEVBQUU7WUFDTCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakQsS0FBSyxNQUFNLEtBQUssSUFBSSxTQUFTLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN4RTtTQUNKO2FBQU07WUFDSCxLQUFLLE1BQU0sS0FBSyxJQUFJLEdBQUcsRUFBRTtnQkFDckIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdkM7U0FDSjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNPLG9CQUFvQixDQUFDLEdBQVU7UUFDckMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNqQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxZQUFtQixFQUFFLFlBQW1CO1FBQ2pFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ3RCLDZDQUE2QztZQUM3QyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hELE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFDRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVGLENBQUM7O2tIQXRuQ2lCLHFCQUFxQixtTEE4eEJmLG1CQUFtQiw2QkFDbkIsb0JBQW9CO3NHQS94QjFCLHFCQUFxQiw2b0NBd2J6QixxQkFBcUIsMkJBQVUsV0FBVyw4REF1QjFDLHVCQUF1QiwyQkFBVSxXQUFXLDhEQXVCNUMsdUJBQXVCLDJCQUFVLFdBQVcsa0VBcUI1QywyQkFBMkIsMkJBQVUsV0FBVywrREF1QmhELHdCQUF3QiwyQkFBVSxXQUFXLDZEQXVCN0Msc0JBQXNCLDJCQUFVLFdBQVcsa0VBcUIzQywyQkFBMkIsMkJBQVUsV0FBVyxpRUFxQmhELDBCQUEwQiwyQkFBVSxXQUFXLGtIQUk1QixzQkFBc0IsaUhBSXRCLGlCQUFpQixpTEFRdkMsaUJBQWlCLHdGQUdqQixpQkFBaUIsMkJBQVUsaUJBQWlCLGtQQU12QixXQUFXLG1IQUdiLFdBQVc7MkZBL21CdkIscUJBQXFCO2tCQUQxQyxTQUFTOzswQkEreEJELFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsbUJBQW1COzswQkFDdEMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUN2QyxRQUFROzRDQWh4Qk4sa0JBQWtCO3NCQUR4QixLQUFLO2dCQW9CQyxlQUFlO3NCQURyQixLQUFLO2dCQWtCQyxFQUFFO3NCQUZSLFdBQVc7dUJBQUMsU0FBUzs7c0JBQ3JCLEtBQUs7Z0JBa0JDLEtBQUs7c0JBRlgsV0FBVzt1QkFBQyxhQUFhOztzQkFDekIsS0FBSztnQkFpQkMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQWlCSyxjQUFjO3NCQUR4QixLQUFLO2dCQTBCSyxVQUFVO3NCQURwQixLQUFLO2dCQTBCQyxVQUFVO3NCQURoQixLQUFLO2dCQWlCQyxXQUFXO3NCQURqQixLQUFLO2dCQVlLLElBQUk7c0JBRGQsS0FBSztnQkFzQkMsUUFBUTtzQkFEZCxLQUFLO2dCQUlLLFVBQVU7c0JBRHBCLEtBQUs7Z0JBbUNLLFFBQVE7c0JBRGxCLEtBQUs7Z0JBNkJLLHFCQUFxQjtzQkFEL0IsS0FBSztnQkFnQkMsY0FBYztzQkFGcEIsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBSzVCLFFBQVE7c0JBRGQsV0FBVzt1QkFBQyxpQkFBaUI7Z0JBS3ZCLElBQUk7c0JBRFYsV0FBVzt1QkFBQyxXQUFXO2dCQUtiLFlBQVk7c0JBRHRCLFdBQVc7dUJBQUMsb0JBQW9CO2dCQU90QixRQUFRO3NCQURsQixXQUFXO3VCQUFDLG9CQUFvQjtnQkFPdEIsUUFBUTtzQkFEbEIsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBWXRCLFFBQVE7c0JBRGQsS0FBSztnQkFXSyxJQUFJO3NCQURkLEtBQUs7Z0JBZ0JLLGVBQWU7c0JBRHpCLEtBQUs7Z0JBbUJDLE9BQU87c0JBRGIsTUFBTTtnQkFXQSxNQUFNO3NCQURaLE1BQU07Z0JBV0EsT0FBTztzQkFEYixNQUFNO2dCQVdBLE1BQU07c0JBRFosTUFBTTtnQkFXQSxRQUFRO3NCQURkLE1BQU07Z0JBV0EsaUJBQWlCO3NCQUR2QixNQUFNO2dCQVdBLFdBQVc7c0JBRGpCLE1BQU07Z0JBeUJBLFlBQVk7c0JBRGxCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQXdCbkQsY0FBYztzQkFEcEIsWUFBWTt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBd0JyRCxjQUFjO3NCQURwQixZQUFZO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFzQnJELGtCQUFrQjtzQkFEeEIsWUFBWTt1QkFBQywyQkFBMkIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBd0J6RCxlQUFlO3NCQURyQixZQUFZO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkF3QnRELGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQXNCcEQsa0JBQWtCO3NCQUR4QixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFzQnpELGlCQUFpQjtzQkFEdkIsWUFBWTt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBS3hELFVBQVU7c0JBRGhCLFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBS2hFLFVBQVU7c0JBRGhCLFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSzNELFdBQVc7c0JBRGpCLFNBQVM7dUJBQUMsYUFBYTtnQkFLakIsc0JBQXNCO3NCQUQ1QixTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJcEMsT0FBTztzQkFEaEIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk3RCxpQkFBaUI7c0JBRDFCLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUkxQyxpQkFBaUI7c0JBRDFCLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUlqRCxlQUFlO3NCQUR4QixTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkF3TGxELFdBQVc7c0JBRmpCLFlBQVk7dUJBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUM1QyxZQUFZO3VCQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBEaXJlY3RpdmUsXG4gICAgRG9DaGVjayxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdGlvblRva2VuLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGNhc2VTZW5zaXRpdmUgfSBmcm9tICdAaWduaXRldWkvbWF0ZXJpYWwtaWNvbnMtZXh0ZW5kZWQnO1xuaW1wb3J0IHsgbm9vcCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGlzcGxheURlbnNpdHlCYXNlLCBEaXNwbGF5RGVuc2l0eVRva2VuLCBJRGlzcGxheURlbnNpdHlPcHRpb25zIH0gZnJvbSAnLi4vY29yZS9kaXNwbGF5RGVuc2l0eSc7XG5pbXBvcnQgeyBJZ3hTZWxlY3Rpb25BUElTZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9zZWxlY3Rpb24nO1xuaW1wb3J0IHsgQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MsIGNsb25lQXJyYXksIElCYXNlQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MsIElCYXNlRXZlbnRBcmdzLCBpc05hTnZhbHVlIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctc3RyYXRlZ3knO1xuaW1wb3J0IHsgSUZvck9mU3RhdGUsIElneEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hJY29uU2VydmljZSB9IGZyb20gJy4uL2ljb24vcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJZ3hJbnB1dEdyb3VwVHlwZSwgSUdYX0lOUFVUX0dST1VQX1RZUEUgfSBmcm9tICcuLi9pbnB1dC1ncm91cC9pbnB1dEdyb3VwVHlwZSc7XG5pbXBvcnQgeyBJZ3hJbnB1dERpcmVjdGl2ZSwgSWd4SW5wdXRHcm91cENvbXBvbmVudCwgSWd4SW5wdXRTdGF0ZSB9IGZyb20gJy4uL2lucHV0LWdyb3VwL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSwgQXV0b1Bvc2l0aW9uU3RyYXRlZ3ksIE92ZXJsYXlTZXR0aW5ncyB9IGZyb20gJy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHsgSWd4Q29tYm9Ecm9wRG93bkNvbXBvbmVudCB9IGZyb20gJy4vY29tYm8tZHJvcGRvd24uY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbWJvQVBJU2VydmljZSB9IGZyb20gJy4vY29tYm8uYXBpJztcbmltcG9ydCB7XG4gICAgSWd4Q29tYm9BZGRJdGVtRGlyZWN0aXZlLCBJZ3hDb21ib0NsZWFySWNvbkRpcmVjdGl2ZSwgSWd4Q29tYm9FbXB0eURpcmVjdGl2ZSxcbiAgICBJZ3hDb21ib0Zvb3RlckRpcmVjdGl2ZSwgSWd4Q29tYm9IZWFkZXJEaXJlY3RpdmUsIElneENvbWJvSGVhZGVySXRlbURpcmVjdGl2ZSwgSWd4Q29tYm9JdGVtRGlyZWN0aXZlLCBJZ3hDb21ib1RvZ2dsZUljb25EaXJlY3RpdmVcbn0gZnJvbSAnLi9jb21iby5kaXJlY3RpdmVzJztcbmltcG9ydCB7XG4gICAgSUNvbWJvRmlsdGVyaW5nT3B0aW9ucywgSUNvbWJvSXRlbUFkZGl0aW9uRXZlbnQsIElDb21ib1NlYXJjaElucHV0RXZlbnRBcmdzXG59IGZyb20gJy4vcHVibGljX2FwaSc7XG5pbXBvcnQgeyBJQ29tYm9SZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vY29tYm8tcmVzb3VyY2VzJztcbmltcG9ydCB7IEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vcmVzb3VyY2VzJztcblxuZXhwb3J0IGNvbnN0IElHWF9DT01CT19DT01QT05FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48SWd4Q29tYm9CYXNlPignSWd4Q29tYm9Db21wb25lbnRUb2tlbicpO1xuXG4vKiogQGhpZGRlbiBAaW50ZXJuYWwgVE9ETzogRXZhbHVhdGUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWd4Q29tYm9CYXNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGRhdGE6IGFueVtdIHwgbnVsbDtcbiAgICB2YWx1ZUtleTogc3RyaW5nO1xuICAgIGdyb3VwS2V5OiBzdHJpbmc7XG4gICAgaXNSZW1vdGU6IGJvb2xlYW47XG4gICAgZmlsdGVyZWREYXRhOiBhbnlbXSB8IG51bGw7XG4gICAgdG90YWxJdGVtQ291bnQ6IG51bWJlcjtcbiAgICBpdGVtc01heEhlaWdodDogbnVtYmVyO1xuICAgIGl0ZW1IZWlnaHQ6IG51bWJlcjtcbiAgICBzZWFyY2hWYWx1ZTogc3RyaW5nO1xuICAgIHNlYXJjaElucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuICAgIGNvbWJvSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gICAgb3BlbmVkOiBFdmVudEVtaXR0ZXI8SUJhc2VFdmVudEFyZ3M+O1xuICAgIG9wZW5pbmc6IEV2ZW50RW1pdHRlcjxDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncz47XG4gICAgY2xvc2luZzogRXZlbnRFbWl0dGVyPENhbmNlbGFibGVCcm93c2VyRXZlbnRBcmdzPjtcbiAgICBjbG9zZWQ6IEV2ZW50RW1pdHRlcjxJQmFzZUV2ZW50QXJncz47XG4gICAgZm9jdXNTZWFyY2hJbnB1dChvcGVuaW5nPzogYm9vbGVhbik6IHZvaWQ7XG4gICAgdHJpZ2dlckNoZWNrKCk6IHZvaWQ7XG4gICAgYWRkSXRlbVRvQ29sbGVjdGlvbigpOiB2b2lkO1xuICAgIGlzQWRkQnV0dG9uVmlzaWJsZSgpOiBib29sZWFuO1xuICAgIGhhbmRsZUlucHV0Q2hhbmdlKGV2ZW50Pzogc3RyaW5nKTogdm9pZDtcbiAgICBpc0l0ZW1TZWxlY3RlZChpdGVtSUQ6IGFueSk6IGJvb2xlYW47XG4gICAgc2VsZWN0KGl0ZW06IGFueSk6IHZvaWQ7XG4gICAgc2VsZWN0KGl0ZW1JRHM6IGFueVtdLCBjbGVhclNlbGVjdGlvbj86IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpOiB2b2lkO1xuICAgIGRlc2VsZWN0KC4uLmFyZ3M6IFtdIHwgW2l0ZW1JRHM6IGFueVtdLCBldmVudD86IEV2ZW50XSk6IHZvaWQ7XG59XG5cbmxldCBORVhUX0lEID0gMDtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgaXRlbXMgdGhhdCBzaG91bGQgYmUgaW4gdGhlIGNvbWJvJ3NcbiAqIGRyb3AtZG93biBsaXN0IGlmIG5vIGBbaXRlbXNNYXhIZWlnaHRdYCBpcyBzcGVjaWZpZWRcbiAqL1xuY29uc3QgaXRlbXNJbkNvbnRhaW5lciA9IDEwOyAvLyBUT0RPOiBtYWtlIHByaXZhdGUgcmVhZG9ubHlcblxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXG5jb25zdCBJdGVtSGVpZ2h0cyA9IHtcbiAgICBjb21mb3J0YWJsZTogNDAsXG4gICAgY29zeTogMzIsXG4gICAgY29tcGFjdDogMjgsXG59O1xuXG4vKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBlbnVtIERhdGFUeXBlcyB7XG4gICAgRU1QVFkgPSAnZW1wdHknLFxuICAgIFBSSU1JVElWRSA9ICdwcmltaXRpdmUnLFxuICAgIENPTVBMRVggPSAnY29tcGxleCcsXG4gICAgUFJJTUFSWUtFWSA9ICd2YWx1ZUtleSdcbn1cblxuZXhwb3J0IGVudW0gSWd4Q29tYm9TdGF0ZSB7XG4gICAgLyoqXG4gICAgICogQ29tYm8gd2l0aCBpbml0aWFsIHN0YXRlLlxuICAgICAqL1xuICAgIElOSVRJQUwgPSBJZ3hJbnB1dFN0YXRlLklOSVRJQUwsXG4gICAgLyoqXG4gICAgICogQ29tYm8gd2l0aCB2YWxpZCBzdGF0ZS5cbiAgICAgKi9cbiAgICBWQUxJRCA9IElneElucHV0U3RhdGUuVkFMSUQsXG4gICAgLyoqXG4gICAgICogQ29tYm8gd2l0aCBpbnZhbGlkIHN0YXRlLlxuICAgICAqL1xuICAgIElOVkFMSUQgPSBJZ3hJbnB1dFN0YXRlLklOVkFMSURcbn1cblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSWd4Q29tYm9CYXNlRGlyZWN0aXZlIGV4dGVuZHMgRGlzcGxheURlbnNpdHlCYXNlIGltcGxlbWVudHMgSWd4Q29tYm9CYXNlLCBPbkluaXQsIERvQ2hlY2ssXG4gICAgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB3aGV0aGVyIHRoZSBjYXNlU2Vuc2l0aXZlIGljb24gc2hvdWxkIGJlIHNob3duIGluIHRoZSBzZWFyY2ggaW5wdXRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib1Nob3dTZWFyY2hDYXNlSWNvbiA9IHRoaXMuY29tYm8uc2hvd1NlYXJjaENhc2VJY29uO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFtzaG93U2VhcmNoQ2FzZUljb25dPSd0cnVlJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93U2VhcmNoQ2FzZUljb24gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNldCBjdXN0b20gb3ZlcmxheSBzZXR0aW5ncyB0aGF0IGNvbnRyb2wgaG93IHRoZSBjb21ibydzIGxpc3Qgb2YgaXRlbXMgaXMgZGlzcGxheWVkLlxuICAgICAqIFNldDpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyBbb3ZlcmxheVNldHRpbmdzXSA9IFwiY3VzdG9tT3ZlcmxheVNldHRpbmdzXCI+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGNvbnN0IGN1c3RvbVNldHRpbmdzID0geyBwb3NpdGlvblN0cmF0ZWd5OiB7IHNldHRpbmdzOiB7IHRhcmdldDogbXlUYXJnZXQgfSB9IH07XG4gICAgICogIGNvbWJvLm92ZXJsYXlTZXR0aW5ncyA9IGN1c3RvbVNldHRpbmdzO1xuICAgICAqIGBgYFxuICAgICAqIEdldCBhbnkgY3VzdG9tIG92ZXJsYXkgc2V0dGluZ3MgdXNlZCBieSB0aGUgY29tYm86XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBjb25zdCBjb21ib092ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0gbXlDb21iby5vdmVybGF5U2V0dGluZ3M7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3MgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9nZXRzIGNvbWJvIGlkLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBpZCA9IHRoaXMuY29tYm8uaWQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2lkXT0nY29tYm8xJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlkID0gYGlneC1jb21iby0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3R5bGUgd2lkdGggb2YgdGhlIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib1dpZHRoID0gdGhpcy5jb21iby53aWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbd2lkdGhdPScyNTBweCc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgd2lkdGg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgY3VzdG9tIHZhbHVlcyBjYW4gYmUgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgY29tYm9BbGxvd3NDdXN0b21WYWx1ZXMgPSB0aGlzLmNvbWJvLmFsbG93Q3VzdG9tVmFsdWVzO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFthbGxvd0N1c3RvbVZhbHVlc109J3RydWUnPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFsbG93Q3VzdG9tVmFsdWVzID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBkcm9wIGRvd24gbGlzdCBoZWlnaHRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib0l0ZW1zTWF4SGVpZ2h0ID0gdGhpcy5jb21iby5pdGVtc01heEhlaWdodDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbaXRlbXNNYXhIZWlnaHRdPSczMjAnPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBpdGVtc01heEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5faXRlbXNNYXhIZWlnaHQgPT09IG51bGwgfHwgdGhpcy5faXRlbXNNYXhIZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbUhlaWdodCAqIGl0ZW1zSW5Db250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zTWF4SGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaXRlbXNNYXhIZWlnaHQodmFsOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5faXRlbXNNYXhIZWlnaHQgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgZHJvcCBkb3duIGxpc3QgaXRlbSBoZWlnaHRcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib0l0ZW1IZWlnaHQgPSB0aGlzLmNvbWJvLml0ZW1IZWlnaHQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2l0ZW1IZWlnaHRdPSczMic+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGl0ZW1IZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuX2l0ZW1IZWlnaHQgPT09IG51bGwgfHwgdGhpcy5faXRlbUhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gSXRlbUhlaWdodHNbdGhpcy5kaXNwbGF5RGVuc2l0eV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1IZWlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBpdGVtSGVpZ2h0KHZhbDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1IZWlnaHQgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB0aGUgZHJvcCBkb3duIGxpc3Qgd2lkdGhcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgbXlDb21ib0l0ZW1zV2lkdGggPSB0aGlzLmNvbWJvLml0ZW1zV2lkdGg7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2l0ZW1zV2lkdGhdID0gJ1wiMTgwcHhcIic+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaXRlbXNXaWR0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUgZm9yIHRoZSBjb21ibyB2YWx1ZSBmaWVsZFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvUGxhY2Vob2xkZXIgPSB0aGlzLmNvbWJvLnBsYWNlaG9sZGVyO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFtwbGFjZWhvbGRlcl09J25ld1BsYWNlSG9sZGVyJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29tYm8gZGF0YSBzb3VyY2UuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2RhdGFdPSdpdGVtcyc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRhdGEoKTogYW55W10gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZGF0YSh2YWw6IGFueVtdIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9kYXRhID0gKHZhbCkgPyB2YWwgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHdoaWNoIGNvbHVtbiBpbiB0aGUgZGF0YSBzb3VyY2UgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHZhbHVlLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvVmFsdWVLZXkgPSB0aGlzLmNvbWJvLnZhbHVlS2V5O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS1zZXQtLT5cbiAgICAgKiA8aWd4LWNvbWJvIFt2YWx1ZUtleV09J215S2V5Jz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2YWx1ZUtleTogc3RyaW5nID0gbnVsbDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBkaXNwbGF5S2V5KHZhbDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlLZXkgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGljaCBjb2x1bW4gaW4gdGhlIGRhdGEgc291cmNlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkaXNwbGF5IHZhbHVlLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteUNvbWJvRGlzcGxheUtleSA9IHRoaXMuY29tYm8uZGlzcGxheUtleTtcbiAgICAgKlxuICAgICAqIC8vIHNldFxuICAgICAqIHRoaXMuY29tYm8uZGlzcGxheUtleSA9ICd2YWwnO1xuICAgICAqXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLXNldC0tPlxuICAgICAqIDxpZ3gtY29tYm8gW2Rpc3BsYXlLZXldPSdteURpc3BsYXlLZXknPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGlzcGxheUtleSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlLZXkgPyB0aGlzLl9kaXNwbGF5S2V5IDogdGhpcy52YWx1ZUtleTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaXRlbSBwcm9wZXJ0eSBieSB3aGljaCBpdGVtcyBzaG91bGQgYmUgZ3JvdXBlZCBpbnNpZGUgdGhlIGl0ZW1zIGxpc3QuIE5vdCB1c2FibGUgaWYgZGF0YSBpcyBub3Qgb2YgdHlwZSBPYmplY3RbXS5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tc2V0LS0+XG4gICAgICogPGlneC1jb21ibyBbZ3JvdXBLZXldPSduZXdHcm91cEtleSc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGdyb3VwS2V5KHZhbDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2dyb3VwS2V5ID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBpdGVtIHByb3BlcnR5IGJ5IHdoaWNoIGl0ZW1zIHNob3VsZCBiZSBncm91cGVkIGluc2lkZSB0aGUgaXRlbXMgbGlzdC4gTm90IHVzYWJsZSBpZiBkYXRhIGlzIG5vdCBvZiB0eXBlIE9iamVjdFtdLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBjdXJyZW50R3JvdXBLZXkgPSB0aGlzLmNvbWJvLmdyb3VwS2V5O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ3JvdXBLZXkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VwS2V5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldHMgZ3JvdXBzIHNvcnRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIFtncm91cFNvcnRpbmdEaXJlY3Rpb25dPVwiZ3JvdXBTb3J0aW5nRGlyZWN0aW9uXCI+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHB1YmxpYyBncm91cFNvcnRpbmdEaXJlY3Rpb24gPSBTb3J0aW5nRGlyZWN0aW9uLkFzYztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZ3JvdXBTb3J0aW5nRGlyZWN0aW9uKCk6IFNvcnRpbmdEaXJlY3Rpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdXBTb3J0aW5nRGlyZWN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGdyb3VwU29ydGluZ0RpcmVjdGlvbih2YWw6IFNvcnRpbmdEaXJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fZ3JvdXBTb3J0aW5nRGlyZWN0aW9uID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSB0aGF0IHNldCBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gW2FyaWFMYWJlbGxlZEJ5XT1cIidsYWJlbDEnXCI+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbGxlZGJ5JylcbiAgICBwdWJsaWMgYXJpYUxhYmVsbGVkQnk6IHN0cmluZztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNvbWJvJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWNvbWJvJzsgLy8gSW5kZXBlbmRlbnQgb2YgZGlzcGxheSBkZW5zaXR5IGZvciB0aGUgdGltZSBiZWluZ1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKGBhdHRyLnJvbGVgKVxuICAgIHB1YmxpYyByb2xlID0gJ2NvbWJvYm94JztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWV4cGFuZGVkJylcbiAgICBwdWJsaWMgZ2V0IGFyaWFFeHBhbmRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRyb3Bkb3duLmNvbGxhcHNlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1oYXNwb3B1cCcpXG4gICAgcHVibGljIGdldCBoYXNQb3BVcCgpIHtcbiAgICAgICAgcmV0dXJuICdsaXN0Ym94JztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1vd25zJylcbiAgICBwdWJsaWMgZ2V0IGFyaWFPd25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wZG93bi5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBlbmFibGVkL2Rpc2FibGVzIGNvbWJvLiBUaGUgZGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIFtkaXNhYmxlZF09XCIndHJ1ZSdcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyBob3cgdGhlIGNvbWJvIHdpbGwgYmUgc3R5bGVkLlxuICAgICAqIFRoZSBhbGxvd2VkIHZhbHVlcyBhcmUgYGxpbmVgLCBgYm94YCwgYGJvcmRlcmAgYW5kIGBzZWFyY2hgLiBUaGUgZGVmYXVsdCBpcyBgYm94YC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyBbdHlwZV09XCInbGluZSdcIj5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdHlwZSgpOiBJZ3hJbnB1dEdyb3VwVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlIHx8IHRoaXMuX2lucHV0R3JvdXBUeXBlIHx8ICdib3gnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdHlwZSh2YWw6IElneElucHV0R3JvdXBUeXBlKSB7XG4gICAgICAgIHRoaXMuX3R5cGUgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgRU4gcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByZXNvdXJjZVN0cmluZ3MoKTogSUNvbWJvUmVzb3VyY2VTdHJpbmdzIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc291cmNlU3RyaW5ncyA9IEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MuQ29tYm9SZXNTdHJpbmdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVN0cmluZ3M7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgcmVzb3VyY2VTdHJpbmdzKHZhbHVlOiBJQ29tYm9SZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgdGhlIGRyb3Bkb3duIGlzIG9wZW5lZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gb3BlbmluZz0naGFuZGxlT3BlbmluZygkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3BlbmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGRyb3Bkb3duIGlzIG9wZW5lZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gKG9wZW5lZCk9J2hhbmRsZU9wZW5lZCgkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjxJQmFzZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHRoZSBkcm9wZG93biBpcyBjbG9zZWRcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIChjbG9zaW5nKT0naGFuZGxlQ2xvc2luZygkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2xvc2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGRyb3Bkb3duIGlzIGNsb3NlZFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29tYm8gKGNsb3NlZCk9J2hhbmRsZUNsb3NlZCgkZXZlbnQpJz48L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJQmFzZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhbiBpdGVtIGlzIGJlaW5nIGFkZGVkIHRvIHRoZSBkYXRhIGNvbGxlY3Rpb25cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbWJvIChhZGRpdGlvbik9J2hhbmRsZUFkZGl0aW9uRXZlbnQoJGV2ZW50KSc+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGFkZGl0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29tYm9JdGVtQWRkaXRpb25FdmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIHNlYXJjaCBpbnB1dCBjaGFuZ2VzIChlLmcuIHR5cGluZywgcGFzdGluZywgY2xlYXIsIGV0Yy4pXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyAoc2VhcmNoSW5wdXRVcGRhdGUpPSdoYW5kbGVTZWFyY2hJbnB1dEV2ZW50KCRldmVudCknPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzZWFyY2hJbnB1dFVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbWJvU2VhcmNoSW5wdXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gbmV3IGNodW5rIG9mIGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIHZpcnR1YWxpemF0aW9uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb21ibyAoZGF0YVByZUxvYWQpPSdoYW5kbGVEYXRhUHJlbG9hZEV2ZW50KCRldmVudCknPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkYXRhUHJlTG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUZvck9mU3RhdGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgSVRFTVMgaW4gdGhlIGNvbWJvIGxpc3RcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5jb21iby5pdGVtVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9JdGVtIGxldC1pdGVtIGxldC1rZXk9XCJ2YWx1ZUtleVwiPlxuICAgICAqICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20taXRlbVwiPlxuICAgICAqICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWl0ZW1fX25hbWVcIj57eyBpdGVtW2tleV0gfX08L2Rpdj5cbiAgICAgKiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1pdGVtX19jb3N0XCI+e3sgaXRlbS5jb3N0IH19PC9kaXY+XG4gICAgICogICAgICAgICAgPC9kaXY+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENvbWJvSXRlbURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBpdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBIRUFERVIgZm9yIHRoZSBjb21ibyBpdGVtcyBsaXN0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8uaGVhZGVyVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9IZWFkZXI+XG4gICAgICogICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvX19oZWFkZXJcIj5cbiAgICAgKiAgICAgICAgICAgICAgVGhpcyBpcyBhIGN1c3RvbSBoZWFkZXJcbiAgICAgKiAgICAgICAgICA8L2Rpdj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9IZWFkZXJEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgaGVhZGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBGT09URVIgZm9yIHRoZSBjb21ibyBpdGVtcyBsaXN0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8uZm9vdGVyVGVtcGxhdGUgPSBteUN1c3RvbVRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8IS0tIFNldCBpbiBtYXJrdXAgLS0+XG4gICAgICogIDxpZ3gtY29tYm8gI2NvbWJvPlxuICAgICAqICAgICAgLi4uXG4gICAgICogICAgICA8bmctdGVtcGxhdGUgaWd4Q29tYm9Gb290ZXI+XG4gICAgICogICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvX19mb290ZXJcIj5cbiAgICAgKiAgICAgICAgICAgICAgVGhpcyBpcyBhIGN1c3RvbSBmb290ZXJcbiAgICAgKiAgICAgICAgICA8L2Rpdj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9Gb290ZXJEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgZm9vdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIEhFQURFUiBJVEVNUyBmb3IgZ3JvdXBzIGluIHRoZSBjb21ibyBsaXN0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8uaGVhZGVySXRlbVRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvSGVhZGVySXRlbSBsZXQtaXRlbSBsZXQta2V5PVwiZ3JvdXBLZXlcIj5cbiAgICAgKiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWl0ZW0tLWdyb3VwXCI+R3JvdXAgaGVhZGVyIGZvciB7eyBpdGVtW2tleV0gfX08L2Rpdj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9IZWFkZXJJdGVtRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGhlYWRlckl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIEFERCBCVVRUT04gaW4gdGhlIGNvbWJvIGRyb3AgZG93blxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIFNldCBpbiB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG15Q29tcG9uZW50LmN1c3RvbVRlbXBsYXRlO1xuICAgICAqIG15Q29tcG9uZW50LmNvbWJvLmFkZEl0ZW1UZW1wbGF0ZSA9IG15Q3VzdG9tVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDwhLS0gU2V0IGluIG1hcmt1cCAtLT5cbiAgICAgKiAgPGlneC1jb21ibyAjY29tYm8+XG4gICAgICogICAgICAuLi5cbiAgICAgKiAgICAgIDxuZy10ZW1wbGF0ZSBpZ3hDb21ib0FkZEl0ZW0+XG4gICAgICogICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbWJvX19hZGQtYnV0dG9uXCI+XG4gICAgICogICAgICAgICAgICAgIENsaWNrIHRvIGFkZCBpdGVtXG4gICAgICogICAgICAgICAgPC9idXR0b24+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENvbWJvQWRkSXRlbURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBhZGRJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBBREQgQlVUVE9OIGluIHRoZSBjb21ibyBkcm9wIGRvd25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBTZXQgaW4gdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG15Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBteUNvbXBvbmVudC5jdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBteUNvbXBvbmVudC5jb21iby5lbXB0eVRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvRW1wdHk+XG4gICAgICogICAgICAgICAgPGRpdiBjbGFzcz1cImNvbWJvLS1lbXB0eVwiPlxuICAgICAqICAgICAgICAgICAgICBUaGVyZSBhcmUgbm8gaXRlbXMgdG8gZGlzcGxheVxuICAgICAqICAgICAgICAgIDwvZGl2PlxuICAgICAqICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiAgPC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hDb21ib0VtcHR5RGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGVtcHR5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSBjb21ibyBUT0dHTEUob3Blbi9jbG9zZSkgYnV0dG9uXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gU2V0IGluIHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBteUN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbXlDb21wb25lbnQuY3VzdG9tVGVtcGxhdGU7XG4gICAgICogbXlDb21wb25lbnQuY29tYm8udG9nZ2xlSWNvblRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvVG9nZ2xlSWNvbiBsZXQtY29sbGFwc2VkPlxuICAgICAqICAgICAgICAgIDxpZ3gtaWNvbj57eyBjb2xsYXBzZWQgPyAncmVtb3ZlX2NpcmNsZScgOiAncmVtb3ZlX2NpcmNsZV9vdXRsaW5lJ319PC9pZ3gtaWNvbj5cbiAgICAgKiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogIDwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q29tYm9Ub2dnbGVJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHRvZ2dsZUljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIGNvbWJvIENMRUFSIGJ1dHRvblxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIFNldCBpbiB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiA9IG15Q29tcG9uZW50LmN1c3RvbVRlbXBsYXRlO1xuICAgICAqIG15Q29tcG9uZW50LmNvbWJvLmNsZWFySWNvblRlbXBsYXRlID0gbXlDdXN0b21UZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPCEtLSBTZXQgaW4gbWFya3VwIC0tPlxuICAgICAqICA8aWd4LWNvbWJvICNjb21ibz5cbiAgICAgKiAgICAgIC4uLlxuICAgICAqICAgICAgPG5nLXRlbXBsYXRlIGlneENvbWJvQ2xlYXJJY29uPlxuICAgICAqICAgICAgICAgIDxpZ3gtaWNvbj5jbGVhcjwvaWd4LWljb24+XG4gICAgICogICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAqICA8L2lneC1jb21ibz5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENvbWJvQ2xlYXJJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGNsZWFySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+ID0gbnVsbDtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lucHV0R3JvdXAnLCB7IHJlYWQ6IElneElucHV0R3JvdXBDb21wb25lbnQsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBpbnB1dEdyb3VwOiBJZ3hJbnB1dEdyb3VwQ29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZCgnY29tYm9JbnB1dCcsIHsgcmVhZDogSWd4SW5wdXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBjb21ib0lucHV0OiBJZ3hJbnB1dERpcmVjdGl2ZTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0JylcbiAgICBwdWJsaWMgc2VhcmNoSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4gPSBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hGb3JPZkRpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbENvbnRhaW5lcjogSWd4Rm9yT2ZEaXJlY3RpdmU8YW55PjtcblxuICAgIEBWaWV3Q2hpbGQoSWd4Rm9yT2ZEaXJlY3RpdmUsIHsgcmVhZDogSWd4Rm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCB2aXJ0RGlyOiBJZ3hGb3JPZkRpcmVjdGl2ZTxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnZHJvcGRvd25JdGVtQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZHJvcGRvd25Db250YWluZXI6IEVsZW1lbnRSZWYgPSBudWxsO1xuXG4gICAgQFZpZXdDaGlsZCgncHJpbWl0aXZlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIHByaW1pdGl2ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQFZpZXdDaGlsZCgnY29tcGxleCcsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBjb21wbGV4VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHNlYXJjaFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hWYWx1ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBzZWFyY2hWYWx1ZSh2YWw6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbHRlclZhbHVlID0gdmFsO1xuICAgICAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHZhbDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUmVtb3RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b3RhbEl0ZW1Db3VudCA+IDAgJiZcbiAgICAgICAgICAgIHRoaXMudmFsdWVLZXkgJiZcbiAgICAgICAgICAgIHRoaXMuZGF0YVR5cGUgPT09IERhdGFUeXBlcy5DT01QTEVYO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheUtleSkge1xuICAgICAgICAgICAgcmV0dXJuIERhdGFUeXBlcy5DT01QTEVYO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEYXRhVHlwZXMuUFJJTUlUSVZFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgaWYgY29udHJvbCBpcyB2YWxpZCwgd2hlbiB1c2VkIGluIGEgZm9ybVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCB2YWxpZCA9IHRoaXMuY29tYm8udmFsaWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWxpZCgpOiBJZ3hDb21ib1N0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgaWYgY29udHJvbCBpcyB2YWxpZCwgd2hlbiB1c2VkIGluIGEgZm9ybVxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHNldFxuICAgICAqIHRoaXMuY29tYm8udmFsaWQgPSBJZ3hDb21ib1N0YXRlLklOVkFMSUQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCB2YWxpZCh2YWxpZDogSWd4Q29tYm9TdGF0ZSkge1xuICAgICAgICB0aGlzLl92YWxpZCA9IHZhbGlkO1xuICAgICAgICB0aGlzLmNvbWJvSW5wdXQudmFsaWQgPSBJZ3hJbnB1dFN0YXRlW0lneENvbWJvU3RhdGVbdmFsaWRdXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGNvbWJvIGlucHV0XG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IGNvbWJvVmFsdWUgPSB0aGlzLmNvbWJvLnZhbHVlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZpcnR1YWxpemVkIGRhdGEuIEl0IGNvbnRhaW5zIGBzdGFydEluZGV4YCBhbmQgYGNodW5rU2l6ZWBcbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXRcbiAgICAgKiBsZXQgc3RhdGUgPSB0aGlzLmNvbWJvLnZpcnR1YWxpemF0aW9uU3RhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB2aXJ0dWFsaXphdGlvblN0YXRlKCk6IElGb3JPZlN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlydERpci5zdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmlydHVhbGl6ZWQgZGF0YS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBzZXRcbiAgICAgKiB0aGlzLmNvbWJvLnZpcnR1YWxpemF0aW9uU3RhdGUoc3RhdGUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdmlydHVhbGl6YXRpb25TdGF0ZShzdGF0ZTogSUZvck9mU3RhdGUpIHtcbiAgICAgICAgdGhpcy52aXJ0RGlyLnN0YXRlID0gc3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBkcm9wIGRvd24gc3RhdGUuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN0YXRlID0gdGhpcy5jb21iby5jb2xsYXBzZWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyb3Bkb3duLmNvbGxhcHNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRvdGFsIGNvdW50IG9mIHRoZSB2aXJ0dWFsIGRhdGEgaXRlbXMsIHdoZW4gdXNpbmcgcmVtb3RlIHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IGNvdW50ID0gdGhpcy5jb21iby50b3RhbEl0ZW1Db3VudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsSXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpcnREaXIudG90YWxJdGVtQ291bnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdG90YWwgY291bnQgb2YgdGhlIHZpcnR1YWwgZGF0YSBpdGVtcywgd2hlbiB1c2luZyByZW1vdGUgc2VydmljZS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBzZXRcbiAgICAgKiB0aGlzLmNvbWJvLnRvdGFsSXRlbUNvdW50KHJlbW90ZVNlcnZpY2UuY291bnQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdG90YWxJdGVtQ291bnQoY291bnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnZpcnREaXIudG90YWxJdGVtQ291bnQgPSBjb3VudDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICB0aGlzLl9kYXRhVHlwZSA9IHRoaXMuZGF0YVR5cGU7XG4gICAgICAgIGlmICh0aGlzLml0ZW1UZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbVRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kYXRhVHlwZSA9PT0gRGF0YVR5cGVzLkNPTVBMRVgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBsZXhUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wcmltaXRpdmVUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgY3VzdG9tVmFsdWVGbGFnID0gdHJ1ZTtcbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZmlsdGVyVmFsdWUgPSAnJztcbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZGVmYXVsdEZhbGxiYWNrR3JvdXAgPSAnT3RoZXInO1xuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBmaWx0ZXJpbmdPcHRpb25zOiBJQ29tYm9GaWx0ZXJpbmdPcHRpb25zID0ge1xuICAgICAgICBjYXNlU2Vuc2l0aXZlOiBmYWxzZVxuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgX2RhdGEgPSBbXTtcbiAgICBwcm90ZWN0ZWQgX3ZhbHVlID0gJyc7XG4gICAgcHJvdGVjdGVkIF9ncm91cEtleSA9ICcnO1xuICAgIHByb3RlY3RlZCBfc2VhcmNoVmFsdWUgPSAnJztcbiAgICBwcm90ZWN0ZWQgX2ZpbHRlcmVkRGF0YSA9IFtdO1xuICAgIHByb3RlY3RlZCBfZGlzcGxheUtleTogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfcmVtb3RlU2VsZWN0aW9uID0ge307XG4gICAgcHJvdGVjdGVkIF9yZXNvdXJjZVN0cmluZ3M7XG4gICAgcHJvdGVjdGVkIF92YWxpZCA9IElneENvbWJvU3RhdGUuSU5JVElBTDtcbiAgICBwcm90ZWN0ZWQgbmdDb250cm9sOiBOZ0NvbnRyb2wgPSBudWxsO1xuICAgIHByb3RlY3RlZCBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcm90ZWN0ZWQgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgICBwcm90ZWN0ZWQgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuXG4gICAgcHJpdmF0ZSBfdHlwZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZGF0YVR5cGUgPSAnJztcbiAgICBwcml2YXRlIF9pdGVtSGVpZ2h0ID0gbnVsbDtcbiAgICBwcml2YXRlIF9pdGVtc01heEhlaWdodCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfb3ZlcmxheVNldHRpbmdzOiBPdmVybGF5U2V0dGluZ3M7XG4gICAgcHJpdmF0ZSBfZ3JvdXBTb3J0aW5nRGlyZWN0aW9uOiBTb3J0aW5nRGlyZWN0aW9uID0gU29ydGluZ0RpcmVjdGlvbi5Bc2M7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgZHJvcGRvd246IElneENvbWJvRHJvcERvd25Db21wb25lbnQ7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3Qgc2VsZWN0aW9uQ2hhbmdpbmc6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIHNlbGVjdGlvblNlcnZpY2U6IElneFNlbGVjdGlvbkFQSVNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBjb21ib0FQSTogSWd4Q29tYm9BUElTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX2ljb25TZXJ2aWNlOiBJZ3hJY29uU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEaXNwbGF5RGVuc2l0eVRva2VuKSBwcm90ZWN0ZWQgX2Rpc3BsYXlEZW5zaXR5T3B0aW9uczogSURpc3BsYXlEZW5zaXR5T3B0aW9ucyxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChJR1hfSU5QVVRfR1JPVVBfVFlQRSkgcHJvdGVjdGVkIF9pbnB1dEdyb3VwVHlwZTogSWd4SW5wdXRHcm91cFR5cGUsXG4gICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uQXJyb3dEb3duJywgWyckZXZlbnQnXSlcbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLkFsdC5BcnJvd0Rvd24nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkFycm93RG93bihldmVudDogRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLl9pbmplY3Rvci5nZXQ8TmdDb250cm9sPihOZ0NvbnRyb2wsIG51bGwpO1xuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0RWxlbWVudCxcbiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IEF1dG9Qb3NpdGlvblN0cmF0ZWd5KCksXG4gICAgICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlLFxuICAgICAgICAgICAgZXhjbHVkZUZyb21PdXRzaWRlQ2xpY2s6IFt0YXJnZXRFbGVtZW50IGFzIEhUTUxFbGVtZW50XVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2V0KHRoaXMuaWQsIG5ldyBTZXQoKSk7XG4gICAgICAgIHRoaXMuX2ljb25TZXJ2aWNlLmFkZFN2Z0ljb25Gcm9tVGV4dChjYXNlU2Vuc2l0aXZlLm5hbWUsIGNhc2VTZW5zaXRpdmUudmFsdWUsICdpbXgtaWNvbnMnKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IFsuLi50aGlzLmRhdGFdO1xuXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wuc3RhdHVzQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHRoaXMub25TdGF0dXNDaGFuZ2VkKTtcbiAgICAgICAgICAgIHRoaXMubWFuYWdlUmVxdWlyZWRBc3RlcmlzaygpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlydERpci5jaHVua1ByZWxvYWQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZTogSUZvck9mU3RhdGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUZvck9mU3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBlLCB7IG93bmVyOiB0aGlzIH0pO1xuICAgICAgICAgICAgdGhpcy5kYXRhUHJlTG9hZC5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5jb21ib0FQSS5jbGVhcigpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXIodGhpcy5pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBtZXRob2QgdGhhdCBvcGVucy9jbG9zZXMgdGhlIGNvbWJvLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxidXR0b24gKGNsaWNrKT1cImNvbWJvLnRvZ2dsZSgpXCI+VG9nZ2xlIENvbWJvPC9idXR0b24+XG4gICAgICogPGlneC1jb21ibyAjY29tYm8+PC9pZ3gtY29tYm8+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3ZlcmxheVNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fb3ZlcmxheVNldHRpbmdzLCB0aGlzLm92ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuZHJvcGRvd24udG9nZ2xlKG92ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBtZXRob2QgdGhhdCBvcGVucyB0aGUgY29tYm8uXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGJ1dHRvbiAoY2xpY2spPVwiY29tYm8ub3BlbigpXCI+T3BlbiBDb21ibzwvYnV0dG9uPlxuICAgICAqIDxpZ3gtY29tYm8gI2NvbWJvPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvdmVybGF5U2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9vdmVybGF5U2V0dGluZ3MsIHRoaXMub3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5kcm9wZG93bi5vcGVuKG92ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBtZXRob2QgdGhhdCBjbG9zZXMgdGhlIGNvbWJvLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxidXR0b24gKGNsaWNrKT1cImNvbWJvLmNsb3NlKClcIj5DbG9zZSBDb21ibzwvYnV0dG9uPlxuICAgICAqIDxpZ3gtY29tYm8gI2NvbWJvPjwvaWd4LWNvbWJvPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kcm9wZG93bi5jbG9zZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGNvbWJvIHZpZXdcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJpZ2dlckNoZWNrKCkge1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBzZWxlY3RlZCBpdGVtc1xuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbXlTZWxlY3Rpb24gPSB0aGlzLmNvbWJvLnNlbGVjdGlvbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXQodGhpcy5pZCkpO1xuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgc3BlY2lmaWVkIGl0ZW1JRCBpcyBzZWxlY3RlZFxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0l0ZW1TZWxlY3RlZChpdGVtOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5pc19pdGVtX3NlbGVjdGVkKHRoaXMuaWQsIGl0ZW0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBhZGRJdGVtVG9Db2xsZWN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhZGRlZEl0ZW0gPSB0aGlzLmRpc3BsYXlLZXkgPyB7XG4gICAgICAgICAgICBbdGhpcy52YWx1ZUtleV06IHRoaXMuc2VhcmNoVmFsdWUsXG4gICAgICAgICAgICBbdGhpcy5kaXNwbGF5S2V5XTogdGhpcy5zZWFyY2hWYWx1ZVxuICAgICAgICB9IDogdGhpcy5zZWFyY2hWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBLZXkpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYWRkZWRJdGVtLCB7IFt0aGlzLmdyb3VwS2V5XTogdGhpcy5kZWZhdWx0RmFsbGJhY2tHcm91cCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBleHBvc2Ugc2hhbGxvdyBjb3B5IGluc3RlYWQgb2YgdGhpcy5kYXRhIGluIGV2ZW50IGFyZ3Mgc28gdGhpcy5kYXRhIGNhbid0IGJlIG11dGF0ZWRcbiAgICAgICAgY29uc3Qgb2xkQ29sbGVjdGlvbiA9IFsuLi50aGlzLmRhdGFdO1xuICAgICAgICBjb25zdCBuZXdDb2xsZWN0aW9uID0gWy4uLnRoaXMuZGF0YSwgYWRkZWRJdGVtXTtcbiAgICAgICAgY29uc3QgYXJnczogSUNvbWJvSXRlbUFkZGl0aW9uRXZlbnQgPSB7XG4gICAgICAgICAgICBvbGRDb2xsZWN0aW9uLCBhZGRlZEl0ZW0sIG5ld0NvbGxlY3Rpb24sIG93bmVyOiB0aGlzLCBjYW5jZWw6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWRkaXRpb24uZW1pdChhcmdzKTtcbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhLnB1c2goYXJncy5hZGRlZEl0ZW0pO1xuICAgICAgICAvLyB0cmlnZ2VyIHJlLXJlbmRlclxuICAgICAgICB0aGlzLmRhdGEgPSBjbG9uZUFycmF5KHRoaXMuZGF0YSk7XG4gICAgICAgIHRoaXMuc2VsZWN0KHRoaXMudmFsdWVLZXkgIT09IG51bGwgJiYgdGhpcy52YWx1ZUtleSAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIFthcmdzLmFkZGVkSXRlbVt0aGlzLnZhbHVlS2V5XV0gOiBbYXJncy5hZGRlZEl0ZW1dLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuY3VzdG9tVmFsdWVGbGFnID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VhcmNoSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5kcm9wZG93bi5mb2N1c2VkSXRlbSA9IG51bGw7XG4gICAgICAgIHRoaXMudmlydERpci5zY3JvbGxUbygwKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgaXNBZGRCdXR0b25WaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBUaGlzIHNob3VsZCBhbHdheXMgcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZS4gSWYgdGhpcy5zZWFyY2hWYWx1ZSB3YXMgJycsIGl0IHJldHVybnMgJycgaW5zdGVhZCBvZiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoVmFsdWUgIT09ICcnICYmIHRoaXMuY3VzdG9tVmFsdWVGbGFnO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBoYW5kbGVJbnB1dENoYW5nZShldmVudD86IGFueSkge1xuICAgICAgICBpZiAoZXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgYXJnczogSUNvbWJvU2VhcmNoSW5wdXRFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoVGV4dDogdHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJyA/IGV2ZW50IDogZXZlbnQudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgIG93bmVyOiB0aGlzLFxuICAgICAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0VXBkYXRlLmVtaXQoYXJncyk7XG4gICAgICAgICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrTWF0Y2goKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBoYW5kbGVyc1xuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVPcGVuaW5nKGU6IElCYXNlQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgYXJnczogSUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncyA9IHsgb3duZXI6IHRoaXMsIGV2ZW50OiBlLmV2ZW50LCBjYW5jZWw6IGUuY2FuY2VsIH07XG4gICAgICAgIHRoaXMub3BlbmluZy5lbWl0KGFyZ3MpO1xuICAgICAgICBlLmNhbmNlbCA9IGFyZ3MuY2FuY2VsO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBoYW5kbGVDbG9zaW5nKGU6IElCYXNlQ2FuY2VsYWJsZUJyb3dzZXJFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgYXJnczogSUJhc2VDYW5jZWxhYmxlQnJvd3NlckV2ZW50QXJncyA9IHsgb3duZXI6IHRoaXMsIGV2ZW50OiBlLmV2ZW50LCBjYW5jZWw6IGUuY2FuY2VsIH07XG4gICAgICAgIHRoaXMuY2xvc2luZy5lbWl0KGFyZ3MpO1xuICAgICAgICBlLmNhbmNlbCA9IGFyZ3MuY2FuY2VsO1xuICAgICAgICBpZiAoZS5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgICAgIGlmICghZS5ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5jb21ib0lucHV0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgaGFuZGxlQ2xvc2VkKCkge1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KHsgb3duZXI6IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnIHx8IGV2ZW50LmtleSA9PT0gJ1VwJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIG9uQmx1cigpIHtcbiAgICAgICAgaWYgKHRoaXMuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICYmIHRoaXMubmdDb250cm9sLmludmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkID0gSWd4Q29tYm9TdGF0ZS5JTlZBTElEO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkID0gSWd4Q29tYm9TdGF0ZS5JTklUSUFMO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHRvZ2dsZUNhc2VTZW5zaXRpdmUoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nT3B0aW9ucyA9IHsgY2FzZVNlbnNpdGl2ZTogIXRoaXMuZmlsdGVyaW5nT3B0aW9ucy5jYXNlU2Vuc2l0aXZlIH07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uU3RhdHVzQ2hhbmdlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCh0aGlzLm5nQ29udHJvbC5jb250cm9sLnRvdWNoZWQgfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5kaXJ0eSkgJiZcbiAgICAgICAgICAgICh0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvciB8fCB0aGlzLm5nQ29udHJvbC5jb250cm9sLmFzeW5jVmFsaWRhdG9yKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbGxhcHNlZCB8fCB0aGlzLmlucHV0R3JvdXAuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRoaXMubmdDb250cm9sLmludmFsaWQgPyBJZ3hDb21ib1N0YXRlLklOVkFMSUQgOiBJZ3hDb21ib1N0YXRlLlZBTElEO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkID0gdGhpcy5uZ0NvbnRyb2wuaW52YWxpZCA/IElneENvbWJvU3RhdGUuSU5WQUxJRCA6IElneENvbWJvU3RhdGUuSU5JVElBTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEIuUC4gMTggTWF5IDIwMjE6IElneERhdGVQaWNrZXIgZG9lcyBub3QgcmVzZXQgaXRzIHN0YXRlIHVwb24gcmVzZXRGb3JtICM5NTI2XG4gICAgICAgICAgICB0aGlzLnZhbGlkID0gSWd4Q29tYm9TdGF0ZS5JTklUSUFMO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFuYWdlUmVxdWlyZWRBc3RlcmlzaygpO1xuICAgIH07XG5cbiAgICAvKiogaWYgdGhlcmUgaXMgYSB2YWx1ZUtleSAtIG1hcCB0aGUga2V5cyB0byBkYXRhIGl0ZW1zLCBlbHNlIC0ganVzdCByZXR1cm4gdGhlIGtleXMgKi9cbiAgICBwcm90ZWN0ZWQgY29udmVydEtleXNUb0l0ZW1zKGtleXM6IGFueVtdKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbWJvQVBJLnZhbHVlS2V5ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1hcCBrZXlzIHZzLiBmaWx0ZXIgZGF0YSB0byByZXRhaW4gdGhlIG9yZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtc1xuICAgICAgICByZXR1cm4ga2V5cy5tYXAoa2V5ID0+IGlzTmFOdmFsdWUoa2V5KVxuICAgICAgICAgICAgPyB0aGlzLmRhdGEuZmluZChlbnRyeSA9PiBpc05hTnZhbHVlKGVudHJ5W3RoaXMudmFsdWVLZXldKSlcbiAgICAgICAgICAgIDogdGhpcy5kYXRhLmZpbmQoZW50cnkgPT4gZW50cnlbdGhpcy52YWx1ZUtleV0gPT09IGtleSkpXG4gICAgICAgIC5maWx0ZXIoZSA9PiBlICE9PSB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja01hdGNoKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpdGVtTWF0Y2ggPSB0aGlzLmZpbHRlcmVkRGF0YS5zb21lKHRoaXMuZmluZE1hdGNoKTtcbiAgICAgICAgdGhpcy5jdXN0b21WYWx1ZUZsYWcgPSB0aGlzLmFsbG93Q3VzdG9tVmFsdWVzICYmICFpdGVtTWF0Y2g7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGZpbmRNYXRjaCA9IChlbGVtZW50OiBhbnkpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRpc3BsYXlLZXkgPyBlbGVtZW50W3RoaXMuZGlzcGxheUtleV0gOiBlbGVtZW50O1xuICAgICAgICByZXR1cm4gdmFsdWU/LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5zZWFyY2hWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9O1xuXG4gICAgcHJvdGVjdGVkIG1hbmFnZVJlcXVpcmVkQXN0ZXJpc2soKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgLy8gUnVuIHRoZSB2YWxpZGF0aW9uIHdpdGggZW1wdHkgb2JqZWN0IHRvIGNoZWNrIGlmIHJlcXVpcmVkIGlzIGVuYWJsZWQuXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvcih7fSBhcyBBYnN0cmFjdENvbnRyb2wpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRHcm91cC5pc1JlcXVpcmVkID0gZXJyb3IgJiYgZXJyb3IucmVxdWlyZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFAuTS4gMTggTWF5IDIwMjI6IElneENvbWJvJ3MgYXN0ZXJpc2sgbm90IHJlbW92ZWQgd2hlbiByZW1vdmluZyByZXF1aXJlZCB2YWxpZGF0b3IgZHluYW1pY2FsbHkgaW4gcmVhY3RpdmUgZm9ybSAjMTE1NDNcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0R3JvdXAuaXNSZXF1aXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIENvbnRhaW5zIGtleS12YWx1ZSBwYWlycyBvZiB0aGUgc2VsZWN0ZWQgdmFsdWVLZXlzIGFuZCB0aGVpciByZXNwLiBkaXNwbGF5S2V5cyAqL1xuICAgIHByb3RlY3RlZCByZWdpc3RlclJlbW90ZUVudHJpZXMoaWRzOiBhbnlbXSwgYWRkID0gdHJ1ZSkge1xuICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmdldFZhbHVlRGlzcGxheVBhaXJzKGlkcyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW90ZVNlbGVjdGlvbltlbnRyeVt0aGlzLnZhbHVlS2V5XV0gPSBlbnRyeVt0aGlzLmRpc3BsYXlLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBpZHMpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fcmVtb3RlU2VsZWN0aW9uW2VudHJ5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBgaWQ6IGFueVtdYCByZXR1cm5zIGEgbWFwcGVkIGB7IFtjb21iby52YWx1ZUtleV06IGFueSwgW2NvbWJvLmRpc3BsYXlLZXldOiBhbnkgfVtdYFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRWYWx1ZURpc3BsYXlQYWlycyhpZHM6IGFueVtdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZmlsdGVyKGVudHJ5ID0+IGlkcy5pbmRleE9mKGVudHJ5W3RoaXMudmFsdWVLZXldKSA+IC0xKS5tYXAoZSA9PiAoe1xuICAgICAgICAgICAgW3RoaXMudmFsdWVLZXldOiBlW3RoaXMudmFsdWVLZXldLFxuICAgICAgICAgICAgW3RoaXMuZGlzcGxheUtleV06IGVbdGhpcy5kaXNwbGF5S2V5XVxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFJlbW90ZVNlbGVjdGlvbihuZXdTZWxlY3Rpb246IGFueVtdLCBvbGRTZWxlY3Rpb246IGFueVtdKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFuZXdTZWxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBJZiBuZXcgc2VsZWN0aW9uIGlzIGVtcHR5LCBjbGVhciBhbGwgaXRlbXNcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJSZW1vdGVFbnRyaWVzKG9sZFNlbGVjdGlvbiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbW92ZWRJdGVtcyA9IG9sZFNlbGVjdGlvbi5maWx0ZXIoZSA9PiBuZXdTZWxlY3Rpb24uaW5kZXhPZihlKSA8IDApO1xuICAgICAgICBjb25zdCBhZGRlZEl0ZW1zID0gbmV3U2VsZWN0aW9uLmZpbHRlcihlID0+IG9sZFNlbGVjdGlvbi5pbmRleE9mKGUpIDwgMCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJSZW1vdGVFbnRyaWVzKGFkZGVkSXRlbXMpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyUmVtb3RlRW50cmllcyhyZW1vdmVkSXRlbXMsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3JlbW90ZVNlbGVjdGlvbikubWFwKGUgPT4gdGhpcy5fcmVtb3RlU2VsZWN0aW9uW2VdKS5qb2luKCcsICcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXQgZmlsdGVyZWREYXRhKCk6IGFueVtdIHwgbnVsbDtcbiAgICBwdWJsaWMgYWJzdHJhY3Qgc2V0IGZpbHRlcmVkRGF0YSh2YWw6IGFueVtdIHwgbnVsbCk7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgaGFuZGxlT3BlbmVkKCk7XG4gICAgcHVibGljIGFic3RyYWN0IGZvY3VzU2VhcmNoSW5wdXQob3BlbmluZz86IGJvb2xlYW4pO1xuXG4gICAgcHVibGljIGFic3RyYWN0IHNlbGVjdChuZXdJdGVtOiBhbnkpOiB2b2lkO1xuICAgIHB1YmxpYyBhYnN0cmFjdCBzZWxlY3QobmV3SXRlbXM6IEFycmF5PGFueT4gfCBhbnksIGNsZWFyQ3VycmVudFNlbGVjdGlvbj86IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpOiB2b2lkO1xuXG4gICAgcHVibGljIGFic3RyYWN0IGRlc2VsZWN0KC4uLmFyZ3M6IFtdIHwgW2l0ZW1zOiBBcnJheTxhbnk+LCBldmVudD86IEV2ZW50XSk6IHZvaWQ7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3Qgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZDtcblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uOiBTZXQ8YW55PiwgZXZlbnQ/OiBFdmVudCk6IHZvaWQ7XG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZURpc3BsYXlUZXh0KG5ld1NlbGVjdGlvbjogYW55W10sIG9sZFNlbGVjdGlvbjogYW55W10pO1xufVxuIl19