ngx-touch-keyboard 3.1.0 → 3.2.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 CHANGED
@@ -41,8 +41,8 @@ export class AppModule { }
41
41
 
42
42
  #### Version [`3.0.0`]
43
43
 
44
- * `@angular/core`: `^16.0.0`
45
- * `@angular/cdk`: `^16.0.0`
44
+ * `@angular/core`: `^16.0.0` || `^17.0.0` || `^18.0.0`
45
+ * `@angular/cdk`: `^16.0.0` || `^17.0.0` || `^18.0.0`
46
46
 
47
47
  #### Version [`2.0.0`]
48
48
 
@@ -56,8 +56,9 @@ AngularTouchKeyboard is localized in 5 keyboard-specific locales:
56
56
  * `en-US` English (United States) (default)
57
57
  * `en-UK` English (United Kingdom)
58
58
  * `fa-IR` Persian (Iran)
59
- * `sv-SE` Swedish (Sweden)
60
59
  * `ka-GE` Georgian (Georgia)
60
+ * `ru-RU` Russian (Russia)
61
+ * `sv-SE` Swedish (Sweden)
61
62
 
62
63
  ## Usage
63
64
 
@@ -1,6 +1,7 @@
1
1
  export { default as enGB } from './en-GB';
2
2
  export { default as enUS } from './en-US';
3
3
  export { default as faIR } from './fa-IR';
4
- export { default as svSE } from './sv-SE';
5
4
  export { default as kaGE } from './ka-GE';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdG91Y2gta2V5Ym9hcmQvc3JjL2xpYi9Mb2NhbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBkZWZhdWx0IGFzIGVuR0IgfSBmcm9tICcuL2VuLUdCJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBlblVTIH0gZnJvbSAnLi9lbi1VUyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmFJUiB9IGZyb20gJy4vZmEtSVInO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIHN2U0UgfSBmcm9tICcuL3N2LVNFJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBrYUdFIH0gZnJvbSAnLi9rYS1HRSc7XHJcbiJdfQ==
5
+ export { default as ruRU } from './ru-RU';
6
+ export { default as svSE } from './sv-SE';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdG91Y2gta2V5Ym9hcmQvc3JjL2xpYi9Mb2NhbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBkZWZhdWx0IGFzIGVuR0IgfSBmcm9tICcuL2VuLUdCJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBlblVTIH0gZnJvbSAnLi9lbi1VUyc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmFJUiB9IGZyb20gJy4vZmEtSVInO1xyXG5leHBvcnQgeyBkZWZhdWx0IGFzIGthR0UgfSBmcm9tICcuL2thLUdFJztcclxuZXhwb3J0IHsgZGVmYXVsdCBhcyBydVJVIH0gZnJvbSAnLi9ydS1SVSc7XHJcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3ZTRSB9IGZyb20gJy4vc3YtU0UnO1xyXG4iXX0=
@@ -0,0 +1,134 @@
1
+ import { fnDisplay } from '../constants';
2
+ const layouts = {
3
+ text_alphabetic: [
4
+ ['й', 'ц', 'у', 'к', 'е', 'н', 'г', 'ш', 'щ', 'з', 'х', 'ъ'],
5
+ ['ф', 'ы', 'в', 'а', 'п', 'р', 'о', 'л', 'д', 'ж', 'э'],
6
+ ['{shift}', 'я', 'ч', 'с', 'м', 'и', 'т', 'ь', 'б', 'ю', '{backspace}'],
7
+ ['{numeric}', '{space}', '{done}'],
8
+ ],
9
+ text_shift: [
10
+ ['Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Х', 'Ъ'],
11
+ ['Ф', 'Ы', 'В', 'А', 'П', 'Р', 'О', 'Л', 'Д', 'Ж', 'З'],
12
+ ['{shift}', 'Я', 'Ч', 'С', 'М', 'И', 'Т', 'Ь', 'Б', 'Ю', '{backspace}'],
13
+ ['{numeric}', '{space}', '{done}'],
14
+ ],
15
+ text_numeric: [
16
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],
17
+ ['-', '/', ':', ';', '(', ')', '$', '&', '@', '"'],
18
+ ['{symbolic}', '.', ',', '?', '!', "'", '{backspace}'],
19
+ ['{alphabetic}', '{space}', '{done}'],
20
+ ],
21
+ text_symbolic: [
22
+ ['[', ']', '{', '}', '#', '%', '^', '*', '+', '='],
23
+ ['_', '\\', '|', '~', '<', '>', '€', '£', '¥', '•'],
24
+ ['{numeric}', '.', ',', '?', '!', "'", '{backspace}'],
25
+ ['{alphabetic}', '{space}', '{done}'],
26
+ ],
27
+ search_alphabetic: [
28
+ ['й', 'ц', 'у', 'к', 'е', 'н', 'г', 'ш', 'щ', 'з', 'х', 'ъ'],
29
+ ['ф', 'ы', 'в', 'а', 'п', 'р', 'о', 'л', 'д', 'ж', 'э'],
30
+ ['{shift}', 'я', 'ч', 'с', 'м', 'и', 'т', 'ь', 'б', 'ю', '{backspace}'],
31
+ ['{numeric}', '{space}', '{done}'],
32
+ ],
33
+ search_shift: [
34
+ ['Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Х', 'Ъ'],
35
+ ['Ф', 'Ы', 'В', 'А', 'П', 'Р', 'О', 'Л', 'Д', 'Ж', 'З'],
36
+ ['{shift}', 'Я', 'Ч', 'С', 'М', 'И', 'Т', 'Ь', 'Б', 'Ю', '{backspace}'],
37
+ ['{numeric}', '{space}', '{done}'],
38
+ ],
39
+ search_numeric: [
40
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],
41
+ ['-', '/', ':', ';', '(', ')', '$', '&', '@', '"'],
42
+ ['{symbolic}', '.', ',', '?', '!', "'", '{backspace}'],
43
+ ['{alphabetic}', '{space}', '{done}'],
44
+ ],
45
+ search_symbolic: [
46
+ ['[', ']', '{', '}', '#', '%', '^', '*', '+', '='],
47
+ ['_', '\\', '|', '~', '<', '>', '€', '£', '¥', '•'],
48
+ ['{numeric}', '.', ',', '?', '!', "'", '{backspace}'],
49
+ ['{alphabetic}', '{space}', '{done}'],
50
+ ],
51
+ email_alphabetic: [
52
+ ['й', 'ц', 'у', 'к', 'е', 'н', 'г', 'ш', 'щ', 'з', 'х', 'ъ'],
53
+ ['ф', 'ы', 'в', 'а', 'п', 'р', 'о', 'л', 'д', 'ж', 'э'],
54
+ ['{shift}', 'я', 'ч', 'с', 'м', 'и', 'т', 'ь', 'б', 'ю', '{backspace}'],
55
+ ['{numeric}', '@', '{space}', '.', '{done}'],
56
+ ],
57
+ email_shift: [
58
+ ['Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Х', 'Ъ'],
59
+ ['Ф', 'Ы', 'В', 'А', 'П', 'Р', 'О', 'Л', 'Д', 'Ж', 'З'],
60
+ ['{shift}', 'Я', 'Ч', 'С', 'М', 'И', 'Т', 'Ь', 'Б', 'Ю', '{backspace}'],
61
+ ['{numeric}', '@', '{space}', '.', '{done}'],
62
+ ],
63
+ email_numeric: [
64
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],
65
+ ['$', '!', '~', '&', '=', '#', '[', ']'],
66
+ ['{symbolic}', '.', '_', '-', '+', '{backspace}'],
67
+ ['{alphabetic}', '@', '{space}', '.', '{done}'],
68
+ ],
69
+ email_symbolic: [
70
+ ['`', '|', '{', '}', '?', '%', '^', '*', '/', "'"],
71
+ ['$', '!', '~', '&', '=', '#', '[', ']'],
72
+ ['{numeric}', '.', '_', '-', '+', '{backspace}'],
73
+ ['{alphabetic}', '@', '{space}', '.', '{done}'],
74
+ ],
75
+ url_alphabetic: [
76
+ ['й', 'ц', 'у', 'к', 'е', 'н', 'г', 'ш', 'щ', 'з', 'х', 'ъ'],
77
+ ['ф', 'ы', 'в', 'а', 'п', 'р', 'о', 'л', 'д', 'ж', 'э'],
78
+ ['{shift}', 'я', 'ч', 'с', 'м', 'и', 'т', 'ь', 'б', 'ю', '{backspace}'],
79
+ ['{numeric}', '/', '.ru', '.', '{done}'],
80
+ ],
81
+ url_shift: [
82
+ ['Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Х', 'Ъ'],
83
+ ['Ф', 'Ы', 'В', 'А', 'П', 'Р', 'О', 'Л', 'Д', 'Ж', 'З'],
84
+ ['{shift}', 'Я', 'Ч', 'С', 'М', 'И', 'Т', 'Ь', 'Б', 'Ю', '{backspace}'],
85
+ ['{numeric}', '/', '.ru', '.', '{done}'],
86
+ ],
87
+ url_numeric: [
88
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],
89
+ ['@', '&', '%', '?', ',', '=', '[', ']'],
90
+ ['{symbolic}', '_', ':', '-', '+', '{backspace}'],
91
+ ['{alphabetic}', '/', '.ru', '.', '{done}'],
92
+ ],
93
+ url_symbolic: [
94
+ ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'],
95
+ ['*', '$', '#', '!', "'", '^', '[', ']'],
96
+ ['{numeric}', '~', ';', '(', ')', '{backspace}'],
97
+ ['{alphabetic}', '/', '.ru', '.', '{done}'],
98
+ ],
99
+ numeric_default: [
100
+ ['1', '2', '3'],
101
+ ['4', '5', '6'],
102
+ ['7', '8', '9'],
103
+ ['0', '{backspace}'],
104
+ ],
105
+ decimal_default: [
106
+ ['1', '2', '3'],
107
+ ['4', '5', '6'],
108
+ ['7', '8', '9'],
109
+ ['.', '0', '{backspace}'],
110
+ ],
111
+ tel_default: [
112
+ ['1', '2', '3', '*'],
113
+ ['4', '5', '6', '#'],
114
+ ['7', '8', '9', '+'],
115
+ ['0', '{backspace}'],
116
+ ],
117
+ };
118
+ const display = {
119
+ '{done}': fnDisplay.DONE,
120
+ '{shift}': fnDisplay.SHIFT,
121
+ '{backspace}': fnDisplay.BACKSPACE,
122
+ '{space}': fnDisplay.SPACE,
123
+ '{alphabetic}': 'АБВ',
124
+ '{numeric}': '123',
125
+ '{symbolic}': '#+=',
126
+ };
127
+ const locale = {
128
+ code: 'ru-RU',
129
+ dir: 'ltr',
130
+ layouts: layouts,
131
+ display: display,
132
+ };
133
+ export default locale;
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdG91Y2gta2V5Ym9hcmQvc3JjL2xpYi9Mb2NhbGUvcnUtUlUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV6QyxNQUFNLE9BQU8sR0FBVztJQUN0QixlQUFlLEVBQUU7UUFDZixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQzVELENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUN2RCxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUM7UUFDdkUsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQztLQUNuQztJQUNELFVBQVUsRUFBRTtRQUNWLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDNUQsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFB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LEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUN2RCxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUM7UUFDdkUsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDO0tBQzdDO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUM1RCxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDdkQsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDO1FBQ3ZFLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQztLQUM3QztJQUNELGFBQWEsRUFBRTtRQUNiLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ2xELENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUN4QyxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDO1FBQ2pELENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQztLQUNoRDtJQUNELGNBQWMsRUFBRTtRQUNkLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ2xELENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUN4QyxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDO1FBQ2hELENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQztLQUNoRDtJQUNELGNBQWMsRUFBRTtRQUNkLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDNUQsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ3ZELENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVB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QztLQUNyQjtDQUNGLENBQUM7QUFFRixNQUFNLE9BQU8sR0FBWTtJQUN2QixRQUFRLEVBQUUsU0FBUyxDQUFDLElBQUk7SUFDeEIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxLQUFLO0lBQzFCLGFBQWEsRUFBRSxTQUFTLENBQUMsU0FBUztJQUNsQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEtBQUs7SUFDMUIsY0FBYyxFQUFFLEtBQUs7SUFDckIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsWUFBWSxFQUFFLEtBQUs7Q0FDcEIsQ0FBQztBQUVGLE1BQU0sTUFBTSxHQUFXO0lBQ3JCLElBQUksRUFBRSxPQUFPO0lBQ2IsR0FBRyxFQUFFLEtBQUs7SUFDVixPQUFPLEVBQUUsT0FBTztJQUNoQixPQUFPLEVBQUUsT0FBTztDQUNqQixDQUFDO0FBRUYsZUFBZSxNQUFNLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMYXlvdXQsIERpc3BsYXksIExvY2FsZSB9IGZyb20gJy4uL3R5cGUnO1xyXG5pbXBvcnQgeyBmbkRpc3BsYXkgfSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5cclxuY29uc3QgbGF5b3V0czogTGF5b3V0ID0ge1xyXG4gIHRleHRfYWxwaGFiZXRpYzogW1xyXG4gICAgWyfQuScsICfRhicsICfRgycsICfQuicsICfQtScsICfQvScsICfQsycsICfRiCcsICfRiScsICfQtycsICfRhScsICfRiiddLFxyXG4gICAgWyfRhCcsICfRiycsICfQsicsICfQsCcsICfQvycsICfRgCcsICfQvicsICfQuycsICfQtCcsICfQticsICfRjSddLFxyXG4gICAgWyd7c2hpZnR9JywgJ9GPJywgJ9GHJywgJ9GBJywgJ9C8JywgJ9C4JywgJ9GCJywgJ9GMJywgJ9CxJywgJ9GOJywgJ3tiYWNrc3BhY2V9J10sXHJcbiAgICBbJ3tudW1lcmljfScsICd7c3BhY2V9JywgJ3tkb25lfSddLFxyXG4gIF0sXHJcbiAgdGV4dF9zaGlmdDogW1xyXG4gICAgWyfQmScsICfQpicsICfQoycsICfQmicsICfQlScsICfQnScsICfQkycsICfQqCcsICfQqScsICfQlycsICfQpScsICfQqiddLFxyXG4gICAgWyfQpCcsICfQqycsICfQkicsICfQkCcsICfQnycsICfQoCcsICfQnicsICfQmycsICfQlCcsICfQlicsICfQlyddLFxyXG4gICAgWyd7c2hpZnR9JywgJ9CvJywgJ9CnJywgJ9ChJywgJ9CcJywgJ9CYJywgJ9CiJywgJ9CsJywgJ9CRJywgJ9CuJywgJ3tiYWNrc3BhY2V9J10sXHJcbiAgICBbJ3tudW1lcmljfScsICd7c3BhY2V9JywgJ3tkb25lfSddLFxyXG4gIF0sXHJcbiAgdGV4dF9udW1lcmljOiBbXHJcbiAgICBbJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJzAnXSxcclxuICAgIFsnLScsICcvJywgJzonLCAnOycsICcoJywgJyknLCAnJCcsICcmJywgJ0AnLCAnXCInXSxcclxuICAgIFsne3N5bWJvbGljfScsICcuJywgJywnLCAnPycsICchJywgXCInXCIsICd7YmFja3NwYWNlfSddLFxyXG4gICAgWyd7YWxwaGFiZXRpY30nLCAne3NwYWNlfScsICd7ZG9uZX0nXSxcclxuICBdLFxyXG4gIHRleHRfc3ltYm9saWM6IFtcclxuICAgIFsnWycsICddJywgJ3snLCAnfScsICcjJywgJyUnLCAnXicsICcqJywgJysnLCAnPSddLFxyXG4gICAgWydfJywgJ1xcXFwnLCAnfCcsICd+JywgJzwnLCAnPicsICfigqwnLCAnwqMnLCAnwqUnLCAn4oCiJ10sXHJcbiAgICBbJ3tudW1lcmljfScsICcuJywgJywnLCAnPycsICchJywgXCInXCIsICd7YmFja3NwYWNlfSddLFxyXG4gICAgWyd7YWxwaGFiZXRpY30nLCAne3NwYWNlfScsICd7ZG9uZX0nXSxcclxuICBdLFxyXG4gIHNlYXJjaF9hbHBoYWJldGljOiBbXHJcbiAgICBbJ9C5JywgJ9GGJywgJ9GDJywgJ9C6JywgJ9C1JywgJ9C9JywgJ9CzJywgJ9GIJywgJ9GJJywgJ9C3JywgJ9GFJywgJ9GKJ10sXHJcbiAgICBbJ9GEJywgJ9GLJywgJ9CyJywgJ9CwJywgJ9C/JywgJ9GAJywgJ9C+JywgJ9C7JywgJ9C0JywgJ9C2JywgJ9GNJ10sXHJcbiAgICBbJ3tzaGlmdH0nLCAn0Y8nLCAn0YcnLCAn0YEnLCAn0LwnLCAn0LgnLCAn0YInLCAn0YwnLCAn0LEnLCAn0Y4nLCAne2JhY2tzcGFjZX0nXSxcclxuICAgIFsne251bWVyaWN9JywgJ3tzcGFjZX0nLCAne2RvbmV9J10sXHJcbiAgXSxcclxuICBzZWFyY2hfc2hpZnQ6IFtcclxuICAgIFsn0JknLCAn0KYnLCAn0KMnLCAn0JonLCAn0JUnLCAn0J0nLCAn0JMnLCAn0KgnLCAn0KknLCAn0JcnLCAn0KUnLCAn0KonXSxcclxuICAgIFsn0KQnLCAn0KsnLCAn0JInLCAn0JAnLCAn0J8nLCAn0KAnLCAn0J4nLCAn0JsnLCAn0JQnLCAn0JYnLCAn0JcnXSxcclxuICAgIFsne3NoaWZ0fScsICfQrycsICfQpycsICfQoScsICfQnCcsICfQmCcsICfQoicsICfQrCcsICfQkScsICfQricsICd7YmFja3NwYWNlfSddLFxyXG4gICAgWyd7bnVtZXJpY30nLCAne3NwYWNlfScsICd7ZG9uZX0nXSxcclxuICBdLFxyXG4gIHNlYXJjaF9udW1lcmljOiBbXHJcbiAgICBbJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJzAnXSxcclxuICAgIFsnLScsICcvJywgJzonLCAnOycsICcoJywgJyknLCAnJCcsICcmJywgJ0AnLCAnXCInXSxcclxuICAgIFsne3N5bWJvbGljfScsICcuJywgJywnLCAnPycsICchJywgXCInXCIsICd7YmFja3NwYWNlfSddLFxyXG4gICAgWyd7YWxwaGFiZXRpY30nLCAne3NwYWNlfScsICd7ZG9uZX0nXSxcclxuICBdLFxyXG4gIHNlYXJjaF9zeW1ib2xpYzogW1xyXG4gICAgWydbJywgJ10nLCAneycsICd9JywgJyMnLCAnJScsICdeJywgJyonLCAnKycsICc9J10sXHJcbiAgICBbJ18nLCAnXFxcXCcsICd8JywgJ34nLCAnPCcsICc+JywgJ+KCrCcsICfCoycsICfCpScsICfigKInXSxcclxuICAgIFsne251bWVyaWN9JywgJy4nLCAnLCcsICc/JywgJyEnLCBcIidcIiwgJ3tiYWNrc3BhY2V9J10sXHJcbiAgICBbJ3thbHBoYWJldGljfScsICd7c3BhY2V9JywgJ3tkb25lfSddLFxyXG4gIF0sXHJcbiAgZW1haWxfYWxwaGFiZXRpYzogW1xyXG4gICAgWyfQuScsICfRhicsICfRgycsICfQuicsICfQtScsICfQvScsICfQsycsICfRiCcsICfRiScsICfQtycsICfRhScsICfRiiddLFxyXG4gICAgWyfRhCcsICfRiycsICfQsicsICfQsCcsICfQvycsICfRgCcsICfQvicsICfQuycsICfQtCcsICfQticsICfRjSddLFxyXG4gICAgWyd7c2hpZnR9JywgJ9GPJywgJ9GHJywgJ9GBJywgJ9C8JywgJ9C4JywgJ9GCJywgJ9GMJywgJ9CxJywgJ9GOJywgJ3tiYWNrc3BhY2V9J10sXHJcbiAgICBbJ3tudW1lcmljfScsICdAJywgJ3tzcGFjZX0nLCAnLicsICd7ZG9uZX0nXSxcclxuICBdLFxyXG4gIGVtYWlsX3NoaWZ0OiBbXHJcbiAgICBbJ9CZJywgJ9CmJywgJ9CjJywgJ9CaJywgJ9CVJywgJ9CdJywgJ9CTJywgJ9CoJywgJ9CpJywgJ9CXJywgJ9ClJywgJ9CqJ10sXHJcbiAgICBbJ9CkJywgJ9CrJywgJ9CSJywgJ9CQJywgJ9CfJywgJ9CgJywgJ9CeJywgJ9CbJywgJ9CUJywgJ9CWJywgJ9CXJ10sXHJcbiAgICBbJ3tzaGlmdH0nLCAn0K8nLCAn0KcnLCAn0KEnLCAn0JwnLCAn0JgnLCAn0KInLCAn0KwnLCAn0JEnLCAn0K4nLCAne2JhY2tzcGFjZX0nXSxcclxuICAgIFsne251bWVyaWN9JywgJ0AnLCAne3NwYWNlfScsICcuJywgJ3tkb25lfSddLFxyXG4gIF0sXHJcbiAgZW1haWxfbnVtZXJpYzogW1xyXG4gICAgWycxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcwJ10sXHJcbiAgICBbJyQnLCAnIScsICd+JywgJyYnLCAnPScsICcjJywgJ1snLCAnXSddLFxyXG4gICAgWyd7c3ltYm9saWN9JywgJy4nLCAnXycsICctJywgJysnLCAne2JhY2tzcGFjZX0nXSxcclxuICAgIFsne2FscGhhYmV0aWN9JywgJ0AnLCAne3NwYWNlfScsICcuJywgJ3tkb25lfSddLFxyXG4gIF0sXHJcbiAgZW1haWxfc3ltYm9saWM6IFtcclxuICAgIFsnYCcsICd8JywgJ3snLCAnfScsICc/JywgJyUnLCAnXicsICcqJywgJy8nLCBcIidcIl0sXHJcbiAgICBbJyQnLCAnIScsICd+JywgJyYnLCAnPScsICcjJywgJ1snLCAnXSddLFxyXG4gICAgWyd7bnVtZXJpY30nLCAnLicsICdfJywgJy0nLCAnKycsICd7YmFja3NwYWNlfSddLFxyXG4gICAgWyd7YWxwaGFiZXRpY30nLCAnQCcsICd7c3BhY2V9JywgJy4nLCAne2RvbmV9J10sXHJcbiAgXSxcclxuICB1cmxfYWxwaGFiZXRpYzogW1xyXG4gICAgWyfQuScsICfRhicsICfRgycsICfQuicsICfQtScsICfQvScsICfQsycsICfRiCcsICfRiScsICfQtycsICfRhScsICfRiiddLFxyXG4gICAgWyfRhCcsICfRiycsICfQsicsICfQsCcsICfQvycsICfRgCcsICfQvicsICfQuycsICfQtCcsICfQticsICfRjSddLFxyXG4gICAgWyd7c2hpZnR9JywgJ9GPJywgJ9GHJywgJ9GBJywgJ9C8JywgJ9C4JywgJ9GCJywgJ9GMJywgJ9CxJywgJ9GOJywgJ3tiYWNrc3BhY2V9J10sXHJcbiAgICBbJ3tudW1lcmljfScsICcvJywgJy5ydScsICcuJywgJ3tkb25lfSddLFxyXG4gIF0sXHJcbiAgdXJsX3NoaWZ0OiBbXHJcbiAgICBbJ9CZJywgJ9CmJywgJ9CjJywgJ9CaJywgJ9CVJywgJ9CdJywgJ9CTJywgJ9CoJywgJ9CpJywgJ9CXJywgJ9ClJywgJ9CqJ10sXHJcbiAgICBbJ9CkJywgJ9CrJywgJ9CSJywgJ9CQJywgJ9CfJywgJ9CgJywgJ9CeJywgJ9CbJywgJ9CUJywgJ9CWJywgJ9CXJ10sXHJcbiAgICBbJ3tzaGlmdH0nLCAn0K8nLCAn0KcnLCAn0KEnLCAn0JwnLCAn0JgnLCAn0KInLCAn0KwnLCAn0JEnLCAn0K4nLCAne2JhY2tzcGFjZX0nXSxcclxuICAgIFsne251bWVyaWN9JywgJy8nLCAnLnJ1JywgJy4nLCAne2RvbmV9J10sXHJcbiAgXSxcclxuICB1cmxfbnVtZXJpYzogW1xyXG4gICAgWycxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcwJ10sXHJcbiAgICBbJ0AnLCAnJicsICclJywgJz8nLCAnLCcsICc9JywgJ1snLCAnXSddLFxyXG4gICAgWyd7c3ltYm9saWN9JywgJ18nLCAnOicsICctJywgJysnLCAne2JhY2tzcGFjZX0nXSxcclxuICAgIFsne2FscGhhYmV0aWN9JywgJy8nLCAnLnJ1JywgJy4nLCAne2RvbmV9J10sXHJcbiAgXSxcclxuICB1cmxfc3ltYm9saWM6IFtcclxuICAgIFsnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnMCddLFxyXG4gICAgWycqJywgJyQnLCAnIycsICchJywgXCInXCIsICdeJywgJ1snLCAnXSddLFxyXG4gICAgWyd7bnVtZXJpY30nLCAnficsICc7JywgJygnLCAnKScsICd7YmFja3NwYWNlfSddLFxyXG4gICAgWyd7YWxwaGFiZXRpY30nLCAnLycsICcucnUnLCAnLicsICd7ZG9uZX0nXSxcclxuICBdLFxyXG4gIG51bWVyaWNfZGVmYXVsdDogW1xyXG4gICAgWycxJywgJzInLCAnMyddLFxyXG4gICAgWyc0JywgJzUnLCAnNiddLFxyXG4gICAgWyc3JywgJzgnLCAnOSddLFxyXG4gICAgWycwJywgJ3tiYWNrc3BhY2V9J10sXHJcbiAgXSxcclxuICBkZWNpbWFsX2RlZmF1bHQ6IFtcclxuICAgIFsnMScsICcyJywgJzMnXSxcclxuICAgIFsnNCcsICc1JywgJzYnXSxcclxuICAgIFsnNycsICc4JywgJzknXSxcclxuICAgIFsnLicsICcwJywgJ3tiYWNrc3BhY2V9J10sXHJcbiAgXSxcclxuICB0ZWxfZGVmYXVsdDogW1xyXG4gICAgWycxJywgJzInLCAnMycsICcqJ10sXHJcbiAgICBbJzQnLCAnNScsICc2JywgJyMnXSxcclxuICAgIFsnNycsICc4JywgJzknLCAnKyddLFxyXG4gICAgWycwJywgJ3tiYWNrc3BhY2V9J10sXHJcbiAgXSxcclxufTtcclxuXHJcbmNvbnN0IGRpc3BsYXk6IERpc3BsYXkgPSB7XHJcbiAgJ3tkb25lfSc6IGZuRGlzcGxheS5ET05FLFxyXG4gICd7c2hpZnR9JzogZm5EaXNwbGF5LlNISUZULFxyXG4gICd7YmFja3NwYWNlfSc6IGZuRGlzcGxheS5CQUNLU1BBQ0UsXHJcbiAgJ3tzcGFjZX0nOiBmbkRpc3BsYXkuU1BBQ0UsXHJcbiAgJ3thbHBoYWJldGljfSc6ICfQkNCR0JInLFxyXG4gICd7bnVtZXJpY30nOiAnMTIzJyxcclxuICAne3N5bWJvbGljfSc6ICcjKz0nLFxyXG59O1xyXG5cclxuY29uc3QgbG9jYWxlOiBMb2NhbGUgPSB7XHJcbiAgY29kZTogJ3J1LVJVJyxcclxuICBkaXI6ICdsdHInLFxyXG4gIGxheW91dHM6IGxheW91dHMsXHJcbiAgZGlzcGxheTogZGlzcGxheSxcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGxvY2FsZTtcclxuIl19
@@ -176,9 +176,9 @@ class NgxTouchKeyboardComponent {
176
176
  * @param button The button layout name.
177
177
  * @param event The button event.
178
178
  */
179
- handleButtonClicked(button, e) {
179
+ handleButtonPress(button, e) {
180
180
  if (this.debug) {
181
- console.log('Key pressed:', button);
181
+ console.log('Key press:', button);
182
182
  }
183
183
  if (button === fnButton.SHIFT) {
184
184
  this.layoutName =
@@ -234,12 +234,15 @@ class NgxTouchKeyboardComponent {
234
234
  this._dispatchEvents(button);
235
235
  }
236
236
  /**
237
- * Handles button mousedown
237
+ * Handles button down
238
238
  *
239
239
  * @param button The button layout name.
240
240
  * @param event The button event.
241
241
  */
242
- handleButtonMouseDown(button, e) {
242
+ handleButtonDown(button, e) {
243
+ if (this.debug) {
244
+ console.log('Key down:', button);
245
+ }
243
246
  if (e) {
244
247
  /**
245
248
  * Handle event options
@@ -265,20 +268,27 @@ class NgxTouchKeyboardComponent {
265
268
  button === fnButton.BACKSPACE ||
266
269
  button === fnButton.SPACE)) {
267
270
  if (this.debug) {
268
- console.log('Button held:', button);
271
+ console.log('Button hold:', button);
269
272
  }
270
273
  this.handleButtonHold(button);
271
274
  }
272
275
  clearTimeout(this._holdTimeout);
273
276
  }, 500);
277
+ /**
278
+ * Handel button Click after button down
279
+ */
280
+ this.handleButtonPress(button, e);
274
281
  }
275
282
  /**
276
- * Handles button mouseup
283
+ * Handles button up
277
284
  *
278
285
  * @param button The button layout name.
279
286
  * @param event The button event.
280
287
  */
281
- handleButtonMouseUp(button, e) {
288
+ handleButtonUp(button, e) {
289
+ if (this.debug) {
290
+ console.log('Key up:', button);
291
+ }
282
292
  if (e) {
283
293
  /**
284
294
  * Handle event options
@@ -305,7 +315,7 @@ class NgxTouchKeyboardComponent {
305
315
  */
306
316
  this._holdInteractionTimeout = window.setTimeout(() => {
307
317
  if (this._isMouseHold) {
308
- this.handleButtonClicked(button);
318
+ this.handleButtonPress(button);
309
319
  this.handleButtonHold(button);
310
320
  }
311
321
  else {
@@ -511,7 +521,7 @@ class NgxTouchKeyboardComponent {
511
521
  else if (event.type === 'pointerup' &&
512
522
  this._activeInputElement === document.activeElement) {
513
523
  if (this._isMouseHold) {
514
- this.handleButtonMouseUp('');
524
+ this.handleButtonUp('');
515
525
  }
516
526
  return;
517
527
  }
@@ -623,12 +633,12 @@ class NgxTouchKeyboardComponent {
623
633
  }
624
634
  }
625
635
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: NgxTouchKeyboardComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.ElementRef }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Component }); }
626
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.8", 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\r\n dir=\"ltr\"\r\n class=\"touch-keyboard\"\r\n [ngClass]=\"'layout-' + layoutMode + '-' + layoutName\"\r\n>\r\n <ng-container\r\n *ngFor=\"\r\n let row of locale.layouts[layoutMode + '_' + layoutName];\r\n let rowIndex = index\r\n \"\r\n >\r\n <div class=\"touch-keyboard-row\">\r\n <ng-container *ngFor=\"let key of row; let keyIndex = index\">\r\n <button\r\n [name]=\"key\"\r\n [dir]=\"locale.dir\"\r\n class=\"touch-keyboard-key\"\r\n [ngClass]=\"[getButtonClass(key)]\"\r\n [attr.data-layout]=\"layoutMode\"\r\n (pointerdown)=\"\r\n handleButtonClicked(key, $event); handleButtonMouseDown(key, $event)\r\n \"\r\n (pointerup)=\"handleButtonMouseUp(key, $event)\"\r\n (pointercancel)=\"handleButtonMouseUp(key, $event)\"\r\n [innerHtml]=\"getButtonDisplayName(key)\"\r\n ></button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\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:rgba(0,0,0,.32)}.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;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.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[data-layout=numeric],.touch-keyboard .touch-keyboard-key[data-layout=decimal],.touch-keyboard .touch-keyboard-key[data-layout=tel]{width:33%!important;max-width:none!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.enter-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:6rem}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
636
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.8", 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\r\n dir=\"ltr\"\r\n class=\"touch-keyboard\"\r\n [ngClass]=\"'layout-' + layoutMode + '-' + layoutName\"\r\n>\r\n <ng-container\r\n *ngFor=\"\r\n let row of locale.layouts[layoutMode + '_' + layoutName];\r\n let rowIndex = index\r\n \"\r\n >\r\n <div class=\"touch-keyboard-row\">\r\n <ng-container *ngFor=\"let key of row; let keyIndex = index\">\r\n <button\r\n [name]=\"key\"\r\n [dir]=\"locale.dir\"\r\n class=\"touch-keyboard-key\"\r\n [ngClass]=\"[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 </ng-container>\r\n </div>\r\n </ng-container>\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:rgba(0,0,0,.32)}.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;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.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[data-layout=numeric],.touch-keyboard .touch-keyboard-key[data-layout=decimal],.touch-keyboard .touch-keyboard-key[data-layout=tel]{width:33%!important;max-width:none!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.enter-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:6rem}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
627
637
  }
628
638
  export { NgxTouchKeyboardComponent };
629
639
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: NgxTouchKeyboardComponent, decorators: [{
630
640
  type: Component,
631
- args: [{ selector: 'ngx-touch-keyboard', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n dir=\"ltr\"\r\n class=\"touch-keyboard\"\r\n [ngClass]=\"'layout-' + layoutMode + '-' + layoutName\"\r\n>\r\n <ng-container\r\n *ngFor=\"\r\n let row of locale.layouts[layoutMode + '_' + layoutName];\r\n let rowIndex = index\r\n \"\r\n >\r\n <div class=\"touch-keyboard-row\">\r\n <ng-container *ngFor=\"let key of row; let keyIndex = index\">\r\n <button\r\n [name]=\"key\"\r\n [dir]=\"locale.dir\"\r\n class=\"touch-keyboard-key\"\r\n [ngClass]=\"[getButtonClass(key)]\"\r\n [attr.data-layout]=\"layoutMode\"\r\n (pointerdown)=\"\r\n handleButtonClicked(key, $event); handleButtonMouseDown(key, $event)\r\n \"\r\n (pointerup)=\"handleButtonMouseUp(key, $event)\"\r\n (pointercancel)=\"handleButtonMouseUp(key, $event)\"\r\n [innerHtml]=\"getButtonDisplayName(key)\"\r\n ></button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\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:rgba(0,0,0,.32)}.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;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.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[data-layout=numeric],.touch-keyboard .touch-keyboard-key[data-layout=decimal],.touch-keyboard .touch-keyboard-key[data-layout=tel]{width:33%!important;max-width:none!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.enter-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:6rem}}\n"] }]
641
+ args: [{ selector: 'ngx-touch-keyboard', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n dir=\"ltr\"\r\n class=\"touch-keyboard\"\r\n [ngClass]=\"'layout-' + layoutMode + '-' + layoutName\"\r\n>\r\n <ng-container\r\n *ngFor=\"\r\n let row of locale.layouts[layoutMode + '_' + layoutName];\r\n let rowIndex = index\r\n \"\r\n >\r\n <div class=\"touch-keyboard-row\">\r\n <ng-container *ngFor=\"let key of row; let keyIndex = index\">\r\n <button\r\n [name]=\"key\"\r\n [dir]=\"locale.dir\"\r\n class=\"touch-keyboard-key\"\r\n [ngClass]=\"[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 </ng-container>\r\n </div>\r\n </ng-container>\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:rgba(0,0,0,.32)}.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;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.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[data-layout=numeric],.touch-keyboard .touch-keyboard-key[data-layout=decimal],.touch-keyboard .touch-keyboard-key[data-layout=tel]{width:33%!important;max-width:none!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.enter-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:6rem}}\n"] }]
632
642
  }], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ElementRef }, { type: undefined, decorators: [{
633
643
  type: Inject,
634
644
  args: [LOCALE_ID]
@@ -650,4 +660,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.8", ngImpor
650
660
  type: HostListener,
651
661
  args: ['window:selectionchange', ['$event']]
652
662
  }] } });
653
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRvdWNoLWtleWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10b3VjaC1rZXlib2FyZC9zcmMvbGliL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdG91Y2gta2V5Ym9hcmQvc3JjL2xpYi9uZ3gtdG91Y2gta2V5Ym9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlDLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDOzs7OztBQUVwQyxNQU9hLHlCQUF5QjtJQWdCcEM7O09BRUc7SUFDSCxZQUNVLFVBQXdCLEVBQ3hCLFdBQXlDLEVBQ3RCLGNBQXNCO1FBRnpDLGVBQVUsR0FBVixVQUFVLENBQWM7UUFDeEIsZ0JBQVcsR0FBWCxXQUFXLENBQThCO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUFRO1FBckJuRCxXQUFNLEdBQVcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUM5QixlQUFVLEdBQUcsTUFBTSxDQUFDO1FBQ3BCLGVBQVUsR0FBRyxZQUFZLENBQUM7UUFDMUIsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUVKLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXhDLHVCQUFrQixHQUFHLFFBQVEsQ0FBQztRQUk5QixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDckMsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQThKaEQ7O1dBRUc7UUFDSCxxQkFBZ0IsR0FBRyxDQUFDLE1BQWMsRUFB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QUMsU0FBUyxFQUFFO2dCQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUNoRDtTQUNGO2FBQU07WUFDTCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDckMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDcEQ7U0FDRjtJQUNILENBQUM7OEdBbHZCVSx5QkFBeUIsd0VBc0IxQixTQUFTO2tHQXRCUix5QkFBeUIsNlZDeEJ0QyxtL0JBOEJBOztTRE5hLHlCQUF5QjsyRkFBekIseUJBQXlCO2tCQVByQyxTQUFTOytCQUNFLG9CQUFvQixpQkFHZixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNOzswQkF3QjVDLE1BQU07MkJBQUMsU0FBUzs0Q0FoQlQsVUFBVTtzQkFBbkIsTUFBTTtnQkE2Q1AsV0FBVztzQkFEVixZQUFZO3VCQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFZeEMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVcxQyxhQUFhO3NCQURaLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUzVDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBU3pDLHFCQUFxQjtzQkFEcEIsWUFBWTt1QkFBQyx3QkFBd0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbmplY3QsXHJcbiAgTE9DQUxFX0lELFxyXG4gIE91dHB1dCxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5cclxuaW1wb3J0IHsgZm5CdXR0b24gfSBmcm9tICcuL0xvY2FsZS9jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBMb2NhbGUgfSBmcm9tICcuL0xvY2FsZS90eXBlJztcclxuaW1wb3J0ICogYXMgTG9jYWxlcyBmcm9tICcuL0xvY2FsZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25neC10b3VjaC1rZXlib2FyZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LXRvdWNoLWtleWJvYXJkLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFRvdWNoS2V5Ym9hcmRDb21wb25lbnQge1xyXG4gIGxvY2FsZTogTG9jYWxlID0gTG9jYWxlcy5lblVTO1xyXG4gIGxheW91dE1vZGUgPSAndGV4dCc7XHJcbiAgbGF5b3V0TmFtZSA9ICdhbHBoYWJldGljJztcclxuICBkZWJ1ZyA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgY2xvc2VQYW5lbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfYWN0aXZlQnV0dG9uQ2xhc3MgPSAnYWN0aXZlJztcclxuICBwcml2YXRlIF9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0ITogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2hvbGRUaW1lb3V0ITogbnVtYmVyO1xyXG4gIHByaXZhdGUgX2lzTW91c2VIb2xkITogYm9vbGVhbjtcclxuICBwcml2YXRlIF9jYXJldFBvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9jYXJldFBvc2l0aW9uRW5kOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9hY3RpdmVJbnB1dEVsZW1lbnQhOiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdG9yXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4sXHJcbiAgICBASW5qZWN0KExPQ0FMRV9JRCkgcHJpdmF0ZSBfZGVmYXVsdExvY2FsZTogc3RyaW5nXHJcbiAgKSB7fVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEAgQWNjZXNzb3JzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0dGVyIGZvciBtYXhMZW5ndGhcclxuICAgKi9cclxuICBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py5tYXhMZW5ndGggPz8gLTE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXR0ZXIgZm9yIHR5cGUgb2YgaW5wdXRcclxuICAgKi9cclxuICBnZXQgaXNUZXh0YXJlYSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LnR5cGUgPT09ICd0ZXh0YXJlYSc7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEAgRGVjb3JhdGVkIG1ldGhvZHNcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKipcclxuICAgKiBPbiBrZXl1cFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cCcsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudC5pc1RydXN0ZWQpIHtcclxuICAgICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gICAgICB0aGlzLl9oYW5kbGVIaWdobGlnaHRLZXlVcChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbiBrZXlkb3duXHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24nLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudC5pc1RydXN0ZWQpIHtcclxuICAgICAgdGhpcy5faGFuZGxlSGlnaGxpZ2h0S2V5RG93bihldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbiBwb2ludGVydXAgKG1vdXNldXAgb3IgdG91Y2hlbmQpXHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvaW50ZXJ1cCcsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlTW91c2VVcChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gc2VsZWN0XHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNlbGVjdCcsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gc2VsZWN0aW9uY2hhbmdlXHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNlbGVjdGlvbmNoYW5nZScsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIFB1YmxpYyBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGxheW91dCBrZXlib2FyZCBmb3IgbG9jYWxlXHJcbiAgICpcclxuICAgKiBAcGFyYW0gdmFsdWVcclxuICAgKi9cclxuICBzZXRMb2NhbGUodmFsdWU6IHN0cmluZyA9IHRoaXMuX2RlZmF1bHRMb2NhbGUpOiB2b2lkIHtcclxuICAgIC8vIG5vcm1hbGl6ZSB2YWx1ZVxyXG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCctJywgJycpLnRyaW0oKTtcclxuICAgIC8vIFNldCBMb2NhbGUgaWYgc3VwcG9ydGVkXHJcbiAgICBpZiAoKE9iamVjdC5rZXlzKExvY2FsZXMpIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgdGhpcy5sb2NhbGUgPSBMb2NhbGVzW3ZhbHVlIGFzICdlblVTJ107XHJcbiAgICB9XHJcbiAgICAvLyBTZXQgZGVmYXVsdCBMb2NhbGUgaWYgbm90IHN1cHBvcnRlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubG9jYWxlID0gTG9jYWxlcy5lblVTO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGFjdGl2ZSBpbnB1dFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGlucHV0IElucHV0IG5hdGl2ZSBlbGVtZW50XHJcbiAgICovXHJcbiAgc2V0QWN0aXZlSW5wdXQoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPSBpbnB1dDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNraW5nIGtleWJvYXJkIGxheW91dFxyXG4gICAgICovXHJcbiAgICBjb25zdCBpbnB1dE1vZGUgPSB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmlucHV0TW9kZTtcclxuICAgIGlmIChcclxuICAgICAgaW5wdXRNb2RlICYmXHJcbiAgICAgIFsndGV4dCcsICdzZWFyY2gnLCAnZW1haWwnLCAndXJsJywgJ251bWVyaWMnLCAnZGVjaW1hbCcsICd0ZWwnXS5zb21lKFxyXG4gICAgICAgIChpKSA9PiBpID09PSBpbnB1dE1vZGVcclxuICAgICAgKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TW9kZSA9IGlucHV0TW9kZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TW9kZSA9ICd0ZXh0JztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIGlucHV0TW9kZSAmJlxyXG4gICAgICBbJ251bWVyaWMnLCAnZGVjaW1hbCcsICd0ZWwnXS5zb21lKChpKSA9PiBpID09PSBpbnB1dE1vZGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5sYXlvdXROYW1lID0gJ2RlZmF1bHQnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sYXlvdXROYW1lID0gJ2FscGhhYmV0aWMnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdMb2NhbGU6JywgYCR7dGhpcy5sb2NhbGUuY29kZSB8fCB0aGlzLl9kZWZhdWx0TG9jYWxlfWApO1xyXG4gICAgICBjb25zb2xlLmxvZygnTGF5b3V0OicsIGAke3RoaXMubGF5b3V0TW9kZX1fJHt0aGlzLmxheW91dE5hbWV9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB3ZSBtdXN0IGVuc3VyZSBjYXJldFBvc2l0aW9uIGRvZXNuJ3QgcGVyc2lzdCBvbmNlIHJlYWN0aXZhdGVkLlxyXG4gICAgICovXHJcbiAgICB0aGlzLl9zZXRDYXJldFBvc2l0aW9uKFxyXG4gICAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQsXHJcbiAgICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudC5zZWxlY3Rpb25FbmRcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgJ0NhcmV0IHN0YXJ0IGF0OicsXHJcbiAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbixcclxuICAgICAgICB0aGlzLl9jYXJldFBvc2l0aW9uRW5kXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQW5kIHNldCBmb2N1cyB0byBpbnB1dFxyXG4gICAgdGhpcy5fZm9jdXNBY3RpdmVJbnB1dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgd2hldGhlciB0aGUgYnV0dG9uIGlzIGEgc3RhbmRhcmQgYnV0dG9uXHJcbiAgICovXHJcbiAgaXNTdGFuZGFyZEJ1dHRvbiA9IChidXR0b246IHN0cmluZykgPT5cclxuICAgIGJ1dHRvbiAmJiAhKGJ1dHRvblswXSA9PT0gJ3snICYmIGJ1dHRvbltidXR0b24ubGVuZ3RoIC0gMV0gPT09ICd9Jyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlIGJ1dHRvbiB0eXBlXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24ncyBsYXlvdXQgbmFtZVxyXG4gICAqIEByZXR1cm4gVGhlIGJ1dHRvbiB0eXBlXHJcbiAgICovXHJcbiAgZ2V0QnV0dG9uVHlwZShidXR0b246IHN0cmluZyk6ICdzdGFuZGFyZC1rZXknIHwgJ2Z1bmN0aW9uLWtleScge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNTdGFuZGFyZEJ1dHRvbihidXR0b24pID8gJ3N0YW5kYXJkLWtleScgOiAnZnVuY3Rpb24ta2V5JztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgZGVmYXVsdCBjbGFzc2VzIHRvIGEgZ2l2ZW4gYnV0dG9uXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24ncyBsYXlvdXQgbmFtZVxyXG4gICAqIEByZXR1cm4gVGhlIGNsYXNzZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGJ1dHRvblxyXG4gICAqL1xyXG4gIGdldEJ1dHRvbkNsYXNzKGJ1dHRvbjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGJ1dHRvblR5cGVDbGFzcyA9IHRoaXMuZ2V0QnV0dG9uVHlwZShidXR0b24pO1xyXG4gICAgY29uc3QgYnV0dG9uV2l0aG91dEJyYWNlcyA9IGJ1dHRvbi5yZXBsYWNlKCd7JywgJycpLnJlcGxhY2UoJ30nLCAnJyk7XHJcbiAgICBsZXQgYnV0dG9uTm9ybWFsaXplZCA9ICcnO1xyXG5cclxuICAgIGlmIChidXR0b25UeXBlQ2xhc3MgIT09ICdzdGFuZGFyZC1rZXknKVxyXG4gICAgICBidXR0b25Ob3JtYWxpemVkID0gYCR7YnV0dG9uV2l0aG91dEJyYWNlc30ta2V5YDtcclxuXHJcbiAgICByZXR1cm4gYCR7YnV0dG9uVHlwZUNsYXNzfSAke2J1dHRvbk5vcm1hbGl6ZWR9YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGRpc3BsYXkgKGxhYmVsKSBuYW1lIGZvciBhIGdpdmVuIGJ1dHRvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uJ3MgbGF5b3V0IG5hbWVcclxuICAgKiBAcmV0dXJuIFRoZSBkaXNwbGF5IG5hbWUgdG8gYmUgc2hvdyB0byB0aGUgYnV0dG9uXHJcbiAgICovXHJcbiAgZ2V0QnV0dG9uRGlzcGxheU5hbWUoYnV0dG9uOiBzdHJpbmcpOiBTYWZlSHRtbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKFxyXG4gICAgICB0aGlzLmxvY2FsZS5kaXNwbGF5W2J1dHRvbl0gfHwgYnV0dG9uXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBjbGlja3MgbWFkZSB0byBrZXlib2FyZCBidXR0b25zXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gbGF5b3V0IG5hbWUuXHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBidXR0b24gZXZlbnQuXHJcbiAgICovXHJcbiAgaGFuZGxlQnV0dG9uQ2xpY2tlZChidXR0b246IHN0cmluZywgZT86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICBjb25zb2xlLmxvZygnS2V5IHByZXNzZWQ6JywgYnV0dG9uKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYnV0dG9uID09PSBmbkJ1dHRvbi5TSElGVCkge1xyXG4gICAgICB0aGlzLmxheW91dE5hbWUgPVxyXG4gICAgICAgIHRoaXMubGF5b3V0TmFtZSA9PT0gJ2FscGhhYmV0aWMnID8gJ3NoaWZ0JyA6ICdhbHBoYWJldGljJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmIChidXR0b24gPT09IGZuQnV0dG9uLkRPTkUpIHtcclxuICAgICAgdGhpcy5jbG9zZVBhbmVsLmVtaXQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbW1vblBhcmFtczogW251bWJlciwgbnVtYmVyLCBib29sZWFuXSA9IFtcclxuICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbiB8fCAwLFxyXG4gICAgICB0aGlzLl9jYXJldFBvc2l0aW9uRW5kIHx8IDAsXHJcbiAgICAgIHRydWUsXHJcbiAgICBdO1xyXG4gICAgbGV0IG91dHB1dCA9IHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8udmFsdWUgfHwgJyc7XHJcblxyXG4gICAgLy8gSGFuZGVsIGZ1bmN0aW9uYWwgYnV0dG9uXHJcbiAgICBpZiAoIXRoaXMuaXNTdGFuZGFyZEJ1dHRvbihidXR0b24pKSB7XHJcbiAgICAgIC8vIEhhbmRlbCBCQUNLU1BBQ0VcclxuICAgICAgaWYgKGJ1dHRvbiA9PT0gZm5CdXR0b24uQkFDS1NQQUNFKSB7XHJcbiAgICAgICAgb3V0cHV0ID0gdGhpcy5fcmVtb3ZlQXQob3V0cHV0LCAuLi5jb21tb25QYXJhbXMpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIEhhbmRlbCBTUEFDRVxyXG4gICAgICBlbHNlIGlmIChidXR0b24gPT09IGZuQnV0dG9uLlNQQUNFKSB7XHJcbiAgICAgICAgb3V0cHV0ID0gdGhpcy5fYWRkU3RyaW5nQXQob3V0cHV0LCAnICcsIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gSGFuZGVsIFRBQlxyXG4gICAgICBlbHNlIGlmIChidXR0b24gPT09IGZuQnV0dG9uLlRBQikge1xyXG4gICAgICAgIG91dHB1dCA9IHRoaXMuX2FkZFN0cmluZ0F0KG91dHB1dCwgJ1xcdCcsIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gSGFuZGVsIEVOVEVSXHJcbiAgICAgIGVsc2UgaWYgKGJ1dHRvbiA9PT0gZm5CdXR0b24uRU5URVIpIHtcclxuICAgICAgICBpZiAodGhpcy5pc1RleHRhcmVhKSB7XHJcbiAgICAgICAgICBvdXRwdXQgPSB0aGlzLl9hZGRTdHJpbmdBdChvdXRwdXQsICdcXG4nLCAuLi5jb21tb25QYXJhbXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBIYW5kZWwgTEFZT1VUXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TmFtZSA9IGJ1dHRvbi5zdWJzdHJpbmcoMSwgYnV0dG9uLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gSGFuZGVsIHN0YW5kYXJkIGJ1dHRvblxyXG4gICAgZWxzZSB7XHJcbiAgICAgIG91dHB1dCA9IHRoaXMuX2FkZFN0cmluZ0F0KG91dHB1dCwgYnV0dG9uLCAuLi5jb21tb25QYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50LnZhbHVlID0gb3V0cHV0O1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICdDYXJldCBhdDonLFxyXG4gICAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbixcclxuICAgICAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQsXHJcbiAgICAgICAgICAnQnV0dG9uJyxcclxuICAgICAgICAgIGVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZGlzcGF0Y2hFdmVudHMoYnV0dG9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgYnV0dG9uIG1vdXNlZG93blxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGxheW91dCBuYW1lLlxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgYnV0dG9uIGV2ZW50LlxyXG4gICAqL1xyXG4gIGhhbmRsZUJ1dHRvbk1vdXNlRG93bihidXR0b246IHN0cmluZywgZT86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZSkge1xyXG4gICAgICAvKipcclxuICAgICAgICogSGFuZGxlIGV2ZW50IG9wdGlvbnNcclxuICAgICAgICovXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhY3RpdmUgY2xhc3NcclxuICAgICAqL1xyXG4gICAgdGhpcy5fc2V0QWN0aXZlQnV0dG9uKGJ1dHRvbik7XHJcblxyXG4gICAgaWYgKHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpXHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KTtcclxuICAgIGlmICh0aGlzLl9ob2xkVGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRUaW1lb3V0KTtcclxuICAgIHRoaXMuX2lzTW91c2VIb2xkID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRpbWUgdG8gd2FpdCB1bnRpbCBhIGtleSBob2xkIGlzIGRldGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX2hvbGRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5faXNNb3VzZUhvbGQgJiZcclxuICAgICAgICAoKCFidXR0b24uaW5jbHVkZXMoJ3snKSAmJiAhYnV0dG9uLmluY2x1ZGVzKCd9JykpIHx8XHJcbiAgICAgICAgICBidXR0b24gPT09IGZuQnV0dG9uLkJBQ0tTUEFDRSB8fFxyXG4gICAgICAgICAgYnV0dG9uID09PSBmbkJ1dHRvbi5TUEFDRSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdCdXR0b24gaGVsZDonLCBidXR0b24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhbmRsZUJ1dHRvbkhvbGQoYnV0dG9uKTtcclxuICAgICAgfVxyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faG9sZFRpbWVvdXQpO1xyXG4gICAgfSwgNTAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgYnV0dG9uIG1vdXNldXBcclxuICAgKlxyXG4gICAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiBsYXlvdXQgbmFtZS5cclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGJ1dHRvbiBldmVudC5cclxuICAgKi9cclxuICBoYW5kbGVCdXR0b25Nb3VzZVVwKGJ1dHRvbjogc3RyaW5nLCBlPzogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChlKSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBIYW5kbGUgZXZlbnQgb3B0aW9uc1xyXG4gICAgICAgKi9cclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIGFjdGl2ZSBjbGFzc1xyXG4gICAgICovXHJcbiAgICB0aGlzLl9yZW1vdmVBY3RpdmVCdXR0b24oKTtcclxuXHJcbiAgICB0aGlzLl9pc01vdXNlSG9sZCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpXHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgYnV0dG9uIGhvbGRcclxuICAgKi9cclxuICBoYW5kbGVCdXR0b25Ib2xkKGJ1dHRvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dClcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGltZW91dCBkaWN0YXRpbmcgdGhlIHNwZWVkIG9mIGtleSBob2xkIGl0ZXJhdGlvbnNcclxuICAgICAqL1xyXG4gICAgdGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuX2lzTW91c2VIb2xkKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVCdXR0b25DbGlja2VkKGJ1dHRvbik7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVCdXR0b25Ib2xkKGJ1dHRvbik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpO1xyXG4gICAgICB9XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIFByaXZhdGUgbWV0aG9kc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZXMgdGhlIGludGVybmFsIGNhcmV0IHBvc2l0aW9uXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgY2FyZXQncyBzdGFydCBwb3NpdGlvblxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbkVuZCBUaGUgY2FyZXQncyBlbmQgcG9zaXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIF9zZXRDYXJldFBvc2l0aW9uKFxyXG4gICAgcG9zaXRpb246IG51bWJlciB8IG51bGwsXHJcbiAgICBlbmRQb3NpdGlvbiA9IHBvc2l0aW9uXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYXJldFBvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICB0aGlzLl9jYXJldFBvc2l0aW9uRW5kID0gZW5kUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHBvc2l0aW9uIGJ5IGEgZ2l2ZW4gYW1vdW50XHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBsZW5ndGggUmVwcmVzZW50cyBieSBob3cgbWFueSBjaGFyYWN0ZXJzIHRoZSBpbnB1dCBzaG91bGQgYmUgbW92ZWRcclxuICAgKiBAcGFyYW0gbWludXMgV2hldGhlciB0aGUgY3Vyc29yIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgbGVmdCBvciBub3QuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfdXBkYXRlQ2FyZXRQb3MobGVuZ3RoOiBudW1iZXIsIG1pbnVzID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IG5ld0NhcmV0UG9zID0gdGhpcy5fdXBkYXRlQ2FyZXRQb3NBY3Rpb24obGVuZ3RoLCBtaW51cyk7XHJcbiAgICB0aGlzLl9zZXRDYXJldFBvc2l0aW9uKG5ld0NhcmV0UG9zKTtcclxuICAgIC8vIFNjcm9sbCB0byBib3R0b21cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LnNjcm9sbFRvKHtcclxuICAgICAgICB0b3A6IHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudC5zY3JvbGxIZWlnaHQsXHJcbiAgICAgIH0gYXMgU2Nyb2xsVG9PcHRpb25zKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWN0aW9uIG1ldGhvZCBvZiB1cGRhdGVDYXJldFBvc1xyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gbGVuZ3RoIFJlcHJlc2VudHMgYnkgaG93IG1hbnkgY2hhcmFjdGVycyB0aGUgaW5wdXQgc2hvdWxkIGJlIG1vdmVkXHJcbiAgICogQHBhcmFtIG1pbnVzIFdoZXRoZXIgdGhlIGN1cnNvciBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGxlZnQgb3Igbm90LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3VwZGF0ZUNhcmV0UG9zQWN0aW9uKGxlbmd0aDogbnVtYmVyLCBtaW51cyA9IGZhbHNlKSB7XHJcbiAgICBsZXQgY2FyZXRQb3NpdGlvbiA9IHRoaXMuX2NhcmV0UG9zaXRpb247XHJcblxyXG4gICAgaWYgKGNhcmV0UG9zaXRpb24gIT0gbnVsbCkge1xyXG4gICAgICBpZiAobWludXMpIHtcclxuICAgICAgICBpZiAoY2FyZXRQb3NpdGlvbiA+IDApIGNhcmV0UG9zaXRpb24gPSBjYXJldFBvc2l0aW9uIC0gbGVuZ3RoO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNhcmV0UG9zaXRpb24gPSBjYXJldFBvc2l0aW9uICsgbGVuZ3RoO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNhcmV0UG9zaXRpb247XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIGFuIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJlZm9yZSBhIGdpdmVuIHBvc2l0aW9uXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBpbnB1dFxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgKGN1cnNvcikgcG9zaXRpb24gZnJvbSB3aGVyZSB0aGUgY2hhcmFjdGVycyBzaG91bGQgYmUgcmVtb3ZlZFxyXG4gICAqIEBwYXJhbSBtb3ZlQ2FyZXQgV2hldGhlciB0byB1cGRhdGUgaW5wdXQgY3Vyc29yXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfcmVtb3ZlQXQoXHJcbiAgICBzb3VyY2U6IHN0cmluZyxcclxuICAgIHBvc2l0aW9uID0gc291cmNlLmxlbmd0aCxcclxuICAgIHBvc2l0aW9uRW5kID0gc291cmNlLmxlbmd0aCxcclxuICAgIG1vdmVDYXJldCA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBpZiAocG9zaXRpb24gPT09IDAgJiYgcG9zaXRpb25FbmQgPT09IDApIHtcclxuICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3V0cHV0O1xyXG5cclxuICAgIGlmIChwb3NpdGlvbiA9PT0gcG9zaXRpb25FbmQpIHtcclxuICAgICAgbGV0IHByZXZUd29DaGFycztcclxuICAgICAgbGV0IGVtb2ppTWF0Y2hlZDtcclxuICAgICAgY29uc3QgZW1vamlNYXRjaGVkUmVnID0gLyhbXFx1RDgwMC1cXHVEQkZGXVtcXHVEQzAwLVxcdURGRkZdKS9nO1xyXG5cclxuICAgICAgLyoqXHJcbiAgICAgICAqIEVtb2ppcyBhcmUgbWFkZSBvdXQgb2YgdHdvIGNoYXJhY3RlcnMsIHNvIHdlIG11c3QgdGFrZSBhIGN1c3RvbSBhcHByb2FjaCB0byB0cmltIHRoZW0uXHJcbiAgICAgICAqIEZvciBtb3JlIGluZm86IGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGVcclxuICAgICAgICovXHJcbiAgICAgIGlmIChwb3NpdGlvbiAmJiBwb3NpdGlvbiA+PSAwKSB7XHJcbiAgICAgICAgcHJldlR3b0NoYXJzID0gc291cmNlLnN1YnN0cmluZyhwb3NpdGlvbiAtIDIsIHBvc2l0aW9uKTtcclxuICAgICAgICBlbW9qaU1hdGNoZWQgPSBwcmV2VHdvQ2hhcnMubWF0Y2goZW1vamlNYXRjaGVkUmVnKTtcclxuXHJcbiAgICAgICAgaWYgKGVtb2ppTWF0Y2hlZCkge1xyXG4gICAgICAgICAgb3V0cHV0ID0gc291cmNlLnN1YnN0cigwLCBwb3NpdGlvbiAtIDIpICsgc291cmNlLnN1YnN0cihwb3NpdGlvbik7XHJcbiAgICAgICAgICBpZiAobW92ZUNhcmV0KSB0aGlzLl91cGRhdGVDYXJldFBvcygyLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb3V0cHV0ID0gc291cmNlLnN1YnN0cigwLCBwb3NpdGlvbiAtIDEpICsgc291cmNlLnN1YnN0cihwb3NpdGlvbik7XHJcbiAgICAgICAgICBpZiAobW92ZUNhcmV0KSB0aGlzLl91cGRhdGVDYXJldFBvcygxLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJldlR3b0NoYXJzID0gc291cmNlLnNsaWNlKC0yKTtcclxuICAgICAgICBlbW9qaU1hdGNoZWQgPSBwcmV2VHdvQ2hhcnMubWF0Y2goZW1vamlNYXRjaGVkUmVnKTtcclxuXHJcbiAgICAgICAgaWYgKGVtb2ppTWF0Y2hlZCkge1xyXG4gICAgICAgICAgb3V0cHV0ID0gc291cmNlLnNsaWNlKDAsIC0yKTtcclxuICAgICAgICAgIGlmIChtb3ZlQ2FyZXQpIHRoaXMuX3VwZGF0ZUNhcmV0UG9zKDIsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvdXRwdXQgPSBzb3VyY2Uuc2xpY2UoMCwgLTEpO1xyXG4gICAgICAgICAgaWYgKG1vdmVDYXJldCkgdGhpcy5fdXBkYXRlQ2FyZXRQb3MoMSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvdXRwdXQgPSBzb3VyY2Uuc2xpY2UoMCwgcG9zaXRpb24pICsgc291cmNlLnNsaWNlKHBvc2l0aW9uRW5kKTtcclxuICAgICAgaWYgKG1vdmVDYXJldCkge1xyXG4gICAgICAgIHRoaXMuX3NldENhcmV0UG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgYSBzdHJpbmcgdG8gdGhlIGlucHV0IGF0IGEgZ2l2ZW4gcG9zaXRpb25cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGlucHV0XHJcbiAgICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGFkZFxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgKGN1cnNvcikgcG9zaXRpb24gd2hlcmUgdGhlIHN0cmluZyBzaG91bGQgYmUgYWRkZWRcclxuICAgKiBAcGFyYW0gbW92ZUNhcmV0IFdoZXRoZXIgdG8gdXBkYXRlIHZpcnR1YWwta2V5Ym9hcmQgY3Vyc29yXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfYWRkU3RyaW5nQXQoXHJcbiAgICBzb3VyY2U6IHN0cmluZyxcclxuICAgIHN0cjogc3RyaW5nLFxyXG4gICAgcG9zaXRpb24gPSBzb3VyY2UubGVuZ3RoLFxyXG4gICAgcG9zaXRpb25FbmQgPSBzb3VyY2UubGVuZ3RoLFxyXG4gICAgbW92ZUNhcmV0ID0gZmFsc2VcclxuICApIHtcclxuICAgIGlmICh0aGlzLm1heExlbmd0aCAhPT0gLTEgJiYgc291cmNlLmxlbmd0aCA+PSB0aGlzLm1heExlbmd0aCkge1xyXG4gICAgICByZXR1cm4gc291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBvdXRwdXQ7XHJcblxyXG4gICAgaWYgKCFwb3NpdGlvbiAmJiBwb3NpdGlvbiAhPT0gMCkge1xyXG4gICAgICBvdXRwdXQgPSBzb3VyY2UgKyBzdHI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvdXRwdXQgPSBbc291cmNlLnNsaWNlKDAsIHBvc2l0aW9uKSwgc3RyLCBzb3VyY2Uuc2xpY2UocG9zaXRpb25FbmQpXS5qb2luKFxyXG4gICAgICAgICcnXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChtb3ZlQ2FyZXQpIHRoaXMuX3VwZGF0ZUNhcmV0UG9zKHN0ci5sZW5ndGgsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0cHV0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0aG9kIHRvIGRpc3BhdGNoIG5lY2Vzc2FyeSBrZXlib2FyZCBldmVudHMgdG8gY3VycmVudCBpbnB1dCBlbGVtZW50LlxyXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3VpZXZlbnRzL3Rvb2xzL2tleS1ldmVudC12aWV3ZXIuaHRtbFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2Rpc3BhdGNoRXZlbnRzKGJ1dHRvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQga2V5LCBjb2RlO1xyXG4gICAgaWYgKGJ1dHRvbi5pbmNsdWRlcygneycpICYmIGJ1dHRvbi5pbmNsdWRlcygnfScpKSB7XHJcbiAgICAgIC8vIENhcGl0YWxpemUgbmFtZVxyXG4gICAgICBrZXkgPSBidXR0b24uc2xpY2UoMSwgYnV0dG9uLmxlbmd0aCAtIDEpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGtleSA9IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKTtcclxuICAgICAgY29kZSA9IGtleTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGtleSA9IGJ1dHRvbjtcclxuICAgICAgY29kZSA9IE51bWJlci5pc0ludGVnZXIoTnVtYmVyKGJ1dHRvbikpXHJcbiAgICAgICAgPyBgRGlnaXQke2J1dHRvbn1gXHJcbiAgICAgICAgOiBgS2V5JHtidXR0b24udG9VcHBlckNhc2UoKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGV2ZW50SW5pdDogS2V5Ym9hcmRFdmVudEluaXQgPSB7XHJcbiAgICAgIGJ1YmJsZXM6IHRydWUsXHJcbiAgICAgIGNhbmNlbGFibGU6IHRydWUsXHJcbiAgICAgIHNoaWZ0S2V5OiB0aGlzLmxheW91dE5hbWUgPT0gJ3NoaWZ0JyxcclxuICAgICAga2V5OiBrZXksXHJcbiAgICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgIGxvY2F0aW9uOiAwLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBTaW11bGF0ZSBhbGwgbmVlZGVkIGV2ZW50cyBvbiBiYXNlIGVsZW1lbnRcclxuICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uZGlzcGF0Y2hFdmVudChcclxuICAgICAgbmV3IEtleWJvYXJkRXZlbnQoJ2tleWRvd24nLCBldmVudEluaXQpXHJcbiAgICApO1xyXG4gICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICBuZXcgS2V5Ym9hcmRFdmVudCgna2V5cHJlc3MnLCBldmVudEluaXQpXHJcbiAgICApO1xyXG4gICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICBuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pXHJcbiAgICApO1xyXG4gICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py5kaXNwYXRjaEV2ZW50KFxyXG4gICAgICBuZXcgS2V5Ym9hcmRFdmVudCgna2V5dXAnLCBldmVudEluaXQpXHJcbiAgICApO1xyXG5cclxuICAgIC8vIEFuZCBzZXQgZm9jdXMgdG8gaW5wdXRcclxuICAgIHRoaXMuX2ZvY3VzQWN0aXZlSW5wdXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIGFuIGV2ZW50IHRoYXQgd2FycmFudHMgYSBjdXJzb3IgcG9zaXRpb24gdXBkYXRlIGlzIHRyaWdnZXJlZFxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gZXZlbnRcclxuICAgKi9cclxuICBwcml2YXRlIF9jYXJldEV2ZW50SGFuZGxlcihldmVudDogYW55KSB7XHJcbiAgICBsZXQgdGFyZ2V0VGFnTmFtZSA9ICcnO1xyXG4gICAgaWYgKGV2ZW50LnRhcmdldC50YWdOYW1lKSB7XHJcbiAgICAgIHRhcmdldFRhZ05hbWUgPSBldmVudC50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGlzVGV4dElucHV0ID1cclxuICAgICAgdGFyZ2V0VGFnTmFtZSA9PT0gJ3RleHRhcmVhJyB8fFxyXG4gICAgICAodGFyZ2V0VGFnTmFtZSA9PT0gJ2lucHV0JyAmJlxyXG4gICAgICAgIFsndGV4dCcsICdzZWFyY2gnLCAnZW1haWwnLCAncGFzc3dvcmQnLCAndXJsJywgJ3RlbCddLmluY2x1ZGVzKFxyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LnR5cGVcclxuICAgICAgICApKTtcclxuXHJcbiAgICBjb25zdCBpc0tleWJvYXJkID1cclxuICAgICAgZXZlbnQudGFyZ2V0ID09PSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgfHxcclxuICAgICAgKGV2ZW50LnRhcmdldCAmJiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSk7XHJcblxyXG4gICAgaWYgKGlzVGV4dElucHV0ICYmIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudCA9PSBldmVudC50YXJnZXQpIHtcclxuICAgICAgLyoqXHJcbiAgICAgICAqIFRyYWNrcyBjdXJyZW50IGN1cnNvciBwb3NpdGlvblxyXG4gICAgICAgKiBBcyBrZXlzIGFyZSBwcmVzc2VkLCB0ZXh0IHdpbGwgYmUgYWRkZWQvcmVtb3ZlZCBhdCB0aGF0IHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQuXHJcbiAgICAgICAqL1xyXG4gICAgICB0aGlzLl9zZXRDYXJldFBvc2l0aW9uKFxyXG4gICAgICAgIGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCxcclxuICAgICAgICBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgJ0NhcmV0IGF0OicsXHJcbiAgICAgICAgICB0aGlzLl9jYXJldFBvc2l0aW9uLFxyXG4gICAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbkVuZCxcclxuICAgICAgICAgIGV2ZW50ICYmIGV2ZW50LnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgICAgICBldmVudFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIGV2ZW50LnR5cGUgPT09ICdwb2ludGVydXAnICYmXHJcbiAgICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxyXG4gICAgKSB7XHJcbiAgICAgIGlmICh0aGlzLl9pc01vdXNlSG9sZCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQnV0dG9uTW91c2VVcCgnJyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIGlmICghaXNLZXlib2FyZCAmJiBldmVudD8udHlwZSAhPT0gJ3NlbGVjdGlvbmNoYW5nZScpIHtcclxuICAgICAgLyoqXHJcbiAgICAgICAqIHdlIG11c3QgZW5zdXJlIGNhcmV0UG9zaXRpb24gZG9lc24ndCBwZXJzaXN0IG9uY2UgcmVhY3RpdmF0ZWQuXHJcbiAgICAgICAqL1xyXG4gICAgICB0aGlzLl9zZXRDYXJldFBvc2l0aW9uKG51bGwpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgIGBDYXJldCBwb3NpdGlvbiByZXNldCBkdWUgdG8gXCIke2V2ZW50Py50eXBlfVwiIGV2ZW50YCxcclxuICAgICAgICAgIGV2ZW50XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLyoqXHJcbiAgICAgICAqIENsb3NlIHBhbmVsXHJcbiAgICAgICAqL1xyXG4gICAgICB0aGlzLmNsb3NlUGFuZWwuZW1pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9jdXMgdG8gaW5wdXRcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZm9jdXNBY3RpdmVJbnB1dCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uZm9jdXMoKTtcclxuICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uc2V0U2VsZWN0aW9uUmFuZ2UoXHJcbiAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb24sXHJcbiAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb25FbmRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kZWwgaGlnaGxpZ2h0IG9uIGtleSBkb3duXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgS2V5Ym9hcmRFdmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2hhbmRsZUhpZ2hsaWdodEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGJ1dHRvblByZXNzZWQgPSB0aGlzLl9nZXRLZXlib2FyZExheW91dEtleShldmVudCk7XHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhY3RpdmUgY2xhc3NcclxuICAgICAqL1xyXG4gICAgdGhpcy5fc2V0QWN0aXZlQnV0dG9uKGJ1dHRvblByZXNzZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGVsIGhpZ2hsaWdodCBvbiBrZXkgdXBcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBLZXlib2FyZEV2ZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfaGFuZGxlSGlnaGxpZ2h0S2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGJ1dHRvblByZXNzZWQgPSB0aGlzLl9nZXRLZXlib2FyZExheW91dEtleShldmVudCk7XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBhY3RpdmUgY2xhc3NcclxuICAgICAqL1xyXG4gICAgdGhpcy5fcmVtb3ZlQWN0aXZlQnV0dG9uKGJ1dHRvblByZXNzZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhbnNmb3JtcyBhIEtleWJvYXJkRXZlbnQncyBcImtleS5jb2RlXCIgc3RyaW5nIGludG8gYSB2aXJ0dWFsLWtleWJvYXJkIGxheW91dCBmb3JtYXRcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBLZXlib2FyZEV2ZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZ2V0S2V5Ym9hcmRMYXlvdXRLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGxldCBvdXRwdXQgPSAnJztcclxuICAgIGNvbnN0IGtleUlkID0gZXZlbnQuY29kZSB8fCBldmVudC5rZXk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBrZXlJZD8uaW5jbHVkZXMoJ1NwYWNlJykgfHxcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdOdW1wYWQnKSB8fFxyXG4gICAgICBrZXlJZD8uaW5jbHVkZXMoJ0JhY2tzcGFjZScpIHx8XHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnQ2Fwc0xvY2snKSB8fFxyXG4gICAgICBrZXlJZD8uaW5jbHVkZXMoJ01ldGEnKVxyXG4gICAgKSB7XHJcbiAgICAgIG91dHB1dCA9IGB7JHtldmVudC5jb2RlfX1gIHx8ICcnO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdDb250cm9sJykgfHxcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdTaGlmdCcpIHx8XHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnQWx0JylcclxuICAgICkge1xyXG4gICAgICBvdXRwdXQgPSBgeyR7ZXZlbnQua2V5fX1gIHx8ICcnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb3V0cHV0ID0gZXZlbnQua2V5IHx8ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRwdXQubGVuZ3RoID4gMSA/IG91dHB1dD8udG9Mb3dlckNhc2UoKSA6IG91dHB1dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBhY3RpdmUgY2xhc3MgaW4gYnV0dG9uXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uTmFtZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3NldEFjdGl2ZUJ1dHRvbihidXR0b25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcclxuICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKVxyXG4gICAgICAubmFtZWRJdGVtKGJ1dHRvbk5hbWUpO1xyXG4gICAgaWYgKG5vZGUgJiYgbm9kZS5jbGFzc0xpc3QpIHtcclxuICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKHRoaXMuX2FjdGl2ZUJ1dHRvbkNsYXNzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBhY3RpdmUgYnV0dG9uXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uTmFtZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3JlbW92ZUFjdGl2ZUJ1dHRvbihidXR0b25OYW1lPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBub2RlcyA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJyk7XHJcbiAgICBpZiAoYnV0dG9uTmFtZSkge1xyXG4gICAgICBjb25zdCBub2RlID0gbm9kZXMubmFtZWRJdGVtKGJ1dHRvbk5hbWUpO1xyXG4gICAgICBpZiAobm9kZSAmJiBub2RlLmNsYXNzTGlzdCkge1xyXG4gICAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9hY3RpdmVCdXR0b25DbGFzcyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBub2Rlc1tpXS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2FjdGl2ZUJ1dHRvbkNsYXNzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2XHJcbiAgZGlyPVwibHRyXCJcclxuICBjbGFzcz1cInRvdWNoLWtleWJvYXJkXCJcclxuICBbbmdDbGFzc109XCInbGF5b3V0LScgKyBsYXlvdXRNb2RlICsgJy0nICsgbGF5b3V0TmFtZVwiXHJcbj5cclxuICA8bmctY29udGFpbmVyXHJcbiAgICAqbmdGb3I9XCJcclxuICAgICAgbGV0IHJvdyBvZiBsb2NhbGUubGF5b3V0c1tsYXlvdXRNb2RlICsgJ18nICsgbGF5b3V0TmFtZV07XHJcbiAgICAgIGxldCByb3dJbmRleCA9IGluZGV4XHJcbiAgICBcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJ0b3VjaC1rZXlib2FyZC1yb3dcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdzsgbGV0IGtleUluZGV4ID0gaW5kZXhcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBbbmFtZV09XCJrZXlcIlxyXG4gICAgICAgICAgW2Rpcl09XCJsb2NhbGUuZGlyXCJcclxuICAgICAgICAgIGNsYXNzPVwidG91Y2gta2V5Ym9hcmQta2V5XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cIltnZXRCdXR0b25DbGFzcyhrZXkpXVwiXHJcbiAgICAgICAgICBbYXR0ci5kYXRhLWxheW91dF09XCJsYXlvdXRNb2RlXCJcclxuICAgICAgICAgIChwb2ludGVyZG93bik9XCJcclxuICAgICAgICAgICAgaGFuZGxlQnV0dG9uQ2xpY2tlZChrZXksICRldmVudCk7IGhhbmRsZUJ1dHRvbk1vdXNlRG93bihrZXksICRldmVudClcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICAocG9pbnRlcnVwKT1cImhhbmRsZUJ1dHRvbk1vdXNlVXAoa2V5LCAkZXZlbnQpXCJcclxuICAgICAgICAgIChwb2ludGVyY2FuY2VsKT1cImhhbmRsZUJ1dHRvbk1vdXNlVXAoa2V5LCAkZXZlbnQpXCJcclxuICAgICAgICAgIFtpbm5lckh0bWxdPVwiZ2V0QnV0dG9uRGlzcGxheU5hbWUoa2V5KVwiXHJcbiAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuIl19
663
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRvdWNoLWtleWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10b3VjaC1rZXlib2FyZC9zcmMvbGliL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdG91Y2gta2V5Ym9hcmQvc3JjL2xpYi9uZ3gtdG91Y2gta2V5Ym9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlDLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDOzs7OztBQUVwQyxNQU9hLHlCQUF5QjtJQWdCcEM7O09BRUc7SUFDSCxZQUNVLFVBQXdCLEVBQ3hCLFdBQXlDLEVBQ3RCLGNBQXNCO1FBRnpDLGVBQVUsR0FBVixVQUFVLENBQWM7UUFDeEIsZ0JBQVcsR0FBWCxXQUFXLENBQThCO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUFRO1FBckJuRCxXQUFNLEdBQVcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUM5QixlQUFVLEdBQUcsTUFBTSxDQUFDO1FBQ3BCLGVBQVUsR0FBRyxZQUFZLENBQUM7UUFDMUIsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUVKLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXhDLHVCQUFrQixHQUFHLFFBQVEsQ0FBQztRQUk5QixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDckMsc0JBQWlCLEdBQWtCLElBQUksQ0FBQztRQThKaEQ7O1dBRUc7UUFDSCxxQkFBZ0IsR0FBRyxDQUFDLE1BQWMsRUFB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dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVN6QyxxQkFBcUI7c0JBRHBCLFlBQVk7dUJBQUMsd0JBQXdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5qZWN0LFxyXG4gIExPQ0FMRV9JRCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbmltcG9ydCB7IGZuQnV0dG9uIH0gZnJvbSAnLi9Mb2NhbGUvY29uc3RhbnRzJztcclxuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSAnLi9Mb2NhbGUvdHlwZSc7XHJcbmltcG9ydCAqIGFzIExvY2FsZXMgZnJvbSAnLi9Mb2NhbGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtdG91Y2gta2V5Ym9hcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtdG91Y2gta2V5Ym9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hUb3VjaEtleWJvYXJkQ29tcG9uZW50IHtcclxuICBsb2NhbGU6IExvY2FsZSA9IExvY2FsZXMuZW5VUztcclxuICBsYXlvdXRNb2RlID0gJ3RleHQnO1xyXG4gIGxheW91dE5hbWUgPSAnYWxwaGFiZXRpYyc7XHJcbiAgZGVidWcgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIGNsb3NlUGFuZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIHByaXZhdGUgX2FjdGl2ZUJ1dHRvbkNsYXNzID0gJ2FjdGl2ZSc7XHJcbiAgcHJpdmF0ZSBfaG9sZEludGVyYWN0aW9uVGltZW91dCE6IG51bWJlcjtcclxuICBwcml2YXRlIF9ob2xkVGltZW91dCE6IG51bWJlcjtcclxuICBwcml2YXRlIF9pc01vdXNlSG9sZCE6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfY2FyZXRQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY2FyZXRQb3NpdGlvbkVuZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfYWN0aXZlSW5wdXRFbGVtZW50ITogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RvclxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+LFxyXG4gICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgX2RlZmF1bHRMb2NhbGU6IHN0cmluZ1xyXG4gICkge31cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIEFjY2Vzc29yc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHRlciBmb3IgbWF4TGVuZ3RoXHJcbiAgICovXHJcbiAgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8ubWF4TGVuZ3RoID8/IC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0dGVyIGZvciB0eXBlIG9mIGlucHV0XHJcbiAgICovXHJcbiAgZ2V0IGlzVGV4dGFyZWEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py50eXBlID09PSAndGV4dGFyZWEnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIERlY29yYXRlZCBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogT24ga2V5dXBcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQuaXNUcnVzdGVkKSB7XHJcbiAgICAgIHRoaXMuX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50KTtcclxuICAgICAgdGhpcy5faGFuZGxlSGlnaGxpZ2h0S2V5VXAoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24ga2V5ZG93blxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQuaXNUcnVzdGVkKSB7XHJcbiAgICAgIHRoaXMuX2hhbmRsZUhpZ2hsaWdodEtleURvd24oZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gcG9pbnRlcnVwIChtb3VzZXVwIG9yIHRvdWNoZW5kKVxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVydXAnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZU1vdXNlVXAoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gc2VsZWN0XHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNlbGVjdCcsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gc2VsZWN0aW9uY2hhbmdlXHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNlbGVjdGlvbmNoYW5nZScsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIFB1YmxpYyBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGxheW91dCBrZXlib2FyZCBmb3IgbG9jYWxlXHJcbiAgICpcclxuICAgKiBAcGFyYW0gdmFsdWVcclxuICAgKi9cclxuICBzZXRMb2NhbGUodmFsdWU6IHN0cmluZyA9IHRoaXMuX2RlZmF1bHRMb2NhbGUpOiB2b2lkIHtcclxuICAgIC8vIG5vcm1hbGl6ZSB2YWx1ZVxyXG4gICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCctJywgJycpLnRyaW0oKTtcclxuICAgIC8vIFNldCBMb2NhbGUgaWYgc3VwcG9ydGVkXHJcbiAgICBpZiAoKE9iamVjdC5rZXlzKExvY2FsZXMpIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgdGhpcy5sb2NhbGUgPSBMb2NhbGVzW3ZhbHVlIGFzICdlblVTJ107XHJcbiAgICB9XHJcbiAgICAvLyBTZXQgZGVmYXVsdCBMb2NhbGUgaWYgbm90IHN1cHBvcnRlZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubG9jYWxlID0gTG9jYWxlcy5lblVTO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGFjdGl2ZSBpbnB1dFxyXG4gICAqXHJcbiAgICogQHBhcmFtIGlucHV0IElucHV0IG5hdGl2ZSBlbGVtZW50XHJcbiAgICovXHJcbiAgc2V0QWN0aXZlSW5wdXQoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPSBpbnB1dDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNraW5nIGtleWJvYXJkIGxheW91dFxyXG4gICAgICovXHJcbiAgICBjb25zdCBpbnB1dE1vZGUgPSB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmlucHV0TW9kZTtcclxuICAgIGlmIChcclxuICAgICAgaW5wdXRNb2RlICYmXHJcbiAgICAgIFsndGV4dCcsICdzZWFyY2gnLCAnZW1haWwnLCAndXJsJywgJ251bWVyaWMnLCAnZGVjaW1hbCcsICd0ZWwnXS5zb21lKFxyXG4gICAgICAgIChpKSA9PiBpID09PSBpbnB1dE1vZGVcclxuICAgICAgKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TW9kZSA9IGlucHV0TW9kZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TW9kZSA9ICd0ZXh0JztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIGlucHV0TW9kZSAmJlxyXG4gICAgICBbJ251bWVyaWMnLCAnZGVjaW1hbCcsICd0ZWwnXS5zb21lKChpKSA9PiBpID09PSBpbnB1dE1vZGUpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5sYXlvdXROYW1lID0gJ2RlZmF1bHQnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sYXlvdXROYW1lID0gJ2FscGhhYmV0aWMnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdMb2NhbGU6JywgYCR7dGhpcy5sb2NhbGUuY29kZSB8fCB0aGlzLl9kZWZhdWx0TG9jYWxlfWApO1xyXG4gICAgICBjb25zb2xlLmxvZygnTGF5b3V0OicsIGAke3RoaXMubGF5b3V0TW9kZX1fJHt0aGlzLmxheW91dE5hbWV9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB3ZSBtdXN0IGVuc3VyZSBjYXJldFBvc2l0aW9uIGRvZXNuJ3QgcGVyc2lzdCBvbmNlIHJlYWN0aXZhdGVkLlxyXG4gICAgICovXHJcbiAgICB0aGlzLl9zZXRDYXJldFBvc2l0aW9uKFxyXG4gICAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQsXHJcbiAgICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudC5zZWxlY3Rpb25FbmRcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgJ0NhcmV0IHN0YXJ0IGF0OicsXHJcbiAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbixcclxuICAgICAgICB0aGlzLl9jYXJldFBvc2l0aW9uRW5kXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQW5kIHNldCBmb2N1cyB0byBpbnB1dFxyXG4gICAgdGhpcy5fZm9jdXNBY3RpdmVJbnB1dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgd2hldGhlciB0aGUgYnV0dG9uIGlzIGEgc3RhbmRhcmQgYnV0dG9uXHJcbiAgICovXHJcbiAgaXNTdGFuZGFyZEJ1dHRvbiA9IChidXR0b246IHN0cmluZykgPT5cclxuICAgIGJ1dHRvbiAmJiAhKGJ1dHRvblswXSA9PT0gJ3snICYmIGJ1dHRvbltidXR0b24ubGVuZ3RoIC0gMV0gPT09ICd9Jyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlIGJ1dHRvbiB0eXBlXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24ncyBsYXlvdXQgbmFtZVxyXG4gICAqIEByZXR1cm4gVGhlIGJ1dHRvbiB0eXBlXHJcbiAgICovXHJcbiAgZ2V0QnV0dG9uVHlwZShidXR0b246IHN0cmluZyk6ICdzdGFuZGFyZC1rZXknIHwgJ2Z1bmN0aW9uLWtleScge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNTdGFuZGFyZEJ1dHRvbihidXR0b24pID8gJ3N0YW5kYXJkLWtleScgOiAnZnVuY3Rpb24ta2V5JztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgZGVmYXVsdCBjbGFzc2VzIHRvIGEgZ2l2ZW4gYnV0dG9uXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24ncyBsYXlvdXQgbmFtZVxyXG4gICAqIEByZXR1cm4gVGhlIGNsYXNzZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGJ1dHRvblxyXG4gICAqL1xyXG4gIGdldEJ1dHRvbkNsYXNzKGJ1dHRvbjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGJ1dHRvblR5cGVDbGFzcyA9IHRoaXMuZ2V0QnV0dG9uVHlwZShidXR0b24pO1xyXG4gICAgY29uc3QgYnV0dG9uV2l0aG91dEJyYWNlcyA9IGJ1dHRvbi5yZXBsYWNlKCd7JywgJycpLnJlcGxhY2UoJ30nLCAnJyk7XHJcbiAgICBsZXQgYnV0dG9uTm9ybWFsaXplZCA9ICcnO1xyXG5cclxuICAgIGlmIChidXR0b25UeXBlQ2xhc3MgIT09ICdzdGFuZGFyZC1rZXknKVxyXG4gICAgICBidXR0b25Ob3JtYWxpemVkID0gYCR7YnV0dG9uV2l0aG91dEJyYWNlc30ta2V5YDtcclxuXHJcbiAgICByZXR1cm4gYCR7YnV0dG9uVHlwZUNsYXNzfSAke2J1dHRvbk5vcm1hbGl6ZWR9YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGRpc3BsYXkgKGxhYmVsKSBuYW1lIGZvciBhIGdpdmVuIGJ1dHRvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uJ3MgbGF5b3V0IG5hbWVcclxuICAgKiBAcmV0dXJuIFRoZSBkaXNwbGF5IG5hbWUgdG8gYmUgc2hvdyB0byB0aGUgYnV0dG9uXHJcbiAgICovXHJcbiAgZ2V0QnV0dG9uRGlzcGxheU5hbWUoYnV0dG9uOiBzdHJpbmcpOiBTYWZlSHRtbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKFxyXG4gICAgICB0aGlzLmxvY2FsZS5kaXNwbGF5W2J1dHRvbl0gfHwgYnV0dG9uXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBjbGlja3MgbWFkZSB0byBrZXlib2FyZCBidXR0b25zXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gbGF5b3V0IG5hbWUuXHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBidXR0b24gZXZlbnQuXHJcbiAgICovXHJcbiAgaGFuZGxlQnV0dG9uUHJlc3MoYnV0dG9uOiBzdHJpbmcsIGU/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0tleSBwcmVzczonLCBidXR0b24pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChidXR0b24gPT09IGZuQnV0dG9uLlNISUZUKSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TmFtZSA9XHJcbiAgICAgICAgdGhpcy5sYXlvdXROYW1lID09PSAnYWxwaGFiZXRpYycgPyAnc2hpZnQnIDogJ2FscGhhYmV0aWMnO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2UgaWYgKGJ1dHRvbiA9PT0gZm5CdXR0b24uRE9ORSkge1xyXG4gICAgICB0aGlzLmNsb3NlUGFuZWwuZW1pdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29tbW9uUGFyYW1zOiBbbnVtYmVyLCBudW1iZXIsIGJvb2xlYW5dID0gW1xyXG4gICAgICB0aGlzLl9jYXJldFBvc2l0aW9uIHx8IDAsXHJcbiAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQgfHwgMCxcclxuICAgICAgdHJ1ZSxcclxuICAgIF07XHJcbiAgICBsZXQgb3V0cHV0ID0gdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py52YWx1ZSB8fCAnJztcclxuXHJcbiAgICAvLyBIYW5kZWwgZnVuY3Rpb25hbCBidXR0b25cclxuICAgIGlmICghdGhpcy5pc1N0YW5kYXJkQnV0dG9uKGJ1dHRvbikpIHtcclxuICAgICAgLy8gSGFuZGVsIEJBQ0tTUEFDRVxyXG4gICAgICBpZiAoYnV0dG9uID09PSBmbkJ1dHRvbi5CQUNLU1BBQ0UpIHtcclxuICAgICAgICBvdXRwdXQgPSB0aGlzLl9yZW1vdmVBdChvdXRwdXQsIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gSGFuZGVsIFNQQUNFXHJcbiAgICAgIGVsc2UgaWYgKGJ1dHRvbiA9PT0gZm5CdXR0b24uU1BBQ0UpIHtcclxuICAgICAgICBvdXRwdXQgPSB0aGlzLl9hZGRTdHJpbmdBdChvdXRwdXQsICcgJywgLi4uY29tbW9uUGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBIYW5kZWwgVEFCXHJcbiAgICAgIGVsc2UgaWYgKGJ1dHRvbiA9PT0gZm5CdXR0b24uVEFCKSB7XHJcbiAgICAgICAgb3V0cHV0ID0gdGhpcy5fYWRkU3RyaW5nQXQob3V0cHV0LCAnXFx0JywgLi4uY29tbW9uUGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBIYW5kZWwgRU5URVJcclxuICAgICAgZWxzZSBpZiAoYnV0dG9uID09PSBmbkJ1dHRvbi5FTlRFUikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzVGV4dGFyZWEpIHtcclxuICAgICAgICAgIG91dHB1dCA9IHRoaXMuX2FkZFN0cmluZ0F0KG91dHB1dCwgJ1xcbicsIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIEhhbmRlbCBMQVlPVVRcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXROYW1lID0gYnV0dG9uLnN1YnN0cmluZygxLCBidXR0b24ubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBIYW5kZWwgc3RhbmRhcmQgYnV0dG9uXHJcbiAgICBlbHNlIHtcclxuICAgICAgb3V0cHV0ID0gdGhpcy5fYWRkU3RyaW5nQXQob3V0cHV0LCBidXR0b24sIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudCkge1xyXG4gICAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQudmFsdWUgPSBvdXRwdXQ7XHJcblxyXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgJ0NhcmV0IGF0OicsXHJcbiAgICAgICAgICB0aGlzLl9jYXJldFBvc2l0aW9uLFxyXG4gICAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbkVuZCxcclxuICAgICAgICAgICdCdXR0b24nLFxyXG4gICAgICAgICAgZVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9kaXNwYXRjaEV2ZW50cyhidXR0b24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlcyBidXR0b24gZG93blxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGxheW91dCBuYW1lLlxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgYnV0dG9uIGV2ZW50LlxyXG4gICAqL1xyXG4gIGhhbmRsZUJ1dHRvbkRvd24oYnV0dG9uOiBzdHJpbmcsIGU/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0tleSBkb3duOicsIGJ1dHRvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUpIHtcclxuICAgICAgLyoqXHJcbiAgICAgICAqIEhhbmRsZSBldmVudCBvcHRpb25zXHJcbiAgICAgICAqL1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYWN0aXZlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX3NldEFjdGl2ZUJ1dHRvbihidXR0b24pO1xyXG5cclxuICAgIGlmICh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KVxyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dCk7XHJcbiAgICBpZiAodGhpcy5faG9sZFRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkVGltZW91dCk7XHJcbiAgICB0aGlzLl9pc01vdXNlSG9sZCA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaW1lIHRvIHdhaXQgdW50aWwgYSBrZXkgaG9sZCBpcyBkZXRlY3RlZFxyXG4gICAgICovXHJcbiAgICB0aGlzLl9ob2xkVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX2lzTW91c2VIb2xkICYmXHJcbiAgICAgICAgKCghYnV0dG9uLmluY2x1ZGVzKCd7JykgJiYgIWJ1dHRvbi5pbmNsdWRlcygnfScpKSB8fFxyXG4gICAgICAgICAgYnV0dG9uID09PSBmbkJ1dHRvbi5CQUNLU1BBQ0UgfHxcclxuICAgICAgICAgIGJ1dHRvbiA9PT0gZm5CdXR0b24uU1BBQ0UpXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnQnV0dG9uIGhvbGQ6JywgYnV0dG9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oYW5kbGVCdXR0b25Ib2xkKGJ1dHRvbik7XHJcbiAgICAgIH1cclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRUaW1lb3V0KTtcclxuICAgIH0sIDUwMCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kZWwgYnV0dG9uIENsaWNrIGFmdGVyIGJ1dHRvbiBkb3duXHJcbiAgICAgKi9cclxuICAgIHRoaXMuaGFuZGxlQnV0dG9uUHJlc3MoYnV0dG9uLCBlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgYnV0dG9uIHVwXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gbGF5b3V0IG5hbWUuXHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBidXR0b24gZXZlbnQuXHJcbiAgICovXHJcbiAgaGFuZGxlQnV0dG9uVXAoYnV0dG9uOiBzdHJpbmcsIGU/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0tleSB1cDonLCBidXR0b24pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlKSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBIYW5kbGUgZXZlbnQgb3B0aW9uc1xyXG4gICAgICAgKi9cclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIGFjdGl2ZSBjbGFzc1xyXG4gICAgICovXHJcbiAgICB0aGlzLl9yZW1vdmVBY3RpdmVCdXR0b24oKTtcclxuXHJcbiAgICB0aGlzLl9pc01vdXNlSG9sZCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpXHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgYnV0dG9uIGhvbGRcclxuICAgKi9cclxuICBoYW5kbGVCdXR0b25Ib2xkKGJ1dHRvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dClcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGltZW91dCBkaWN0YXRpbmcgdGhlIHNwZWVkIG9mIGtleSBob2xkIGl0ZXJhdGlvbnNcclxuICAgICAqL1xyXG4gICAgdGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuX2lzTW91c2VIb2xkKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVCdXR0b25QcmVzcyhidXR0b24pO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQnV0dG9uSG9sZChidXR0b24pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gQCBQcml2YXRlIG1ldGhvZHNcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKipcclxuICAgKiBDaGFuZ2VzIHRoZSBpbnRlcm5hbCBjYXJldCBwb3NpdGlvblxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGNhcmV0J3Mgc3RhcnQgcG9zaXRpb25cclxuICAgKiBAcGFyYW0gcG9zaXRpb25FbmQgVGhlIGNhcmV0J3MgZW5kIHBvc2l0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfc2V0Q2FyZXRQb3NpdGlvbihcclxuICAgIHBvc2l0aW9uOiBudW1iZXIgfCBudWxsLFxyXG4gICAgZW5kUG9zaXRpb24gPSBwb3NpdGlvblxyXG4gICk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRQb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG4gICAgdGhpcy5fY2FyZXRQb3NpdGlvbkVuZCA9IGVuZFBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZXMgdGhlIGN1cnNvciBwb3NpdGlvbiBieSBhIGdpdmVuIGFtb3VudFxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gbGVuZ3RoIFJlcHJlc2VudHMgYnkgaG93IG1hbnkgY2hhcmFjdGVycyB0aGUgaW5wdXQgc2hvdWxkIGJlIG1vdmVkXHJcbiAgICogQHBhcmFtIG1pbnVzIFdoZXRoZXIgdGhlIGN1cnNvciBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGxlZnQgb3Igbm90LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3VwZGF0ZUNhcmV0UG9zKGxlbmd0aDogbnVtYmVyLCBtaW51cyA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCBuZXdDYXJldFBvcyA9IHRoaXMuX3VwZGF0ZUNhcmV0UG9zQWN0aW9uKGxlbmd0aCwgbWludXMpO1xyXG4gICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihuZXdDYXJldFBvcyk7XHJcbiAgICAvLyBTY3JvbGwgdG8gYm90dG9tXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py5zY3JvbGxUbyh7XHJcbiAgICAgICAgdG9wOiB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LFxyXG4gICAgICB9IGFzIFNjcm9sbFRvT3B0aW9ucyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjdGlvbiBtZXRob2Qgb2YgdXBkYXRlQ2FyZXRQb3NcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIGxlbmd0aCBSZXByZXNlbnRzIGJ5IGhvdyBtYW55IGNoYXJhY3RlcnMgdGhlIGlucHV0IHNob3VsZCBiZSBtb3ZlZFxyXG4gICAqIEBwYXJhbSBtaW51cyBXaGV0aGVyIHRoZSBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBsZWZ0IG9yIG5vdC5cclxuICAgKi9cclxuICBwcml2YXRlIF91cGRhdGVDYXJldFBvc0FjdGlvbihsZW5ndGg6IG51bWJlciwgbWludXMgPSBmYWxzZSkge1xyXG4gICAgbGV0IGNhcmV0UG9zaXRpb24gPSB0aGlzLl9jYXJldFBvc2l0aW9uO1xyXG5cclxuICAgIGlmIChjYXJldFBvc2l0aW9uICE9IG51bGwpIHtcclxuICAgICAgaWYgKG1pbnVzKSB7XHJcbiAgICAgICAgaWYgKGNhcmV0UG9zaXRpb24gPiAwKSBjYXJldFBvc2l0aW9uID0gY2FyZXRQb3NpdGlvbiAtIGxlbmd0aDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjYXJldFBvc2l0aW9uID0gY2FyZXRQb3NpdGlvbiArIGxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjYXJldFBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyBhbiBhbW91bnQgb2YgY2hhcmFjdGVycyBiZWZvcmUgYSBnaXZlbiBwb3NpdGlvblxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgaW5wdXRcclxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIChjdXJzb3IpIHBvc2l0aW9uIGZyb20gd2hlcmUgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHJlbW92ZWRcclxuICAgKiBAcGFyYW0gbW92ZUNhcmV0IFdoZXRoZXIgdG8gdXBkYXRlIGlucHV0IGN1cnNvclxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3JlbW92ZUF0KFxyXG4gICAgc291cmNlOiBzdHJpbmcsXHJcbiAgICBwb3NpdGlvbiA9IHNvdXJjZS5sZW5ndGgsXHJcbiAgICBwb3NpdGlvbkVuZCA9IHNvdXJjZS5sZW5ndGgsXHJcbiAgICBtb3ZlQ2FyZXQgPSBmYWxzZVxyXG4gICkge1xyXG4gICAgaWYgKHBvc2l0aW9uID09PSAwICYmIHBvc2l0aW9uRW5kID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBzb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG91dHB1dDtcclxuXHJcbiAgICBpZiAocG9zaXRpb24gPT09IHBvc2l0aW9uRW5kKSB7XHJcbiAgICAgIGxldCBwcmV2VHdvQ2hhcnM7XHJcbiAgICAgIGxldCBlbW9qaU1hdGNoZWQ7XHJcbiAgICAgIGNvbnN0IGVtb2ppTWF0Y2hlZFJlZyA9IC8oW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXSkvZztcclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBFbW9qaXMgYXJlIG1hZGUgb3V0IG9mIHR3byBjaGFyYWN0ZXJzLCBzbyB3ZSBtdXN0IHRha2UgYSBjdXN0b20gYXBwcm9hY2ggdG8gdHJpbSB0aGVtLlxyXG4gICAgICAgKiBGb3IgbW9yZSBpbmZvOiBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlXHJcbiAgICAgICAqL1xyXG4gICAgICBpZiAocG9zaXRpb24gJiYgcG9zaXRpb24gPj0gMCkge1xyXG4gICAgICAgIHByZXZUd29DaGFycyA9IHNvdXJjZS5zdWJzdHJpbmcocG9zaXRpb24gLSAyLCBwb3NpdGlvbik7XHJcbiAgICAgICAgZW1vamlNYXRjaGVkID0gcHJldlR3b0NoYXJzLm1hdGNoKGVtb2ppTWF0Y2hlZFJlZyk7XHJcblxyXG4gICAgICAgIGlmIChlbW9qaU1hdGNoZWQpIHtcclxuICAgICAgICAgIG91dHB1dCA9IHNvdXJjZS5zdWJzdHIoMCwgcG9zaXRpb24gLSAyKSArIHNvdXJjZS5zdWJzdHIocG9zaXRpb24pO1xyXG4gICAgICAgICAgaWYgKG1vdmVDYXJldCkgdGhpcy5fdXBkYXRlQ2FyZXRQb3MoMiwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG91dHB1dCA9IHNvdXJjZS5zdWJzdHIoMCwgcG9zaXRpb24gLSAxKSArIHNvdXJjZS5zdWJzdHIocG9zaXRpb24pO1xyXG4gICAgICAgICAgaWYgKG1vdmVDYXJldCkgdGhpcy5fdXBkYXRlQ2FyZXRQb3MoMSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHByZXZUd29DaGFycyA9IHNvdXJjZS5zbGljZSgtMik7XHJcbiAgICAgICAgZW1vamlNYXRjaGVkID0gcHJldlR3b0NoYXJzLm1hdGNoKGVtb2ppTWF0Y2hlZFJlZyk7XHJcblxyXG4gICAgICAgIGlmIChlbW9qaU1hdGNoZWQpIHtcclxuICAgICAgICAgIG91dHB1dCA9IHNvdXJjZS5zbGljZSgwLCAtMik7XHJcbiAgICAgICAgICBpZiAobW92ZUNhcmV0KSB0aGlzLl91cGRhdGVDYXJldFBvcygyLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb3V0cHV0ID0gc291cmNlLnNsaWNlKDAsIC0xKTtcclxuICAgICAgICAgIGlmIChtb3ZlQ2FyZXQpIHRoaXMuX3VwZGF0ZUNhcmV0UG9zKDEsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb3V0cHV0ID0gc291cmNlLnNsaWNlKDAsIHBvc2l0aW9uKSArIHNvdXJjZS5zbGljZShwb3NpdGlvbkVuZCk7XHJcbiAgICAgIGlmIChtb3ZlQ2FyZXQpIHtcclxuICAgICAgICB0aGlzLl9zZXRDYXJldFBvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGEgc3RyaW5nIHRvIHRoZSBpbnB1dCBhdCBhIGdpdmVuIHBvc2l0aW9uXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBpbnB1dFxyXG4gICAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byBhZGRcclxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIChjdXJzb3IpIHBvc2l0aW9uIHdoZXJlIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGFkZGVkXHJcbiAgICogQHBhcmFtIG1vdmVDYXJldCBXaGV0aGVyIHRvIHVwZGF0ZSB2aXJ0dWFsLWtleWJvYXJkIGN1cnNvclxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2FkZFN0cmluZ0F0KFxyXG4gICAgc291cmNlOiBzdHJpbmcsXHJcbiAgICBzdHI6IHN0cmluZyxcclxuICAgIHBvc2l0aW9uID0gc291cmNlLmxlbmd0aCxcclxuICAgIHBvc2l0aW9uRW5kID0gc291cmNlLmxlbmd0aCxcclxuICAgIG1vdmVDYXJldCA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5tYXhMZW5ndGggIT09IC0xICYmIHNvdXJjZS5sZW5ndGggPj0gdGhpcy5tYXhMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3V0cHV0O1xyXG5cclxuICAgIGlmICghcG9zaXRpb24gJiYgcG9zaXRpb24gIT09IDApIHtcclxuICAgICAgb3V0cHV0ID0gc291cmNlICsgc3RyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb3V0cHV0ID0gW3NvdXJjZS5zbGljZSgwLCBwb3NpdGlvbiksIHN0ciwgc291cmNlLnNsaWNlKHBvc2l0aW9uRW5kKV0uam9pbihcclxuICAgICAgICAnJ1xyXG4gICAgICApO1xyXG4gICAgICBpZiAobW92ZUNhcmV0KSB0aGlzLl91cGRhdGVDYXJldFBvcyhzdHIubGVuZ3RoLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldGhvZCB0byBkaXNwYXRjaCBuZWNlc3Nhcnkga2V5Ym9hcmQgZXZlbnRzIHRvIGN1cnJlbnQgaW5wdXQgZWxlbWVudC5cclxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby91aWV2ZW50cy90b29scy9rZXktZXZlbnQtdmlld2VyLmh0bWxcclxuICAgKlxyXG4gICAqIEBwYXJhbSBidXR0b25cclxuICAgKi9cclxuICBwcml2YXRlIF9kaXNwYXRjaEV2ZW50cyhidXR0b246IHN0cmluZykge1xyXG4gICAgbGV0IGtleSwgY29kZTtcclxuICAgIGlmIChidXR0b24uaW5jbHVkZXMoJ3snKSAmJiBidXR0b24uaW5jbHVkZXMoJ30nKSkge1xyXG4gICAgICAvLyBDYXBpdGFsaXplIG5hbWVcclxuICAgICAga2V5ID0gYnV0dG9uLnNsaWNlKDEsIGJ1dHRvbi5sZW5ndGggLSAxKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBrZXkgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7XHJcbiAgICAgIGNvZGUgPSBrZXk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBrZXkgPSBidXR0b247XHJcbiAgICAgIGNvZGUgPSBOdW1iZXIuaXNJbnRlZ2VyKE51bWJlcihidXR0b24pKVxyXG4gICAgICAgID8gYERpZ2l0JHtidXR0b259YFxyXG4gICAgICAgIDogYEtleSR7YnV0dG9uLnRvVXBwZXJDYXNlKCl9YDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBldmVudEluaXQ6IEtleWJvYXJkRXZlbnRJbml0ID0ge1xyXG4gICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgICBjYW5jZWxhYmxlOiB0cnVlLFxyXG4gICAgICBzaGlmdEtleTogdGhpcy5sYXlvdXROYW1lID09ICdzaGlmdCcsXHJcbiAgICAgIGtleToga2V5LFxyXG4gICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICBsb2NhdGlvbjogMCxcclxuICAgIH07XHJcblxyXG4gICAgLy8gU2ltdWxhdGUgYWxsIG5lZWRlZCBldmVudHMgb24gYmFzZSBlbGVtZW50XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmRpc3BhdGNoRXZlbnQoXHJcbiAgICAgIG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywgZXZlbnRJbml0KVxyXG4gICAgKTtcclxuICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uZGlzcGF0Y2hFdmVudChcclxuICAgICAgbmV3IEtleWJvYXJkRXZlbnQoJ2tleXByZXNzJywgZXZlbnRJbml0KVxyXG4gICAgKTtcclxuICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uZGlzcGF0Y2hFdmVudChcclxuICAgICAgbmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uZGlzcGF0Y2hFdmVudChcclxuICAgICAgbmV3IEtleWJvYXJkRXZlbnQoJ2tleXVwJywgZXZlbnRJbml0KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBBbmQgc2V0IGZvY3VzIHRvIGlucHV0XHJcbiAgICB0aGlzLl9mb2N1c0FjdGl2ZUlucHV0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiBhbiBldmVudCB0aGF0IHdhcnJhbnRzIGEgY3Vyc29yIHBvc2l0aW9uIHVwZGF0ZSBpcyB0cmlnZ2VyZWRcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIGV2ZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgbGV0IHRhcmdldFRhZ05hbWUgPSAnJztcclxuICAgIGlmIChldmVudC50YXJnZXQudGFnTmFtZSkge1xyXG4gICAgICB0YXJnZXRUYWdOYW1lID0gZXZlbnQudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc1RleHRJbnB1dCA9XHJcbiAgICAgIHRhcmdldFRhZ05hbWUgPT09ICd0ZXh0YXJlYScgfHxcclxuICAgICAgKHRhcmdldFRhZ05hbWUgPT09ICdpbnB1dCcgJiZcclxuICAgICAgICBbJ3RleHQnLCAnc2VhcmNoJywgJ2VtYWlsJywgJ3Bhc3N3b3JkJywgJ3VybCcsICd0ZWwnXS5pbmNsdWRlcyhcclxuICAgICAgICAgIGV2ZW50LnRhcmdldC50eXBlXHJcbiAgICAgICAgKSk7XHJcblxyXG4gICAgY29uc3QgaXNLZXlib2FyZCA9XHJcbiAgICAgIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IHx8XHJcbiAgICAgIChldmVudC50YXJnZXQgJiYgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpO1xyXG5cclxuICAgIGlmIChpc1RleHRJbnB1dCAmJiB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBUcmFja3MgY3VycmVudCBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgICogQXMga2V5cyBhcmUgcHJlc3NlZCwgdGV4dCB3aWxsIGJlIGFkZGVkL3JlbW92ZWQgYXQgdGhhdCBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0LlxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihcclxuICAgICAgICBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICdDYXJldCBhdDonLFxyXG4gICAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbixcclxuICAgICAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQsXHJcbiAgICAgICAgICBldmVudCAmJiBldmVudC50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgZXZlbnRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBldmVudC50eXBlID09PSAncG9pbnRlcnVwJyAmJlxyXG4gICAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcclxuICAgICkge1xyXG4gICAgICBpZiAodGhpcy5faXNNb3VzZUhvbGQpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUJ1dHRvblVwKCcnKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2UgaWYgKCFpc0tleWJvYXJkICYmIGV2ZW50Py50eXBlICE9PSAnc2VsZWN0aW9uY2hhbmdlJykge1xyXG4gICAgICAvKipcclxuICAgICAgICogd2UgbXVzdCBlbnN1cmUgY2FyZXRQb3NpdGlvbiBkb2Vzbid0IHBlcnNpc3Qgb25jZSByZWFjdGl2YXRlZC5cclxuICAgICAgICovXHJcbiAgICAgIHRoaXMuX3NldENhcmV0UG9zaXRpb24obnVsbCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgYENhcmV0IHBvc2l0aW9uIHJlc2V0IGR1ZSB0byBcIiR7ZXZlbnQ/LnR5cGV9XCIgZXZlbnRgLFxyXG4gICAgICAgICAgZXZlbnRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKipcclxuICAgICAgICogQ2xvc2UgcGFuZWxcclxuICAgICAgICovXHJcbiAgICAgIHRoaXMuY2xvc2VQYW5lbC5lbWl0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb2N1cyB0byBpbnB1dFxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKi9cclxuICBwcml2YXRlIF9mb2N1c0FjdGl2ZUlucHV0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py5mb2N1cygpO1xyXG4gICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py5zZXRTZWxlY3Rpb25SYW5nZShcclxuICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbixcclxuICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbkVuZFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRlbCBoaWdobGlnaHQgb24ga2V5IGRvd25cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBLZXlib2FyZEV2ZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfaGFuZGxlSGlnaGxpZ2h0S2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgYnV0dG9uUHJlc3NlZCA9IHRoaXMuX2dldEtleWJvYXJkTGF5b3V0S2V5KGV2ZW50KTtcclxuICAgIC8qKlxyXG4gICAgICogQWRkIGFjdGl2ZSBjbGFzc1xyXG4gICAgICovXHJcbiAgICB0aGlzLl9zZXRBY3RpdmVCdXR0b24oYnV0dG9uUHJlc3NlZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kZWwgaGlnaGxpZ2h0IG9uIGtleSB1cFxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBwcml2YXRlIF9oYW5kbGVIaWdobGlnaHRLZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgYnV0dG9uUHJlc3NlZCA9IHRoaXMuX2dldEtleWJvYXJkTGF5b3V0S2V5KGV2ZW50KTtcclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIGFjdGl2ZSBjbGFzc1xyXG4gICAgICovXHJcbiAgICB0aGlzLl9yZW1vdmVBY3RpdmVCdXR0b24oYnV0dG9uUHJlc3NlZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFuc2Zvcm1zIGEgS2V5Ym9hcmRFdmVudCdzIFwia2V5LmNvZGVcIiBzdHJpbmcgaW50byBhIHZpcnR1YWwta2V5Ym9hcmQgbGF5b3V0IGZvcm1hdFxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRLZXlib2FyZExheW91dEtleShldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgbGV0IG91dHB1dCA9ICcnO1xyXG4gICAgY29uc3Qga2V5SWQgPSBldmVudC5jb2RlIHx8IGV2ZW50LmtleTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnU3BhY2UnKSB8fFxyXG4gICAgICBrZXlJZD8uaW5jbHVkZXMoJ051bXBhZCcpIHx8XHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnQmFja3NwYWNlJykgfHxcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdDYXBzTG9jaycpIHx8XHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnTWV0YScpXHJcbiAgICApIHtcclxuICAgICAgb3V0cHV0ID0gYHske2V2ZW50LmNvZGV9fWAgfHwgJyc7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBrZXlJZD8uaW5jbHVkZXMoJ0NvbnRyb2wnKSB8fFxyXG4gICAgICBrZXlJZD8uaW5jbHVkZXMoJ1NoaWZ0JykgfHxcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdBbHQnKVxyXG4gICAgKSB7XHJcbiAgICAgIG91dHB1dCA9IGB7JHtldmVudC5rZXl9fWAgfHwgJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvdXRwdXQgPSBldmVudC5rZXkgfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dHB1dC5sZW5ndGggPiAxID8gb3V0cHV0Py50b0xvd2VyQ2FzZSgpIDogb3V0cHV0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGFjdGl2ZSBjbGFzcyBpbiBidXR0b25cclxuICAgKlxyXG4gICAqIEBwYXJhbSBidXR0b25OYW1lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfc2V0QWN0aXZlQnV0dG9uKGJ1dHRvbk5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxyXG4gICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpXHJcbiAgICAgIC5uYW1lZEl0ZW0oYnV0dG9uTmFtZSk7XHJcbiAgICBpZiAobm9kZSAmJiBub2RlLmNsYXNzTGlzdCkge1xyXG4gICAgICBub2RlLmNsYXNzTGlzdC5hZGQodGhpcy5fYWN0aXZlQnV0dG9uQ2xhc3MpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFjdGl2ZSBidXR0b25cclxuICAgKlxyXG4gICAqIEBwYXJhbSBidXR0b25OYW1lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfcmVtb3ZlQWN0aXZlQnV0dG9uKGJ1dHRvbk5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdidXR0b24nKTtcclxuICAgIGlmIChidXR0b25OYW1lKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5uYW1lZEl0ZW0oYnV0dG9uTmFtZSk7XHJcbiAgICAgIGlmIChub2RlICYmIG5vZGUuY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2FjdGl2ZUJ1dHRvbkNsYXNzKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG5vZGVzW2ldLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fYWN0aXZlQnV0dG9uQ2xhc3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXZcclxuICBkaXI9XCJsdHJcIlxyXG4gIGNsYXNzPVwidG91Y2gta2V5Ym9hcmRcIlxyXG4gIFtuZ0NsYXNzXT1cIidsYXlvdXQtJyArIGxheW91dE1vZGUgKyAnLScgKyBsYXlvdXROYW1lXCJcclxuPlxyXG4gIDxuZy1jb250YWluZXJcclxuICAgICpuZ0Zvcj1cIlxyXG4gICAgICBsZXQgcm93IG9mIGxvY2FsZS5sYXlvdXRzW2xheW91dE1vZGUgKyAnXycgKyBsYXlvdXROYW1lXTtcclxuICAgICAgbGV0IHJvd0luZGV4ID0gaW5kZXhcclxuICAgIFwiXHJcbiAgPlxyXG4gICAgPGRpdiBjbGFzcz1cInRvdWNoLWtleWJvYXJkLXJvd1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBrZXkgb2Ygcm93OyBsZXQga2V5SW5kZXggPSBpbmRleFwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIFtuYW1lXT1cImtleVwiXHJcbiAgICAgICAgICBbZGlyXT1cImxvY2FsZS5kaXJcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0b3VjaC1rZXlib2FyZC1rZXlcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiW2dldEJ1dHRvbkNsYXNzKGtleSldXCJcclxuICAgICAgICAgIFthdHRyLmRhdGEtbGF5b3V0XT1cImxheW91dE1vZGVcIlxyXG4gICAgICAgICAgKHBvaW50ZXJ1cCk9XCJoYW5kbGVCdXR0b25VcChrZXksICRldmVudClcIlxyXG4gICAgICAgICAgKHBvaW50ZXJkb3duKT1cImhhbmRsZUJ1dHRvbkRvd24oa2V5LCAkZXZlbnQpXCJcclxuICAgICAgICAgIChwb2ludGVyY2FuY2VsKT1cImhhbmRsZUJ1dHRvblVwKGtleSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICBbaW5uZXJIdG1sXT1cImdldEJ1dHRvbkRpc3BsYXlOYW1lKGtleSlcIlxyXG4gICAgICAgID48L2J1dHRvbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbiJdfQ==