ngx-touch-keyboard 4.3.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -6
- package/esm2022/lib/ngx-touch-keyboard.component.mjs +3 -3
- package/esm2022/lib/ngx-touch-keyboard.directive.mjs +41 -25
- package/fesm2022/ngx-touch-keyboard.mjs +42 -26
- package/fesm2022/ngx-touch-keyboard.mjs.map +1 -1
- package/lib/ngx-touch-keyboard.directive.d.ts +11 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# AngularTouchKeyboard
|
|
2
2
|
|
|
3
3
|
An Angular touch keyboard component that provides a customizable on-screen keyboard for input elements.
|
|
4
|
+
Fully compatible with Angular, Angular Material, and Ionic Framework.
|
|
4
5
|
|
|
5
6
|
[](LICENSE) [](http://badge.fury.io/js/ngx-touch-keyboard) [](https://github.com/mohsen77sk/angular-touch-keyboard/actions)
|
|
6
7
|
|
|
@@ -13,7 +14,9 @@ An Angular touch keyboard component that provides a customizable on-screen keybo
|
|
|
13
14
|
- 🎯 Flexible positioning
|
|
14
15
|
- 🖥️ Full-screen mode support
|
|
15
16
|
- 🎨 Customizable appearance
|
|
16
|
-
-
|
|
17
|
+
- Ⓜ️ AngularMaterial support
|
|
18
|
+
- ⏺️ Ionic Framework support
|
|
19
|
+
- ⌨️ Smart native keyboard handling on mobile devices
|
|
17
20
|
|
|
18
21
|
## Demo
|
|
19
22
|
|
|
@@ -67,14 +70,24 @@ export class AppModule { }
|
|
|
67
70
|
|
|
68
71
|
Add the directive to your input elements:
|
|
69
72
|
|
|
73
|
+
Basic usage
|
|
74
|
+
|
|
70
75
|
```html
|
|
71
76
|
<input ngxTouchKeyboard [(ngxTouchKeyboardOpen)]="isOpen">
|
|
72
77
|
```
|
|
73
78
|
|
|
79
|
+
Open keyboard on input focus
|
|
80
|
+
|
|
74
81
|
```html
|
|
75
82
|
<input ngxTouchKeyboard ngxTouchKeyboardOpenOnFocus>
|
|
76
83
|
```
|
|
77
84
|
|
|
85
|
+
Basic usage in Ionic
|
|
86
|
+
|
|
87
|
+
```html
|
|
88
|
+
<ion-input ngxTouchKeyboard [(ngxTouchKeyboardOpen)]="isOpen"></ion-input>
|
|
89
|
+
```
|
|
90
|
+
|
|
78
91
|
## API Reference
|
|
79
92
|
|
|
80
93
|
### Directives
|
|
@@ -83,7 +96,10 @@ Add the directive to your input elements:
|
|
|
83
96
|
|
|
84
97
|
```typescript
|
|
85
98
|
@Directive({
|
|
86
|
-
selector:
|
|
99
|
+
selector: `input[ngxTouchKeyboard],
|
|
100
|
+
textarea[ngxTouchKeyboard],
|
|
101
|
+
ion-input[ngxTouchKeyboard],
|
|
102
|
+
ion-textarea[ngxTouchKeyboard]`,
|
|
87
103
|
})
|
|
88
104
|
```
|
|
89
105
|
|
|
@@ -104,10 +120,6 @@ Add the directive to your input elements:
|
|
|
104
120
|
- `closePanel()`: Closes the keyboard panel
|
|
105
121
|
- `togglePanel()`: Toggles the keyboard panel visibility
|
|
106
122
|
|
|
107
|
-
## Material Design Integration
|
|
108
|
-
|
|
109
|
-
The component automatically detects and integrates with Angular Material form fields, providing proper positioning and styling.
|
|
110
|
-
|
|
111
123
|
## Advanced Usage
|
|
112
124
|
|
|
113
125
|
### Custom locale
|
|
@@ -605,11 +605,11 @@ export class NgxTouchKeyboardComponent {
|
|
|
605
605
|
}
|
|
606
606
|
}
|
|
607
607
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgxTouchKeyboardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
608
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgxTouchKeyboardComponent, selector: "ngx-touch-keyboard", outputs: { closePanel: "closePanel" }, host: { listeners: { "window:keyup": "handleKeyUp($event)", "window:keydown": "handleKeyDown($event)", "window:pointerup": "handleMouseUp($event)", "window:select": "handleSelect($event)", "window:selectionchange": "handleSelectionChange($event)" } }, ngImport: i0, template: "<div class=\"touch-keyboard\" [class]=\"'layout-' + layoutMode + '-' + layoutName\">\r\n @for (row of locale.layouts[layoutMode + \"_\" + layoutName]; track row[0]
|
|
608
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgxTouchKeyboardComponent, selector: "ngx-touch-keyboard", outputs: { closePanel: "closePanel" }, host: { listeners: { "window:keyup": "handleKeyUp($event)", "window:keydown": "handleKeyDown($event)", "window:pointerup": "handleMouseUp($event)", "window:select": "handleSelect($event)", "window:selectionchange": "handleSelectionChange($event)" } }, ngImport: i0, template: "<div class=\"touch-keyboard\" [class]=\"'layout-' + layoutMode + '-' + layoutName\">\r\n @for (row of locale.layouts[layoutMode + \"_\" + layoutName]; track row[0]) {\r\n <div class=\"touch-keyboard-row\">\r\n @for (key of row; track key) {\r\n <button\r\n [name]=\"key\"\r\n type=\"button\"\r\n [dir]=\"locale.dir\"\r\n class=\"touch-keyboard-key\"\r\n [class]=\"getButtonClass(key)\"\r\n [attr.data-layout]=\"layoutMode\"\r\n (pointerup)=\"handleButtonUp(key, $event)\"\r\n (pointerdown)=\"handleButtonDown(key, $event)\"\r\n (pointercancel)=\"handleButtonUp(key, $event)\"\r\n [innerHtml]=\"getButtonDisplayName(key)\"\r\n ></button>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: [".cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:#00000052}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}:root{--tk-color-text: #27272a;--tk-background: rgba(238, 238, 238, .87);--tk-background-button: rgba(255, 255, 255, .96);--tk-background-button-fn: rgba(255, 255, 255, .5);--tk-background-button-active: rgba(0, 0, 0, .04)}.dark{--tk-color-text: #ffffff;--tk-background: rgba(33, 33, 33, .87);--tk-background-button: rgba(66, 66, 66, .96);--tk-background-button-fn: rgba(66, 66, 66, .5);--tk-background-button-active: rgba(255, 255, 255, .2)}ngx-touch-keyboard{width:100%;padding:.25rem .25rem .375rem;border-radius:.375rem;touch-action:manipulation;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:var(--tk-background);box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.ngx-touch-keyboard-fullScreen>ngx-touch-keyboard{border-radius:0}.touch-keyboard{flex:1 1 auto;max-width:840px}.touch-keyboard .touch-keyboard-row{display:flex;flex-direction:row}.touch-keyboard .touch-keyboard-row:not(:last-child){margin-bottom:.25rem}.touch-keyboard .touch-keyboard-key{width:20px;box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;text-align:center;margin:0;line-height:32px;padding:.25rem;border-radius:.375rem;font-size:14px;font-weight:500;display:flex;flex-grow:1;align-items:center;justify-content:center;color:var(--tk-color-text);background-color:var(--tk-background-button);box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.touch-keyboard .touch-keyboard-key>svg{fill:var(--tk-color-text)}.touch-keyboard .touch-keyboard-key.function-key:not(.space-key){background-color:var(--tk-background-button-fn)}.touch-keyboard .touch-keyboard-key.active{background-color:var(--tk-background-button-active)!important}.touch-keyboard .touch-keyboard-key.alphabetic-key,.touch-keyboard .touch-keyboard-key.backspace-key,.touch-keyboard .touch-keyboard-key.shift-key,.touch-keyboard .touch-keyboard-key.numeric-key,.touch-keyboard .touch-keyboard-key.symbolic-key,.touch-keyboard .touch-keyboard-key.language-key,.touch-keyboard .touch-keyboard-key.search-key,.touch-keyboard .touch-keyboard-key.enter-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:4rem}.touch-keyboard .touch-keyboard-key.space-key{min-width:40%}.touch-keyboard .touch-keyboard-key.hidden-key{visibility:hidden}.touch-keyboard .touch-keyboard-key[data-layout=numeric],.touch-keyboard .touch-keyboard-key[data-layout=decimal],.touch-keyboard .touch-keyboard-key[data-layout=tel]{width:24.33%!important;max-width:none!important}.touch-keyboard .touch-keyboard-key[data-layout=numeric].function-key,.touch-keyboard .touch-keyboard-key[data-layout=decimal].function-key,.touch-keyboard .touch-keyboard-key[data-layout=tel].function-key{max-width:24.33%!important}.touch-keyboard .touch-keyboard-key:not(:last-child){margin-right:.25rem}@media (min-width: 600px){.touch-keyboard .touch-keyboard-key.alphabetic-key,.touch-keyboard .touch-keyboard-key.backspace-key,.touch-keyboard .touch-keyboard-key.shift-key,.touch-keyboard .touch-keyboard-key.numeric-key,.touch-keyboard .touch-keyboard-key.symbolic-key,.touch-keyboard .touch-keyboard-key.language-key,.touch-keyboard .touch-keyboard-key.search-key,.touch-keyboard .touch-keyboard-key.enter-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:6rem}}\n"], dependencies: [{ kind: "directive", type: i1.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
609
609
|
}
|
|
610
610
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgxTouchKeyboardComponent, decorators: [{
|
|
611
611
|
type: Component,
|
|
612
|
-
args: [{ selector: 'ngx-touch-keyboard', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"touch-keyboard\" [class]=\"'layout-' + layoutMode + '-' + layoutName\">\r\n @for (row of locale.layouts[layoutMode + \"_\" + layoutName]; track row[0]
|
|
612
|
+
args: [{ selector: 'ngx-touch-keyboard', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"touch-keyboard\" [class]=\"'layout-' + layoutMode + '-' + layoutName\">\r\n @for (row of locale.layouts[layoutMode + \"_\" + layoutName]; track row[0]) {\r\n <div class=\"touch-keyboard-row\">\r\n @for (key of row; track key) {\r\n <button\r\n [name]=\"key\"\r\n type=\"button\"\r\n [dir]=\"locale.dir\"\r\n class=\"touch-keyboard-key\"\r\n [class]=\"getButtonClass(key)\"\r\n [attr.data-layout]=\"layoutMode\"\r\n (pointerup)=\"handleButtonUp(key, $event)\"\r\n (pointerdown)=\"handleButtonDown(key, $event)\"\r\n (pointercancel)=\"handleButtonUp(key, $event)\"\r\n [innerHtml]=\"getButtonDisplayName(key)\"\r\n ></button>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: [".cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:#00000052}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}:root{--tk-color-text: #27272a;--tk-background: rgba(238, 238, 238, .87);--tk-background-button: rgba(255, 255, 255, .96);--tk-background-button-fn: rgba(255, 255, 255, .5);--tk-background-button-active: rgba(0, 0, 0, .04)}.dark{--tk-color-text: #ffffff;--tk-background: rgba(33, 33, 33, .87);--tk-background-button: rgba(66, 66, 66, .96);--tk-background-button-fn: rgba(66, 66, 66, .5);--tk-background-button-active: rgba(255, 255, 255, .2)}ngx-touch-keyboard{width:100%;padding:.25rem .25rem .375rem;border-radius:.375rem;touch-action:manipulation;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:var(--tk-background);box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.ngx-touch-keyboard-fullScreen>ngx-touch-keyboard{border-radius:0}.touch-keyboard{flex:1 1 auto;max-width:840px}.touch-keyboard .touch-keyboard-row{display:flex;flex-direction:row}.touch-keyboard .touch-keyboard-row:not(:last-child){margin-bottom:.25rem}.touch-keyboard .touch-keyboard-key{width:20px;box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;text-align:center;margin:0;line-height:32px;padding:.25rem;border-radius:.375rem;font-size:14px;font-weight:500;display:flex;flex-grow:1;align-items:center;justify-content:center;color:var(--tk-color-text);background-color:var(--tk-background-button);box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.touch-keyboard .touch-keyboard-key>svg{fill:var(--tk-color-text)}.touch-keyboard .touch-keyboard-key.function-key:not(.space-key){background-color:var(--tk-background-button-fn)}.touch-keyboard .touch-keyboard-key.active{background-color:var(--tk-background-button-active)!important}.touch-keyboard .touch-keyboard-key.alphabetic-key,.touch-keyboard .touch-keyboard-key.backspace-key,.touch-keyboard .touch-keyboard-key.shift-key,.touch-keyboard .touch-keyboard-key.numeric-key,.touch-keyboard .touch-keyboard-key.symbolic-key,.touch-keyboard .touch-keyboard-key.language-key,.touch-keyboard .touch-keyboard-key.search-key,.touch-keyboard .touch-keyboard-key.enter-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:4rem}.touch-keyboard .touch-keyboard-key.space-key{min-width:40%}.touch-keyboard .touch-keyboard-key.hidden-key{visibility:hidden}.touch-keyboard .touch-keyboard-key[data-layout=numeric],.touch-keyboard .touch-keyboard-key[data-layout=decimal],.touch-keyboard .touch-keyboard-key[data-layout=tel]{width:24.33%!important;max-width:none!important}.touch-keyboard .touch-keyboard-key[data-layout=numeric].function-key,.touch-keyboard .touch-keyboard-key[data-layout=decimal].function-key,.touch-keyboard .touch-keyboard-key[data-layout=tel].function-key{max-width:24.33%!important}.touch-keyboard .touch-keyboard-key:not(:last-child){margin-right:.25rem}@media (min-width: 600px){.touch-keyboard .touch-keyboard-key.alphabetic-key,.touch-keyboard .touch-keyboard-key.backspace-key,.touch-keyboard .touch-keyboard-key.shift-key,.touch-keyboard .touch-keyboard-key.numeric-key,.touch-keyboard .touch-keyboard-key.symbolic-key,.touch-keyboard .touch-keyboard-key.language-key,.touch-keyboard .touch-keyboard-key.search-key,.touch-keyboard .touch-keyboard-key.enter-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:6rem}}\n"] }]
|
|
613
613
|
}], propDecorators: { handleKeyUp: [{
|
|
614
614
|
type: HostListener,
|
|
615
615
|
args: ['window:keyup', ['$event']]
|
|
@@ -626,4 +626,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
|
|
|
626
626
|
type: HostListener,
|
|
627
627
|
args: ['window:selectionchange', ['$event']]
|
|
628
628
|
}] } });
|
|
629
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRvdWNoLWtleWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10b3VjaC1rZXlib2FyZC9zcmMvbGliL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdG91Y2gta2V5Ym9hcmQvc3JjL2xpYi9uZ3gtdG91Y2gta2V5Ym9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFFbkUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7QUFVOUMsTUFBTSxPQUFPLHlCQUF5QjtJQVB0QztRQVFVLGVBQVUsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEMsZ0JBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQSxVQUE0QixDQUFBLENBQUMsQ0FBQztRQUNuRCxtQkFBYyxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRTNELFdBQU0sR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3JDLGVBQVUsR0FBRyxNQUFNLENBQUM7UUFDcEIsZUFBVSxHQUFHLFlBQVksQ0FBQztRQUMxQixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBRWQsZUFBVSxHQUFHLE1BQU0sRUFBUSxDQUFDO1FBRXBCLHVCQUFrQixHQUFHLFFBQVEsQ0FBQztRQUk5QixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDckMsc0JBQWlCLEdBQWtCLElBQUks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QkFBa0IsQ0FBQyxDQUFDO1lBQ3JELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzs4R0F4cUJVLHlCQUF5QjtrR0FBekIseUJBQXlCLDZWQ3RCdEMsb3pCQW9CQTs7MkZERWEseUJBQXlCO2tCQVByQyxTQUFTOytCQUNFLG9CQUFvQixpQkFHZixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNOzhCQWdEL0MsV0FBVztzQkFEVixZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFZeEMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVcxQyxhQUFhO3NCQURaLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUzVDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU3pDLHFCQUFxQjtzQkFEcEIsWUFBWTt1QkFBQyx3QkFBd0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIGluamVjdCxcclxuICBvdXRwdXQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbmltcG9ydCB7IE5HWF9UT1VDSF9LRVlCT0FSRF9MT0NBTEUgfSBmcm9tICcuL25neC10b3VjaC1rZXlib2FyZC5jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBmbkJ1dHRvbiB9IGZyb20gJy4vTG9jYWxlL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IExvY2FsZSB9IGZyb20gJy4vTG9jYWxlL3R5cGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtdG91Y2gta2V5Ym9hcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtdG91Y2gta2V5Ym9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hUb3VjaEtleWJvYXJkQ29tcG9uZW50IHtcclxuICBwcml2YXRlIF9zYW5pdGl6ZXIgPSBpbmplY3QoRG9tU2FuaXRpemVyKTtcclxuICBwcml2YXRlIF9lbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4pO1xyXG4gIHByaXZhdGUgX2RlZmF1bHRMb2NhbGUgPSBpbmplY3QoTkdYX1RPVUNIX0tFWUJPQVJEX0xPQ0FMRSk7XHJcblxyXG4gIGxvY2FsZTogTG9jYWxlID0gdGhpcy5fZGVmYXVsdExvY2FsZTtcclxuICBsYXlvdXRNb2RlID0gJ3RleHQnO1xyXG4gIGxheW91dE5hbWUgPSAnYWxwaGFiZXRpYyc7XHJcbiAgZGVidWcgPSBmYWxzZTtcclxuXHJcbiAgY2xvc2VQYW5lbCA9IG91dHB1dDx2b2lkPigpO1xyXG5cclxuICBwcml2YXRlIF9hY3RpdmVCdXR0b25DbGFzcyA9ICdhY3RpdmUnO1xyXG4gIHByaXZhdGUgX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQhOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfaG9sZFRpbWVvdXQhOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfaXNNb3VzZUhvbGQhOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2NhcmV0UG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2NhcmV0UG9zaXRpb25FbmQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2FjdGl2ZUlucHV0RWxlbWVudCE6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbDtcclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIEFjY2Vzc29yc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHRlciBmb3IgbWF4TGVuZ3RoXHJcbiAgICovXHJcbiAgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8ubWF4TGVuZ3RoID8/IC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0dGVyIGZvciB0eXBlIG9mIGlucHV0XHJcbiAgICovXHJcbiAgZ2V0IGlzVGV4dGFyZWEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py50eXBlID09PSAndGV4dGFyZWEnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIERlY29yYXRlZCBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogT24ga2V5dXBcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQuaXNUcnVzdGVkKSB7XHJcbiAgICAgIHRoaXMuX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50KTtcclxuICAgICAgdGhpcy5faGFuZGxlSGlnaGxpZ2h0S2V5VXAoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24ga2V5ZG93blxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQuaXNUcnVzdGVkKSB7XHJcbiAgICAgIHRoaXMuX2hhbmRsZUhpZ2hsaWdodEtleURvd24oZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gcG9pbnRlcnVwIChtb3VzZXVwIG9yIHRvdWNoZW5kKVxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVydXAnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZU1vdXNlVXAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gc2VsZWN0XHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNlbGVjdCcsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gc2VsZWN0aW9uY2hhbmdlXHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNlbGVjdGlvbmNoYW5nZScsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIFB1YmxpYyBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGxvY2FsZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHZhbHVlIExvY2FsZVxyXG4gICAqL1xyXG4gIHNldExvY2FsZSh2YWx1ZTogTG9jYWxlID0gdGhpcy5fZGVmYXVsdExvY2FsZSk6IHZvaWQge1xyXG4gICAgaWYgKCEodmFsdWUgJiYgdmFsdWUubGF5b3V0cykpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbGUgaXMgbm90IGRlZmluZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvY2FsZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGFjdGl2ZSBpbnB1dFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGlucHV0IElucHV0IG5hdGl2ZSBlbGVtZW50XHJcbiAgICovXHJcbiAgc2V0QWN0aXZlSW5wdXQoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPSBpbnB1dDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNraW5nIGtleWJvYXJkIGxheW91dFxyXG4gICAgICovXHJcbiAgICBjb25zdCBpbnB1dE1vZGUgPSB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmlucHV0TW9kZTtcclxuICAgIGlmIChpbnB1dE1vZGUgJiYgWyd0ZXh0JywgJ3NlYXJjaCcsICdlbWFpbCcsICd1cmwnLCAnbnVtZXJpYycsICdkZWNpbWFsJywgJ3RlbCddLnNvbWUoKGkpID0+IGkgPT09IGlucHV0TW9kZSkpIHtcclxuICAgICAgdGhpcy5sYXlvdXRNb2RlID0gaW5wdXRNb2RlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sYXlvdXRNb2RlID0gJ3RleHQnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbnB1dE1vZGUgJiYgWydudW1lcmljJywgJ2RlY2ltYWwnLCAndGVsJ10uc29tZSgoaSkgPT4gaSA9PT0gaW5wdXRNb2RlKSkge1xyXG4gICAgICB0aGlzLmxheW91dE5hbWUgPSAnZGVmYXVsdCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxheW91dE5hbWUgPSAnYWxwaGFiZXRpYyc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0xvY2FsZTonLCBgJHt0aGlzLmxvY2FsZS5jb2RlfWApO1xyXG4gICAgICBjb25zb2xlLmxvZygnTGF5b3V0OicsIGAke3RoaXMubGF5b3V0TW9kZX1fJHt0aGlzLmxheW91dE5hbWV9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB3ZSBtdXN0IGVuc3VyZSBjYXJldFBvc2l0aW9uIGRvZXNuJ3QgcGVyc2lzdCBvbmNlIHJlYWN0aXZhdGVkLlxyXG4gICAgICovXHJcbiAgICB0aGlzLl9zZXRDYXJldFBvc2l0aW9uKHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudC5zZWxlY3Rpb25TdGFydCwgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50LnNlbGVjdGlvbkVuZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0NhcmV0IHN0YXJ0IGF0OicsIHRoaXMuX2NhcmV0UG9zaXRpb24sIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFuZCBzZXQgZm9jdXMgdG8gaW5wdXRcclxuICAgIHRoaXMuX2ZvY3VzQWN0aXZlSW5wdXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBhIHN0YW5kYXJkIGJ1dHRvblxyXG4gICAqL1xyXG4gIGlzU3RhbmRhcmRCdXR0b24gPSAoYnV0dG9uOiBzdHJpbmcpID0+IGJ1dHRvbiAmJiAhKGJ1dHRvblswXSA9PT0gJ3snICYmIGJ1dHRvbltidXR0b24ubGVuZ3RoIC0gMV0gPT09ICd9Jyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlIGJ1dHRvbiB0eXBlXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24ncyBsYXlvdXQgbmFtZVxyXG4gICAqIEByZXR1cm4gVGhlIGJ1dHRvbiB0eXBlXHJcbiAgICovXHJcbiAgZ2V0QnV0dG9uVHlwZShidXR0b246IHN0cmluZyk6ICdzdGFuZGFyZC1rZXknIHwgJ2Z1bmN0aW9uLWtleScge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNTdGFuZGFyZEJ1dHRvbihidXR0b24pID8gJ3N0YW5kYXJkLWtleScgOiAnZnVuY3Rpb24ta2V5JztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgZGVmYXVsdCBjbGFzc2VzIHRvIGEgZ2l2ZW4gYnV0dG9uXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24ncyBsYXlvdXQgbmFtZVxyXG4gICAqIEByZXR1cm4gVGhlIGNsYXNzZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGJ1dHRvblxyXG4gICAqL1xyXG4gIGdldEJ1dHRvbkNsYXNzKGJ1dHRvbjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGJ1dHRvblR5cGVDbGFzcyA9IHRoaXMuZ2V0QnV0dG9uVHlwZShidXR0b24pO1xyXG4gICAgY29uc3QgYnV0dG9uV2l0aG91dEJyYWNlcyA9IGJ1dHRvbi5yZXBsYWNlKCd7JywgJycpLnJlcGxhY2UoJ30nLCAnJyk7XHJcbiAgICBsZXQgYnV0dG9uTm9ybWFsaXplZCA9ICcnO1xyXG5cclxuICAgIGlmIChidXR0b25UeXBlQ2xhc3MgIT09ICdzdGFuZGFyZC1rZXknKSBidXR0b25Ob3JtYWxpemVkID0gYCR7YnV0dG9uV2l0aG91dEJyYWNlc30ta2V5YDtcclxuXHJcbiAgICByZXR1cm4gYCR7YnV0dG9uVHlwZUNsYXNzfSAke2J1dHRvbk5vcm1hbGl6ZWR9YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGRpc3BsYXkgKGxhYmVsKSBuYW1lIGZvciBhIGdpdmVuIGJ1dHRvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uJ3MgbGF5b3V0IG5hbWVcclxuICAgKiBAcmV0dXJuIFRoZSBkaXNwbGF5IG5hbWUgdG8gYmUgc2hvdyB0byB0aGUgYnV0dG9uXHJcbiAgICovXHJcbiAgZ2V0QnV0dG9uRGlzcGxheU5hbWUoYnV0dG9uOiBzdHJpbmcpOiBTYWZlSHRtbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHRoaXMubG9jYWxlLmRpc3BsYXlbYnV0dG9uXSB8fCBidXR0b24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBjbGlja3MgbWFkZSB0byBrZXlib2FyZCBidXR0b25zXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gbGF5b3V0IG5hbWUuXHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBidXR0b24gZXZlbnQuXHJcbiAgICovXHJcbiAgaGFuZGxlQnV0dG9uUHJlc3MoYnV0dG9uOiBzdHJpbmcsIGU/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0tleSBwcmVzczonLCBidXR0b24pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChidXR0b24gPT09IGZuQnV0dG9uLlNISUZUKSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TmFtZSA9IHRoaXMubGF5b3V0TmFtZSA9PT0gJ2FscGhhYmV0aWMnID8gJ3NoaWZ0JyA6ICdhbHBoYWJldGljJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmIChidXR0b24gPT09IGZuQnV0dG9uLkRPTkUpIHtcclxuICAgICAgdGhpcy5jbG9zZVBhbmVsLmVtaXQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbW1vblBhcmFtczogW251bWJlciwgbnVtYmVyLCBib29sZWFuXSA9IFt0aGlzLl9jYXJldFBvc2l0aW9uIHx8IDAsIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQgfHwgMCwgdHJ1ZV07XHJcbiAgICBsZXQgb3V0cHV0ID0gdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py52YWx1ZSB8fCAnJztcclxuXHJcbiAgICAvLyBIYW5kZWwgZnVuY3Rpb25hbCBidXR0b25cclxuICAgIGlmICghdGhpcy5pc1N0YW5kYXJkQnV0dG9uKGJ1dHRvbikpIHtcclxuICAgICAgLy8gSGFuZGVsIEJBQ0tTUEFDRVxyXG4gICAgICBpZiAoYnV0dG9uID09PSBmbkJ1dHRvbi5CQUNLU1BBQ0UpIHtcclxuICAgICAgICBvdXRwdXQgPSB0aGlzLl9yZW1vdmVBdChvdXRwdXQsIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gSGFuZGVsIFNQQUNFXHJcbiAgICAgIGVsc2UgaWYgKGJ1dHRvbiA9PT0gZm5CdXR0b24uU1BBQ0UpIHtcclxuICAgICAgICBvdXRwdXQgPSB0aGlzLl9hZGRTdHJpbmdBdChvdXRwdXQsICcgJywgLi4uY29tbW9uUGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBIYW5kZWwgVEFCXHJcbiAgICAgIGVsc2UgaWYgKGJ1dHRvbiA9PT0gZm5CdXR0b24uVEFCKSB7XHJcbiAgICAgICAgb3V0cHV0ID0gdGhpcy5fYWRkU3RyaW5nQXQob3V0cHV0LCAnXFx0JywgLi4uY29tbW9uUGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBIYW5kZWwgRU5URVJcclxuICAgICAgZWxzZSBpZiAoYnV0dG9uID09PSBmbkJ1dHRvbi5FTlRFUikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzVGV4dGFyZWEpIHtcclxuICAgICAgICAgIG91dHB1dCA9IHRoaXMuX2FkZFN0cmluZ0F0KG91dHB1dCwgJ1xcbicsIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIEhhbmRlbCBMQVlPVVRcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXROYW1lID0gYnV0dG9uLnN1YnN0cmluZygxLCBidXR0b24ubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBIYW5kZWwgc3RhbmRhcmQgYnV0dG9uXHJcbiAgICBlbHNlIHtcclxuICAgICAgb3V0cHV0ID0gdGhpcy5fYWRkU3RyaW5nQXQob3V0cHV0LCBidXR0b24sIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudCkge1xyXG4gICAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQudmFsdWUgPSBvdXRwdXQ7XHJcblxyXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdDYXJldCBhdDonLCB0aGlzLl9jYXJldFBvc2l0aW9uLCB0aGlzLl9jYXJldFBvc2l0aW9uRW5kLCAnQnV0dG9uJywgZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9kaXNwYXRjaEV2ZW50cyhidXR0b24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBidXR0b24gZG93blxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGxheW91dCBuYW1lLlxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgYnV0dG9uIGV2ZW50LlxyXG4gICAqL1xyXG4gIGhhbmRsZUJ1dHRvbkRvd24oYnV0dG9uOiBzdHJpbmcsIGU/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0tleSBkb3duOicsIGJ1dHRvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUpIHtcclxuICAgICAgLyoqXHJcbiAgICAgICAqIEhhbmRsZSBldmVudCBvcHRpb25zXHJcbiAgICAgICAqL1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYWN0aXZlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX3NldEFjdGl2ZUJ1dHRvbihidXR0b24pO1xyXG5cclxuICAgIGlmICh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dCk7XHJcbiAgICBpZiAodGhpcy5faG9sZFRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkVGltZW91dCk7XHJcbiAgICB0aGlzLl9pc01vdXNlSG9sZCA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaW1lIHRvIHdhaXQgdW50aWwgYSBrZXkgaG9sZCBpcyBkZXRlY3RlZFxyXG4gICAgICovXHJcbiAgICB0aGlzLl9ob2xkVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX2lzTW91c2VIb2xkICYmXHJcbiAgICAgICAgKCghYnV0dG9uLmluY2x1ZGVzKCd7JykgJiYgIWJ1dHRvbi5pbmNsdWRlcygnfScpKSB8fCBidXR0b24gPT09IGZuQnV0dG9uLkJBQ0tTUEFDRSB8fCBidXR0b24gPT09IGZuQnV0dG9uLlNQQUNFKVxyXG4gICAgICApIHtcclxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0J1dHRvbiBob2xkOicsIGJ1dHRvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGFuZGxlQnV0dG9uSG9sZChidXR0b24pO1xyXG4gICAgICB9XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkVGltZW91dCk7XHJcbiAgICB9LCA1MDApO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGVsIGJ1dHRvbiBDbGljayBhZnRlciBidXR0b24gZG93blxyXG4gICAgICovXHJcbiAgICB0aGlzLmhhbmRsZUJ1dHRvblByZXNzKGJ1dHRvbiwgZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGJ1dHRvbiB1cFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGxheW91dCBuYW1lLlxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgYnV0dG9uIGV2ZW50LlxyXG4gICAqL1xyXG4gIGhhbmRsZUJ1dHRvblVwKGJ1dHRvbjogc3RyaW5nLCBlPzogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdLZXkgdXA6JywgYnV0dG9uKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZSkge1xyXG4gICAgICAvKipcclxuICAgICAgICogSGFuZGxlIGV2ZW50IG9wdGlvbnNcclxuICAgICAgICovXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBhY3RpdmUgY2xhc3NcclxuICAgICAqL1xyXG4gICAgdGhpcy5fcmVtb3ZlQWN0aXZlQnV0dG9uKCk7XHJcblxyXG4gICAgdGhpcy5faXNNb3VzZUhvbGQgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGJ1dHRvbiBob2xkXHJcbiAgICovXHJcbiAgaGFuZGxlQnV0dG9uSG9sZChidXR0b246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRpbWVvdXQgZGljdGF0aW5nIHRoZSBzcGVlZCBvZiBrZXkgaG9sZCBpdGVyYXRpb25zXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLl9pc01vdXNlSG9sZCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQnV0dG9uUHJlc3MoYnV0dG9uKTtcclxuICAgICAgICB0aGlzLmhhbmRsZUJ1dHRvbkhvbGQoYnV0dG9uKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dCk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEAgUHJpdmF0ZSBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlcyB0aGUgaW50ZXJuYWwgY2FyZXQgcG9zaXRpb25cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBjYXJldCdzIHN0YXJ0IHBvc2l0aW9uXHJcbiAgICogQHBhcmFtIHBvc2l0aW9uRW5kIFRoZSBjYXJldCdzIGVuZCBwb3NpdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3NldENhcmV0UG9zaXRpb24ocG9zaXRpb246IG51bWJlciB8IG51bGwsIGVuZFBvc2l0aW9uID0gcG9zaXRpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhcmV0UG9zaXRpb24gPSBwb3NpdGlvbjtcclxuICAgIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQgPSBlbmRQb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vdmVzIHRoZSBjdXJzb3IgcG9zaXRpb24gYnkgYSBnaXZlbiBhbW91bnRcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIGxlbmd0aCBSZXByZXNlbnRzIGJ5IGhvdyBtYW55IGNoYXJhY3RlcnMgdGhlIGlucHV0IHNob3VsZCBiZSBtb3ZlZFxyXG4gICAqIEBwYXJhbSBtaW51cyBXaGV0aGVyIHRoZSBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBsZWZ0IG9yIG5vdC5cclxuICAgKi9cclxuICBwcml2YXRlIF91cGRhdGVDYXJldFBvcyhsZW5ndGg6IG51bWJlciwgbWludXMgPSBmYWxzZSkge1xyXG4gICAgY29uc3QgbmV3Q2FyZXRQb3MgPSB0aGlzLl91cGRhdGVDYXJldFBvc0FjdGlvbihsZW5ndGgsIG1pbnVzKTtcclxuICAgIHRoaXMuX3NldENhcmV0UG9zaXRpb24obmV3Q2FyZXRQb3MpO1xyXG4gICAgLy8gU2Nyb2xsIHRvIGJvdHRvbVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uc2Nyb2xsVG8oe1xyXG4gICAgICAgIHRvcDogdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50LnNjcm9sbEhlaWdodCxcclxuICAgICAgfSBhcyBTY3JvbGxUb09wdGlvbnMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBY3Rpb24gbWV0aG9kIG9mIHVwZGF0ZUNhcmV0UG9zXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBsZW5ndGggUmVwcmVzZW50cyBieSBob3cgbWFueSBjaGFyYWN0ZXJzIHRoZSBpbnB1dCBzaG91bGQgYmUgbW92ZWRcclxuICAgKiBAcGFyYW0gbWludXMgV2hldGhlciB0aGUgY3Vyc29yIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgbGVmdCBvciBub3QuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfdXBkYXRlQ2FyZXRQb3NBY3Rpb24obGVuZ3RoOiBudW1iZXIsIG1pbnVzID0gZmFsc2UpIHtcclxuICAgIGxldCBjYXJldFBvc2l0aW9uID0gdGhpcy5fY2FyZXRQb3NpdGlvbjtcclxuXHJcbiAgICBpZiAoY2FyZXRQb3NpdGlvbiAhPSBudWxsKSB7XHJcbiAgICAgIGlmIChtaW51cykge1xyXG4gICAgICAgIGlmIChjYXJldFBvc2l0aW9uID4gMCkgY2FyZXRQb3NpdGlvbiA9IGNhcmV0UG9zaXRpb24gLSBsZW5ndGg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2FyZXRQb3NpdGlvbiA9IGNhcmV0UG9zaXRpb24gKyBsZW5ndGg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FyZXRQb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYW4gYW1vdW50IG9mIGNoYXJhY3RlcnMgYmVmb3JlIGEgZ2l2ZW4gcG9zaXRpb25cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGlucHV0XHJcbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSAoY3Vyc29yKSBwb3NpdGlvbiBmcm9tIHdoZXJlIHRoZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSByZW1vdmVkXHJcbiAgICogQHBhcmFtIG1vdmVDYXJldCBXaGV0aGVyIHRvIHVwZGF0ZSBpbnB1dCBjdXJzb3JcclxuICAgKi9cclxuICBwcml2YXRlIF9yZW1vdmVBdChzb3VyY2U6IHN0cmluZywgcG9zaXRpb24gPSBzb3VyY2UubGVuZ3RoLCBwb3NpdGlvbkVuZCA9IHNvdXJjZS5sZW5ndGgsIG1vdmVDYXJldCA9IGZhbHNlKSB7XHJcbiAgICBpZiAocG9zaXRpb24gPT09IDAgJiYgcG9zaXRpb25FbmQgPT09IDApIHtcclxuICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3V0cHV0O1xyXG5cclxuICAgIGlmIChwb3NpdGlvbiA9PT0gcG9zaXRpb25FbmQpIHtcclxuICAgICAgbGV0IHByZXZUd29DaGFycztcclxuICAgICAgbGV0IGVtb2ppTWF0Y2hlZDtcclxuICAgICAgY29uc3QgZW1vamlNYXRjaGVkUmVnID0gLyhbXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdKS9nO1xyXG5cclxuICAgICAgLyoqXHJcbiAgICAgICAqIEVtb2ppcyBhcmUgbWFkZSBvdXQgb2YgdHdvIGNoYXJhY3RlcnMsIHNvIHdlIG11c3QgdGFrZSBhIGN1c3RvbSBhcHByb2FjaCB0byB0cmltIHRoZW0uXHJcbiAgICAgICAqIEZvciBtb3JlIGluZm86IGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGVcclxuICAgICAgICovXHJcbiAgICAgIGlmIChwb3NpdGlvbiAmJiBwb3NpdGlvbiA+PSAwKSB7XHJcbiAgICAgICAgcHJldlR3b0NoYXJzID0gc291cmNlLnN1YnN0cmluZyhwb3NpdGlvbiAtIDIsIHBvc2l0aW9uKTtcclxuICAgICAgICBlbW9qaU1hdGNoZWQgPSBwcmV2VHdvQ2hhcnMubWF0Y2goZW1vamlNYXRjaGVkUmVnKTtcclxuXHJcbiAgICAgICAgaWYgKGVtb2ppTWF0Y2hlZCkge1xyXG4gICAgICAgICAgb3V0cHV0ID0gc291cmNlLnN1YnN0cmluZygwLCBwb3NpdGlvbiAtIDIpICsgc291cmNlLnN1YnN0cmluZyhwb3NpdGlvbik7XHJcbiAgICAgICAgICBpZiAobW92ZUNhcmV0KSB0aGlzLl91cGRhdGVDYXJldFBvcygyLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb3V0cHV0ID0gc291cmNlLnN1YnN0cmluZygwLCBwb3NpdGlvbiAtIDEpICsgc291cmNlLnN1YnN0cmluZyhwb3NpdGlvbik7XHJcbiAgICAgICAgICBpZiAobW92ZUNhcmV0KSB0aGlzLl91cGRhdGVDYXJldFBvcygxLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJldlR3b0NoYXJzID0gc291cmNlLnNsaWNlKC0yKTtcclxuICAgICAgICBlbW9qaU1hdGNoZWQgPSBwcmV2VHdvQ2hhcnMubWF0Y2goZW1vamlNYXRjaGVkUmVnKTtcclxuXHJcbiAgICAgICAgaWYgKGVtb2ppTWF0Y2hlZCkge1xyXG4gICAgICAgICAgb3V0cHV0ID0gc291cmNlLnNsaWNlKDAsIC0yKTtcclxuICAgICAgICAgIGlmIChtb3ZlQ2FyZXQpIHRoaXMuX3VwZGF0ZUNhcmV0UG9zKDIsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvdXRwdXQgPSBzb3VyY2Uuc2xpY2UoMCwgLTEpO1xyXG4gICAgICAgICAgaWYgKG1vdmVDYXJldCkgdGhpcy5fdXBkYXRlQ2FyZXRQb3MoMSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvdXRwdXQgPSBzb3VyY2Uuc2xpY2UoMCwgcG9zaXRpb24pICsgc291cmNlLnNsaWNlKHBvc2l0aW9uRW5kKTtcclxuICAgICAgaWYgKG1vdmVDYXJldCkge1xyXG4gICAgICAgIHRoaXMuX3NldENhcmV0UG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgYSBzdHJpbmcgdG8gdGhlIGlucHV0IGF0IGEgZ2l2ZW4gcG9zaXRpb25cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGlucHV0XHJcbiAgICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGFkZFxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgKGN1cnNvcikgcG9zaXRpb24gd2hlcmUgdGhlIHN0cmluZyBzaG91bGQgYmUgYWRkZWRcclxuICAgKiBAcGFyYW0gbW92ZUNhcmV0IFdoZXRoZXIgdG8gdXBkYXRlIHZpcnR1YWwta2V5Ym9hcmQgY3Vyc29yXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfYWRkU3RyaW5nQXQoXHJcbiAgICBzb3VyY2U6IHN0cmluZyxcclxuICAgIHN0cjogc3RyaW5nLFxyXG4gICAgcG9zaXRpb24gPSBzb3VyY2UubGVuZ3RoLFxyXG4gICAgcG9zaXRpb25FbmQgPSBzb3VyY2UubGVuZ3RoLFxyXG4gICAgbW92ZUNhcmV0ID0gZmFsc2UsXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5tYXhMZW5ndGggIT09IC0xICYmIHNvdXJjZS5sZW5ndGggPj0gdGhpcy5tYXhMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3V0cHV0O1xyXG5cclxuICAgIGlmICghcG9zaXRpb24gJiYgcG9zaXRpb24gIT09IDApIHtcclxuICAgICAgb3V0cHV0ID0gc291cmNlICsgc3RyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb3V0cHV0ID0gW3NvdXJjZS5zbGljZSgwLCBwb3NpdGlvbiksIHN0ciwgc291cmNlLnNsaWNlKHBvc2l0aW9uRW5kKV0uam9pbignJyk7XHJcbiAgICAgIGlmIChtb3ZlQ2FyZXQpIHRoaXMuX3VwZGF0ZUNhcmV0UG9zKHN0ci5sZW5ndGgsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0cHV0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0aG9kIHRvIGRpc3BhdGNoIG5lY2Vzc2FyeSBrZXlib2FyZCBldmVudHMgdG8gY3VycmVudCBpbnB1dCBlbGVtZW50LlxyXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3VpZXZlbnRzL3Rvb2xzL2tleS1ldmVudC12aWV3ZXIuaHRtbFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2Rpc3BhdGNoRXZlbnRzKGJ1dHRvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQga2V5LCBjb2RlO1xyXG4gICAgaWYgKGJ1dHRvbi5pbmNsdWRlcygneycpICYmIGJ1dHRvbi5pbmNsdWRlcygnfScpKSB7XHJcbiAgICAgIC8vIENhcGl0YWxpemUgbmFtZVxyXG4gICAgICBrZXkgPSBidXR0b24uc2xpY2UoMSwgYnV0dG9uLmxlbmd0aCAtIDEpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGtleSA9IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKTtcclxuICAgICAgY29kZSA9IGtleTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGtleSA9IGJ1dHRvbjtcclxuICAgICAgY29kZSA9IE51bWJlci5pc0ludGVnZXIoTnVtYmVyKGJ1dHRvbikpID8gYERpZ2l0JHtidXR0b259YCA6IGBLZXkke2J1dHRvbi50b1VwcGVyQ2FzZSgpfWA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXZlbnRJbml0OiBLZXlib2FyZEV2ZW50SW5pdCA9IHtcclxuICAgICAgYnViYmxlczogdHJ1ZSxcclxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcclxuICAgICAgc2hpZnRLZXk6IHRoaXMubGF5b3V0TmFtZSA9PSAnc2hpZnQnLFxyXG4gICAgICBrZXk6IGtleSxcclxuICAgICAgY29kZTogY29kZSxcclxuICAgICAgbG9jYXRpb246IDAsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIFNpbXVsYXRlIGFsbCBuZWVkZWQgZXZlbnRzIG9uIGJhc2UgZWxlbWVudFxyXG4gICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py5kaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywgZXZlbnRJbml0KSk7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoJ2tleXByZXNzJywgZXZlbnRJbml0KSk7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoJ2tleXVwJywgZXZlbnRJbml0KSk7XHJcblxyXG4gICAgLy8gQW5kIHNldCBmb2N1cyB0byBpbnB1dFxyXG4gICAgdGhpcy5fZm9jdXNBY3RpdmVJbnB1dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gYW4gZXZlbnQgdGhhdCB3YXJyYW50cyBhIGN1cnNvciBwb3NpdGlvbiB1cGRhdGUgaXMgdHJpZ2dlcmVkXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCB0YXJnZXRUYWdOYW1lID0gJyc7XHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LnRhZ05hbWUpIHtcclxuICAgICAgdGFyZ2V0VGFnTmFtZSA9IGV2ZW50LnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNUZXh0SW5wdXQgPVxyXG4gICAgICB0YXJnZXRUYWdOYW1lID09PSAndGV4dGFyZWEnIHx8XHJcbiAgICAgICh0YXJnZXRUYWdOYW1lID09PSAnaW5wdXQnICYmIFsndGV4dCcsICdzZWFyY2gnLCAnZW1haWwnLCAncGFzc3dvcmQnLCAndXJsJywgJ3RlbCddLmluY2x1ZGVzKGV2ZW50LnRhcmdldC50eXBlKSk7XHJcblxyXG4gICAgY29uc3QgaXNLZXlib2FyZCA9XHJcbiAgICAgIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IHx8XHJcbiAgICAgIChldmVudC50YXJnZXQgJiYgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpO1xyXG5cclxuICAgIGlmIChpc1RleHRJbnB1dCAmJiB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBUcmFja3MgY3VycmVudCBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgICogQXMga2V5cyBhcmUgcHJlc3NlZCwgdGV4dCB3aWxsIGJlIGFkZGVkL3JlbW92ZWQgYXQgdGhhdCBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0LlxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsIGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICdDYXJldCBhdDonLFxyXG4gICAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbixcclxuICAgICAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQsXHJcbiAgICAgICAgICBldmVudCAmJiBldmVudC50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgZXZlbnQsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSAncG9pbnRlcnVwJyAmJiB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgdGhpcy5faXNNb3VzZUhvbGQpIHtcclxuICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgaWYgdGhlIHVzZXIgcmVsZWFzZXMgdGhlIGJ1dHRvbiBvdXRzaWRlIG9mIHRoZSB3aW5kb3csIHRoZSBrZXlib2FyZCBkb2Vzbid0IGdldCBzdHVjay5cclxuICAgICAgdGhpcy5oYW5kbGVCdXR0b25VcCgnJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoIWlzS2V5Ym9hcmQgJiYgZXZlbnQ/LnR5cGUgIT09ICdzZWxlY3Rpb25jaGFuZ2UnKSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiB3ZSBtdXN0IGVuc3VyZSBjYXJldFBvc2l0aW9uIGRvZXNuJ3QgcGVyc2lzdCBvbmNlIHJlYWN0aXZhdGVkLlxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihudWxsKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYENhcmV0IHBvc2l0aW9uIHJlc2V0IGR1ZSB0byBcIiR7ZXZlbnQ/LnR5cGV9XCIgZXZlbnRgLCBldmVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBDbG9zZSBwYW5lbFxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5jbG9zZVBhbmVsLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvY3VzIHRvIGlucHV0XHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2ZvY3VzQWN0aXZlSW5wdXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmZvY3VzKCk7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LnNldFNlbGVjdGlvblJhbmdlKHRoaXMuX2NhcmV0UG9zaXRpb24sIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGVsIGhpZ2hsaWdodCBvbiBrZXkgZG93blxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBwcml2YXRlIF9oYW5kbGVIaWdobGlnaHRLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBidXR0b25QcmVzc2VkID0gdGhpcy5fZ2V0S2V5Ym9hcmRMYXlvdXRLZXkoZXZlbnQpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYWN0aXZlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX3NldEFjdGl2ZUJ1dHRvbihidXR0b25QcmVzc2VkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRlbCBoaWdobGlnaHQgb24ga2V5IHVwXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgS2V5Ym9hcmRFdmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2hhbmRsZUhpZ2hsaWdodEtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBidXR0b25QcmVzc2VkID0gdGhpcy5fZ2V0S2V5Ym9hcmRMYXlvdXRLZXkoZXZlbnQpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgYWN0aXZlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX3JlbW92ZUFjdGl2ZUJ1dHRvbihidXR0b25QcmVzc2VkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybXMgYSBLZXlib2FyZEV2ZW50J3MgXCJrZXkuY29kZVwiIHN0cmluZyBpbnRvIGEgdmlydHVhbC1rZXlib2FyZCBsYXlvdXQgZm9ybWF0XHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgS2V5Ym9hcmRFdmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2dldEtleWJvYXJkTGF5b3V0S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBsZXQgb3V0cHV0ID0gJyc7XHJcbiAgICBjb25zdCBrZXlJZCA9IGV2ZW50LmNvZGUgfHwgZXZlbnQua2V5O1xyXG5cclxuICAgIGlmIChcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdTcGFjZScpIHx8XHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnTnVtcGFkJykgfHxcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdCYWNrc3BhY2UnKSB8fFxyXG4gICAgICBrZXlJZD8uaW5jbHVkZXMoJ0NhcHNMb2NrJykgfHxcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdNZXRhJylcclxuICAgICkge1xyXG4gICAgICBvdXRwdXQgPSBgeyR7ZXZlbnQuY29kZX19YCB8fCAnJztcclxuICAgIH0gZWxzZSBpZiAoa2V5SWQ/LmluY2x1ZGVzKCdDb250cm9sJykgfHwga2V5SWQ/LmluY2x1ZGVzKCdTaGlmdCcpIHx8IGtleUlkPy5pbmNsdWRlcygnQWx0JykpIHtcclxuICAgICAgb3V0cHV0ID0gYHske2V2ZW50LmtleX19YCB8fCAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG91dHB1dCA9IGV2ZW50LmtleSB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IDEgPyBvdXRwdXQ/LnRvTG93ZXJDYXNlKCkgOiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgYWN0aXZlIGNsYXNzIGluIGJ1dHRvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbk5hbWVcclxuICAgKi9cclxuICBwcml2YXRlIF9zZXRBY3RpdmVCdXR0b24oYnV0dG9uTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBub2RlID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKS5uYW1lZEl0ZW0oYnV0dG9uTmFtZSk7XHJcbiAgICBpZiAobm9kZSAmJiBub2RlLmNsYXNzTGlzdCkge1xyXG4gICAgICBub2RlLmNsYXNzTGlzdC5hZGQodGhpcy5fYWN0aXZlQnV0dG9uQ2xhc3MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFjdGl2ZSBidXR0b25cclxuICAgKlxyXG4gICAqIEBwYXJhbSBidXR0b25OYW1lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfcmVtb3ZlQWN0aXZlQnV0dG9uKGJ1dHRvbk5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKTtcclxuICAgIGlmIChidXR0b25OYW1lKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5uYW1lZEl0ZW0oYnV0dG9uTmFtZSk7XHJcbiAgICAgIGlmIChub2RlICYmIG5vZGUuY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2FjdGl2ZUJ1dHRvbkNsYXNzKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG5vZGVzW2ldLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fYWN0aXZlQnV0dG9uQ2xhc3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ0b3VjaC1rZXlib2FyZFwiIFtjbGFzc109XCInbGF5b3V0LScgKyBsYXlvdXRNb2RlICsgJy0nICsgbGF5b3V0TmFtZVwiPlxyXG4gIEBmb3IgKHJvdyBvZiBsb2NhbGUubGF5b3V0c1tsYXlvdXRNb2RlICsgXCJfXCIgKyBsYXlvdXROYW1lXTsgdHJhY2sgcm93WzBdOyBsZXQgcm93SW5kZXggPSAkaW5kZXgpIHtcclxuICAgIDxkaXYgY2xhc3M9XCJ0b3VjaC1rZXlib2FyZC1yb3dcIj5cclxuICAgICAgQGZvciAoa2V5IG9mIHJvdzsgdHJhY2sga2V5KSB7XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgW25hbWVdPVwia2V5XCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgW2Rpcl09XCJsb2NhbGUuZGlyXCJcclxuICAgICAgICAgIGNsYXNzPVwidG91Y2gta2V5Ym9hcmQta2V5XCJcclxuICAgICAgICAgIFtjbGFzc109XCJnZXRCdXR0b25DbGFzcyhrZXkpXCJcclxuICAgICAgICAgIFthdHRyLmRhdGEtbGF5b3V0XT1cImxheW91dE1vZGVcIlxyXG4gICAgICAgICAgKHBvaW50ZXJ1cCk9XCJoYW5kbGVCdXR0b25VcChrZXksICRldmVudClcIlxyXG4gICAgICAgICAgKHBvaW50ZXJkb3duKT1cImhhbmRsZUJ1dHRvbkRvd24oa2V5LCAkZXZlbnQpXCJcclxuICAgICAgICAgIChwb2ludGVyY2FuY2VsKT1cImhhbmRsZUJ1dHRvblVwKGtleSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICBbaW5uZXJIdG1sXT1cImdldEJ1dHRvbkRpc3BsYXlOYW1lKGtleSlcIlxyXG4gICAgICAgID48L2J1dHRvbj5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG48L2Rpdj5cclxuIl19
|
|
629
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRvdWNoLWtleWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10b3VjaC1rZXlib2FyZC9zcmMvbGliL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdG91Y2gta2V5Ym9hcmQvc3JjL2xpYi9uZ3gtdG91Y2gta2V5Ym9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFFbkUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7QUFVOUMsTUFBTSxPQUFPLHlCQUF5QjtJQVB0QztRQVFVLGVBQVUsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEMsZ0JBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQSxVQUE0QixDQUFBLENBQUMsQ0FBQztRQUNuRCxtQkFBYyxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRTNELFdBQU0sR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3JDLGVBQVUsR0FBRyxNQUFNLENBQUM7UUFDcEIsZUFBVSxHQUFHLFlBQVksQ0FBQztRQUMxQixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBRWQsZUFBVSxHQUFHLE1BQU0sRUFBUSxDQUFDO1FBRXBCLHVCQUFrQixHQUFHLFFBQVEsQ0FBQztRQUk5QixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDckMsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQWlJaEQ7O1dBRUc7UUFDSCxxQkFBZ0IsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0tBb2hCNUc7SUFycEJDLHdHQUF3RztJQUN4RyxjQUFjO0lBQ2Qsd0dBQXdHO0lBRXhHOztPQUVHO0lBQ0gsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksS0FBSyxVQUFVLENBQUM7SUFDdkQsQ0FBQztJQUVELHdHQUF3RztJQUN4RyxzQkFBc0I7SUFDdEIsd0dBQXdHO0lBRXhHOztPQUVHO0lBRUgsV0FBVyxDQUFDLEtBQW9CO1FBQzlCLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUVILGFBQWEsQ0FBQyxLQUFvQjtRQUNoQyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUVILGFBQWEsQ0FBQyxLQUFtQjtRQUMvQixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBRUgsWUFBWSxDQUFDLEtBQVk7UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUVILHFCQUFxQixDQUFDLEtBQVk7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCx3R0FBd0c7SUFDeEcsbUJBQW1CO0lBQ25CLHdHQUF3RztJQUV4Rzs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLFFBQWdCLElBQUksQ0FBQyxjQUFjO1FBQzNDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLEtBQTZDO1FBQzFELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFFakM7O1dBRUc7UUFDSCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxDQUFDO1FBQ3RELElBQUksU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM5RyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM1RSxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQ7O1dBRUc7UUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFdkcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUVELHlCQUF5QjtRQUN6QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBT0Q7Ozs7O09BS0c7SUFDSCxhQUFhLENBQUMsTUFBYztRQUMxQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFDekUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLE1BQWM7UUFDM0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckUsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFMUIsSUFBSSxlQUFlLEtBQUssY0FBYztZQUFFLGdCQUFnQixHQUFHLEdBQUcsbUJBQW1CLE1BQU0sQ0FBQztRQUV4RixPQUFPLEdBQUcsZUFBZSxJQUFJLGdCQUFnQixFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsb0JBQW9CLENBQUMsTUFBYztRQUNqQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsaUJBQWlCLENBQUMsTUFBYyxFQUFFLENBQVM7UUFDekMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQzVFLE9BQU87UUFDVCxDQUFDO2FBQU0sSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFlBQVksR0FBOEIsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlHLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBRW5ELDJCQUEyQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkMsbUJBQW1CO1lBQ25CLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7WUFDbkQsQ0FBQztZQUNELGVBQWU7aUJBQ1YsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7WUFDM0QsQ0FBQztZQUNELGFBQWE7aUJBQ1IsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUNELGVBQWU7aUJBQ1YsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDcEIsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDO2dCQUM1RCxDQUFDO1lBQ0gsQ0FBQztZQUNELGdCQUFnQjtpQkFDWCxDQUFDO2dCQUNKLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDekQsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO1FBQ0QseUJBQXlCO2FBQ3BCLENBQUM7WUFDSixNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFFeEMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JGLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxnQkFBZ0IsQ0FBQyxNQUFjLEVBQUUsQ0FBUztRQUN4QyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ047O2VBRUc7WUFDSCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFFRDs7V0FFRztRQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5QixJQUFJLElBQUksQ0FBQyx1QkFBdUI7WUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDN0UsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFekI7O1dBRUc7UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3pDLElBQ0UsSUFBSSxDQUFDLFlBQVk7Z0JBQ2pCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxTQUFTLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDaEgsQ0FBQztnQkFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDdEMsQ0FBQztnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRVI7O1dBRUc7UUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGNBQWMsQ0FBQyxNQUFjLEVBQUUsQ0FBUztRQUN0QyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ047O2VBRUc7WUFDSCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFFRDs7V0FFRztRQUNILElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTNCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLHVCQUF1QjtZQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzdCLElBQUksSUFBSSxDQUFDLHVCQUF1QjtZQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUU3RTs7V0FFRztRQUNILElBQUksQ0FBQyx1QkFBdUIsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNwRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELHdHQUF3RztJQUN4RyxvQkFBb0I7SUFDcEIsd0dBQXdHO0lBRXhHOzs7Ozs7T0FNRztJQUNLLGlCQUFpQixDQUFDLFFBQXVCLEVBQUUsV0FBVyxHQUFHLFFBQVE7UUFDdkUsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssZUFBZSxDQUFDLE1BQWMsRUFBRSxLQUFLLEdBQUcsS0FBSztRQUNuRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwQyxtQkFBbUI7UUFDbkIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUM7Z0JBQ2pDLEdBQUcsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWTthQUN4QixDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0sscUJBQXFCLENBQUMsTUFBYyxFQUFFLEtBQUssR0FBRyxLQUFLO1FBQ3pELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFeEMsSUFBSSxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixJQUFJLGFBQWEsR0FBRyxDQUFDO29CQUFFLGFBQWEsR0FBRyxhQUFhLEdBQUcsTUFBTSxDQUFDO1lBQ2hFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixhQUFhLEdBQUcsYUFBYSxHQUFHLE1BQU0sQ0FBQztZQUN6QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssU0FBUyxDQUFDLE1BQWMsRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLEdBQUcsS0FBSztRQUN4RyxJQUFJLFFBQVEsS0FBSyxDQUFDLElBQUksV0FBVyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQztRQUVYLElBQUksUUFBUSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQzdCLElBQUksWUFBWSxDQUFDO1lBQ2pCLElBQUksWUFBWSxDQUFDO1lBQ2pCLE1BQU0sZUFBZSxHQUFHLG1DQUFtQyxDQUFDO1lBRTVEOzs7ZUFHRztZQUNILElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsWUFBWSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDeEQsWUFBWSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBRW5ELElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2pCLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDeEUsSUFBSSxTQUFTO3dCQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMvQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN4RSxJQUFJLFNBQVM7d0JBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQy9DLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsWUFBWSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBRW5ELElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2pCLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM3QixJQUFJLFNBQVM7d0JBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQy9DLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0IsSUFBSSxTQUFTO3dCQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMvQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0QsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxZQUFZLENBQ2xCLE1BQWMsRUFDZCxHQUFXLEVBQ1gsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQ3hCLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUMzQixTQUFTLEdBQUcsS0FBSztRQUVqQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDO1FBRVgsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEMsTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5RSxJQUFJLFNBQVM7Z0JBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxlQUFlLENBQUMsTUFBYztRQUNwQyxJQUFJLEdBQUcsRUFBRSxJQUFJLENBQUM7UUFDZCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pELGtCQUFrQjtZQUNsQixHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2RCxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksR0FBRyxHQUFHLENBQUM7UUFDYixDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsR0FBRyxNQUFNLENBQUM7WUFDYixJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUM1RixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQXNCO1lBQ25DLE9BQU8sRUFBRSxJQUFJO1lBQ2IsVUFBVSxFQUFFLElBQUk7WUFDaEIsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksT0FBTztZQUNwQyxHQUFHLEVBQUUsR0FBRztZQUNSLElBQUksRUFBRSxJQUFJO1lBQ1YsUUFBUSxFQUFFLENBQUM7U0FDWixDQUFDO1FBRUYsNkNBQTZDO1FBQzdDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLENBQUMsSUFBSSxhQUFhLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsbUJBQW1CLEVBQUUsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUUvRSx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssa0JBQWtCLENBQUMsS0FBVTtRQUNuQyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyRCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQ2YsYUFBYSxLQUFLLFVBQVU7WUFDNUIsQ0FBQyxhQUFhLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRW5ILE1BQU0sVUFBVSxHQUNkLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhO1lBQy9DLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFMUUsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1RDs7O2VBR0c7WUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUUvRSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsR0FBRyxDQUNULFdBQVcsRUFDWCxJQUFJLENBQUMsY0FBYyxFQUNuQixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFDM0MsS0FBSyxDQUNOLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLFFBQVEsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xILHVIQUF1SDtZQUN2SCxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO2FBQU0sSUFBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLEVBQUUsSUFBSSxLQUFLLGlCQUFpQixFQUFFLENBQUM7WUFDNUQ7O2VBRUc7WUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFN0IsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsS0FBSyxFQUFFLElBQUksU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzNFLENBQUM7WUFFRDs7ZUFFRztZQUNILElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssaUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyx1QkFBdUIsQ0FBQyxLQUFvQjtRQUNsRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQ7O1dBRUc7UUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0sscUJBQXFCLENBQUMsS0FBb0I7UUFDaEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hEOztXQUVHO1FBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLHFCQUFxQixDQUFDLEtBQW9CO1FBQ2hELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFFdEMsSUFDRSxLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUN4QixLQUFLLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUN6QixLQUFLLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUM1QixLQUFLLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUMzQixLQUFLLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUN2QixDQUFDO1lBQ0QsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxDQUFDO2FBQU0sSUFBSSxLQUFLLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVGLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDbEMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDM0IsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQUMsVUFBa0I7UUFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pHLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxtQkFBbUIsQ0FBQyxVQUFtQjtRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1RSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6QyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2pELENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3RDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3JELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzs4R0F4cUJVLHlCQUF5QjtrR0FBekIseUJBQXlCLDZWQ3RCdEMsNnhCQW9CQTs7MkZERWEseUJBQXlCO2tCQVByQyxTQUFTOytCQUNFLG9CQUFvQixpQkFHZixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNOzhCQWdEL0MsV0FBVztzQkFEVixZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFZeEMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVcxQyxhQUFhO3NCQURaLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUzVDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU3pDLHFCQUFxQjtzQkFEcEIsWUFBWTt1QkFBQyx3QkFBd0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIGluamVjdCxcclxuICBvdXRwdXQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbmltcG9ydCB7IE5HWF9UT1VDSF9LRVlCT0FSRF9MT0NBTEUgfSBmcm9tICcuL25neC10b3VjaC1rZXlib2FyZC5jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBmbkJ1dHRvbiB9IGZyb20gJy4vTG9jYWxlL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IExvY2FsZSB9IGZyb20gJy4vTG9jYWxlL3R5cGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtdG91Y2gta2V5Ym9hcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtdG91Y2gta2V5Ym9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hUb3VjaEtleWJvYXJkQ29tcG9uZW50IHtcclxuICBwcml2YXRlIF9zYW5pdGl6ZXIgPSBpbmplY3QoRG9tU2FuaXRpemVyKTtcclxuICBwcml2YXRlIF9lbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4pO1xyXG4gIHByaXZhdGUgX2RlZmF1bHRMb2NhbGUgPSBpbmplY3QoTkdYX1RPVUNIX0tFWUJPQVJEX0xPQ0FMRSk7XHJcblxyXG4gIGxvY2FsZTogTG9jYWxlID0gdGhpcy5fZGVmYXVsdExvY2FsZTtcclxuICBsYXlvdXRNb2RlID0gJ3RleHQnO1xyXG4gIGxheW91dE5hbWUgPSAnYWxwaGFiZXRpYyc7XHJcbiAgZGVidWcgPSBmYWxzZTtcclxuXHJcbiAgY2xvc2VQYW5lbCA9IG91dHB1dDx2b2lkPigpO1xyXG5cclxuICBwcml2YXRlIF9hY3RpdmVCdXR0b25DbGFzcyA9ICdhY3RpdmUnO1xyXG4gIHByaXZhdGUgX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQhOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfaG9sZFRpbWVvdXQhOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfaXNNb3VzZUhvbGQhOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2NhcmV0UG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2NhcmV0UG9zaXRpb25FbmQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2FjdGl2ZUlucHV0RWxlbWVudCE6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbDtcclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIEFjY2Vzc29yc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHRlciBmb3IgbWF4TGVuZ3RoXHJcbiAgICovXHJcbiAgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8ubWF4TGVuZ3RoID8/IC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0dGVyIGZvciB0eXBlIG9mIGlucHV0XHJcbiAgICovXHJcbiAgZ2V0IGlzVGV4dGFyZWEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py50eXBlID09PSAndGV4dGFyZWEnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIERlY29yYXRlZCBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogT24ga2V5dXBcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQuaXNUcnVzdGVkKSB7XHJcbiAgICAgIHRoaXMuX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50KTtcclxuICAgICAgdGhpcy5faGFuZGxlSGlnaGxpZ2h0S2V5VXAoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24ga2V5ZG93blxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQuaXNUcnVzdGVkKSB7XHJcbiAgICAgIHRoaXMuX2hhbmRsZUhpZ2hsaWdodEtleURvd24oZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gcG9pbnRlcnVwIChtb3VzZXVwIG9yIHRvdWNoZW5kKVxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVydXAnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZU1vdXNlVXAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gc2VsZWN0XHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNlbGVjdCcsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gc2VsZWN0aW9uY2hhbmdlXHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNlbGVjdGlvbmNoYW5nZScsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIFB1YmxpYyBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGxvY2FsZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHZhbHVlIExvY2FsZVxyXG4gICAqL1xyXG4gIHNldExvY2FsZSh2YWx1ZTogTG9jYWxlID0gdGhpcy5fZGVmYXVsdExvY2FsZSk6IHZvaWQge1xyXG4gICAgaWYgKCEodmFsdWUgJiYgdmFsdWUubGF5b3V0cykpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbGUgaXMgbm90IGRlZmluZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvY2FsZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGFjdGl2ZSBpbnB1dFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGlucHV0IElucHV0IG5hdGl2ZSBlbGVtZW50XHJcbiAgICovXHJcbiAgc2V0QWN0aXZlSW5wdXQoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPSBpbnB1dDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNraW5nIGtleWJvYXJkIGxheW91dFxyXG4gICAgICovXHJcbiAgICBjb25zdCBpbnB1dE1vZGUgPSB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmlucHV0TW9kZTtcclxuICAgIGlmIChpbnB1dE1vZGUgJiYgWyd0ZXh0JywgJ3NlYXJjaCcsICdlbWFpbCcsICd1cmwnLCAnbnVtZXJpYycsICdkZWNpbWFsJywgJ3RlbCddLnNvbWUoKGkpID0+IGkgPT09IGlucHV0TW9kZSkpIHtcclxuICAgICAgdGhpcy5sYXlvdXRNb2RlID0gaW5wdXRNb2RlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sYXlvdXRNb2RlID0gJ3RleHQnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbnB1dE1vZGUgJiYgWydudW1lcmljJywgJ2RlY2ltYWwnLCAndGVsJ10uc29tZSgoaSkgPT4gaSA9PT0gaW5wdXRNb2RlKSkge1xyXG4gICAgICB0aGlzLmxheW91dE5hbWUgPSAnZGVmYXVsdCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxheW91dE5hbWUgPSAnYWxwaGFiZXRpYyc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0xvY2FsZTonLCBgJHt0aGlzLmxvY2FsZS5jb2RlfWApO1xyXG4gICAgICBjb25zb2xlLmxvZygnTGF5b3V0OicsIGAke3RoaXMubGF5b3V0TW9kZX1fJHt0aGlzLmxheW91dE5hbWV9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB3ZSBtdXN0IGVuc3VyZSBjYXJldFBvc2l0aW9uIGRvZXNuJ3QgcGVyc2lzdCBvbmNlIHJlYWN0aXZhdGVkLlxyXG4gICAgICovXHJcbiAgICB0aGlzLl9zZXRDYXJldFBvc2l0aW9uKHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudC5zZWxlY3Rpb25TdGFydCwgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50LnNlbGVjdGlvbkVuZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0NhcmV0IHN0YXJ0IGF0OicsIHRoaXMuX2NhcmV0UG9zaXRpb24sIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFuZCBzZXQgZm9jdXMgdG8gaW5wdXRcclxuICAgIHRoaXMuX2ZvY3VzQWN0aXZlSW5wdXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBhIHN0YW5kYXJkIGJ1dHRvblxyXG4gICAqL1xyXG4gIGlzU3RhbmRhcmRCdXR0b24gPSAoYnV0dG9uOiBzdHJpbmcpID0+IGJ1dHRvbiAmJiAhKGJ1dHRvblswXSA9PT0gJ3snICYmIGJ1dHRvbltidXR0b24ubGVuZ3RoIC0gMV0gPT09ICd9Jyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlIGJ1dHRvbiB0eXBlXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24ncyBsYXlvdXQgbmFtZVxyXG4gICAqIEByZXR1cm4gVGhlIGJ1dHRvbiB0eXBlXHJcbiAgICovXHJcbiAgZ2V0QnV0dG9uVHlwZShidXR0b246IHN0cmluZyk6ICdzdGFuZGFyZC1rZXknIHwgJ2Z1bmN0aW9uLWtleScge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNTdGFuZGFyZEJ1dHRvbihidXR0b24pID8gJ3N0YW5kYXJkLWtleScgOiAnZnVuY3Rpb24ta2V5JztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgZGVmYXVsdCBjbGFzc2VzIHRvIGEgZ2l2ZW4gYnV0dG9uXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24ncyBsYXlvdXQgbmFtZVxyXG4gICAqIEByZXR1cm4gVGhlIGNsYXNzZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGJ1dHRvblxyXG4gICAqL1xyXG4gIGdldEJ1dHRvbkNsYXNzKGJ1dHRvbjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGJ1dHRvblR5cGVDbGFzcyA9IHRoaXMuZ2V0QnV0dG9uVHlwZShidXR0b24pO1xyXG4gICAgY29uc3QgYnV0dG9uV2l0aG91dEJyYWNlcyA9IGJ1dHRvbi5yZXBsYWNlKCd7JywgJycpLnJlcGxhY2UoJ30nLCAnJyk7XHJcbiAgICBsZXQgYnV0dG9uTm9ybWFsaXplZCA9ICcnO1xyXG5cclxuICAgIGlmIChidXR0b25UeXBlQ2xhc3MgIT09ICdzdGFuZGFyZC1rZXknKSBidXR0b25Ob3JtYWxpemVkID0gYCR7YnV0dG9uV2l0aG91dEJyYWNlc30ta2V5YDtcclxuXHJcbiAgICByZXR1cm4gYCR7YnV0dG9uVHlwZUNsYXNzfSAke2J1dHRvbk5vcm1hbGl6ZWR9YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGRpc3BsYXkgKGxhYmVsKSBuYW1lIGZvciBhIGdpdmVuIGJ1dHRvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uJ3MgbGF5b3V0IG5hbWVcclxuICAgKiBAcmV0dXJuIFRoZSBkaXNwbGF5IG5hbWUgdG8gYmUgc2hvdyB0byB0aGUgYnV0dG9uXHJcbiAgICovXHJcbiAgZ2V0QnV0dG9uRGlzcGxheU5hbWUoYnV0dG9uOiBzdHJpbmcpOiBTYWZlSHRtbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHRoaXMubG9jYWxlLmRpc3BsYXlbYnV0dG9uXSB8fCBidXR0b24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBjbGlja3MgbWFkZSB0byBrZXlib2FyZCBidXR0b25zXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gbGF5b3V0IG5hbWUuXHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBidXR0b24gZXZlbnQuXHJcbiAgICovXHJcbiAgaGFuZGxlQnV0dG9uUHJlc3MoYnV0dG9uOiBzdHJpbmcsIGU/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0tleSBwcmVzczonLCBidXR0b24pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChidXR0b24gPT09IGZuQnV0dG9uLlNISUZUKSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TmFtZSA9IHRoaXMubGF5b3V0TmFtZSA9PT0gJ2FscGhhYmV0aWMnID8gJ3NoaWZ0JyA6ICdhbHBoYWJldGljJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmIChidXR0b24gPT09IGZuQnV0dG9uLkRPTkUpIHtcclxuICAgICAgdGhpcy5jbG9zZVBhbmVsLmVtaXQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbW1vblBhcmFtczogW251bWJlciwgbnVtYmVyLCBib29sZWFuXSA9IFt0aGlzLl9jYXJldFBvc2l0aW9uIHx8IDAsIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQgfHwgMCwgdHJ1ZV07XHJcbiAgICBsZXQgb3V0cHV0ID0gdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py52YWx1ZSB8fCAnJztcclxuXHJcbiAgICAvLyBIYW5kZWwgZnVuY3Rpb25hbCBidXR0b25cclxuICAgIGlmICghdGhpcy5pc1N0YW5kYXJkQnV0dG9uKGJ1dHRvbikpIHtcclxuICAgICAgLy8gSGFuZGVsIEJBQ0tTUEFDRVxyXG4gICAgICBpZiAoYnV0dG9uID09PSBmbkJ1dHRvbi5CQUNLU1BBQ0UpIHtcclxuICAgICAgICBvdXRwdXQgPSB0aGlzLl9yZW1vdmVBdChvdXRwdXQsIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gSGFuZGVsIFNQQUNFXHJcbiAgICAgIGVsc2UgaWYgKGJ1dHRvbiA9PT0gZm5CdXR0b24uU1BBQ0UpIHtcclxuICAgICAgICBvdXRwdXQgPSB0aGlzLl9hZGRTdHJpbmdBdChvdXRwdXQsICcgJywgLi4uY29tbW9uUGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBIYW5kZWwgVEFCXHJcbiAgICAgIGVsc2UgaWYgKGJ1dHRvbiA9PT0gZm5CdXR0b24uVEFCKSB7XHJcbiAgICAgICAgb3V0cHV0ID0gdGhpcy5fYWRkU3RyaW5nQXQob3V0cHV0LCAnXFx0JywgLi4uY29tbW9uUGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBIYW5kZWwgRU5URVJcclxuICAgICAgZWxzZSBpZiAoYnV0dG9uID09PSBmbkJ1dHRvbi5FTlRFUikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzVGV4dGFyZWEpIHtcclxuICAgICAgICAgIG91dHB1dCA9IHRoaXMuX2FkZFN0cmluZ0F0KG91dHB1dCwgJ1xcbicsIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIEhhbmRlbCBMQVlPVVRcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXROYW1lID0gYnV0dG9uLnN1YnN0cmluZygxLCBidXR0b24ubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBIYW5kZWwgc3RhbmRhcmQgYnV0dG9uXHJcbiAgICBlbHNlIHtcclxuICAgICAgb3V0cHV0ID0gdGhpcy5fYWRkU3RyaW5nQXQob3V0cHV0LCBidXR0b24sIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudCkge1xyXG4gICAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQudmFsdWUgPSBvdXRwdXQ7XHJcblxyXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdDYXJldCBhdDonLCB0aGlzLl9jYXJldFBvc2l0aW9uLCB0aGlzLl9jYXJldFBvc2l0aW9uRW5kLCAnQnV0dG9uJywgZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9kaXNwYXRjaEV2ZW50cyhidXR0b24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBidXR0b24gZG93blxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGxheW91dCBuYW1lLlxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgYnV0dG9uIGV2ZW50LlxyXG4gICAqL1xyXG4gIGhhbmRsZUJ1dHRvbkRvd24oYnV0dG9uOiBzdHJpbmcsIGU/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0tleSBkb3duOicsIGJ1dHRvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUpIHtcclxuICAgICAgLyoqXHJcbiAgICAgICAqIEhhbmRsZSBldmVudCBvcHRpb25zXHJcbiAgICAgICAqL1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYWN0aXZlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX3NldEFjdGl2ZUJ1dHRvbihidXR0b24pO1xyXG5cclxuICAgIGlmICh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dCk7XHJcbiAgICBpZiAodGhpcy5faG9sZFRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkVGltZW91dCk7XHJcbiAgICB0aGlzLl9pc01vdXNlSG9sZCA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaW1lIHRvIHdhaXQgdW50aWwgYSBrZXkgaG9sZCBpcyBkZXRlY3RlZFxyXG4gICAgICovXHJcbiAgICB0aGlzLl9ob2xkVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX2lzTW91c2VIb2xkICYmXHJcbiAgICAgICAgKCghYnV0dG9uLmluY2x1ZGVzKCd7JykgJiYgIWJ1dHRvbi5pbmNsdWRlcygnfScpKSB8fCBidXR0b24gPT09IGZuQnV0dG9uLkJBQ0tTUEFDRSB8fCBidXR0b24gPT09IGZuQnV0dG9uLlNQQUNFKVxyXG4gICAgICApIHtcclxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0J1dHRvbiBob2xkOicsIGJ1dHRvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGFuZGxlQnV0dG9uSG9sZChidXR0b24pO1xyXG4gICAgICB9XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkVGltZW91dCk7XHJcbiAgICB9LCA1MDApO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGVsIGJ1dHRvbiBDbGljayBhZnRlciBidXR0b24gZG93blxyXG4gICAgICovXHJcbiAgICB0aGlzLmhhbmRsZUJ1dHRvblByZXNzKGJ1dHRvbiwgZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGJ1dHRvbiB1cFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGxheW91dCBuYW1lLlxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgYnV0dG9uIGV2ZW50LlxyXG4gICAqL1xyXG4gIGhhbmRsZUJ1dHRvblVwKGJ1dHRvbjogc3RyaW5nLCBlPzogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdLZXkgdXA6JywgYnV0dG9uKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZSkge1xyXG4gICAgICAvKipcclxuICAgICAgICogSGFuZGxlIGV2ZW50IG9wdGlvbnNcclxuICAgICAgICovXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBhY3RpdmUgY2xhc3NcclxuICAgICAqL1xyXG4gICAgdGhpcy5fcmVtb3ZlQWN0aXZlQnV0dG9uKCk7XHJcblxyXG4gICAgdGhpcy5faXNNb3VzZUhvbGQgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGJ1dHRvbiBob2xkXHJcbiAgICovXHJcbiAgaGFuZGxlQnV0dG9uSG9sZChidXR0b246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRpbWVvdXQgZGljdGF0aW5nIHRoZSBzcGVlZCBvZiBrZXkgaG9sZCBpdGVyYXRpb25zXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLl9pc01vdXNlSG9sZCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQnV0dG9uUHJlc3MoYnV0dG9uKTtcclxuICAgICAgICB0aGlzLmhhbmRsZUJ1dHRvbkhvbGQoYnV0dG9uKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dCk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEAgUHJpdmF0ZSBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlcyB0aGUgaW50ZXJuYWwgY2FyZXQgcG9zaXRpb25cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBjYXJldCdzIHN0YXJ0IHBvc2l0aW9uXHJcbiAgICogQHBhcmFtIHBvc2l0aW9uRW5kIFRoZSBjYXJldCdzIGVuZCBwb3NpdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3NldENhcmV0UG9zaXRpb24ocG9zaXRpb246IG51bWJlciB8IG51bGwsIGVuZFBvc2l0aW9uID0gcG9zaXRpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhcmV0UG9zaXRpb24gPSBwb3NpdGlvbjtcclxuICAgIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQgPSBlbmRQb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vdmVzIHRoZSBjdXJzb3IgcG9zaXRpb24gYnkgYSBnaXZlbiBhbW91bnRcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIGxlbmd0aCBSZXByZXNlbnRzIGJ5IGhvdyBtYW55IGNoYXJhY3RlcnMgdGhlIGlucHV0IHNob3VsZCBiZSBtb3ZlZFxyXG4gICAqIEBwYXJhbSBtaW51cyBXaGV0aGVyIHRoZSBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBsZWZ0IG9yIG5vdC5cclxuICAgKi9cclxuICBwcml2YXRlIF91cGRhdGVDYXJldFBvcyhsZW5ndGg6IG51bWJlciwgbWludXMgPSBmYWxzZSkge1xyXG4gICAgY29uc3QgbmV3Q2FyZXRQb3MgPSB0aGlzLl91cGRhdGVDYXJldFBvc0FjdGlvbihsZW5ndGgsIG1pbnVzKTtcclxuICAgIHRoaXMuX3NldENhcmV0UG9zaXRpb24obmV3Q2FyZXRQb3MpO1xyXG4gICAgLy8gU2Nyb2xsIHRvIGJvdHRvbVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uc2Nyb2xsVG8oe1xyXG4gICAgICAgIHRvcDogdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50LnNjcm9sbEhlaWdodCxcclxuICAgICAgfSBhcyBTY3JvbGxUb09wdGlvbnMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBY3Rpb24gbWV0aG9kIG9mIHVwZGF0ZUNhcmV0UG9zXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBsZW5ndGggUmVwcmVzZW50cyBieSBob3cgbWFueSBjaGFyYWN0ZXJzIHRoZSBpbnB1dCBzaG91bGQgYmUgbW92ZWRcclxuICAgKiBAcGFyYW0gbWludXMgV2hldGhlciB0aGUgY3Vyc29yIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgbGVmdCBvciBub3QuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfdXBkYXRlQ2FyZXRQb3NBY3Rpb24obGVuZ3RoOiBudW1iZXIsIG1pbnVzID0gZmFsc2UpIHtcclxuICAgIGxldCBjYXJldFBvc2l0aW9uID0gdGhpcy5fY2FyZXRQb3NpdGlvbjtcclxuXHJcbiAgICBpZiAoY2FyZXRQb3NpdGlvbiAhPSBudWxsKSB7XHJcbiAgICAgIGlmIChtaW51cykge1xyXG4gICAgICAgIGlmIChjYXJldFBvc2l0aW9uID4gMCkgY2FyZXRQb3NpdGlvbiA9IGNhcmV0UG9zaXRpb24gLSBsZW5ndGg7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2FyZXRQb3NpdGlvbiA9IGNhcmV0UG9zaXRpb24gKyBsZW5ndGg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FyZXRQb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZXMgYW4gYW1vdW50IG9mIGNoYXJhY3RlcnMgYmVmb3JlIGEgZ2l2ZW4gcG9zaXRpb25cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGlucHV0XHJcbiAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSAoY3Vyc29yKSBwb3NpdGlvbiBmcm9tIHdoZXJlIHRoZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSByZW1vdmVkXHJcbiAgICogQHBhcmFtIG1vdmVDYXJldCBXaGV0aGVyIHRvIHVwZGF0ZSBpbnB1dCBjdXJzb3JcclxuICAgKi9cclxuICBwcml2YXRlIF9yZW1vdmVBdChzb3VyY2U6IHN0cmluZywgcG9zaXRpb24gPSBzb3VyY2UubGVuZ3RoLCBwb3NpdGlvbkVuZCA9IHNvdXJjZS5sZW5ndGgsIG1vdmVDYXJldCA9IGZhbHNlKSB7XHJcbiAgICBpZiAocG9zaXRpb24gPT09IDAgJiYgcG9zaXRpb25FbmQgPT09IDApIHtcclxuICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3V0cHV0O1xyXG5cclxuICAgIGlmIChwb3NpdGlvbiA9PT0gcG9zaXRpb25FbmQpIHtcclxuICAgICAgbGV0IHByZXZUd29DaGFycztcclxuICAgICAgbGV0IGVtb2ppTWF0Y2hlZDtcclxuICAgICAgY29uc3QgZW1vamlNYXRjaGVkUmVnID0gLyhbXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdKS9nO1xyXG5cclxuICAgICAgLyoqXHJcbiAgICAgICAqIEVtb2ppcyBhcmUgbWFkZSBvdXQgb2YgdHdvIGNoYXJhY3RlcnMsIHNvIHdlIG11c3QgdGFrZSBhIGN1c3RvbSBhcHByb2FjaCB0byB0cmltIHRoZW0uXHJcbiAgICAgICAqIEZvciBtb3JlIGluZm86IGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGVcclxuICAgICAgICovXHJcbiAgICAgIGlmIChwb3NpdGlvbiAmJiBwb3NpdGlvbiA+PSAwKSB7XHJcbiAgICAgICAgcHJldlR3b0NoYXJzID0gc291cmNlLnN1YnN0cmluZyhwb3NpdGlvbiAtIDIsIHBvc2l0aW9uKTtcclxuICAgICAgICBlbW9qaU1hdGNoZWQgPSBwcmV2VHdvQ2hhcnMubWF0Y2goZW1vamlNYXRjaGVkUmVnKTtcclxuXHJcbiAgICAgICAgaWYgKGVtb2ppTWF0Y2hlZCkge1xyXG4gICAgICAgICAgb3V0cHV0ID0gc291cmNlLnN1YnN0cmluZygwLCBwb3NpdGlvbiAtIDIpICsgc291cmNlLnN1YnN0cmluZyhwb3NpdGlvbik7XHJcbiAgICAgICAgICBpZiAobW92ZUNhcmV0KSB0aGlzLl91cGRhdGVDYXJldFBvcygyLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb3V0cHV0ID0gc291cmNlLnN1YnN0cmluZygwLCBwb3NpdGlvbiAtIDEpICsgc291cmNlLnN1YnN0cmluZyhwb3NpdGlvbik7XHJcbiAgICAgICAgICBpZiAobW92ZUNhcmV0KSB0aGlzLl91cGRhdGVDYXJldFBvcygxLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJldlR3b0NoYXJzID0gc291cmNlLnNsaWNlKC0yKTtcclxuICAgICAgICBlbW9qaU1hdGNoZWQgPSBwcmV2VHdvQ2hhcnMubWF0Y2goZW1vamlNYXRjaGVkUmVnKTtcclxuXHJcbiAgICAgICAgaWYgKGVtb2ppTWF0Y2hlZCkge1xyXG4gICAgICAgICAgb3V0cHV0ID0gc291cmNlLnNsaWNlKDAsIC0yKTtcclxuICAgICAgICAgIGlmIChtb3ZlQ2FyZXQpIHRoaXMuX3VwZGF0ZUNhcmV0UG9zKDIsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvdXRwdXQgPSBzb3VyY2Uuc2xpY2UoMCwgLTEpO1xyXG4gICAgICAgICAgaWYgKG1vdmVDYXJldCkgdGhpcy5fdXBkYXRlQ2FyZXRQb3MoMSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvdXRwdXQgPSBzb3VyY2Uuc2xpY2UoMCwgcG9zaXRpb24pICsgc291cmNlLnNsaWNlKHBvc2l0aW9uRW5kKTtcclxuICAgICAgaWYgKG1vdmVDYXJldCkge1xyXG4gICAgICAgIHRoaXMuX3NldENhcmV0UG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgYSBzdHJpbmcgdG8gdGhlIGlucHV0IGF0IGEgZ2l2ZW4gcG9zaXRpb25cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGlucHV0XHJcbiAgICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGFkZFxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgKGN1cnNvcikgcG9zaXRpb24gd2hlcmUgdGhlIHN0cmluZyBzaG91bGQgYmUgYWRkZWRcclxuICAgKiBAcGFyYW0gbW92ZUNhcmV0IFdoZXRoZXIgdG8gdXBkYXRlIHZpcnR1YWwta2V5Ym9hcmQgY3Vyc29yXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfYWRkU3RyaW5nQXQoXHJcbiAgICBzb3VyY2U6IHN0cmluZyxcclxuICAgIHN0cjogc3RyaW5nLFxyXG4gICAgcG9zaXRpb24gPSBzb3VyY2UubGVuZ3RoLFxyXG4gICAgcG9zaXRpb25FbmQgPSBzb3VyY2UubGVuZ3RoLFxyXG4gICAgbW92ZUNhcmV0ID0gZmFsc2UsXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5tYXhMZW5ndGggIT09IC0xICYmIHNvdXJjZS5sZW5ndGggPj0gdGhpcy5tYXhMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3V0cHV0O1xyXG5cclxuICAgIGlmICghcG9zaXRpb24gJiYgcG9zaXRpb24gIT09IDApIHtcclxuICAgICAgb3V0cHV0ID0gc291cmNlICsgc3RyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb3V0cHV0ID0gW3NvdXJjZS5zbGljZSgwLCBwb3NpdGlvbiksIHN0ciwgc291cmNlLnNsaWNlKHBvc2l0aW9uRW5kKV0uam9pbignJyk7XHJcbiAgICAgIGlmIChtb3ZlQ2FyZXQpIHRoaXMuX3VwZGF0ZUNhcmV0UG9zKHN0ci5sZW5ndGgsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0cHV0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0aG9kIHRvIGRpc3BhdGNoIG5lY2Vzc2FyeSBrZXlib2FyZCBldmVudHMgdG8gY3VycmVudCBpbnB1dCBlbGVtZW50LlxyXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3VpZXZlbnRzL3Rvb2xzL2tleS1ldmVudC12aWV3ZXIuaHRtbFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2Rpc3BhdGNoRXZlbnRzKGJ1dHRvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQga2V5LCBjb2RlO1xyXG4gICAgaWYgKGJ1dHRvbi5pbmNsdWRlcygneycpICYmIGJ1dHRvbi5pbmNsdWRlcygnfScpKSB7XHJcbiAgICAgIC8vIENhcGl0YWxpemUgbmFtZVxyXG4gICAgICBrZXkgPSBidXR0b24uc2xpY2UoMSwgYnV0dG9uLmxlbmd0aCAtIDEpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGtleSA9IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKTtcclxuICAgICAgY29kZSA9IGtleTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGtleSA9IGJ1dHRvbjtcclxuICAgICAgY29kZSA9IE51bWJlci5pc0ludGVnZXIoTnVtYmVyKGJ1dHRvbikpID8gYERpZ2l0JHtidXR0b259YCA6IGBLZXkke2J1dHRvbi50b1VwcGVyQ2FzZSgpfWA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXZlbnRJbml0OiBLZXlib2FyZEV2ZW50SW5pdCA9IHtcclxuICAgICAgYnViYmxlczogdHJ1ZSxcclxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcclxuICAgICAgc2hpZnRLZXk6IHRoaXMubGF5b3V0TmFtZSA9PSAnc2hpZnQnLFxyXG4gICAgICBrZXk6IGtleSxcclxuICAgICAgY29kZTogY29kZSxcclxuICAgICAgbG9jYXRpb246IDAsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIFNpbXVsYXRlIGFsbCBuZWVkZWQgZXZlbnRzIG9uIGJhc2UgZWxlbWVudFxyXG4gICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py5kaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywgZXZlbnRJbml0KSk7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoJ2tleXByZXNzJywgZXZlbnRJbml0KSk7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoJ2tleXVwJywgZXZlbnRJbml0KSk7XHJcblxyXG4gICAgLy8gQW5kIHNldCBmb2N1cyB0byBpbnB1dFxyXG4gICAgdGhpcy5fZm9jdXNBY3RpdmVJbnB1dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gYW4gZXZlbnQgdGhhdCB3YXJyYW50cyBhIGN1cnNvciBwb3NpdGlvbiB1cGRhdGUgaXMgdHJpZ2dlcmVkXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCB0YXJnZXRUYWdOYW1lID0gJyc7XHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LnRhZ05hbWUpIHtcclxuICAgICAgdGFyZ2V0VGFnTmFtZSA9IGV2ZW50LnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaXNUZXh0SW5wdXQgPVxyXG4gICAgICB0YXJnZXRUYWdOYW1lID09PSAndGV4dGFyZWEnIHx8XHJcbiAgICAgICh0YXJnZXRUYWdOYW1lID09PSAnaW5wdXQnICYmIFsndGV4dCcsICdzZWFyY2gnLCAnZW1haWwnLCAncGFzc3dvcmQnLCAndXJsJywgJ3RlbCddLmluY2x1ZGVzKGV2ZW50LnRhcmdldC50eXBlKSk7XHJcblxyXG4gICAgY29uc3QgaXNLZXlib2FyZCA9XHJcbiAgICAgIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IHx8XHJcbiAgICAgIChldmVudC50YXJnZXQgJiYgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpO1xyXG5cclxuICAgIGlmIChpc1RleHRJbnB1dCAmJiB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBUcmFja3MgY3VycmVudCBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgICogQXMga2V5cyBhcmUgcHJlc3NlZCwgdGV4dCB3aWxsIGJlIGFkZGVkL3JlbW92ZWQgYXQgdGhhdCBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0LlxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsIGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICdDYXJldCBhdDonLFxyXG4gICAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbixcclxuICAgICAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQsXHJcbiAgICAgICAgICBldmVudCAmJiBldmVudC50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgZXZlbnQsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSAncG9pbnRlcnVwJyAmJiB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgdGhpcy5faXNNb3VzZUhvbGQpIHtcclxuICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgaWYgdGhlIHVzZXIgcmVsZWFzZXMgdGhlIGJ1dHRvbiBvdXRzaWRlIG9mIHRoZSB3aW5kb3csIHRoZSBrZXlib2FyZCBkb2Vzbid0IGdldCBzdHVjay5cclxuICAgICAgdGhpcy5oYW5kbGVCdXR0b25VcCgnJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoIWlzS2V5Ym9hcmQgJiYgZXZlbnQ/LnR5cGUgIT09ICdzZWxlY3Rpb25jaGFuZ2UnKSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiB3ZSBtdXN0IGVuc3VyZSBjYXJldFBvc2l0aW9uIGRvZXNuJ3QgcGVyc2lzdCBvbmNlIHJlYWN0aXZhdGVkLlxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihudWxsKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYENhcmV0IHBvc2l0aW9uIHJlc2V0IGR1ZSB0byBcIiR7ZXZlbnQ/LnR5cGV9XCIgZXZlbnRgLCBldmVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBDbG9zZSBwYW5lbFxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5jbG9zZVBhbmVsLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvY3VzIHRvIGlucHV0XHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2ZvY3VzQWN0aXZlSW5wdXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmZvY3VzKCk7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LnNldFNlbGVjdGlvblJhbmdlKHRoaXMuX2NhcmV0UG9zaXRpb24sIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGVsIGhpZ2hsaWdodCBvbiBrZXkgZG93blxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBwcml2YXRlIF9oYW5kbGVIaWdobGlnaHRLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBidXR0b25QcmVzc2VkID0gdGhpcy5fZ2V0S2V5Ym9hcmRMYXlvdXRLZXkoZXZlbnQpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYWN0aXZlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX3NldEFjdGl2ZUJ1dHRvbihidXR0b25QcmVzc2VkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRlbCBoaWdobGlnaHQgb24ga2V5IHVwXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgS2V5Ym9hcmRFdmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2hhbmRsZUhpZ2hsaWdodEtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBidXR0b25QcmVzc2VkID0gdGhpcy5fZ2V0S2V5Ym9hcmRMYXlvdXRLZXkoZXZlbnQpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgYWN0aXZlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX3JlbW92ZUFjdGl2ZUJ1dHRvbihidXR0b25QcmVzc2VkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybXMgYSBLZXlib2FyZEV2ZW50J3MgXCJrZXkuY29kZVwiIHN0cmluZyBpbnRvIGEgdmlydHVhbC1rZXlib2FyZCBsYXlvdXQgZm9ybWF0XHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgS2V5Ym9hcmRFdmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2dldEtleWJvYXJkTGF5b3V0S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBsZXQgb3V0cHV0ID0gJyc7XHJcbiAgICBjb25zdCBrZXlJZCA9IGV2ZW50LmNvZGUgfHwgZXZlbnQua2V5O1xyXG5cclxuICAgIGlmIChcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdTcGFjZScpIHx8XHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnTnVtcGFkJykgfHxcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdCYWNrc3BhY2UnKSB8fFxyXG4gICAgICBrZXlJZD8uaW5jbHVkZXMoJ0NhcHNMb2NrJykgfHxcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdNZXRhJylcclxuICAgICkge1xyXG4gICAgICBvdXRwdXQgPSBgeyR7ZXZlbnQuY29kZX19YCB8fCAnJztcclxuICAgIH0gZWxzZSBpZiAoa2V5SWQ/LmluY2x1ZGVzKCdDb250cm9sJykgfHwga2V5SWQ/LmluY2x1ZGVzKCdTaGlmdCcpIHx8IGtleUlkPy5pbmNsdWRlcygnQWx0JykpIHtcclxuICAgICAgb3V0cHV0ID0gYHske2V2ZW50LmtleX19YCB8fCAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG91dHB1dCA9IGV2ZW50LmtleSB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IDEgPyBvdXRwdXQ/LnRvTG93ZXJDYXNlKCkgOiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgYWN0aXZlIGNsYXNzIGluIGJ1dHRvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbk5hbWVcclxuICAgKi9cclxuICBwcml2YXRlIF9zZXRBY3RpdmVCdXR0b24oYnV0dG9uTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBub2RlID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKS5uYW1lZEl0ZW0oYnV0dG9uTmFtZSk7XHJcbiAgICBpZiAobm9kZSAmJiBub2RlLmNsYXNzTGlzdCkge1xyXG4gICAgICBub2RlLmNsYXNzTGlzdC5hZGQodGhpcy5fYWN0aXZlQnV0dG9uQ2xhc3MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFjdGl2ZSBidXR0b25cclxuICAgKlxyXG4gICAqIEBwYXJhbSBidXR0b25OYW1lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfcmVtb3ZlQWN0aXZlQnV0dG9uKGJ1dHRvbk5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKTtcclxuICAgIGlmIChidXR0b25OYW1lKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5uYW1lZEl0ZW0oYnV0dG9uTmFtZSk7XHJcbiAgICAgIGlmIChub2RlICYmIG5vZGUuY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2FjdGl2ZUJ1dHRvbkNsYXNzKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG5vZGVzW2ldLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fYWN0aXZlQnV0dG9uQ2xhc3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ0b3VjaC1rZXlib2FyZFwiIFtjbGFzc109XCInbGF5b3V0LScgKyBsYXlvdXRNb2RlICsgJy0nICsgbGF5b3V0TmFtZVwiPlxyXG4gIEBmb3IgKHJvdyBvZiBsb2NhbGUubGF5b3V0c1tsYXlvdXRNb2RlICsgXCJfXCIgKyBsYXlvdXROYW1lXTsgdHJhY2sgcm93WzBdKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwidG91Y2gta2V5Ym9hcmQtcm93XCI+XHJcbiAgICAgIEBmb3IgKGtleSBvZiByb3c7IHRyYWNrIGtleSkge1xyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIFtuYW1lXT1cImtleVwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIFtkaXJdPVwibG9jYWxlLmRpclwiXHJcbiAgICAgICAgICBjbGFzcz1cInRvdWNoLWtleWJvYXJkLWtleVwiXHJcbiAgICAgICAgICBbY2xhc3NdPVwiZ2V0QnV0dG9uQ2xhc3Moa2V5KVwiXHJcbiAgICAgICAgICBbYXR0ci5kYXRhLWxheW91dF09XCJsYXlvdXRNb2RlXCJcclxuICAgICAgICAgIChwb2ludGVydXApPVwiaGFuZGxlQnV0dG9uVXAoa2V5LCAkZXZlbnQpXCJcclxuICAgICAgICAgIChwb2ludGVyZG93bik9XCJoYW5kbGVCdXR0b25Eb3duKGtleSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAocG9pbnRlcmNhbmNlbCk9XCJoYW5kbGVCdXR0b25VcChrZXksICRldmVudClcIlxyXG4gICAgICAgICAgW2lubmVySHRtbF09XCJnZXRCdXR0b25EaXNwbGF5TmFtZShrZXkpXCJcclxuICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcbiJdfQ==
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { booleanAttribute, Directive,
|
|
1
|
+
import { booleanAttribute, Directive, ElementRef, HostListener, inject, input, model, } from '@angular/core';
|
|
2
2
|
import { ComponentPortal } from '@angular/cdk/portal';
|
|
3
3
|
import { Overlay } from '@angular/cdk/overlay';
|
|
4
4
|
import { NgxTouchKeyboardComponent } from './ngx-touch-keyboard.component';
|
|
@@ -26,14 +26,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
|
|
|
26
26
|
* It also handles the creation and configuration of the overlay used to display the keyboard.
|
|
27
27
|
*/
|
|
28
28
|
export class NgxTouchKeyboardDirective {
|
|
29
|
-
onFocus() {
|
|
30
|
-
if (this.openOnFocus()) {
|
|
31
|
-
this.open.set(true);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* constructor
|
|
36
|
-
*/
|
|
37
29
|
constructor() {
|
|
38
30
|
this._overlay = inject(Overlay);
|
|
39
31
|
this._elementRef = inject((ElementRef));
|
|
@@ -59,13 +51,21 @@ export class NgxTouchKeyboardDirective {
|
|
|
59
51
|
this.origin = input(null, {
|
|
60
52
|
alias: 'ngxConnectedTouchKeyboardOrigin',
|
|
61
53
|
});
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
54
|
+
}
|
|
55
|
+
onFocus() {
|
|
56
|
+
if (this.openOnFocus() && !this.open()) {
|
|
57
|
+
this.openPanel();
|
|
58
|
+
}
|
|
65
59
|
}
|
|
66
60
|
// -----------------------------------------------------------------------------------------------------
|
|
67
61
|
// @ Lifecycle hooks
|
|
68
62
|
// -----------------------------------------------------------------------------------------------------
|
|
63
|
+
/**
|
|
64
|
+
* On changes
|
|
65
|
+
*/
|
|
66
|
+
ngOnChanges() {
|
|
67
|
+
this.open() ? this.openPanel() : this.closePanel();
|
|
68
|
+
}
|
|
69
69
|
/**
|
|
70
70
|
* On destroy
|
|
71
71
|
*/
|
|
@@ -101,15 +101,17 @@ export class NgxTouchKeyboardDirective {
|
|
|
101
101
|
this._overlayRef.updatePositionStrategy(this._getPositionStrategy(this.fullScreenMode()));
|
|
102
102
|
// Update size the overlay
|
|
103
103
|
this._overlayRef.updateSize(this._getOverlaySize(this.fullScreenMode()));
|
|
104
|
+
// Get the input element associated with the directive
|
|
105
|
+
const inputElement = this._getInputElement();
|
|
104
106
|
// Set input to readonly on mobile devices to prevent the native keyboard from appearing
|
|
105
107
|
if (this._isMobile)
|
|
106
|
-
|
|
108
|
+
inputElement.readOnly = true;
|
|
107
109
|
// Attach the portal to the overlay
|
|
108
110
|
this._panelRef = this._overlayRef.attach(new ComponentPortal(NgxTouchKeyboardComponent));
|
|
109
111
|
this._panelRef.instance.debug = this.debugMode();
|
|
110
112
|
this._panelRef.instance.setLocale(this.locale());
|
|
111
|
-
this._panelRef.instance.setActiveInput(
|
|
112
|
-
this._panelRef.instance.closePanel.subscribe(() => this.
|
|
113
|
+
this._panelRef.instance.setActiveInput(inputElement);
|
|
114
|
+
this._panelRef.instance.closePanel.subscribe(() => this.closePanel());
|
|
113
115
|
this.open.set(true);
|
|
114
116
|
}
|
|
115
117
|
/**
|
|
@@ -127,12 +129,7 @@ export class NgxTouchKeyboardDirective {
|
|
|
127
129
|
* Toggle keyboard panel
|
|
128
130
|
*/
|
|
129
131
|
togglePanel() {
|
|
130
|
-
|
|
131
|
-
this.closePanel();
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
this.openPanel();
|
|
135
|
-
}
|
|
132
|
+
this.open() ? this.closePanel() : this.openPanel();
|
|
136
133
|
}
|
|
137
134
|
// -----------------------------------------------------------------------------------------------------
|
|
138
135
|
// @ Private methods
|
|
@@ -212,6 +209,19 @@ export class NgxTouchKeyboardDirective {
|
|
|
212
209
|
minWidth: '260px',
|
|
213
210
|
};
|
|
214
211
|
}
|
|
212
|
+
/**
|
|
213
|
+
* Gets the input element associated with the directive.
|
|
214
|
+
* This is necessary because when the directive is applied to an Ionic component (ion-input or ion-textarea),
|
|
215
|
+
* the actual input element is nested inside the component's template.
|
|
216
|
+
*
|
|
217
|
+
* @private
|
|
218
|
+
*/
|
|
219
|
+
_getInputElement() {
|
|
220
|
+
if (['ION-INPUT', 'ION-TEXTAREA'].includes(this._elementRef.nativeElement.tagName)) {
|
|
221
|
+
return this._elementRef.nativeElement.querySelector('input, textarea');
|
|
222
|
+
}
|
|
223
|
+
return this._elementRef.nativeElement;
|
|
224
|
+
}
|
|
215
225
|
/**
|
|
216
226
|
* Gets the origin element for the keyboard panel.
|
|
217
227
|
*
|
|
@@ -236,16 +246,22 @@ export class NgxTouchKeyboardDirective {
|
|
|
236
246
|
return element;
|
|
237
247
|
}
|
|
238
248
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgxTouchKeyboardDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
239
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.0", type: NgxTouchKeyboardDirective, selector: "input[ngxTouchKeyboard]
|
|
249
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.0", type: NgxTouchKeyboardDirective, selector: "input[ngxTouchKeyboard],\n textarea[ngxTouchKeyboard],\n ion-input[ngxTouchKeyboard],\n ion-textarea[ngxTouchKeyboard]", inputs: { open: { classPropertyName: "open", publicName: "ngxTouchKeyboardOpen", isSignal: true, isRequired: false, transformFunction: null }, openOnFocus: { classPropertyName: "openOnFocus", publicName: "ngxTouchKeyboardOpenOnFocus", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "ngxTouchKeyboardLocale", isSignal: true, isRequired: false, transformFunction: null }, debugMode: { classPropertyName: "debugMode", publicName: "ngxTouchKeyboardDebug", isSignal: true, isRequired: false, transformFunction: null }, fullScreenMode: { classPropertyName: "fullScreenMode", publicName: "ngxTouchKeyboardFullScreen", isSignal: true, isRequired: false, transformFunction: null }, origin: { classPropertyName: "origin", publicName: "ngxConnectedTouchKeyboardOrigin", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "ngxTouchKeyboardOpenChange" }, host: { listeners: { "focus": "onFocus()", "ionFocus": "onFocus()" } }, exportAs: ["ngxTouchKeyboard"], usesOnChanges: true, ngImport: i0 }); }
|
|
240
250
|
}
|
|
241
251
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgxTouchKeyboardDirective, decorators: [{
|
|
242
252
|
type: Directive,
|
|
243
253
|
args: [{
|
|
244
|
-
selector:
|
|
254
|
+
selector: `input[ngxTouchKeyboard],
|
|
255
|
+
textarea[ngxTouchKeyboard],
|
|
256
|
+
ion-input[ngxTouchKeyboard],
|
|
257
|
+
ion-textarea[ngxTouchKeyboard]`,
|
|
245
258
|
exportAs: 'ngxTouchKeyboard',
|
|
246
259
|
}]
|
|
247
|
-
}],
|
|
260
|
+
}], propDecorators: { onFocus: [{
|
|
248
261
|
type: HostListener,
|
|
249
262
|
args: ['focus']
|
|
263
|
+
}, {
|
|
264
|
+
type: HostListener,
|
|
265
|
+
args: ['ionFocus']
|
|
250
266
|
}] } });
|
|
251
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRvdWNoLWtleWJvYXJkLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10b3VjaC1rZXlib2FyZC9zcmMvbGliL25neC10b3VjaC1rZXlib2FyZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixTQUFTLEVBQ1QsTUFBTSxFQUNOLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEdBRU4sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQW1ELE1BQU0sc0JBQXNCLENBQUM7QUFDaEcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBRzNFOzs7R0FHRztBQUtILE1BQU0sT0FBTyxzQkFBc0I7SUFKbkM7UUFLRSxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ2pDOzhHQUZZLHNCQUFzQjtrR0FBdEIsc0JBQXNCOzsyRkFBdEIsc0JBQXNCO2tCQUpsQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwwQkFBMEI7b0JBQ3BDLFFBQVEsRUFBRSx3QkFBd0I7aUJBQ25DOztBQUtEOzs7R0FHRztBQUtILE1BQU0sT0FBTyx5QkFBeUI7SUFvQ3BDLE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSDtRQTVDUSxhQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFBNEIsQ0FBQSxDQUFDLENB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QkFBQztvQkFDVCxRQUFRLEVBQUUscURBQXFEO29CQUMvRCxRQUFRLEVBQUUsa0JBQWtCO2lCQUM3Qjt3REFxQ0MsT0FBTztzQkFETixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBlZmZlY3QsXHJcbiAgRWxlbWVudFJlZixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgaW5qZWN0LFxyXG4gIGlucHV0LFxyXG4gIG1vZGVsLFxyXG4gIE9uRGVzdHJveSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlSZWYsIE92ZXJsYXlTaXplQ29uZmlnLCBQb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBOZ3hUb3VjaEtleWJvYXJkQ29tcG9uZW50IH0gZnJvbSAnLi9uZ3gtdG91Y2gta2V5Ym9hcmQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSAnLi9Mb2NhbGUvdHlwZSc7XHJcblxyXG4vKipcclxuICogRGlyZWN0aXZlIGFwcGxpZWQgdG8gYW4gZWxlbWVudCB0byBtYWtlIGl0IHVzYWJsZSBhcyBhbiBvcmlnaW4gZm9yIGFuIGtleWJvYXJkIHVzaW5nIGFcclxuICogQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneS5cclxuICovXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW25neFRvdWNoS2V5Ym9hcmRPcmlnaW5dJyxcclxuICBleHBvcnRBczogJ25neFRvdWNoS2V5Ym9hcmRPcmlnaW4nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4VG91Y2hLZXlib2FyZE9yaWdpbiB7XHJcbiAgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZGlyZWN0aXZlIHByb3ZpZGVzIG1ldGhvZHMgdG8gb3BlbiwgY2xvc2UsIGFuZCB0b2dnbGUgdGhlIHRvdWNoIGtleWJvYXJkIHBhbmVsLlxyXG4gKiBJdCBhbHNvIGhhbmRsZXMgdGhlIGNyZWF0aW9uIGFuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBvdmVybGF5IHVzZWQgdG8gZGlzcGxheSB0aGUga2V5Ym9hcmQuXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ2lucHV0W25neFRvdWNoS2V5Ym9hcmRdLCB0ZXh0YXJlYVtuZ3hUb3VjaEtleWJvYXJkXScsXHJcbiAgZXhwb3J0QXM6ICduZ3hUb3VjaEtleWJvYXJkJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFRvdWNoS2V5Ym9hcmREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgX292ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XHJcbiAgcHJpdmF0ZSBfZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+KTtcclxuICBwcml2YXRlIF9pc01vYmlsZSA9IC9BbmRyb2lkfGlQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xyXG5cclxuICBvcGVuID0gbW9kZWwoZmFsc2UsIHtcclxuICAgIGFsaWFzOiAnbmd4VG91Y2hLZXlib2FyZE9wZW4nLFxyXG4gIH0pO1xyXG5cclxuICBvcGVuT25Gb2N1cyA9IGlucHV0KGZhbHNlLCB7XHJcbiAgICBhbGlhczogJ25neFRvdWNoS2V5Ym9hcmRPcGVuT25Gb2N1cycsXHJcbiAgICB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsXHJcbiAgfSk7XHJcblxyXG4gIGxvY2FsZSA9IGlucHV0PExvY2FsZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7XHJcbiAgICBhbGlhczogJ25neFRvdWNoS2V5Ym9hcmRMb2NhbGUnLFxyXG4gIH0pO1xyXG5cclxuICBkZWJ1Z01vZGUgPSBpbnB1dChmYWxzZSwge1xyXG4gICAgYWxpYXM6ICduZ3hUb3VjaEtleWJvYXJkRGVidWcnLFxyXG4gICAgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLFxyXG4gIH0pO1xyXG5cclxuICBmdWxsU2NyZWVuTW9kZSA9IGlucHV0KGZhbHNlLCB7XHJcbiAgICBhbGlhczogJ25neFRvdWNoS2V5Ym9hcmRGdWxsU2NyZWVuJyxcclxuICAgIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSxcclxuICB9KTtcclxuXHJcbiAgb3JpZ2luID0gaW5wdXQ8Tmd4VG91Y2hLZXlib2FyZE9yaWdpbiB8IG51bGw+KG51bGwsIHtcclxuICAgIGFsaWFzOiAnbmd4Q29ubmVjdGVkVG91Y2hLZXlib2FyZE9yaWdpbicsXHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgX292ZXJsYXlSZWYhOiBPdmVybGF5UmVmO1xyXG4gIHByaXZhdGUgX3BhbmVsUmVmITogQ29tcG9uZW50UmVmPE5neFRvdWNoS2V5Ym9hcmRDb21wb25lbnQ+O1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdmb2N1cycpXHJcbiAgb25Gb2N1cygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9wZW5PbkZvY3VzKCkpIHtcclxuICAgICAgdGhpcy5vcGVuLnNldCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNvbnN0cnVjdG9yXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBlZmZlY3QoKCkgPT4ge1xyXG4gICAgICB0aGlzLm9wZW4oKSA/IHRoaXMub3BlblBhbmVsKCkgOiB0aGlzLmNsb3NlUGFuZWwoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIExpZmVjeWNsZSBob29rc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIGRlc3Ryb3lcclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIC8vIERpc3Bvc2UgdGhlIG92ZXJsYXlcclxuICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIFB1YmxpYyBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiBrZXlib2FyZCBwYW5lbFxyXG4gICAqL1xyXG4gIG9wZW5QYW5lbCgpOiB2b2lkIHtcclxuICAgIC8vIHJldHVybiBpZiBwYW5lbCBpcyBhdHRhY2hlZFxyXG4gICAgaWYgKHRoaXMuX292ZXJsYXlSZWY/Lmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSB0aGUgb3ZlcmxheSBpZiBpdCBkb2Vzbid0IGV4aXN0XHJcbiAgICBpZiAoIXRoaXMuX292ZXJsYXlSZWYpIHtcclxuICAgICAgdGhpcy5fY3JlYXRlT3ZlcmxheSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNldCBvdmVybGF5IGNsYXNzXHJcbiAgICBpZiAodGhpcy5mdWxsU2NyZWVuTW9kZSgpKSB7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYuYWRkUGFuZWxDbGFzcygnbmd4LXRvdWNoLWtleWJvYXJkLWZ1bGxTY3JlZW4nKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlSZWYucmVtb3ZlUGFuZWxDbGFzcygnbmd4LXRvdWNoLWtleWJvYXJkLWZ1bGxTY3JlZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBVcGRhdGUgcG9zaXRpb24gdGhlIG92ZXJsYXlcclxuICAgIHRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb25TdHJhdGVneSh0aGlzLl9nZXRQb3NpdGlvblN0cmF0ZWd5KHRoaXMuZnVsbFNjcmVlbk1vZGUoKSkpO1xyXG5cclxuICAgIC8vIFVwZGF0ZSBzaXplIHRoZSBvdmVybGF5XHJcbiAgICB0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVNpemUodGhpcy5fZ2V0T3ZlcmxheVNpemUodGhpcy5mdWxsU2NyZWVuTW9kZSgpKSk7XHJcblxyXG4gICAgLy8gU2V0IGlucHV0IHRvIHJlYWRvbmx5IG9uIG1vYmlsZSBkZXZpY2VzIHRvIHByZXZlbnQgdGhlIG5hdGl2ZSBrZXlib2FyZCBmcm9tIGFwcGVhcmluZ1xyXG4gICAgaWYgKHRoaXMuX2lzTW9iaWxlKSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucmVhZE9ubHkgPSB0cnVlO1xyXG5cclxuICAgIC8vIEF0dGFjaCB0aGUgcG9ydGFsIHRvIHRoZSBvdmVybGF5XHJcbiAgICB0aGlzLl9wYW5lbFJlZiA9IHRoaXMuX292ZXJsYXlSZWYuYXR0YWNoKG5ldyBDb21wb25lbnRQb3J0YWwoTmd4VG91Y2hLZXlib2FyZENvbXBvbmVudCkpO1xyXG4gICAgdGhpcy5fcGFuZWxSZWYuaW5zdGFuY2UuZGVidWcgPSB0aGlzLmRlYnVnTW9kZSgpO1xyXG4gICAgdGhpcy5fcGFuZWxSZWYuaW5zdGFuY2Uuc2V0TG9jYWxlKHRoaXMubG9jYWxlKCkpO1xyXG4gICAgdGhpcy5fcGFuZWxSZWYuaW5zdGFuY2Uuc2V0QWN0aXZlSW5wdXQodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgIHRoaXMuX3BhbmVsUmVmLmluc3RhbmNlLmNsb3NlUGFuZWwuc3Vic2NyaWJlKCgpID0+IHRoaXMub3Blbi5zZXQoZmFsc2UpKTtcclxuICAgIHRoaXMub3Blbi5zZXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSBrZXlib2FyZCBwYW5lbFxyXG4gICAqL1xyXG4gIGNsb3NlUGFuZWwoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNNb2JpbGUpIHtcclxuICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlYWRPbmx5ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5ibHVyKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vdmVybGF5UmVmPy5kZXRhY2goKTtcclxuICAgIHRoaXMub3Blbi5zZXQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIGtleWJvYXJkIHBhbmVsXHJcbiAgICovXHJcbiAgdG9nZ2xlUGFuZWwoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5vcGVuKCkpIHtcclxuICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW5QYW5lbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIFByaXZhdGUgbWV0aG9kc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSB0aGUgb3ZlcmxheVxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9jcmVhdGVPdmVybGF5KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fb3ZlcmxheVJlZiA9IHRoaXMuX292ZXJsYXkuY3JlYXRlKHtcclxuICAgICAgZGlyZWN0aW9uOiAnbHRyJyxcclxuICAgICAgaGFzQmFja2Ryb3A6IGZhbHNlLFxyXG4gICAgICBwYW5lbENsYXNzOiAnbmd4LXRvdWNoLWtleWJvYXJkLW92ZXJsYXktcGFuZScsXHJcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMubm9vcCgpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgcG9zaXRpb24gc3RyYXRlZ3lcclxuICAgKlxyXG4gICAqIEBwYXJhbSBmdWxsc2NyZWVuXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRQb3NpdGlvblN0cmF0ZWd5KGZ1bGxzY3JlZW46IGJvb2xlYW4pOiBQb3NpdGlvblN0cmF0ZWd5IHtcclxuICAgIGlmIChmdWxsc2NyZWVuKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCkuY2VudGVySG9yaXpvbnRhbGx5KCkuYm90dG9tKCcwJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX292ZXJsYXlcclxuICAgICAgLnBvc2l0aW9uKClcclxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5fZ2V0T3JpZ2luRWxlbWVudCgpKVxyXG4gICAgICAud2l0aExvY2tlZFBvc2l0aW9uKClcclxuICAgICAgLndpdGhQdXNoKClcclxuICAgICAgLndpdGhQb3NpdGlvbnMoW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXHJcbiAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcclxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxyXG4gICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcclxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxyXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXHJcbiAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBvcmlnaW5YOiAnZW5kJyxcclxuICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxyXG4gICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxyXG4gICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXHJcbiAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcclxuICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcclxuICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcclxuICAgICAgICB9LFxyXG4gICAgICBdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBvdmVybGF5IHNpemVcclxuICAgKlxyXG4gICAqIEBwYXJhbSBmdWxsc2NyZWVuXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRPdmVybGF5U2l6ZShmdWxsc2NyZWVuOiBib29sZWFuKTogT3ZlcmxheVNpemVDb25maWcge1xyXG4gICAgaWYgKGZ1bGxzY3JlZW4pIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgICAgIG1heFdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgbWluV2lkdGg6ICcxMDAlJyxcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aDogdGhpcy5fZ2V0T3JpZ2luRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLFxyXG4gICAgICBtYXhXaWR0aDogdGhpcy5fZ2V0T3JpZ2luRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLFxyXG4gICAgICBtaW5XaWR0aDogJzI2MHB4JyxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBvcmlnaW4gZWxlbWVudCBmb3IgdGhlIGtleWJvYXJkIHBhbmVsLlxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRPcmlnaW5FbGVtZW50KCk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5vcmlnaW4oKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5vcmlnaW4oKT8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgLy8gTWF0ZXJpYWwgZm9ybSBmaWVsZCA8PSB2MTRcclxuICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbWF0LWlucHV0LWVsZW1lbnQnKSkge1xyXG4gICAgICAvLyBSZXR1cm4gW21hdC1mb3JtLWZpZWxkLWZsZXhdIGVsZW1lbnRcclxuICAgICAgcmV0dXJuIGVsZW1lbnQucGFyZW50Tm9kZT8ucGFyZW50Tm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNYXRlcmlhbCBmb3JtIGZpZWxkID4gdjE0XHJcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1tZGMtaW5wdXQtZWxlbWVudCcpKSB7XHJcbiAgICAgIC8vIFJldHVybiBbbWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXJdIGVsZW1lbnRcclxuICAgICAgcmV0dXJuIGVsZW1lbnQucGFyZW50Tm9kZT8ucGFyZW50Tm9kZT8ucGFyZW50Tm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZXR1cm4gaW5wdXRcclxuICAgIHJldHVybiBlbGVtZW50O1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
267
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRvdWNoLWtleWJvYXJkLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10b3VjaC1rZXlib2FyZC9zcmMvbGliL25neC10b3VjaC1rZXlib2FyZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssR0FFTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBbUQsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFHM0U7OztHQUdHO0FBS0gsTUFBTSxPQUFPLHNCQUFzQjtJQUpuQztRQUtFLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDakM7OEdBRlksc0JBQXNCO2tHQUF0QixzQkFBc0I7OzJGQUF0QixzQkFBc0I7a0JBSmxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDBCQUEwQjtvQkFDcEMsUUFBUSxFQUFFLHdCQUF3QjtpQkFDbkM7O0FBS0Q7OztHQUdHO0FBUUgsTUFBTSxPQUFPLHlCQUF5QjtJQVB0QztRQVFVLGFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsZ0JBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQSxVQUE0QixDQUFBLENBQUMsQ0FBQztRQUNuRCxjQUFTLEdBQUcsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUxRSxTQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRTtZQUNsQixLQUFLLEVBQUUsc0JBQXNCO1NBQzlCLENBQUMsQ0FBQztRQUVI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Qyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7WUFDeEQsOENBQThDO1lBQzlDLE9BQU8sT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDO1FBQ3BELENBQUM7UUFFRCxlQUFlO1FBQ2YsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs4R0E5UFUseUJBQXlCO2tHQUF6Qix5QkFBeUI7OzJGQUF6Qix5QkFBeUI7a0JBUHJDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFOzs7NENBR2dDO29CQUMxQyxRQUFRLEVBQUUsa0JBQWtCO2lCQUM3Qjs4QkFzQ0MsT0FBTztzQkFGTixZQUFZO3VCQUFDLE9BQU87O3NCQUNwQixZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBpbmplY3QsXHJcbiAgaW5wdXQsXHJcbiAgbW9kZWwsXHJcbiAgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVJlZiwgT3ZlcmxheVNpemVDb25maWcsIFBvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IE5neFRvdWNoS2V5Ym9hcmRDb21wb25lbnQgfSBmcm9tICcuL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMb2NhbGUgfSBmcm9tICcuL0xvY2FsZS90eXBlJztcclxuXHJcbi8qKlxyXG4gKiBEaXJlY3RpdmUgYXBwbGllZCB0byBhbiBlbGVtZW50IHRvIG1ha2UgaXQgdXNhYmxlIGFzIGFuIG9yaWdpbiBmb3IgYW4ga2V5Ym9hcmQgdXNpbmcgYVxyXG4gKiBDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LlxyXG4gKi9cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbbmd4VG91Y2hLZXlib2FyZE9yaWdpbl0nLFxyXG4gIGV4cG9ydEFzOiAnbmd4VG91Y2hLZXlib2FyZE9yaWdpbicsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hUb3VjaEtleWJvYXJkT3JpZ2luIHtcclxuICBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBkaXJlY3RpdmUgcHJvdmlkZXMgbWV0aG9kcyB0byBvcGVuLCBjbG9zZSwgYW5kIHRvZ2dsZSB0aGUgdG91Y2gga2V5Ym9hcmQgcGFuZWwuXHJcbiAqIEl0IGFsc28gaGFuZGxlcyB0aGUgY3JlYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gb2YgdGhlIG92ZXJsYXkgdXNlZCB0byBkaXNwbGF5IHRoZSBrZXlib2FyZC5cclxuICovXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiBgaW5wdXRbbmd4VG91Y2hLZXlib2FyZF0sXHJcbiAgICAgICAgICAgICB0ZXh0YXJlYVtuZ3hUb3VjaEtleWJvYXJkXSxcclxuICAgICAgICAgICAgIGlvbi1pbnB1dFtuZ3hUb3VjaEtleWJvYXJkXSxcclxuICAgICAgICAgICAgIGlvbi10ZXh0YXJlYVtuZ3hUb3VjaEtleWJvYXJkXWAsXHJcbiAgZXhwb3J0QXM6ICduZ3hUb3VjaEtleWJvYXJkJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFRvdWNoS2V5Ym9hcmREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgX292ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XHJcbiAgcHJpdmF0ZSBfZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+KTtcclxuICBwcml2YXRlIF9pc01vYmlsZSA9IC9BbmRyb2lkfGlQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xyXG5cclxuICBvcGVuID0gbW9kZWwoZmFsc2UsIHtcclxuICAgIGFsaWFzOiAnbmd4VG91Y2hLZXlib2FyZE9wZW4nLFxyXG4gIH0pO1xyXG5cclxuICBvcGVuT25Gb2N1cyA9IGlucHV0KGZhbHNlLCB7XHJcbiAgICBhbGlhczogJ25neFRvdWNoS2V5Ym9hcmRPcGVuT25Gb2N1cycsXHJcbiAgICB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsXHJcbiAgfSk7XHJcblxyXG4gIGxvY2FsZSA9IGlucHV0PExvY2FsZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7XHJcbiAgICBhbGlhczogJ25neFRvdWNoS2V5Ym9hcmRMb2NhbGUnLFxyXG4gIH0pO1xyXG5cclxuICBkZWJ1Z01vZGUgPSBpbnB1dChmYWxzZSwge1xyXG4gICAgYWxpYXM6ICduZ3hUb3VjaEtleWJvYXJkRGVidWcnLFxyXG4gICAgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLFxyXG4gIH0pO1xyXG5cclxuICBmdWxsU2NyZWVuTW9kZSA9IGlucHV0KGZhbHNlLCB7XHJcbiAgICBhbGlhczogJ25neFRvdWNoS2V5Ym9hcmRGdWxsU2NyZWVuJyxcclxuICAgIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSxcclxuICB9KTtcclxuXHJcbiAgb3JpZ2luID0gaW5wdXQ8Tmd4VG91Y2hLZXlib2FyZE9yaWdpbiB8IG51bGw+KG51bGwsIHtcclxuICAgIGFsaWFzOiAnbmd4Q29ubmVjdGVkVG91Y2hLZXlib2FyZE9yaWdpbicsXHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgX292ZXJsYXlSZWYhOiBPdmVybGF5UmVmO1xyXG4gIHByaXZhdGUgX3BhbmVsUmVmITogQ29tcG9uZW50UmVmPE5neFRvdWNoS2V5Ym9hcmRDb21wb25lbnQ+O1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdmb2N1cycpXHJcbiAgQEhvc3RMaXN0ZW5lcignaW9uRm9jdXMnKVxyXG4gIG9uRm9jdXMoKSB7XHJcbiAgICBpZiAodGhpcy5vcGVuT25Gb2N1cygpICYmICF0aGlzLm9wZW4oKSkge1xyXG4gICAgICB0aGlzLm9wZW5QYW5lbCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIExpZmVjeWNsZSBob29rc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIGNoYW5nZXNcclxuICAgKi9cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIHRoaXMub3BlbigpID8gdGhpcy5vcGVuUGFuZWwoKSA6IHRoaXMuY2xvc2VQYW5lbCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gZGVzdHJveVxyXG4gICAqL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgLy8gRGlzcG9zZSB0aGUgb3ZlcmxheVxyXG4gICAgaWYgKHRoaXMuX292ZXJsYXlSZWYpIHtcclxuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEAgUHVibGljIG1ldGhvZHNcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKipcclxuICAgKiBPcGVuIGtleWJvYXJkIHBhbmVsXHJcbiAgICovXHJcbiAgb3BlblBhbmVsKCk6IHZvaWQge1xyXG4gICAgLy8gcmV0dXJuIGlmIHBhbmVsIGlzIGF0dGFjaGVkXHJcbiAgICBpZiAodGhpcy5fb3ZlcmxheVJlZj8uaGFzQXR0YWNoZWQoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3JlYXRlIHRoZSBvdmVybGF5IGlmIGl0IGRvZXNuJ3QgZXhpc3RcclxuICAgIGlmICghdGhpcy5fb3ZlcmxheVJlZikge1xyXG4gICAgICB0aGlzLl9jcmVhdGVPdmVybGF5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2V0IG92ZXJsYXkgY2xhc3NcclxuICAgIGlmICh0aGlzLmZ1bGxTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5hZGRQYW5lbENsYXNzKCduZ3gtdG91Y2gta2V5Ym9hcmQtZnVsbFNjcmVlbicpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fb3ZlcmxheVJlZi5yZW1vdmVQYW5lbENsYXNzKCduZ3gtdG91Y2gta2V5Ym9hcmQtZnVsbFNjcmVlbicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSBwb3NpdGlvbiB0aGUgb3ZlcmxheVxyXG4gICAgdGhpcy5fb3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHRoaXMuX2dldFBvc2l0aW9uU3RyYXRlZ3kodGhpcy5mdWxsU2NyZWVuTW9kZSgpKSk7XHJcblxyXG4gICAgLy8gVXBkYXRlIHNpemUgdGhlIG92ZXJsYXlcclxuICAgIHRoaXMuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh0aGlzLl9nZXRPdmVybGF5U2l6ZSh0aGlzLmZ1bGxTY3JlZW5Nb2RlKCkpKTtcclxuXHJcbiAgICAvLyBHZXQgdGhlIGlucHV0IGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmVcclxuICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IHRoaXMuX2dldElucHV0RWxlbWVudCgpO1xyXG5cclxuICAgIC8vIFNldCBpbnB1dCB0byByZWFkb25seSBvbiBtb2JpbGUgZGV2aWNlcyB0byBwcmV2ZW50IHRoZSBuYXRpdmUga2V5Ym9hcmQgZnJvbSBhcHBlYXJpbmdcclxuICAgIGlmICh0aGlzLl9pc01vYmlsZSkgaW5wdXRFbGVtZW50LnJlYWRPbmx5ID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBBdHRhY2ggdGhlIHBvcnRhbCB0byB0aGUgb3ZlcmxheVxyXG4gICAgdGhpcy5fcGFuZWxSZWYgPSB0aGlzLl9vdmVybGF5UmVmLmF0dGFjaChuZXcgQ29tcG9uZW50UG9ydGFsKE5neFRvdWNoS2V5Ym9hcmRDb21wb25lbnQpKTtcclxuICAgIHRoaXMuX3BhbmVsUmVmLmluc3RhbmNlLmRlYnVnID0gdGhpcy5kZWJ1Z01vZGUoKTtcclxuICAgIHRoaXMuX3BhbmVsUmVmLmluc3RhbmNlLnNldExvY2FsZSh0aGlzLmxvY2FsZSgpKTtcclxuICAgIHRoaXMuX3BhbmVsUmVmLmluc3RhbmNlLnNldEFjdGl2ZUlucHV0KGlucHV0RWxlbWVudCk7XHJcbiAgICB0aGlzLl9wYW5lbFJlZi5pbnN0YW5jZS5jbG9zZVBhbmVsLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsb3NlUGFuZWwoKSk7XHJcbiAgICB0aGlzLm9wZW4uc2V0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2Uga2V5Ym9hcmQgcGFuZWxcclxuICAgKi9cclxuICBjbG9zZVBhbmVsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2lzTW9iaWxlKSB7XHJcbiAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZWFkT25seSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fb3ZlcmxheVJlZj8uZGV0YWNoKCk7XHJcbiAgICB0aGlzLm9wZW4uc2V0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBrZXlib2FyZCBwYW5lbFxyXG4gICAqL1xyXG4gIHRvZ2dsZVBhbmVsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVuKCkgPyB0aGlzLmNsb3NlUGFuZWwoKSA6IHRoaXMub3BlblBhbmVsKCk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEAgUHJpdmF0ZSBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIHRoZSBvdmVybGF5XHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2NyZWF0ZU92ZXJsYXkoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vdmVybGF5UmVmID0gdGhpcy5fb3ZlcmxheS5jcmVhdGUoe1xyXG4gICAgICBkaXJlY3Rpb246ICdsdHInLFxyXG4gICAgICBoYXNCYWNrZHJvcDogZmFsc2UsXHJcbiAgICAgIHBhbmVsQ2xhc3M6ICduZ3gtdG91Y2gta2V5Ym9hcmQtb3ZlcmxheS1wYW5lJyxcclxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuX292ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5ub29wKCksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBwb3NpdGlvbiBzdHJhdGVneVxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZ1bGxzY3JlZW5cclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2dldFBvc2l0aW9uU3RyYXRlZ3koZnVsbHNjcmVlbjogYm9vbGVhbik6IFBvc2l0aW9uU3RyYXRlZ3kge1xyXG4gICAgaWYgKGZ1bGxzY3JlZW4pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKS5jZW50ZXJIb3Jpem9udGFsbHkoKS5ib3R0b20oJzAnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVxyXG4gICAgICAucG9zaXRpb24oKVxyXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9nZXRPcmlnaW5FbGVtZW50KCkpXHJcbiAgICAgIC53aXRoTG9ja2VkUG9zaXRpb24oKVxyXG4gICAgICAud2l0aFB1c2goKVxyXG4gICAgICAud2l0aFBvc2l0aW9ucyhbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcclxuICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxyXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXHJcbiAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxyXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXHJcbiAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcclxuICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxyXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXHJcbiAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXHJcbiAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBvcmlnaW5YOiAnZW5kJyxcclxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxyXG4gICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxyXG4gICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IG92ZXJsYXkgc2l6ZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZ1bGxzY3JlZW5cclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2dldE92ZXJsYXlTaXplKGZ1bGxzY3JlZW46IGJvb2xlYW4pOiBPdmVybGF5U2l6ZUNvbmZpZyB7XHJcbiAgICBpZiAoZnVsbHNjcmVlbikge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcclxuICAgICAgICBtaW5XaWR0aDogJzEwMCUnLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZHRoOiB0aGlzLl9nZXRPcmlnaW5FbGVtZW50KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgsXHJcbiAgICAgIG1heFdpZHRoOiB0aGlzLl9nZXRPcmlnaW5FbGVtZW50KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgsXHJcbiAgICAgIG1pbldpZHRoOiAnMjYwcHgnLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGlucHV0IGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuXHJcbiAgICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aGVuIHRoZSBkaXJlY3RpdmUgaXMgYXBwbGllZCB0byBhbiBJb25pYyBjb21wb25lbnQgKGlvbi1pbnB1dCBvciBpb24tdGV4dGFyZWEpLFxyXG4gICAqIHRoZSBhY3R1YWwgaW5wdXQgZWxlbWVudCBpcyBuZXN0ZWQgaW5zaWRlIHRoZSBjb21wb25lbnQncyB0ZW1wbGF0ZS5cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZ2V0SW5wdXRFbGVtZW50KCk6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50IHtcclxuICAgIGlmIChbJ0lPTi1JTlBVVCcsICdJT04tVEVYVEFSRUEnXS5pbmNsdWRlcyh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudGFnTmFtZSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCwgdGV4dGFyZWEnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgb3JpZ2luIGVsZW1lbnQgZm9yIHRoZSBrZXlib2FyZCBwYW5lbC5cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZ2V0T3JpZ2luRWxlbWVudCgpOiBhbnkge1xyXG4gICAgaWYgKHRoaXMub3JpZ2luKCkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3JpZ2luKCk/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIC8vIE1hdGVyaWFsIGZvcm0gZmllbGQgPD0gdjE0XHJcbiAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1pbnB1dC1lbGVtZW50JykpIHtcclxuICAgICAgLy8gUmV0dXJuIFttYXQtZm9ybS1maWVsZC1mbGV4XSBlbGVtZW50XHJcbiAgICAgIHJldHVybiBlbGVtZW50LnBhcmVudE5vZGU/LnBhcmVudE5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTWF0ZXJpYWwgZm9ybSBmaWVsZCA+IHYxNFxyXG4gICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdtYXQtbWRjLWlucHV0LWVsZW1lbnQnKSkge1xyXG4gICAgICAvLyBSZXR1cm4gW21hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVyXSBlbGVtZW50XHJcbiAgICAgIHJldHVybiBlbGVtZW50LnBhcmVudE5vZGU/LnBhcmVudE5vZGU/LnBhcmVudE5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmV0dXJuIGlucHV0XHJcbiAgICByZXR1cm4gZWxlbWVudDtcclxuICB9XHJcbn1cclxuIl19
|