@po-ui/ng-components 18.19.1 → 18.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/esm2022/lib/components/po-field/po-combo/po-combo.component.mjs +41 -41
  2. package/esm2022/lib/components/po-field/po-datepicker-range/po-datepicker-range.component.mjs +23 -23
  3. package/esm2022/lib/components/po-field/po-lookup/po-lookup.component.mjs +47 -38
  4. package/esm2022/lib/po.module.mjs +1 -1
  5. package/esm2022/lib/services/po-theme/enum/po-theme-a11y.enum.mjs +30 -0
  6. package/esm2022/lib/services/po-theme/enum/po-theme-type.enum.mjs +4 -1
  7. package/esm2022/lib/services/po-theme/helpers/accessibilities/po-theme-default-aa.constant.mjs +14 -0
  8. package/esm2022/lib/services/po-theme/helpers/accessibilities/po-theme-default-aaa.constant.mjs +18 -0
  9. package/esm2022/lib/services/po-theme/helpers/po-theme-poui.constant.mjs +29 -13
  10. package/esm2022/lib/services/po-theme/helpers/types/po-theme-dark-defaults.constant.mjs +210 -0
  11. package/esm2022/lib/services/po-theme/helpers/types/po-theme-light-defaults.constant.mjs +114 -0
  12. package/esm2022/lib/services/po-theme/index.mjs +7 -4
  13. package/esm2022/lib/services/po-theme/interfaces/po-theme.interface.mjs +1 -1
  14. package/esm2022/lib/services/po-theme/po-theme.service.mjs +216 -32
  15. package/fesm2022/po-ui-ng-components.mjs +626 -372
  16. package/fesm2022/po-ui-ng-components.mjs.map +1 -1
  17. package/lib/services/po-theme/enum/po-theme-a11y.enum.d.ts +28 -0
  18. package/lib/services/po-theme/enum/po-theme-type.enum.d.ts +3 -0
  19. package/lib/services/po-theme/helpers/accessibilities/po-theme-default-aa.constant.d.ts +10 -0
  20. package/lib/services/po-theme/helpers/accessibilities/po-theme-default-aaa.constant.d.ts +14 -0
  21. package/lib/services/po-theme/helpers/po-theme-poui.constant.d.ts +5 -1
  22. package/lib/services/po-theme/helpers/{po-theme-dark-defaults.constant.d.ts → types/po-theme-dark-defaults.constant.d.ts} +4 -11
  23. package/lib/services/po-theme/helpers/types/po-theme-light-defaults.constant.d.ts +25 -0
  24. package/lib/services/po-theme/index.d.ts +6 -3
  25. package/lib/services/po-theme/interfaces/po-theme.interface.d.ts +18 -5
  26. package/lib/services/po-theme/po-theme.service.d.ts +90 -10
  27. package/package.json +4 -4
  28. package/po-ui-ng-components-18.20.0.tgz +0 -0
  29. package/schematics/ng-add/index.js +1 -1
  30. package/schematics/ng-update/v14/index.js +1 -1
  31. package/schematics/ng-update/v15/index.js +1 -1
  32. package/schematics/ng-update/v16/index.js +1 -1
  33. package/schematics/ng-update/v17/index.js +1 -1
  34. package/schematics/ng-update/v18/index.js +2 -2
  35. package/schematics/ng-update/v2/index.js +1 -1
  36. package/schematics/ng-update/v3/index.js +1 -1
  37. package/schematics/ng-update/v4/index.js +1 -1
  38. package/schematics/ng-update/v5/index.js +1 -1
  39. package/schematics/ng-update/v6/index.js +1 -1
  40. package/esm2022/lib/services/po-theme/helpers/po-theme-dark-defaults.constant.mjs +0 -203
  41. package/esm2022/lib/services/po-theme/helpers/po-theme-light-defaults.constant.mjs +0 -134
  42. package/lib/services/po-theme/helpers/po-theme-light-defaults.constant.d.ts +0 -41
  43. package/po-ui-ng-components-18.19.1.tgz +0 -0
@@ -1,7 +1,12 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
2
  import { Inject, Injectable, Optional } from '@angular/core';
3
3
  import { ICONS_DICTIONARY, PhosphorIconDictionary } from '../../components/po-icon/index';
4
+ import { PoThemeA11yEnum } from './enum/po-theme-a11y.enum';
4
5
  import { PoThemeTypeEnum } from './enum/po-theme-type.enum';
6
+ import { poThemeDefaultAA } from './helpers/accessibilities/po-theme-default-aa.constant';
7
+ import { poThemeDefaultAAA } from './helpers/accessibilities/po-theme-default-aaa.constant';
8
+ import { poThemeDefaultLightValues } from './helpers/types/po-theme-light-defaults.constant';
9
+ import { poThemeDefaultDarkValues } from './helpers/types/po-theme-dark-defaults.constant';
5
10
  import { poThemeDefault } from './helpers/po-theme-poui.constant';
6
11
  import * as i0 from "@angular/core";
7
12
  /**
@@ -26,7 +31,7 @@ export class PoThemeService {
26
31
  window;
27
32
  document;
28
33
  renderer;
29
- theme = poThemeDefault;
34
+ theme;
30
35
  _iconToken;
31
36
  get iconNameLib() {
32
37
  return this._iconToken.NAME_LIB;
@@ -36,24 +41,37 @@ export class PoThemeService {
36
41
  this.document = document;
37
42
  this.renderer = rendererFactory.createRenderer(null, null);
38
43
  this._iconToken = value ?? PhosphorIconDictionary;
44
+ // set triple A for all themes (its the base theme)
45
+ // result: html:root
46
+ this.setPerComponentAndOnRoot(undefined, poThemeDefaultAAA.perComponent, poThemeDefaultAAA.onRoot);
47
+ // set double A
48
+ // result: html[class*="-AA"]:root
49
+ this.setPerComponentAndOnRoot({ a11y: PoThemeA11yEnum.AA }, poThemeDefaultAA.perComponent, poThemeDefaultAA.onRoot);
50
+ // set Light mode values
51
+ // result: html[class*="-light"]:root
52
+ this.setPerComponentAndOnRoot({ type: PoThemeTypeEnum.light }, poThemeDefaultLightValues.perComponent, poThemeDefaultLightValues.onRoot);
53
+ // set Dark mode values
54
+ // result: html[class*="-dark"]:root
55
+ this.setPerComponentAndOnRoot({ type: PoThemeTypeEnum.dark }, poThemeDefaultDarkValues.perComponent, poThemeDefaultDarkValues.onRoot);
39
56
  }
40
57
  /**
41
- * Define o tema a ser aplicado no componente, de acordo com o tipo de tema especificado.
58
+ * Aplica um tema ao componente de acordo com o tipo de tema e o nível de acessibilidade especificados.
42
59
  *
43
- * Este método define o tema a ser aplicado no componente com base no objeto `theme` fornecido e no tipo de tema especificado.
44
- * Ele atualiza as propriedades do componente para refletir o tema selecionado, como cores, estilos e comportamentos.
60
+ * Este método configura o tema do componente com base no objeto `themeConfig` fornecido, no `themeType` e no `a11yLevel`.
61
+ * Além disso, ele pode opcionalmente salvar a preferência de tema no localStorage, se solicitado.
45
62
  *
46
- * @param {PoTheme} theme - Objeto contendo as definições de tema a serem aplicadas no componente.
47
- * @param {PoThemeTypeEnum} [themeType=PoThemeTypeEnum.light] - (Opcional) Tipo de tema a ser aplicado, podendo ser 'light' (claro) ou 'dark' (escuro). Por padrão, o tema claro é aplicado.
63
+ * @param {PoTheme} themeConfig - Configuração de tema a ser aplicada ao componente.
64
+ * @param {PoThemeTypeEnum} [themeType=PoThemeTypeEnum.light] - (Opcional) Tipo de tema, podendo ser 'light' (claro) ou 'dark' (escuro). O tema claro é o padrão.
65
+ * @param {PoThemeA11yEnum} [a11yLevel=PoThemeA11yEnum.AAA] - (Opcional) Nível de acessibilidade do tema, podendo ser AA ou AAA. Padrão é AAA.
66
+ * @param {boolean} [persistPreference=true] - (Opcional) Define se a preferência de tema deve ser salva no localStorage para persistência. `true` para salvar, `false` para não salvar.
48
67
  */
49
- setTheme(theme, themeType = PoThemeTypeEnum.light) {
68
+ setTheme(themeConfig, themeType = PoThemeTypeEnum.light, a11yLevel = PoThemeA11yEnum.AAA, persistPreference = true) {
50
69
  // Change theme name, remove special characteres and number, replace space with dash
51
- theme.name = theme.name
52
- .toLowerCase()
53
- .replace(/[^a-zA-Z ]/g, '')
54
- .replace(/\s+/g, '-');
55
- theme.active = themeType;
56
- const _themeType = theme.type[PoThemeTypeEnum[themeType]];
70
+ this.formatTheme(themeConfig, themeType, a11yLevel);
71
+ const _themeActive = Array.isArray(themeConfig.type) && themeConfig.type.length >= 1
72
+ ? themeConfig.type.find(e => e.a11y === a11yLevel)
73
+ : themeConfig.type;
74
+ const _themeType = _themeActive[PoThemeTypeEnum[themeType]];
57
75
  if (!_themeType) {
58
76
  return;
59
77
  }
@@ -62,14 +80,91 @@ export class PoThemeService {
62
80
  const onRootStyles = _themeType.onRoot ? this.generateAdditionalStyles(_themeType.onRoot) : '';
63
81
  const additionalStyles = this.generateAdditionalStyles(_themeType);
64
82
  const combinedStyles = `
65
- .${theme.name}-${PoThemeTypeEnum[themeType]}:root {
83
+ html.${themeConfig.name}-${PoThemeTypeEnum[themeType]}-${a11yLevel}:root {
66
84
  ${colorStyles}
67
85
  ${perComponentStyles}
68
86
  ${onRootStyles}
69
87
  ${additionalStyles}
70
88
  }`;
71
89
  this.applyThemeStyles(combinedStyles);
72
- this.changeThemeType(theme);
90
+ this.changeThemeType(themeConfig, persistPreference);
91
+ }
92
+ /**
93
+ * @docsPrivate
94
+ *
95
+ * Aplica estilos customizados para o componente e para o root HTML, utilizando os tokens definidos.
96
+ *
97
+ * Esse método é chamado para inserir ou atualizar estilos no DOM, aplicando tanto tokens de `onRoot` (ex: `--font-family: 'Roboto'`)
98
+ * quanto estilos específicos de componentes (`perComponent`, como `po-listbox [hidden]: { display: 'flex !important' }`).
99
+ *
100
+ * O seletor CSS gerado leva em consideração o tema (`type`) e as configurações de acessibilidade (`a11y`) do tema ativo.
101
+ * A classe do tema é aplicada no HTML e pode ser formatada como `html[class*="-light-AA"]` para personalizações
102
+ * em temas específicos.
103
+ *
104
+ * @param {PoThemeActive} active - Objeto que define o tema ativo, com `type` e `a11y`.
105
+ * @param {any} perComponent - Objeto contendo os estilos específicos para componentes a serem aplicados.
106
+ * @param {any} onRoot - Objeto contendo tokens de estilo que serão aplicados diretamente no seletor `:root` do HTML.
107
+ *
108
+ * @example
109
+ *
110
+ * // Exemplo de utilização com um tema ativo e tokens de estilo
111
+ * const themeActive = { type: 'light', a11y: 'AA' };
112
+ * const perComponentStyles = {
113
+ * 'po-listbox [hidden]': {
114
+ * 'display': 'flex !important'
115
+ * }
116
+ * };
117
+ * const onRootStyles = {
118
+ * '--font-family': 'Roboto',
119
+ * '--background-color': '#fff'
120
+ * };
121
+ *
122
+ * this.setPerComponentAndOnRoot(themeActive, perComponentStyles, onRootStyles);
123
+ *
124
+ * // Resultado:
125
+ * // Gera e aplica os seguintes estilos no DOM
126
+ * // html[class*="-light-AA"]:root {
127
+ * // --font-family: 'Roboto';
128
+ * // --background-color: '#fff';
129
+ * // po-listbox [hidden] {
130
+ * // display: flex !important;
131
+ * // }
132
+ * // }
133
+ *
134
+ */
135
+ setPerComponentAndOnRoot(active, perComponent, onRoot) {
136
+ const perComponentStyles = perComponent ? this.generatePerComponentStyles(perComponent) : '';
137
+ const onRootStyles = onRoot ? this.generateAdditionalStyles(onRoot) : '';
138
+ let selector = 'html';
139
+ const typeSelector = active?.type !== undefined ? `-${PoThemeTypeEnum[active.type]}` : '';
140
+ const accessibilitySelector = active?.a11y !== undefined ? `-${PoThemeA11yEnum[active.a11y]}` : '';
141
+ if (typeSelector && accessibilitySelector) {
142
+ selector += `[class*="${typeSelector}${accessibilitySelector}"]`;
143
+ }
144
+ else if (!typeSelector && accessibilitySelector) {
145
+ selector += `[class$="${accessibilitySelector}"]`;
146
+ }
147
+ else if (typeSelector) {
148
+ selector += `[class*="${typeSelector}"]`;
149
+ }
150
+ const styleCss = `
151
+ ${selector}:root {
152
+ ${perComponentStyles}
153
+ ${onRootStyles}
154
+ }
155
+ `;
156
+ let styleElement = this.document.head.querySelector('#baseStyle');
157
+ if (!styleElement) {
158
+ styleElement = this.renderer.createElement('style');
159
+ styleElement.id = 'baseStyle';
160
+ this.renderer.appendChild(styleElement, this.renderer.createText(styleCss));
161
+ this.renderer.appendChild(this.document.head, styleElement);
162
+ }
163
+ else {
164
+ if (!styleElement.textContent.includes(styleCss.trim())) {
165
+ this.renderer.appendChild(styleElement, this.renderer.createText(styleCss));
166
+ }
167
+ }
73
168
  }
74
169
  /**
75
170
  * @docsPrivate
@@ -91,17 +186,23 @@ export class PoThemeService {
91
186
  * @param styleCss Os estilos CSS a serem aplicados.
92
187
  */
93
188
  applyThemeStyles(styleCss) {
94
- const styleElement = this.createStyleElement(styleCss);
95
- const existingStyleElement = document.head.querySelector('#pouiTheme');
189
+ const styleElement = this.createStyleElement(styleCss, 'theme');
190
+ const existingStyleElement = document.head.querySelector('#theme');
96
191
  if (existingStyleElement) {
97
192
  this.renderer.removeChild(document.head, existingStyleElement);
98
193
  }
99
194
  this.renderer.appendChild(document.head, styleElement);
100
195
  }
101
- changeThemeType(theme) {
102
- this.cleanThemeActive();
103
- this.setThemeActive(theme);
104
- document.getElementsByTagName('html')[0].classList.add(...[`${theme.name}-${PoThemeTypeEnum[theme.active]}`]);
196
+ changeThemeType(theme, persistPreference = true) {
197
+ this.cleanThemeActive(persistPreference);
198
+ if (persistPreference) {
199
+ this.setThemeLocal(theme);
200
+ }
201
+ document
202
+ .getElementsByTagName('html')[0]
203
+ .classList.add(...[
204
+ `${theme.name}-${PoThemeTypeEnum[this.getActiveTypeFromTheme(theme.active)]}-${PoThemeA11yEnum[this.getActiveA11yFromTheme(theme.active)]}`
205
+ ]);
105
206
  }
106
207
  /**
107
208
  * Persiste e define o tema do aplicativo com base nos dados armazenados.
@@ -112,9 +213,35 @@ export class PoThemeService {
112
213
  */
113
214
  persistThemeActive() {
114
215
  const _theme = this.getThemeActive();
115
- this.setTheme(_theme, _theme.active);
216
+ this.setTheme(_theme, this.getActiveTypeFromTheme(_theme.active), this.getActiveA11yFromTheme(_theme.active));
116
217
  return _theme;
117
218
  }
219
+ formatTheme(themeConfig, themeType, a11yLevel) {
220
+ themeConfig.name = themeConfig.name
221
+ .toLowerCase()
222
+ .replace(/[^a-zA-Z ]/g, '')
223
+ .replace(/\s+/g, '-');
224
+ themeConfig.active = { type: themeType, a11y: a11yLevel };
225
+ }
226
+ applyTheme(theme) {
227
+ const _localTheme = this.getThemeActive();
228
+ if (!theme) {
229
+ if (_localTheme) {
230
+ this.persistThemeActive();
231
+ return _localTheme;
232
+ }
233
+ return undefined;
234
+ }
235
+ const _type = this.getActiveTypeFromTheme(theme.active);
236
+ const _accessibility = this.getActiveA11yFromTheme(theme.active);
237
+ if (_localTheme && JSON.stringify(_localTheme) === JSON.stringify(theme)) {
238
+ this.persistThemeActive();
239
+ return _localTheme;
240
+ }
241
+ this.formatTheme(theme, _type, _accessibility);
242
+ this.setTheme(theme, _type, _accessibility);
243
+ return theme;
244
+ }
118
245
  /**
119
246
  * Altera o tipo do tema armazenado e aplica os novos estilos ao documento.
120
247
  *
@@ -124,17 +251,35 @@ export class PoThemeService {
124
251
  */
125
252
  changeCurrentThemeType(type) {
126
253
  const _theme = this.getThemeActive();
127
- _theme.active = type;
254
+ typeof _theme.active === 'object' ? (_theme.active.type = type) : (_theme.active = type);
128
255
  this.changeThemeType(_theme);
129
256
  }
130
257
  /**
131
258
  * Método remove o tema armazenado e limpa todos os estilos de tema
132
259
  * aplicados ao documento.
260
+ *
261
+ * @param {boolean} [persistPreference=true] - (Opcional) Define se a preferência de tema não deve ser mantida no localStorage para persistência. `true` para remover, `false` para manter.
133
262
  */
134
- cleanThemeActive() {
135
- const _theme = this.getThemeActive();
136
- document.getElementsByTagName('html')[0].classList.remove(`${_theme.name}-${PoThemeTypeEnum[_theme.active]}`);
137
- localStorage.removeItem('totvs-theme');
263
+ cleanThemeActive(persistPreference = true) {
264
+ // Sufixo existentes hoje
265
+ const themeSuffixes = ['-light-', '-dark-'];
266
+ const htmlElement = document.getElementsByTagName('html')[0];
267
+ // Converte `classList` em um array e remove as classes que terminam com os sufixos especificados
268
+ Array.from(htmlElement.classList).forEach(className => {
269
+ if (themeSuffixes.some(suffix => className.includes(suffix))) {
270
+ htmlElement.classList.remove(className);
271
+ }
272
+ });
273
+ // Remove o tema ativo do localStorage
274
+ if (persistPreference) {
275
+ localStorage.removeItem('totvs-theme');
276
+ }
277
+ }
278
+ getActiveTypeFromTheme(active) {
279
+ return typeof active === 'object' ? active.type : active;
280
+ }
281
+ getActiveA11yFromTheme(active) {
282
+ return typeof active === 'object' ? active.a11y : PoThemeA11yEnum.AAA;
138
283
  }
139
284
  /**
140
285
  * @docsPrivate
@@ -142,7 +287,7 @@ export class PoThemeService {
142
287
  * Este método define um dados do tema e o armazena.
143
288
  * @param theme Os tokens de tema contendo os estilos adicionais a serem gerados.
144
289
  */
145
- setThemeActive(theme) {
290
+ setThemeLocal(theme) {
146
291
  if (theme) {
147
292
  localStorage.setItem('totvs-theme', JSON.stringify(theme));
148
293
  this.theme = theme;
@@ -168,12 +313,13 @@ export class PoThemeService {
168
313
  * @docsPrivate
169
314
  *
170
315
  * Gera estilos CSS com base nos tokens de cores fornecidos.
171
- * @param themeColor Os tokens de cor a serem usados para gerar os estilos.
316
+ * @param css Os tokens de cor a serem usados para gerar os estilos.
317
+ * @param id id do style a ser aplicado.
172
318
  * @returns Uma string contendo os estilos CSS gerados.
173
319
  */
174
- createStyleElement(css) {
320
+ createStyleElement(css, id) {
175
321
  const styleElement = this.renderer.createElement('style');
176
- styleElement.id = 'pouiTheme';
322
+ styleElement.id = id;
177
323
  this.renderer.appendChild(styleElement, this.renderer.createText(css));
178
324
  return styleElement;
179
325
  }
@@ -278,6 +424,44 @@ export class PoThemeService {
278
424
  svg = svg.concat(`%3E%3C/path%3E%3C/svg%3E");`);
279
425
  return svg;
280
426
  }
427
+ /**
428
+ * Define o tipo (light/dark) quando um tema está sendo aplicado.
429
+ *
430
+ * @param {PoTheme} theme - Objeto contendo as definições de tema a serem aplicadas no componente.
431
+ * @param {PoThemeTypeEnum} [themeType=PoThemeTypeEnum.light] - (Opcional) Tipo de tema a ser aplicado, podendo ser 'light' (claro) ou 'dark' (escuro). Por padrão, o tema claro é aplicado.
432
+ */
433
+ setThemeType(theme, themeType = PoThemeTypeEnum.light) {
434
+ const _accessibility = typeof theme.active === 'object' ? theme.active.a11y : PoThemeA11yEnum.AAA;
435
+ this.setTheme(theme, themeType, _accessibility);
436
+ }
437
+ /**
438
+ * Define o tipo (light/dark) para um tema já ativo.
439
+ *
440
+ * @param {PoThemeTypeEnum} [themeType=PoThemeTypeEnum.light] - (Opcional) Tipo de tema a ser aplicado, podendo ser 'light' (claro) ou 'dark' (escuro). Por padrão, o tema claro é aplicado.
441
+ */
442
+ setCurrentThemeType(themeType = PoThemeTypeEnum.light) {
443
+ const _theme = this.getThemeActive();
444
+ this.setThemeType(_theme, themeType);
445
+ }
446
+ /**
447
+ * Define o nivel de acessibilidade quando um tema está sendo aplicado.
448
+ *
449
+ * @param {PoTheme} theme - Objeto contendo as definições de tema a serem aplicadas no componente.
450
+ * @param {PoThemeA11yEnum} [a11y=PoThemeA11yEnum.AAA] - (Opcional) Nível de acessibilidade a ser aplicado ao tema, como AA ou AAA. Se não for informado, por padrão a acessibilidade será AAA.
451
+ */
452
+ setThemeA11y(theme, a11y = PoThemeA11yEnum.AAA) {
453
+ const _type = (typeof theme.active === 'object' ? theme.active.type : theme.active) || 0;
454
+ this.setTheme(theme, _type, a11y);
455
+ }
456
+ /**
457
+ * Define o nivel de acessibilidade para um tema já ativo.
458
+ *
459
+ * @param {PoThemeA11yEnum} [a11y=PoThemeA11yEnum.AAA] - (Opcional) Nível de acessibilidade a ser aplicado ao tema, como AA ou AAA. Se não for informado, por padrão a acessibilidade será AAA.
460
+ */
461
+ setCurrentThemeA11y(a11y = PoThemeA11yEnum.AAA) {
462
+ const _theme = this.getThemeActive();
463
+ this.setThemeA11y(_theme, a11y);
464
+ }
281
465
  static ɵfac = function PoThemeService_Factory(t) { return new (t || PoThemeService)(i0.ɵɵinject('Window'), i0.ɵɵinject(DOCUMENT), i0.ɵɵinject(i0.RendererFactory2), i0.ɵɵinject(ICONS_DICTIONARY, 8)); };
282
466
  static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PoThemeService, factory: PoThemeService.ɵfac, providedIn: 'root' });
283
467
  }
@@ -298,4 +482,4 @@ export class PoThemeService {
298
482
  type: Inject,
299
483
  args: [ICONS_DICTIONARY]
300
484
  }] }], null); })();
301
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tdGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvc2VydmljZXMvcG8tdGhlbWUvcG8tdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMxRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOztBQUtsRTs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7OztHQVFHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUFVRztJQUNBO0lBVnBCLFFBQVEsQ0FBWTtJQUNwQixLQUFLLEdBQVksY0FBYyxDQUFDO0lBQ2hDLFVBQVUsQ0FBNEI7SUFFOUMsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0lBRUQsWUFDNEIsTUFBYyxFQUNkLFFBQWtCLEVBQzVDLGVBQWlDLEVBQ0ssS0FBZ0M7UUFINUMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFJNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUzRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssSUFBSSxzQkFBc0IsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxRQUFRLENBQUMsS0FBYyxFQUFFLFlBQTZCLGVBQWUsQ0FBQyxL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QUNkLHdIQUF3SCxDQUN6SCxDQUFDO1FBQ0YsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUVoRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7d0VBMVNVLGNBQWMsY0FVZixRQUFRLGVBQ1IsUUFBUSxpREFFSSxnQkFBZ0I7Z0VBYjNCLGNBQWMsV0FBZCxjQUFjLG1CQUZiLE1BQU07O2lGQUVQLGNBQWM7Y0FIMUIsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COztzQkFXSSxNQUFNO3VCQUFDLFFBQVE7O3NCQUNmLE1BQU07dUJBQUMsUUFBUTs7c0JBRWYsUUFBUTs7c0JBQUksTUFBTTt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsLCBSZW5kZXJlcjIsIFJlbmRlcmVyRmFjdG9yeTIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDT05TX0RJQ1RJT05BUlksIFBob3NwaG9ySWNvbkRpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3BvLWljb24vaW5kZXgnO1xuaW1wb3J0IHsgUG9UaGVtZVR5cGVFbnVtIH0gZnJvbSAnLi9lbnVtL3BvLXRoZW1lLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBwb1RoZW1lRGVmYXVsdCB9IGZyb20gJy4vaGVscGVycy9wby10aGVtZS1wb3VpLmNvbnN0YW50JztcbmltcG9ydCB7IFBvVGhlbWVDb2xvciB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby10aGVtZS1jb2xvci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9UaGVtZVRva2VucyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby10aGVtZS10b2tlbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvVGhlbWUgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tdGhlbWUuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqXG4gKiBPIGBQb1RoZW1lU2VydmljZWAgcG9zc2liaWxpdGEgYSBwZXJzb25hbGl6YcOnw6NvIGRhcyBjb3JlcyBkbyB0ZW1hIHBhZHLDo28gZG8gYFBPLVVJYCwgcGVybWl0aW5kbyBhIGFsdGVyYcOnw6NvIGRvcyB2YWxvcmVzIGRhcyB2YXJpw6F2ZWlzIGRlIGVzdGlsbyB1c2FkYXMgbm8gQ1NTIHBhZHLDo28uXG4gKlxuICogPiBQYXJhIHNhYmVyIG1haXMgc29icmUgY29tbyBjdXN0b21pemFyIGFzIGNvcmVzIGRvIHRlbWEgcGFkcsOjbyB2ZXJpZmlxdWUgbyBpdGVtIFtDdXN0b21pemFuZG8gY29yZXMgZG8gdGVtYSBwYWRyw6NvXShodHRwczovL3BvLXVpLmlvL2d1aWRlcy9jb2xvcnMtY3VzdG9taXphdGlvbikgbmEgYWJhIGBHdWlhc2AuXG4gKlxuICogPiBPYnMuOiBOw6NvIGVzdMOhIGRvY3VtZW50YWRvIGFxdWkgZSBuw6NvIGluZGljYW1vcyBhIGN1c3RvbWl6YcOnw6NvIGRhcyBjb3JlcyBkZSAnZmVlZGJhY2snIHBvciBtb3Rpdm9zIGRlIGFjZXNzaWJpbGlkYWRlIGUgdXNhYmlsaWRhZGUuXG4gKi9cblxuLyoqXG4gKiBAZXhhbXBsZVxuICpcbiAqIDxleGFtcGxlIG5hbWU9XCJwby10aGVtZS1sYWJzXCIgdGl0bGU9XCJQTyBUaGVtZSBMYWJzXCI+XG4gKiAgPGZpbGUgbmFtZT1cInNhbXBsZS1wby10aGVtZS1sYWJzL3NhbXBsZS1wby10aGVtZS1sYWJzLmNvbXBvbmVudC5odG1sXCI+IDwvZmlsZT5cbiAqICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLXRoZW1lLWxhYnMvc2FtcGxlLXBvLXRoZW1lLWxhYnMuY29tcG9uZW50LnRzXCI+IDwvZmlsZT5cbiAqIDwvZXhhbXBsZT5cbiAqXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBvVGhlbWVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyO1xuICBwcml2YXRlIHRoZW1lOiBQb1RoZW1lID0gcG9UaGVtZURlZmF1bHQ7XG4gIHByaXZhdGUgX2ljb25Ub2tlbjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICBnZXQgaWNvbk5hbWVMaWIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ljb25Ub2tlbi5OQU1FX0xJQjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoJ1dpbmRvdycpIHByaXZhdGUgd2luZG93OiBXaW5kb3csXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSUNPTlNfRElDVElPTkFSWSkgdmFsdWU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1cbiAgKSB7XG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCBudWxsKTtcblxuICAgIHRoaXMuX2ljb25Ub2tlbiA9IHZhbHVlID8/IFBob3NwaG9ySWNvbkRpY3Rpb25hcnk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIG8gdGVtYSBhIHNlciBhcGxpY2FkbyBubyBjb21wb25lbnRlLCBkZSBhY29yZG8gY29tIG8gdGlwbyBkZSB0ZW1hIGVzcGVjaWZpY2Fkby5cbiAgICpcbiAgICogRXN0ZSBtw6l0b2RvIGRlZmluZSBvIHRlbWEgYSBzZXIgYXBsaWNhZG8gbm8gY29tcG9uZW50ZSBjb20gYmFzZSBubyBvYmpldG8gYHRoZW1lYCBmb3JuZWNpZG8gZSBubyB0aXBvIGRlIHRlbWEgZXNwZWNpZmljYWRvLlxuICAgKiBFbGUgYXR1YWxpemEgYXMgcHJvcHJpZWRhZGVzIGRvIGNvbXBvbmVudGUgcGFyYSByZWZsZXRpciBvIHRlbWEgc2VsZWNpb25hZG8sIGNvbW8gY29yZXMsIGVzdGlsb3MgZSBjb21wb3J0YW1lbnRvcy5cbiAgICpcbiAgICogQHBhcmFtIHtQb1RoZW1lfSB0aGVtZSAtIE9iamV0byBjb250ZW5kbyBhcyBkZWZpbmnDp8O1ZXMgZGUgdGVtYSBhIHNlcmVtIGFwbGljYWRhcyBubyBjb21wb25lbnRlLlxuICAgKiBAcGFyYW0ge1BvVGhlbWVUeXBlRW51bX0gW3RoZW1lVHlwZT1Qb1RoZW1lVHlwZUVudW0ubGlnaHRdIC0gKE9wY2lvbmFsKSBUaXBvIGRlIHRlbWEgYSBzZXIgYXBsaWNhZG8sIHBvZGVuZG8gc2VyICdsaWdodCcgKGNsYXJvKSBvdSAnZGFyaycgKGVzY3VybykuIFBvciBwYWRyw6NvLCBvIHRlbWEgY2xhcm8gw6kgYXBsaWNhZG8uXG4gICAqL1xuICBzZXRUaGVtZSh0aGVtZTogUG9UaGVtZSwgdGhlbWVUeXBlOiBQb1RoZW1lVHlwZUVudW0gPSBQb1RoZW1lVHlwZUVudW0ubGlnaHQpOiB2b2lkIHtcbiAgICAvLyBDaGFuZ2UgdGhlbWUgbmFtZSwgcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVyZXMgYW5kIG51bWJlciwgcmVwbGFjZSBzcGFjZSB3aXRoIGRhc2hcbiAgICB0aGVtZS5uYW1lID0gdGhlbWUubmFtZVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC9bXmEtekEtWiBdL2csICcnKVxuICAgICAgLnJlcGxhY2UoL1xccysvZywgJy0nKTtcbiAgICB0aGVtZS5hY3RpdmUgPSB0aGVtZVR5cGU7XG5cbiAgICBjb25zdCBfdGhlbWVUeXBlID0gdGhlbWUudHlwZVtQb1RoZW1lVHlwZUVudW1bdGhlbWVUeXBlXV07XG4gICAgaWYgKCFfdGhlbWVUeXBlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sb3JTdHlsZXMgPSBfdGhlbWVUeXBlLmNvbG9yID8gdGhpcy5nZW5lcmF0ZVRoZW1lU3R5bGVzKF90aGVtZVR5cGUuY29sb3IpIDogJyc7XG4gICAgY29uc3QgcGVyQ29tcG9uZW50U3R5bGVzID0gX3RoZW1lVHlwZS5wZXJDb21wb25lbnQgPyB0aGlzLmdlbmVyYXRlUGVyQ29tcG9uZW50U3R5bGVzKF90aGVtZVR5cGUucGVyQ29tcG9uZW50KSA6ICcnO1xuICAgIGNvbnN0IG9uUm9vdFN0eWxlcyA9IF90aGVtZVR5cGUub25Sb290ID8gdGhpcy5nZW5lcmF0ZUFkZGl0aW9uYWxTdHlsZXMoX3RoZW1lVHlwZS5vblJvb3QpIDogJyc7XG4gICAgY29uc3QgYWRkaXRpb25hbFN0eWxlcyA9IHRoaXMuZ2VuZXJhdGVBZGRpdGlvbmFsU3R5bGVzKF90aGVtZVR5cGUpO1xuXG4gICAgY29uc3QgY29tYmluZWRTdHlsZXMgPSBgXG4gICAgICAuJHt0aGVtZS5uYW1lfS0ke1BvVGhlbWVUeXBlRW51bVt0aGVtZVR5cGVdfTpyb290IHtcbiAgICAgICAgJHtjb2xvclN0eWxlc31cbiAgICAgICAgJHtwZXJDb21wb25lbnRTdHlsZXN9XG4gICAgICAgICR7b25Sb290U3R5bGVzfVxuICAgICAgICAke2FkZGl0aW9uYWxTdHlsZXN9XG4gICAgICB9YDtcblxuICAgIHRoaXMuYXBwbHlUaGVtZVN0eWxlcyhjb21iaW5lZFN0eWxlcyk7XG4gICAgdGhpcy5jaGFuZ2VUaGVtZVR5cGUodGhlbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkb2NzUHJpdmF0ZVxuICAgKlxuICAgKiBHZXJhIGVzdGlsb3MgYWRpY2lvbmFpcyBjb20gYmFzZSBub3MgdG9rZW5zIGRlIHRlbWEgZm9ybmVjaWRvcywgZXhjbHVpbmRvIG9zIHRva2VucyBkZSBjb3IuXG4gICAqIEBwYXJhbSB0aGVtZSBPcyB0b2tlbnMgZGUgdGVtYSBjb250ZW5kbyBvcyBlc3RpbG9zIGFkaWNpb25haXMgYSBzZXJlbSBnZXJhZG9zLlxuICAgKiBAcmV0dXJucyBVbWEgc3RyaW5nIGNvbnRlbmRvIG9zIGVzdGlsb3MgYWRpY2lvbmFpcyBmb3JtYXRhZG9zLlxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUFkZGl0aW9uYWxTdHlsZXModGhlbWU6IFBvVGhlbWVUb2tlbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGVtZSlcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhWydjb2xvcicsICdwZXJDb21wb25lbnQnLCAnb25Sb290J10uaW5jbHVkZXMoa2V5KSlcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fTogJHt2YWx1ZX07YClcbiAgICAgIC5qb2luKCcgJyk7XG4gIH1cblxuICAvKipcbiAgICogQGRvY3NQcml2YXRlXG4gICAqXG4gICAqIEFwbGljYSBvcyBlc3RpbG9zIGRlIHRlbWEgYW8gZG9jdW1lbnRvLlxuICAgKiBAcGFyYW0gc3R5bGVDc3MgT3MgZXN0aWxvcyBDU1MgYSBzZXJlbSBhcGxpY2Fkb3MuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5VGhlbWVTdHlsZXMoc3R5bGVDc3M6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IHRoaXMuY3JlYXRlU3R5bGVFbGVtZW50KHN0eWxlQ3NzKTtcbiAgICBjb25zdCBleGlzdGluZ1N0eWxlRWxlbWVudCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignI3BvdWlUaGVtZScpO1xuXG4gICAgaWYgKGV4aXN0aW5nU3R5bGVFbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmhlYWQsIGV4aXN0aW5nU3R5bGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmhlYWQsIHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZVRoZW1lVHlwZSh0aGVtZTogUG9UaGVtZSkge1xuICAgIHRoaXMuY2xlYW5UaGVtZUFjdGl2ZSgpO1xuICAgIHRoaXMuc2V0VGhlbWVBY3RpdmUodGhlbWUpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF0uY2xhc3NMaXN0LmFkZCguLi5bYCR7dGhlbWUubmFtZX0tJHtQb1RoZW1lVHlwZUVudW1bdGhlbWUuYWN0aXZlXX1gXSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdGUgZSBkZWZpbmUgbyB0ZW1hIGRvIGFwbGljYXRpdm8gY29tIGJhc2Ugbm9zIGRhZG9zIGFybWF6ZW5hZG9zLlxuICAgKlxuICAgKiBFc3RlIG3DqXRvZG8gcmVjdXBlcmEgb3MgZGFkb3MgZG8gdGVtYSBhcm1hemVuYWRvcyBlIG9zIGFwbGljYSBhbyBhcGxpY2F0aXZvLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UG9UaGVtZX0gUmVjdXBlcmEgbyB0ZW1hIGFybWF6ZW5hZG8uXG4gICAqL1xuICBwZXJzaXN0VGhlbWVBY3RpdmUoKSB7XG4gICAgY29uc3QgX3RoZW1lID0gdGhpcy5nZXRUaGVtZUFjdGl2ZSgpO1xuICAgIHRoaXMuc2V0VGhlbWUoX3RoZW1lLCBfdGhlbWUuYWN0aXZlKTtcbiAgICByZXR1cm4gX3RoZW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsdGVyYSBvIHRpcG8gZG8gdGVtYSBhcm1hemVuYWRvIGUgYXBsaWNhIG9zIG5vdm9zIGVzdGlsb3MgYW8gZG9jdW1lbnRvLlxuICAgKlxuICAgKiBFc3RlIG3DqXRvZG8gYWx0ZXJhIG8gdGlwbyBkbyB0ZW1hIGFybWF6ZW5hZG8gYXRpdm8gKGxpZ2h0L2RhcmspXG4gICAqXG4gICAqIEBwYXJhbSB7UG9UaGVtZVR5cGVFbnVtfSB0aGVtZVR5cGUgTyB0aXBvIGRlIHRlbWEgYSBzZXIgYXBsaWNhZG8sIGxpZ2h0IG91IGRhcmsuXG4gICAqL1xuICBjaGFuZ2VDdXJyZW50VGhlbWVUeXBlKHR5cGU6IFBvVGhlbWVUeXBlRW51bSk6IHZvaWQge1xuICAgIGNvbnN0IF90aGVtZSA9IHRoaXMuZ2V0VGhlbWVBY3RpdmUoKTtcbiAgICBfdGhlbWUuYWN0aXZlID0gdHlwZTtcbiAgICB0aGlzLmNoYW5nZVRoZW1lVHlwZShfdGhlbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIE3DqXRvZG8gcmVtb3ZlIG8gdGVtYSBhcm1hemVuYWRvIGUgbGltcGEgdG9kb3Mgb3MgZXN0aWxvcyBkZSB0ZW1hXG4gICAqIGFwbGljYWRvcyBhbyBkb2N1bWVudG8uXG4gICAqL1xuICBjbGVhblRoZW1lQWN0aXZlKCk6IHZvaWQge1xuICAgIGNvbnN0IF90aGVtZSA9IHRoaXMuZ2V0VGhlbWVBY3RpdmUoKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdLmNsYXNzTGlzdC5yZW1vdmUoYCR7X3RoZW1lLm5hbWV9LSR7UG9UaGVtZVR5cGVFbnVtW190aGVtZS5hY3RpdmVdfWApO1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0b3R2cy10aGVtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkb2NzUHJpdmF0ZVxuICAgKlxuICAgKiBFc3RlIG3DqXRvZG8gZGVmaW5lIHVtIGRhZG9zIGRvIHRlbWEgZSBvIGFybWF6ZW5hLlxuICAgKiBAcGFyYW0gdGhlbWUgT3MgdG9rZW5zIGRlIHRlbWEgY29udGVuZG8gb3MgZXN0aWxvcyBhZGljaW9uYWlzIGEgc2VyZW0gZ2VyYWRvcy5cbiAgICovXG4gIHByaXZhdGUgc2V0VGhlbWVBY3RpdmUodGhlbWU6IFBvVGhlbWUpOiB2b2lkIHtcbiAgICBpZiAodGhlbWUpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b3R2cy10aGVtZScsIEpTT04uc3RyaW5naWZ5KHRoZW1lKSk7XG4gICAgICB0aGlzLnRoZW1lID0gdGhlbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgbyB0ZW1hIGF0aXZvIGNvbW8gdW0gb2JzZXJ2YWJsZS5cbiAgICogQHJldHVybnMge1BvVGhlbWV9IFRlbWEgYXRpdm8uXG4gICAqL1xuICBnZXRUaGVtZUFjdGl2ZSgpOiBQb1RoZW1lIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGhlbWVEYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG90dnMtdGhlbWUnKSk7XG4gICAgICBpZiAodGhlbWVEYXRhICYmIEpTT04uc3RyaW5naWZ5KHRoZW1lRGF0YSkgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMudGhlbWUpKSB7XG4gICAgICAgIHRoaXMudGhlbWUgPSB0aGVtZURhdGE7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm8gYW8gb2J0ZXIgbyB0ZW1hIGRvIGFybWF6ZW5hbWVudG8gbG9jYWw6JywgZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50aGVtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZG9jc1ByaXZhdGVcbiAgICpcbiAgICogR2VyYSBlc3RpbG9zIENTUyBjb20gYmFzZSBub3MgdG9rZW5zIGRlIGNvcmVzIGZvcm5lY2lkb3MuXG4gICAqIEBwYXJhbSB0aGVtZUNvbG9yIE9zIHRva2VucyBkZSBjb3IgYSBzZXJlbSB1c2Fkb3MgcGFyYSBnZXJhciBvcyBlc3RpbG9zLlxuICAgKiBAcmV0dXJucyBVbWEgc3RyaW5nIGNvbnRlbmRvIG9zIGVzdGlsb3MgQ1NTIGdlcmFkb3MuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVN0eWxlRWxlbWVudChjc3M6IHN0cmluZyk6IEhUTUxTdHlsZUVsZW1lbnQge1xuICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZUVsZW1lbnQuaWQgPSAncG91aVRoZW1lJztcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCwgdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KGNzcykpO1xuICAgIHJldHVybiBzdHlsZUVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQGRvY3NQcml2YXRlXG4gICAqXG4gICAqIEdlcmEgZXN0aWxvcyBDU1MgY29tIGJhc2Ugbm9zIHRva2VucyBkZSBjb3JlcyBmb3JuZWNpZG9zLlxuICAgKiBAcGFyYW0gdGhlbWVDb2xvciBPcyB0b2tlbnMgZGUgY29yIGEgc2VyZW0gdXNhZG9zIHBhcmEgZ2VyYXIgb3MgZXN0aWxvcy5cbiAgICogQHJldHVybnMgVW1hIHN0cmluZyBjb250ZW5kbyBvcyBlc3RpbG9zIENTUyBnZXJhZG9zLlxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZVRoZW1lU3R5bGVzKHRoZW1lQ29sb3I6IFBvVGhlbWVDb2xvcik6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VsZWN0QmdJY29uU3R5bGUgPSB0aGlzLmdldFNlbGVjdEJnSWNvbnNTdHlsZSh0aGVtZUNvbG9yKTtcblxuICAgIHJldHVybiBbXG4gICAgICBPYmplY3QuZW50cmllcyh0aGVtZUNvbG9yKVxuICAgICAgICAuZmxhdE1hcCgoW3R5cGUsIHZhbHVlc10pID0+XG4gICAgICAgICAgT2JqZWN0LmVudHJpZXModmFsdWVzKS5mbGF0TWFwKChbdG9uYWxpdHksIHRvbmFsaXR5VmFsdWVzXSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdhY3Rpb24nKSB7XG4gICAgICAgICAgICAgIHJldHVybiBbYC0tY29sb3ItJHt0eXBlfS0ke3RvbmFsaXR5fTogJHt0b25hbGl0eVZhbHVlc307YF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModG9uYWxpdHlWYWx1ZXMpLm1hcChcbiAgICAgICAgICAgICAgICAoW2xldmVsLCBjb2xvclZhbHVlXSkgPT4gYC0tY29sb3ItJHt0eXBlfS0ke3RvbmFsaXR5fS0ke2xldmVsfTogJHtjb2xvclZhbHVlfTtgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuam9pbignJyksXG4gICAgICBzZWxlY3RCZ0ljb25TdHlsZVxuICAgIF0uam9pbignJyk7XG4gIH1cblxuICAvKipcbiAgICogQGRvY3NQcml2YXRlXG4gICAqXG4gICAqIEdlcmEgZXN0aWxvcyBDU1MgY29tIGJhc2Ugbm9zIHRva2VucyBwZXIgQ29tcG9uZW50IGZvcm5lY2lkb3MuXG4gICAqIEBwYXJhbSB0aGVtZVBlckNvbXBvbmVudCBPcyB0b2tlbnMgZGUgY29yIGEgc2VyZW0gdXNhZG9zIHBhcmEgZ2VyYXIgb3MgZXN0aWxvcy5cbiAgICogQHJldHVybnMgVW1hIHN0cmluZyBjb250ZW5kbyBvcyBlc3RpbG9zIENTUyBnZXJhZG9zLlxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZVBlckNvbXBvbmVudFN0eWxlcyh0aGVtZVBlckNvbXBvbmVudDogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhlbWVQZXJDb21wb25lbnQpXG4gICAgICAuZmxhdE1hcCgoW3R5cGUsIHZhbHVlc10pID0+XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlcykuZmxhdE1hcCgoW2xldmVsLCBjb2xvclZhbHVlXSkgPT4gW2Ake3R5cGV9IHske2xldmVsfTogJHtjb2xvclZhbHVlfTt9O2BdKVxuICAgICAgKVxuICAgICAgLmpvaW4oJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBvIHRlbWEgYXR1YWwgY29tbyBvIHRlbWEgXCJQb1VJIFBhZHLDo29cIi5cbiAgICpcbiAgICogQHBhcmFtIHtQb1RoZW1lVHlwZUVudW19IHR5cGUgTyB0aXBvIGRlIFRlbWEgYSBzZXIgYXBsaWNhZG8sIGxpZ2h0IC8gZGFyay5cbiAgICovXG4gIHNldERlZmF1bHRUaGVtZSh0eXBlOiBQb1RoZW1lVHlwZUVudW0pOiB2b2lkIHtcbiAgICB0aGlzLnNldFRoZW1lKHBvVGhlbWVEZWZhdWx0LCB0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZG9jc1ByaXZhdGVcbiAgICpcbiAgICogUmV0b3JuYSBvIGVzdGlsbyBDU1MgcGFyYSBvIGZ1bmRvIGRvcyDDrWNvbmVzIGRvIGNvbXBvbmVudGUgcG8tc2VsZWN0LCBjb20gYmFzZSBuYXMgY29yZXMgZG8gdGVtYS5cbiAgICpcbiAgICogQHBhcmFtIHtQb1RoZW1lQ29sb3J9IHRoZW1lQ29sb3IgLSBPYmpldG8gY29udGVuZG8gYXMgY29yZXMgZG8gdGVtYS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBFc3RpbG8gQ1NTIHBhcmEgbyBmdW5kbyBkb3Mgw61jb25lcyBkbyBwby1zZWxlY3QuXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdEJnSWNvbnNTdHlsZSh0aGVtZUNvbG9yOiBQb1RoZW1lQ29sb3IpOiBzdHJpbmcge1xuICAgIGxldCBzZWxlY3RCZ0ljb24gPSAnJztcblxuICAgIGlmICh0aGVtZUNvbG9yPy5icmFuZD8uWycwMSddPy5kYXJrKSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuaWNvbk5hbWVMaWIgPT09ICdQaG9zcGhvckljb24nID8gJ3BvLXNlbGVjdCAucG8tc2VsZWN0LXBob3NwaG9yJyA6ICdwby1zZWxlY3QnO1xuICAgICAgc2VsZWN0QmdJY29uICs9IGAke3NlbGVjdG9yfSB7IC0tYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7dGhpcy5nZXRTZWxlY3RCZ0ljb24odGhlbWVDb2xvci5uZXV0cmFsLmRhcmtbNzBdKX0pOyB9O2A7XG4gICAgfVxuXG4gICAgaWYgKHRoZW1lQ29sb3I/LmZlZWRiYWNrPy5uZWdhdGl2ZT8uYmFzZSkge1xuICAgICAgaWYgKHRoaXMuaWNvbk5hbWVMaWIgPT09ICdQb0ljb24nKSB7XG4gICAgICAgIHNlbGVjdEJnSWNvbiArPSBgcG8tc2VsZWN0Lm5nLWRpcnR5Lm5nLWludmFsaWQgc2VsZWN0IHsgLS1iYWNrZ3JvdW5kLWltYWdlOiB1cmwoJHt0aGlzLmdldFNlbGVjdEJnSWNvbih0aGVtZUNvbG9yLmZlZWRiYWNrLm5lZ2F0aXZlLmJhc2UpfSk7IH07YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaWNvbk5hbWVMaWIgPT09ICdQaG9zcGhvckljb24nKSB7XG4gICAgICAgIHNlbGVjdEJnSWNvbiArPSBgcG8tc2VsZWN0Lm5nLWRpcnR5Lm5nLWludmFsaWQgc2VsZWN0LnBvLXNlbGVjdC1waG9zcGhvciB7IGJhY2tncm91bmQtaW1hZ2U6IHVybCgke3RoaXMuZ2V0U2VsZWN0QmdJY29uKHRoZW1lQ29sb3IuZmVlZGJhY2submVnYXRpdmUuYmFzZSl9KTsgfTtgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGVtZUNvbG9yPy5uZXV0cmFsPy5saWdodD8uWyczMCddKSB7XG4gICAgICBpZiAodGhpcy5pY29uTmFtZUxpYiA9PT0gJ1BvSWNvbicpIHtcbiAgICAgICAgc2VsZWN0QmdJY29uICs9IGBzZWxlY3Q6ZGlzYWJsZWQgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJHt0aGlzLmdldFNlbGVjdEJnSWNvbih0aGVtZUNvbG9yLm5ldXRyYWwubGlnaHRbJzMwJ10pfSk7IH07YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaWNvbk5hbWVMaWIgPT09ICdQaG9zcGhvckljb24nKSB7XG4gICAgICAgIHNlbGVjdEJnSWNvbiArPSBgcG8tc2VsZWN0IHNlbGVjdC5wby1zZWxlY3QtcGhvc3Bob3I6ZGlzYWJsZWQgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJHt0aGlzLmdldFNlbGVjdEJnSWNvbih0aGVtZUNvbG9yLm5ldXRyYWwubGlnaHRbJzMwJ10pfSk7IH07YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0QmdJY29uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkb2NzUHJpdmF0ZVxuICAgKlxuICAgKiBSZXRvcm5hIGEgaW1hZ2VtIFNWRyB1dGlsaXphZGEgY29tbyBmdW5kbyBkbyBwby1zZWxlY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciBDb3IgZGEgSW1hZ2VtIC0gVXRpbGl6YWRhIG5vIGF0cmlidXRvICdmaWxsJy5cbiAgICogQHJldHVybnMge3N0cmluZ30gSW1hZ2VtIFNWRyB1dGlsaXphZGEgbm8gcG8tc2VsZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RCZ0ljb24oY29sb3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHN2Zzogc3RyaW5nO1xuXG4gICAgaWYgKHRoaXMuaWNvbk5hbWVMaWIgPT09ICdQb0ljb24nKSB7XG4gICAgICBzdmcgPSBgXCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyBmaWxsPSdub25lJyBgO1xuXG4gICAgICBzdmcgPSBzdmcuY29uY2F0KGB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBmaWxsLXJ1bGU9J2V2ZW5vZGQnIGNsaXAtcnVsZT0nZXZlbm9kZCcgYCk7XG4gICAgICBzdmcgPSBzdmcuY29uY2F0KGBkPSdNMTguNzA3IDguMjkzMDFDMTguMzE2IDcuOTAyMDEgMTcuNjg0IDcuOTAyMDEgMTcuMjkzIDguMjkzMDFMMTIgMTMuNTg2TDYuNzA3MDEgYCk7XG4gICAgICBzdmcgPSBzdmcuY29uY2F0KGA4LjI5MzAxQzYuMzE2MDEgNy45MDIwMSA1LjY4NDAxIDcuOTAyMDEgNS4yOTMwMSA4LjI5MzAxQzQuOTAyMDEgOC42ODQwMSA0LjkwMjAxIGApO1xuICAgICAgc3ZnID0gc3ZnLmNvbmNhdChgOS4zMTYwMSA1LjI5MzAxIDkuNzA3MDFMMTEuMjkzIDE1LjcwN0MxMS40ODggMTUuOTAyIDExLjc0NCAxNiAxMiAxNkMxMi4yNTYgMTYgMTIuNTEyIGApO1xuICAgICAgc3ZnID0gc3ZnLmNvbmNhdChgMTUuOTAyIDEyLjcwNyAxNS43MDdMMTguNzA3IDkuNzA3MDFDMTkuMDk4IDkuMzE2MDEgMTkuMDk4IDguNjg0MDEgMTguNzA3IDguMjkzMDFaJyBgKTtcbiAgICAgIHN2ZyA9IHN2Zy5jb25jYXQoYGZpbGw9JyR7Y29sb3IucmVwbGFjZSgnIycsICclMjMnKX0nLyUzRSUzQy9zdmclM0UlMEFcIik7YCk7XG5cbiAgICAgIHJldHVybiBzdmc7XG4gICAgfVxuXG4gICAgc3ZnID0gYFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNTYgMjU2JyBmaWxsPScke2NvbG9yLnJlcGxhY2UoJyMnLCAnJTIzJyl9JyBgO1xuICAgIHN2ZyA9IHN2Zy5jb25jYXQoYHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGApO1xuICAgIHN2ZyA9IHN2Zy5jb25jYXQoXG4gICAgICBgZD0nTTIxMy42NiwxMDEuNjZsLTgwLDgwYTgsOCwwLDAsMS0xMS4zMiwwbC04MC04MEE4LDgsMCwwLDEsNTMuNjYsOTAuMzRMMTI4LDE2NC42OWw3NC4zNC03NC4zNWE4LDgsMCwwLDEsMTEuMzIsMTEuMzJaJ2BcbiAgICApO1xuICAgIHN2ZyA9IHN2Zy5jb25jYXQoYCUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRVwiKTtgKTtcblxuICAgIHJldHVybiBzdmc7XG4gIH1cbn1cbiJdfQ==
485
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG8tdGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvc2VydmljZXMvcG8tdGhlbWUvcG8tdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUsxRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQzVGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFFbEU7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUlILE1BQU0sT0FBTyxjQUFjO0lBVUc7SUFDQTtJQVZwQixRQUFRLENBQVk7SUFDcEIsS0FBSyxDQUFVO0lBQ2YsVUFBVSxDQUE0QjtJQUU5QyxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxZQUM0QixNQUFjLEVBQ2QsUUFBa0IsRUFDNUMsZUFBaUMsRUFDSyxLQUFnQztRQUg1QyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUk1QyxJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxJQUFJLHNCQUFzQixDQUFDO1FBRWxELG1EQUFtRDtRQUNuRCxvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbkcsZUFBZTtRQUNmLGtDQUFrQztRQUNsQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwSCx3QkFBd0I7UUFDeEIscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyx3QkFBd0IsQ0FDM0IsRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUMvQix5QkFBeUIsQ0FBQyxZQUFZLEVBQ3RDLHlCQUF5QixDQUFDLE1BQU0sQ0FDakMsQ0FBQztRQUVGLHVCQUF1QjtRQUN2QixvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLHdCQUF3QixDQUMzQixFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsSUFBSSxFQUFFLEVBQzlCLHdCQUF3QixDQUFDLFlBQVksRUFDckMsd0JBQXdCLENBQUMsTUFBTSxDQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxRQUFRLENBQ04sV0FBb0IsRUFDcEIsWUFBNkIsZUFBZSxDQUFDLEtBQUssRUFDbEQsWUFBNkIsZUFBZSxDQUFDLEdBQUcsRUFDaEQsb0JBQTZCLElBQUk7UUFFakMsb0ZBQW9GO1FBQ3BGLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVwRCxNQUFNLFlBQVksR0FDaEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQztZQUM3RCxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQztZQUNsRCxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUV2QixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3ZGLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25ILE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvRixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVuRSxNQUFNLGNBQWMsR0FBRzthQUNkLFdBQVcsQ0FBQyxJQUFJLElBQUksZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVM7VUFDOUQsV0FBVztVQUNYLGtCQUFrQjtVQUNsQixZQUFZO1VBQ1osZ0JBQWdCO1FBQ2xCLENBQUM7UUFFTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTBDRztJQUNJLHdCQUF3QixDQUFDLE1BQXFCLEVBQUUsWUFBaUIsRUFBRSxNQUFXO1FBQ25GLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRXpFLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUN0QixNQUFNLFlBQVksR0FBRyxNQUFNLEVBQUUsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRixNQUFNLHFCQUFxQixHQUFHLE1BQU0sRUFBRSxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRW5HLElBQUksWUFBWSxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDMUMsUUFBUSxJQUFJLFlBQVksWUFBWSxHQUFHLHFCQUFxQixJQUFJLENBQUM7UUFDbkUsQ0FBQzthQUFNLElBQUksQ0FBQyxZQUFZLElBQUkscUJBQXFCLEVBQUUsQ0FBQztZQUNsRCxRQUFRLElBQUksWUFBWSxxQkFBcUIsSUFBSSxDQUFDO1FBQ3BELENBQUM7YUFBTSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3hCLFFBQVEsSUFBSSxZQUFZLFlBQVksSUFBSSxDQUFDO1FBQzNDLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRztRQUNiLFFBQVE7VUFDTixrQkFBa0I7VUFDbEIsWUFBWTs7S0FFakIsQ0FBQztRQUVGLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELFlBQVksQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDO1lBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzVFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzlELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzlFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLHdCQUF3QixDQUFDLEtBQW9CO1FBQ25ELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7YUFDekIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3JFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsS0FBSyxLQUFLLEdBQUcsQ0FBQzthQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUN2QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkUsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU8sZUFBZSxDQUFDLEtBQWMsRUFBRSxvQkFBNkIsSUFBSTtRQUN2RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUV6QyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBRUQsUUFBUTthQUNMLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvQixTQUFTLENBQUMsR0FBRyxDQUNaLEdBQUc7WUFDRCxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO1NBQzVJLENBQ0YsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxrQkFBa0I7UUFDaEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzlHLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxXQUFXLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTO1FBQ25ELFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUk7YUFDaEMsV0FBVyxFQUFFO2FBQ2IsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7YUFDMUIsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixXQUFXLENBQUMsTUFBTSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFXO1FBQ3BCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUUxQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxXQUFXLENBQUM7WUFDckIsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFakUsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDNUMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsc0JBQXNCLENBQUMsSUFBcUI7UUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGdCQUFnQixDQUFDLG9CQUE2QixJQUFJO1FBQ2hELHlCQUF5QjtRQUN6QixNQUFNLGFBQWEsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1QyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0QsaUdBQWlHO1FBQ2pHLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNwRCxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsc0NBQXNDO1FBQ3RDLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixZQUFZLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsTUFBTTtRQUNuQyxPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNELENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFNO1FBQ25DLE9BQU8sT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGFBQWEsQ0FBQyxLQUFjO1FBQ2xDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjO1FBQ1osSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDbEUsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMxRSxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsRUFBVTtRQUNoRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxZQUFZLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RSxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssbUJBQW1CLENBQUMsVUFBd0I7UUFDbEQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakUsT0FBTztZQUNMLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO2lCQUN2QixPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRTtnQkFDNUQsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3RCLE9BQU8sQ0FBQyxXQUFXLElBQUksSUFBSSxRQUFRLEtBQUssY0FBYyxHQUFHLENBQUMsQ0FBQztnQkFDN0QsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQ3ZDLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsSUFBSSxJQUFJLFFBQVEsSUFBSSxLQUFLLEtBQUssVUFBVSxHQUFHLENBQ2hGLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUMsQ0FBQyxDQUNIO2lCQUNBLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDWCxpQkFBaUI7U0FDbEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssMEJBQTBCLENBQUMsaUJBQXNCO1FBQ3ZELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQzthQUNyQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssS0FBSyxLQUFLLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FDakc7YUFDQSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxJQUFxQjtRQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLHFCQUFxQixDQUFDLFVBQXdCO1FBQ3BELElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUV0QixJQUFJLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxLQUFLLGNBQWMsQ0FBQyxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUNyRyxZQUFZLElBQUksR0FBRyxRQUFRLDhCQUE4QixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNwSCxDQUFDO1FBRUQsSUFBSSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN6QyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2xDLFlBQVksSUFBSSxrRUFBa0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ25KLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQ3hDLFlBQVksSUFBSSxtRkFBbUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3BLLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNsQyxZQUFZLElBQUksMkNBQTJDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3pILENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQ3hDLFlBQVksSUFBSSx3RUFBd0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDdEosQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLGVBQWUsQ0FBQyxLQUFhO1FBQ25DLElBQUksR0FBVyxDQUFDO1FBRWhCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxHQUFHLEdBQUcsb0ZBQW9GLENBQUM7WUFFM0YsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsdUZBQXVGLENBQUMsQ0FBQztZQUMxRyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvRkFBb0YsQ0FBQyxDQUFDO1lBQ3ZHLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGtGQUFrRixDQUFDLENBQUM7WUFDckcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsdUZBQXVGLENBQUMsQ0FBQztZQUMxRyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxxRkFBcUYsQ0FBQyxDQUFDO1lBQ3hHLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFFNUUsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBRUQsR0FBRyxHQUFHLGlGQUFpRixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3JILEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLCtDQUErQyxDQUFDLENBQUM7UUFDbEUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQ2Qsd0hBQXdILENBQ3pILENBQUM7UUFDRixHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBRWhELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWSxDQUFDLEtBQWMsRUFBRSxZQUE2QixlQUFlLENBQUMsS0FBSztRQUM3RSxNQUFNLGNBQWMsR0FBRyxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQztRQUNsRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxZQUE2QixlQUFlLENBQUMsS0FBSztRQUNwRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWSxDQUFDLEtBQWMsRUFBRSxPQUF3QixlQUFlLENBQUMsR0FBRztRQUN0RSxNQUFNLEtBQUssR0FBRyxDQUFDLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLE9BQXdCLGVBQWUsQ0FBQyxHQUFHO1FBQzdELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO3dFQW5nQlUsY0FBYyxjQVVmLFFBQVEsZUFDUixRQUFRLGlEQUVJLGdCQUFnQjtnRUFiM0IsY0FBYyxXQUFkLGNBQWMsbUJBRmIsTUFBTTs7aUZBRVAsY0FBYztjQUgxQixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7O3NCQVdJLE1BQU07dUJBQUMsUUFBUTs7c0JBQ2YsTUFBTTt1QkFBQyxRQUFROztzQkFFZixRQUFROztzQkFBSSxNQUFNO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIFJlbmRlcmVyMiwgUmVuZGVyZXJGYWN0b3J5MiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUNPTlNfRElDVElPTkFSWSwgUGhvc3Bob3JJY29uRGljdGlvbmFyeSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcG8taWNvbi9pbmRleCc7XG5cbmltcG9ydCB7IFBvVGhlbWVDb2xvciB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby10aGVtZS1jb2xvci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUG9UaGVtZVRva2VucyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wby10aGVtZS10b2tlbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvVGhlbWUsIFBvVGhlbWVBY3RpdmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcG8tdGhlbWUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBvVGhlbWVBMTF5RW51bSB9IGZyb20gJy4vZW51bS9wby10aGVtZS1hMTF5LmVudW0nO1xuaW1wb3J0IHsgUG9UaGVtZVR5cGVFbnVtIH0gZnJvbSAnLi9lbnVtL3BvLXRoZW1lLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBwb1RoZW1lRGVmYXVsdEFBIH0gZnJvbSAnLi9oZWxwZXJzL2FjY2Vzc2liaWxpdGllcy9wby10aGVtZS1kZWZhdWx0LWFhLmNvbnN0YW50JztcbmltcG9ydCB7IHBvVGhlbWVEZWZhdWx0QUFBIH0gZnJvbSAnLi9oZWxwZXJzL2FjY2Vzc2liaWxpdGllcy9wby10aGVtZS1kZWZhdWx0LWFhYS5jb25zdGFudCc7XG5pbXBvcnQgeyBwb1RoZW1lRGVmYXVsdExpZ2h0VmFsdWVzIH0gZnJvbSAnLi9oZWxwZXJzL3R5cGVzL3BvLXRoZW1lLWxpZ2h0LWRlZmF1bHRzLmNvbnN0YW50JztcbmltcG9ydCB7IHBvVGhlbWVEZWZhdWx0RGFya1ZhbHVlcyB9IGZyb20gJy4vaGVscGVycy90eXBlcy9wby10aGVtZS1kYXJrLWRlZmF1bHRzLmNvbnN0YW50JztcbmltcG9ydCB7IHBvVGhlbWVEZWZhdWx0IH0gZnJvbSAnLi9oZWxwZXJzL3BvLXRoZW1lLXBvdWkuY29uc3RhbnQnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICpcbiAqIE8gYFBvVGhlbWVTZXJ2aWNlYCBwb3NzaWJpbGl0YSBhIHBlcnNvbmFsaXphw6fDo28gZGFzIGNvcmVzIGRvIHRlbWEgcGFkcsOjbyBkbyBgUE8tVUlgLCBwZXJtaXRpbmRvIGEgYWx0ZXJhw6fDo28gZG9zIHZhbG9yZXMgZGFzIHZhcmnDoXZlaXMgZGUgZXN0aWxvIHVzYWRhcyBubyBDU1MgcGFkcsOjby5cbiAqXG4gKiA+IFBhcmEgc2FiZXIgbWFpcyBzb2JyZSBjb21vIGN1c3RvbWl6YXIgYXMgY29yZXMgZG8gdGVtYSBwYWRyw6NvIHZlcmlmaXF1ZSBvIGl0ZW0gW0N1c3RvbWl6YW5kbyBjb3JlcyBkbyB0ZW1hIHBhZHLDo29dKGh0dHBzOi8vcG8tdWkuaW8vZ3VpZGVzL2NvbG9ycy1jdXN0b21pemF0aW9uKSBuYSBhYmEgYEd1aWFzYC5cbiAqXG4gKiA+IE9icy46IE7Do28gZXN0w6EgZG9jdW1lbnRhZG8gYXF1aSBlIG7Do28gaW5kaWNhbW9zIGEgY3VzdG9taXphw6fDo28gZGFzIGNvcmVzIGRlICdmZWVkYmFjaycgcG9yIG1vdGl2b3MgZGUgYWNlc3NpYmlsaWRhZGUgZSB1c2FiaWxpZGFkZS5cbiAqL1xuXG4vKipcbiAqIEBleGFtcGxlXG4gKlxuICogPGV4YW1wbGUgbmFtZT1cInBvLXRoZW1lLWxhYnNcIiB0aXRsZT1cIlBPIFRoZW1lIExhYnNcIj5cbiAqICA8ZmlsZSBuYW1lPVwic2FtcGxlLXBvLXRoZW1lLWxhYnMvc2FtcGxlLXBvLXRoZW1lLWxhYnMuY29tcG9uZW50Lmh0bWxcIj4gPC9maWxlPlxuICogIDxmaWxlIG5hbWU9XCJzYW1wbGUtcG8tdGhlbWUtbGFicy9zYW1wbGUtcG8tdGhlbWUtbGFicy5jb21wb25lbnQudHNcIj4gPC9maWxlPlxuICogPC9leGFtcGxlPlxuICpcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUG9UaGVtZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjI7XG4gIHByaXZhdGUgdGhlbWU6IFBvVGhlbWU7XG4gIHByaXZhdGUgX2ljb25Ub2tlbjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICBnZXQgaWNvbk5hbWVMaWIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ljb25Ub2tlbi5OQU1FX0xJQjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoJ1dpbmRvdycpIHByaXZhdGUgd2luZG93OiBXaW5kb3csXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcmVuZGVyZXJGYWN0b3J5OiBSZW5kZXJlckZhY3RvcnkyLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSUNPTlNfRElDVElPTkFSWSkgdmFsdWU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1cbiAgKSB7XG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCBudWxsKTtcbiAgICB0aGlzLl9pY29uVG9rZW4gPSB2YWx1ZSA/PyBQaG9zcGhvckljb25EaWN0aW9uYXJ5O1xuXG4gICAgLy8gc2V0IHRyaXBsZSBBIGZvciBhbGwgdGhlbWVzIChpdHMgdGhlIGJhc2UgdGhlbWUpXG4gICAgLy8gcmVzdWx0OiBodG1sOnJvb3RcbiAgICB0aGlzLnNldFBlckNvbXBvbmVudEFuZE9uUm9vdCh1bmRlZmluZWQsIHBvVGhlbWVEZWZhdWx0QUFBLnBlckNvbXBvbmVudCwgcG9UaGVtZURlZmF1bHRBQUEub25Sb290KTtcblxuICAgIC8vIHNldCBkb3VibGUgQVxuICAgIC8vIHJlc3VsdDogaHRtbFtjbGFzcyo9XCItQUFcIl06cm9vdFxuICAgIHRoaXMuc2V0UGVyQ29tcG9uZW50QW5kT25Sb290KHsgYTExeTogUG9UaGVtZUExMXlFbnVtLkFBIH0sIHBvVGhlbWVEZWZhdWx0QUEucGVyQ29tcG9uZW50LCBwb1RoZW1lRGVmYXVsdEFBLm9uUm9vdCk7XG5cbiAgICAvLyBzZXQgTGlnaHQgbW9kZSB2YWx1ZXNcbiAgICAvLyByZXN1bHQ6IGh0bWxbY2xhc3MqPVwiLWxpZ2h0XCJdOnJvb3RcbiAgICB0aGlzLnNldFBlckNvbXBvbmVudEFuZE9uUm9vdChcbiAgICAgIHsgdHlwZTogUG9UaGVtZVR5cGVFbnVtLmxpZ2h0IH0sXG4gICAgICBwb1RoZW1lRGVmYXVsdExpZ2h0VmFsdWVzLnBlckNvbXBvbmVudCxcbiAgICAgIHBvVGhlbWVEZWZhdWx0TGlnaHRWYWx1ZXMub25Sb290XG4gICAgKTtcblxuICAgIC8vIHNldCBEYXJrIG1vZGUgdmFsdWVzXG4gICAgLy8gcmVzdWx0OiBodG1sW2NsYXNzKj1cIi1kYXJrXCJdOnJvb3RcbiAgICB0aGlzLnNldFBlckNvbXBvbmVudEFuZE9uUm9vdChcbiAgICAgIHsgdHlwZTogUG9UaGVtZVR5cGVFbnVtLmRhcmsgfSxcbiAgICAgIHBvVGhlbWVEZWZhdWx0RGFya1ZhbHVlcy5wZXJDb21wb25lbnQsXG4gICAgICBwb1RoZW1lRGVmYXVsdERhcmtWYWx1ZXMub25Sb290XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcGxpY2EgdW0gdGVtYSBhbyBjb21wb25lbnRlIGRlIGFjb3JkbyBjb20gbyB0aXBvIGRlIHRlbWEgZSBvIG7DrXZlbCBkZSBhY2Vzc2liaWxpZGFkZSBlc3BlY2lmaWNhZG9zLlxuICAgKlxuICAgKiBFc3RlIG3DqXRvZG8gY29uZmlndXJhIG8gdGVtYSBkbyBjb21wb25lbnRlIGNvbSBiYXNlIG5vIG9iamV0byBgdGhlbWVDb25maWdgIGZvcm5lY2lkbywgbm8gYHRoZW1lVHlwZWAgZSBubyBgYTExeUxldmVsYC5cbiAgICogQWzDqW0gZGlzc28sIGVsZSBwb2RlIG9wY2lvbmFsbWVudGUgc2FsdmFyIGEgcHJlZmVyw6puY2lhIGRlIHRlbWEgbm8gbG9jYWxTdG9yYWdlLCBzZSBzb2xpY2l0YWRvLlxuICAgKlxuICAgKiBAcGFyYW0ge1BvVGhlbWV9IHRoZW1lQ29uZmlnIC0gQ29uZmlndXJhw6fDo28gZGUgdGVtYSBhIHNlciBhcGxpY2FkYSBhbyBjb21wb25lbnRlLlxuICAgKiBAcGFyYW0ge1BvVGhlbWVUeXBlRW51bX0gW3RoZW1lVHlwZT1Qb1RoZW1lVHlwZUVudW0ubGlnaHRdIC0gKE9wY2lvbmFsKSBUaXBvIGRlIHRlbWEsIHBvZGVuZG8gc2VyICdsaWdodCcgKGNsYXJvKSBvdSAnZGFyaycgKGVzY3VybykuIE8gdGVtYSBjbGFybyDDqSBvIHBhZHLDo28uXG4gICAqIEBwYXJhbSB7UG9UaGVtZUExMXlFbnVtfSBbYTExeUxldmVsPVBvVGhlbWVBMTF5RW51bS5BQUFdIC0gKE9wY2lvbmFsKSBOw612ZWwgZGUgYWNlc3NpYmlsaWRhZGUgZG8gdGVtYSwgcG9kZW5kbyBzZXIgQUEgb3UgQUFBLiBQYWRyw6NvIMOpIEFBQS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbcGVyc2lzdFByZWZlcmVuY2U9dHJ1ZV0gLSAoT3BjaW9uYWwpIERlZmluZSBzZSBhIHByZWZlcsOqbmNpYSBkZSB0ZW1hIGRldmUgc2VyIHNhbHZhIG5vIGxvY2FsU3RvcmFnZSBwYXJhIHBlcnNpc3TDqm5jaWEuIGB0cnVlYCBwYXJhIHNhbHZhciwgYGZhbHNlYCBwYXJhIG7Do28gc2FsdmFyLlxuICAgKi9cbiAgc2V0VGhlbWUoXG4gICAgdGhlbWVDb25maWc6IFBvVGhlbWUsXG4gICAgdGhlbWVUeXBlOiBQb1RoZW1lVHlwZUVudW0gPSBQb1RoZW1lVHlwZUVudW0ubGlnaHQsXG4gICAgYTExeUxldmVsOiBQb1RoZW1lQTExeUVudW0gPSBQb1RoZW1lQTExeUVudW0uQUFBLFxuICAgIHBlcnNpc3RQcmVmZXJlbmNlOiBib29sZWFuID0gdHJ1ZVxuICApOiB2b2lkIHtcbiAgICAvLyBDaGFuZ2UgdGhlbWUgbmFtZSwgcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVyZXMgYW5kIG51bWJlciwgcmVwbGFjZSBzcGFjZSB3aXRoIGRhc2hcbiAgICB0aGlzLmZvcm1hdFRoZW1lKHRoZW1lQ29uZmlnLCB0aGVtZVR5cGUsIGExMXlMZXZlbCk7XG5cbiAgICBjb25zdCBfdGhlbWVBY3RpdmUgPVxuICAgICAgQXJyYXkuaXNBcnJheSh0aGVtZUNvbmZpZy50eXBlKSAmJiB0aGVtZUNvbmZpZy50eXBlLmxlbmd0aCA+PSAxXG4gICAgICAgID8gdGhlbWVDb25maWcudHlwZS5maW5kKGUgPT4gZS5hMTF5ID09PSBhMTF5TGV2ZWwpXG4gICAgICAgIDogdGhlbWVDb25maWcudHlwZTtcblxuICAgIGNvbnN0IF90aGVtZVR5cGUgPSBfdGhlbWVBY3RpdmVbUG9UaGVtZVR5cGVFbnVtW3RoZW1lVHlwZV1dO1xuICAgIGlmICghX3RoZW1lVHlwZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9yU3R5bGVzID0gX3RoZW1lVHlwZS5jb2xvciA/IHRoaXMuZ2VuZXJhdGVUaGVtZVN0eWxlcyhfdGhlbWVUeXBlLmNvbG9yKSA6ICcnO1xuICAgIGNvbnN0IHBlckNvbXBvbmVudFN0eWxlcyA9IF90aGVtZVR5cGUucGVyQ29tcG9uZW50ID8gdGhpcy5nZW5lcmF0ZVBlckNvbXBvbmVudFN0eWxlcyhfdGhlbWVUeXBlLnBlckNvbXBvbmVudCkgOiAnJztcbiAgICBjb25zdCBvblJvb3RTdHlsZXMgPSBfdGhlbWVUeXBlLm9uUm9vdCA/IHRoaXMuZ2VuZXJhdGVBZGRpdGlvbmFsU3R5bGVzKF90aGVtZVR5cGUub25Sb290KSA6ICcnO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxTdHlsZXMgPSB0aGlzLmdlbmVyYXRlQWRkaXRpb25hbFN0eWxlcyhfdGhlbWVUeXBlKTtcblxuICAgIGNvbnN0IGNvbWJpbmVkU3R5bGVzID0gYFxuICAgICAgaHRtbC4ke3RoZW1lQ29uZmlnLm5hbWV9LSR7UG9UaGVtZVR5cGVFbnVtW3RoZW1lVHlwZV19LSR7YTExeUxldmVsfTpyb290IHtcbiAgICAgICAgJHtjb2xvclN0eWxlc31cbiAgICAgICAgJHtwZXJDb21wb25lbnRTdHlsZXN9XG4gICAgICAgICR7b25Sb290U3R5bGVzfVxuICAgICAgICAke2FkZGl0aW9uYWxTdHlsZXN9XG4gICAgICB9YDtcblxuICAgIHRoaXMuYXBwbHlUaGVtZVN0eWxlcyhjb21iaW5lZFN0eWxlcyk7XG4gICAgdGhpcy5jaGFuZ2VUaGVtZVR5cGUodGhlbWVDb25maWcsIHBlcnNpc3RQcmVmZXJlbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZG9jc1ByaXZhdGVcbiAgICpcbiAgICogQXBsaWNhIGVzdGlsb3MgY3VzdG9taXphZG9zIHBhcmEgbyBjb21wb25lbnRlIGUgcGFyYSBvIHJvb3QgSFRNTCwgdXRpbGl6YW5kbyBvcyB0b2tlbnMgZGVmaW5pZG9zLlxuICAgKlxuICAgKiBFc3NlIG3DqXRvZG8gw6kgY2hhbWFkbyBwYXJhIGluc2VyaXIgb3UgYXR1YWxpemFyIGVzdGlsb3Mgbm8gRE9NLCBhcGxpY2FuZG8gdGFudG8gdG9rZW5zIGRlIGBvblJvb3RgIChleDogYC0tZm9udC1mYW1pbHk6ICdSb2JvdG8nYClcbiAgICogcXVhbnRvIGVzdGlsb3MgZXNwZWPDrWZpY29zIGRlIGNvbXBvbmVudGVzIChgcGVyQ29tcG9uZW50YCwgY29tbyBgcG8tbGlzdGJveCBbaGlkZGVuXTogeyBkaXNwbGF5OiAnZmxleCAhaW1wb3J0YW50JyB9YCkuXG4gICAqXG4gICAqIE8gc2VsZXRvciBDU1MgZ2VyYWRvIGxldmEgZW0gY29uc2lkZXJhw6fDo28gbyB0ZW1hIChgdHlwZWApIGUgYXMgY29uZmlndXJhw6fDtWVzIGRlIGFjZXNzaWJpbGlkYWRlIChgYTExeWApIGRvIHRlbWEgYXRpdm8uXG4gICAqIEEgY2xhc3NlIGRvIHRlbWEgw6kgYXBsaWNhZGEgbm8gSFRNTCBlIHBvZGUgc2VyIGZvcm1hdGFkYSBjb21vIGBodG1sW2NsYXNzKj1cIi1saWdodC1BQVwiXWAgcGFyYSBwZXJzb25hbGl6YcOnw7Vlc1xuICAgKiBlbSB0ZW1hcyBlc3BlY8OtZmljb3MuXG4gICAqXG4gICAqIEBwYXJhbSB7UG9UaGVtZUFjdGl2ZX0gYWN0aXZlIC0gT2JqZXRvIHF1ZSBkZWZpbmUgbyB0ZW1hIGF0aXZvLCBjb20gYHR5cGVgIGUgYGExMXlgLlxuICAgKiBAcGFyYW0ge2FueX0gcGVyQ29tcG9uZW50IC0gT2JqZXRvIGNvbnRlbmRvIG9zIGVzdGlsb3MgZXNwZWPDrWZpY29zIHBhcmEgY29tcG9uZW50ZXMgYSBzZXJlbSBhcGxpY2Fkb3MuXG4gICAqIEBwYXJhbSB7YW55fSBvblJvb3QgLSBPYmpldG8gY29udGVuZG8gdG9rZW5zIGRlIGVzdGlsbyBxdWUgc2Vyw6NvIGFwbGljYWRvcyBkaXJldGFtZW50ZSBubyBzZWxldG9yIGA6cm9vdGAgZG8gSFRNTC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogLy8gRXhlbXBsbyBkZSB1dGlsaXphw6fDo28gY29tIHVtIHRlbWEgYXRpdm8gZSB0b2tlbnMgZGUgZXN0aWxvXG4gICAqIGNvbnN0IHRoZW1lQWN0aXZlID0geyB0eXBlOiAnbGlnaHQnLCBhMTF5OiAnQUEnIH07XG4gICAqIGNvbnN0IHBlckNvbXBvbmVudFN0eWxlcyA9IHtcbiAgICogICAncG8tbGlzdGJveCBbaGlkZGVuXSc6IHtcbiAgICogICAgICdkaXNwbGF5JzogJ2ZsZXggIWltcG9ydGFudCdcbiAgICogICB9XG4gICAqIH07XG4gICAqIGNvbnN0IG9uUm9vdFN0eWxlcyA9IHtcbiAgICogICAnLS1mb250LWZhbWlseSc6ICdSb2JvdG8nLFxuICAgKiAgICctLWJhY2tncm91bmQtY29sb3InOiAnI2ZmZidcbiAgICogfTtcbiAgICpcbiAgICogdGhpcy5zZXRQZXJDb21wb25lbnRBbmRPblJvb3QodGhlbWVBY3RpdmUsIHBlckNvbXBvbmVudFN0eWxlcywgb25Sb290U3R5bGVzKTtcbiAgICpcbiAgICogLy8gUmVzdWx0YWRvOlxuICAgKiAvLyBHZXJhIGUgYXBsaWNhIG9zIHNlZ3VpbnRlcyBlc3RpbG9zIG5vIERPTVxuICAgKiAvLyBodG1sW2NsYXNzKj1cIi1saWdodC1BQVwiXTpyb290IHtcbiAgICogLy8gICAtLWZvbnQtZmFtaWx5OiAnUm9ib3RvJztcbiAgICogLy8gICAtLWJhY2tncm91bmQtY29sb3I6ICcjZmZmJztcbiAgICogLy8gICBwby1saXN0Ym94IFtoaWRkZW5dIHtcbiAgICogLy8gICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtcbiAgICogLy8gICB9XG4gICAqIC8vIH1cbiAgICpcbiAgICovXG4gIHB1YmxpYyBzZXRQZXJDb21wb25lbnRBbmRPblJvb3QoYWN0aXZlOiBQb1RoZW1lQWN0aXZlLCBwZXJDb21wb25lbnQ6IGFueSwgb25Sb290OiBhbnkpIHtcbiAgICBjb25zdCBwZXJDb21wb25lbnRTdHlsZXMgPSBwZXJDb21wb25lbnQgPyB0aGlzLmdlbmVyYXRlUGVyQ29tcG9uZW50U3R5bGVzKHBlckNvbXBvbmVudCkgOiAnJztcbiAgICBjb25zdCBvblJvb3RTdHlsZXMgPSBvblJvb3QgPyB0aGlzLmdlbmVyYXRlQWRkaXRpb25hbFN0eWxlcyhvblJvb3QpIDogJyc7XG5cbiAgICBsZXQgc2VsZWN0b3IgPSAnaHRtbCc7XG4gICAgY29uc3QgdHlwZVNlbGVjdG9yID0gYWN0aXZlPy50eXBlICE9PSB1bmRlZmluZWQgPyBgLSR7UG9UaGVtZVR5cGVFbnVtW2FjdGl2ZS50eXBlXX1gIDogJyc7XG4gICAgY29uc3QgYWNjZXNzaWJpbGl0eVNlbGVjdG9yID0gYWN0aXZlPy5hMTF5ICE9PSB1bmRlZmluZWQgPyBgLSR7UG9UaGVtZUExMXlFbnVtW2FjdGl2ZS5hMTF5XX1gIDogJyc7XG5cbiAgICBpZiAodHlwZVNlbGVjdG9yICYmIGFjY2Vzc2liaWxpdHlTZWxlY3Rvcikge1xuICAgICAgc2VsZWN0b3IgKz0gYFtjbGFzcyo9XCIke3R5cGVTZWxlY3Rvcn0ke2FjY2Vzc2liaWxpdHlTZWxlY3Rvcn1cIl1gO1xuICAgIH0gZWxzZSBpZiAoIXR5cGVTZWxlY3RvciAmJiBhY2Nlc3NpYmlsaXR5U2VsZWN0b3IpIHtcbiAgICAgIHNlbGVjdG9yICs9IGBbY2xhc3MkPVwiJHthY2Nlc3NpYmlsaXR5U2VsZWN0b3J9XCJdYDtcbiAgICB9IGVsc2UgaWYgKHR5cGVTZWxlY3Rvcikge1xuICAgICAgc2VsZWN0b3IgKz0gYFtjbGFzcyo9XCIke3R5cGVTZWxlY3Rvcn1cIl1gO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlQ3NzID0gYFxuICAgICAgJHtzZWxlY3Rvcn06cm9vdCB7XG4gICAgICAgICR7cGVyQ29tcG9uZW50U3R5bGVzfVxuICAgICAgICAke29uUm9vdFN0eWxlc31cbiAgICAgIH1cbiAgICBgO1xuXG4gICAgbGV0IHN0eWxlRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCcjYmFzZVN0eWxlJyk7XG4gICAgaWYgKCFzdHlsZUVsZW1lbnQpIHtcbiAgICAgIHN0eWxlRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHN0eWxlRWxlbWVudC5pZCA9ICdiYXNlU3R5bGUnO1xuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChzdHlsZUNzcykpO1xuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmhlYWQsIHN0eWxlRWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghc3R5bGVFbGVtZW50LnRleHRDb250ZW50LmluY2x1ZGVzKHN0eWxlQ3NzLnRyaW0oKSkpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChzdHlsZUNzcykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZG9jc1ByaXZhdGVcbiAgICpcbiAgICogR2VyYSBlc3RpbG9zIGFkaWNpb25haXMgY29tIGJhc2Ugbm9zIHRva2VucyBkZSB0ZW1hIGZvcm5lY2lkb3MsIGV4Y2x1aW5kbyBvcyB0b2tlbnMgZGUgY29yLlxuICAgKiBAcGFyYW0gdGhlbWUgT3MgdG9rZW5zIGRlIHRlbWEgY29udGVuZG8gb3MgZXN0aWxvcyBhZGljaW9uYWlzIGEgc2VyZW0gZ2VyYWRvcy5cbiAgICogQHJldHVybnMgVW1hIHN0cmluZyBjb250ZW5kbyBvcyBlc3RpbG9zIGFkaWNpb25haXMgZm9ybWF0YWRvcy5cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVBZGRpdGlvbmFsU3R5bGVzKHRoZW1lOiBQb1RoZW1lVG9rZW5zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhlbWUpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIVsnY29sb3InLCAncGVyQ29tcG9uZW50JywgJ29uUm9vdCddLmluY2x1ZGVzKGtleSkpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06ICR7dmFsdWV9O2ApXG4gICAgICAuam9pbignICcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkb2NzUHJpdmF0ZVxuICAgKlxuICAgKiBBcGxpY2Egb3MgZXN0aWxvcyBkZSB0ZW1hIGFvIGRvY3VtZW50by5cbiAgICogQHBhcmFtIHN0eWxlQ3NzIE9zIGVzdGlsb3MgQ1NTIGEgc2VyZW0gYXBsaWNhZG9zLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVRoZW1lU3R5bGVzKHN0eWxlQ3NzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSB0aGlzLmNyZWF0ZVN0eWxlRWxlbWVudChzdHlsZUNzcywgJ3RoZW1lJyk7XG4gICAgY29uc3QgZXhpc3RpbmdTdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJyN0aGVtZScpO1xuXG4gICAgaWYgKGV4aXN0aW5nU3R5bGVFbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmhlYWQsIGV4aXN0aW5nU3R5bGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmhlYWQsIHN0eWxlRWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZVRoZW1lVHlwZSh0aGVtZTogUG9UaGVtZSwgcGVyc2lzdFByZWZlcmVuY2U6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgdGhpcy5jbGVhblRoZW1lQWN0aXZlKHBlcnNpc3RQcmVmZXJlbmNlKTtcblxuICAgIGlmIChwZXJzaXN0UHJlZmVyZW5jZSkge1xuICAgICAgdGhpcy5zZXRUaGVtZUxvY2FsKHRoZW1lKTtcbiAgICB9XG5cbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF1cbiAgICAgIC5jbGFzc0xpc3QuYWRkKFxuICAgICAgICAuLi5bXG4gICAgICAgICAgYCR7dGhlbWUubmFtZX0tJHtQb1RoZW1lVHlwZUVudW1bdGhpcy5nZXRBY3RpdmVUeXBlRnJvbVRoZW1lKHRoZW1lLmFjdGl2ZSldfS0ke1BvVGhlbWVBMTF5RW51bVt0aGlzLmdldEFjdGl2ZUExMXlGcm9tVGhlbWUodGhlbWUuYWN0aXZlKV19YFxuICAgICAgICBdXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3RlIGUgZGVmaW5lIG8gdGVtYSBkbyBhcGxpY2F0aXZvIGNvbSBiYXNlIG5vcyBkYWRvcyBhcm1hemVuYWRvcy5cbiAgICpcbiAgICogRXN0ZSBtw6l0b2RvIHJlY3VwZXJhIG9zIGRhZG9zIGRvIHRlbWEgYXJtYXplbmFkb3MgZSBvcyBhcGxpY2EgYW8gYXBsaWNhdGl2by5cbiAgICpcbiAgICogQHJldHVybnMge1BvVGhlbWV9IFJlY3VwZXJhIG8gdGVtYSBhcm1hemVuYWRvLlxuICAgKi9cbiAgcGVyc2lzdFRoZW1lQWN0aXZlKCkge1xuICAgIGNvbnN0IF90aGVtZSA9IHRoaXMuZ2V0VGhlbWVBY3RpdmUoKTtcbiAgICB0aGlzLnNldFRoZW1lKF90aGVtZSwgdGhpcy5nZXRBY3RpdmVUeXBlRnJvbVRoZW1lKF90aGVtZS5hY3RpdmUpLCB0aGlzLmdldEFjdGl2ZUExMXlGcm9tVGhlbWUoX3RoZW1lLmFjdGl2ZSkpO1xuICAgIHJldHVybiBfdGhlbWU7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRoZW1lKHRoZW1lQ29uZmlnLCB0aGVtZVR5cGUsIGExMXlMZXZlbCkge1xuICAgIHRoZW1lQ29uZmlnLm5hbWUgPSB0aGVtZUNvbmZpZy5uYW1lXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1teYS16QS1aIF0vZywgJycpXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpO1xuICAgIHRoZW1lQ29uZmlnLmFjdGl2ZSA9IHsgdHlwZTogdGhlbWVUeXBlLCBhMTF5OiBhMTF5TGV2ZWwgfTtcbiAgfVxuXG4gIGFwcGx5VGhlbWUodGhlbWU/OiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IF9sb2NhbFRoZW1lID0gdGhpcy5nZXRUaGVtZUFjdGl2ZSgpO1xuXG4gICAgaWYgKCF0aGVtZSkge1xuICAgICAgaWYgKF9sb2NhbFRoZW1lKSB7XG4gICAgICAgIHRoaXMucGVyc2lzdFRoZW1lQWN0aXZlKCk7XG4gICAgICAgIHJldHVybiBfbG9jYWxUaGVtZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgX3R5cGUgPSB0aGlzLmdldEFjdGl2ZVR5cGVGcm9tVGhlbWUodGhlbWUuYWN0aXZlKTtcbiAgICBjb25zdCBfYWNjZXNzaWJpbGl0eSA9IHRoaXMuZ2V0QWN0aXZlQTExeUZyb21UaGVtZSh0aGVtZS5hY3RpdmUpO1xuXG4gICAgaWYgKF9sb2NhbFRoZW1lICYmIEpTT04uc3RyaW5naWZ5KF9sb2NhbFRoZW1lKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhlbWUpKSB7XG4gICAgICB0aGlzLnBlcnNpc3RUaGVtZUFjdGl2ZSgpO1xuICAgICAgcmV0dXJuIF9sb2NhbFRoZW1lO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybWF0VGhlbWUodGhlbWUsIF90eXBlLCBfYWNjZXNzaWJpbGl0eSk7XG4gICAgdGhpcy5zZXRUaGVtZSh0aGVtZSwgX3R5cGUsIF9hY2Nlc3NpYmlsaXR5KTtcbiAgICByZXR1cm4gdGhlbWU7XG4gIH1cblxuICAvKipcbiAgICogQWx0ZXJhIG8gdGlwbyBkbyB0ZW1hIGFybWF6ZW5hZG8gZSBhcGxpY2Egb3Mgbm92b3MgZXN0aWxvcyBhbyBkb2N1bWVudG8uXG4gICAqXG4gICAqIEVzdGUgbcOpdG9kbyBhbHRlcmEgbyB0aXBvIGRvIHRlbWEgYXJtYXplbmFkbyBhdGl2byAobGlnaHQvZGFyaylcbiAgICpcbiAgICogQHBhcmFtIHtQb1RoZW1lVHlwZUVudW19IHRoZW1lVHlwZSBPIHRpcG8gZGUgdGVtYSBhIHNlciBhcGxpY2FkbywgbGlnaHQgb3UgZGFyay5cbiAgICovXG4gIGNoYW5nZUN1cnJlbnRUaGVtZVR5cGUodHlwZTogUG9UaGVtZVR5cGVFbnVtKTogdm9pZCB7XG4gICAgY29uc3QgX3RoZW1lID0gdGhpcy5nZXRUaGVtZUFjdGl2ZSgpO1xuICAgIHR5cGVvZiBfdGhlbWUuYWN0aXZlID09PSAnb2JqZWN0JyA/IChfdGhlbWUuYWN0aXZlLnR5cGUgPSB0eXBlKSA6IChfdGhlbWUuYWN0aXZlID0gdHlwZSk7XG4gICAgdGhpcy5jaGFuZ2VUaGVtZVR5cGUoX3RoZW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNw6l0b2RvIHJlbW92ZSBvIHRlbWEgYXJtYXplbmFkbyBlIGxpbXBhIHRvZG9zIG9zIGVzdGlsb3MgZGUgdGVtYVxuICAgKiBhcGxpY2Fkb3MgYW8gZG9jdW1lbnRvLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwZXJzaXN0UHJlZmVyZW5jZT10cnVlXSAtIChPcGNpb25hbCkgRGVmaW5lIHNlIGEgcHJlZmVyw6puY2lhIGRlIHRlbWEgbsOjbyBkZXZlIHNlciBtYW50aWRhIG5vIGxvY2FsU3RvcmFnZSBwYXJhIHBlcnNpc3TDqm5jaWEuIGB0cnVlYCBwYXJhIHJlbW92ZXIsIGBmYWxzZWAgcGFyYSBtYW50ZXIuXG4gICAqL1xuICBjbGVhblRoZW1lQWN0aXZlKHBlcnNpc3RQcmVmZXJlbmNlOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgIC8vIFN1Zml4byBleGlzdGVudGVzIGhvamVcbiAgICBjb25zdCB0aGVtZVN1ZmZpeGVzID0gWyctbGlnaHQtJywgJy1kYXJrLSddO1xuICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXTtcblxuICAgIC8vIENvbnZlcnRlIGBjbGFzc0xpc3RgIGVtIHVtIGFycmF5IGUgcmVtb3ZlIGFzIGNsYXNzZXMgcXVlIHRlcm1pbmFtIGNvbSBvcyBzdWZpeG9zIGVzcGVjaWZpY2Fkb3NcbiAgICBBcnJheS5mcm9tKGh0bWxFbGVtZW50LmNsYXNzTGlzdCkuZm9yRWFjaChjbGFzc05hbWUgPT4ge1xuICAgICAgaWYgKHRoZW1lU3VmZml4ZXMuc29tZShzdWZmaXggPT4gY2xhc3NOYW1lLmluY2x1ZGVzKHN1ZmZpeCkpKSB7XG4gICAgICAgIGh0bWxFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFJlbW92ZSBvIHRlbWEgYXRpdm8gZG8gbG9jYWxTdG9yYWdlXG4gICAgaWYgKHBlcnNpc3RQcmVmZXJlbmNlKSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgndG90dnMtdGhlbWUnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGl2ZVR5cGVGcm9tVGhlbWUoYWN0aXZlKTogUG9UaGVtZVR5cGVFbnVtIHtcbiAgICByZXR1cm4gdHlwZW9mIGFjdGl2ZSA9PT0gJ29iamVjdCcgPyBhY3RpdmUudHlwZSA6IGFjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWN0aXZlQTExeUZyb21UaGVtZShhY3RpdmUpOiBQb1RoZW1lQTExeUVudW0ge1xuICAgIHJldHVybiB0eXBlb2YgYWN0aXZlID09PSAnb2JqZWN0JyA/IGFjdGl2ZS5hMTF5IDogUG9UaGVtZUExMXlFbnVtLkFBQTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZG9jc1ByaXZhdGVcbiAgICpcbiAgICogRXN0ZSBtw6l0b2RvIGRlZmluZSB1bSBkYWRvcyBkbyB0ZW1hIGUgbyBhcm1hemVuYS5cbiAgICogQHBhcmFtIHRoZW1lIE9zIHRva2VucyBkZSB0ZW1hIGNvbnRlbmRvIG9zIGVzdGlsb3MgYWRpY2lvbmFpcyBhIHNlcmVtIGdlcmFkb3MuXG4gICAqL1xuICBwcml2YXRlIHNldFRoZW1lTG9jYWwodGhlbWU6IFBvVGhlbWUpOiB2b2lkIHtcbiAgICBpZiAodGhlbWUpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0b3R2cy10aGVtZScsIEpTT04uc3RyaW5naWZ5KHRoZW1lKSk7XG4gICAgICB0aGlzLnRoZW1lID0gdGhlbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgbyB0ZW1hIGF0aXZvIGNvbW8gdW0gb2JzZXJ2YWJsZS5cbiAgICogQHJldHVybnMge1BvVGhlbWV9IFRlbWEgYXRpdm8uXG4gICAqL1xuICBnZXRUaGVtZUFjdGl2ZSgpOiBQb1RoZW1lIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGhlbWVEYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG90dnMtdGhlbWUnKSk7XG4gICAgICBpZiAodGhlbWVEYXRhICYmIEpTT04uc3RyaW5naWZ5KHRoZW1lRGF0YSkgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMudGhlbWUpKSB7XG4gICAgICAgIHRoaXMudGhlbWUgPSB0aGVtZURhdGE7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm8gYW8gb2J0ZXIgbyB0ZW1hIGRvIGFybWF6ZW5hbWVudG8gbG9jYWw6JywgZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50aGVtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZG9jc1ByaXZhdGVcbiAgICpcbiAgICogR2VyYSBlc3RpbG9zIENTUyBjb20gYmFzZSBub3MgdG9rZW5zIGRlIGNvcmVzIGZvcm5lY2lkb3MuXG4gICAqIEBwYXJhbSBjc3MgT3MgdG9rZW5zIGRlIGNvciBhIHNlcmVtIHVzYWRvcyBwYXJhIGdlcmFyIG9zIGVzdGlsb3MuXG4gICAqIEBwYXJhbSBpZCBpZCBkbyBzdHlsZSBhIHNlciBhcGxpY2Fkby5cbiAgICogQHJldHVybnMgVW1hIHN0cmluZyBjb250ZW5kbyBvcyBlc3RpbG9zIENTUyBnZXJhZG9zLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVTdHlsZUVsZW1lbnQoY3NzOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBIVE1MU3R5bGVFbGVtZW50IHtcbiAgICBjb25zdCBzdHlsZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGVFbGVtZW50LmlkID0gaWQ7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChjc3MpKTtcbiAgICByZXR1cm4gc3R5bGVFbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkb2NzUHJpdmF0ZVxuICAgKlxuICAgKiBHZXJhIGVzdGlsb3MgQ1NTIGNvbSBiYXNlIG5vcyB0b2tlbnMgZGUgY29yZXMgZm9ybmVjaWRvcy5cbiAgICogQHBhcmFtIHRoZW1lQ29sb3IgT3MgdG9rZW5zIGRlIGNvciBhIHNlcmVtIHVzYWRvcyBwYXJhIGdlcmFyIG9zIGVzdGlsb3MuXG4gICAqIEByZXR1cm5zIFVtYSBzdHJpbmcgY29udGVuZG8gb3MgZXN0aWxvcyBDU1MgZ2VyYWRvcy5cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVUaGVtZVN0eWxlcyh0aGVtZUNvbG9yOiBQb1RoZW1lQ29sb3IpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlbGVjdEJnSWNvblN0eWxlID0gdGhpcy5nZXRTZWxlY3RCZ0ljb25zU3R5bGUodGhlbWVDb2xvcik7XG5cbiAgICByZXR1cm4gW1xuICAgICAgT2JqZWN0LmVudHJpZXModGhlbWVDb2xvcilcbiAgICAgICAgLmZsYXRNYXAoKFt0eXBlLCB2YWx1ZXNdKSA9PlxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlcykuZmxhdE1hcCgoW3RvbmFsaXR5LCB0b25hbGl0eVZhbHVlc10pID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnYWN0aW9uJykge1xuICAgICAgICAgICAgICByZXR1cm4gW2AtLWNvbG9yLSR7dHlwZX0tJHt0b25hbGl0eX06ICR7dG9uYWxpdHlWYWx1ZXN9O2BdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRvbmFsaXR5VmFsdWVzKS5tYXAoXG4gICAgICAgICAgICAgICAgKFtsZXZlbCwgY29sb3JWYWx1ZV0pID0+IGAtLWNvbG9yLSR7dHlwZX0tJHt0b25hbGl0eX0tJHtsZXZlbH06ICR7Y29sb3JWYWx1ZX07YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oJycpLFxuICAgICAgc2VsZWN0QmdJY29uU3R5bGVcbiAgICBdLmpvaW4oJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkb2NzUHJpdmF0ZVxuICAgKlxuICAgKiBHZXJhIGVzdGlsb3MgQ1NTIGNvbSBiYXNlIG5vcyB0b2tlbnMgcGVyIENvbXBvbmVudCBmb3JuZWNpZG9zLlxuICAgKiBAcGFyYW0gdGhlbWVQZXJDb21wb25lbnQgT3MgdG9rZW5zIGRlIGNvciBhIHNlcmVtIHVzYWRvcyBwYXJhIGdlcmFyIG9zIGVzdGlsb3MuXG4gICAqIEByZXR1cm5zIFVtYSBzdHJpbmcgY29udGVuZG8gb3MgZXN0aWxvcyBDU1MgZ2VyYWRvcy5cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVQZXJDb21wb25lbnRTdHlsZXModGhlbWVQZXJDb21wb25lbnQ6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoZW1lUGVyQ29tcG9uZW50KVxuICAgICAgLmZsYXRNYXAoKFt0eXBlLCB2YWx1ZXNdKSA9PlxuICAgICAgICBPYmplY3QuZW50cmllcyh2YWx1ZXMpLmZsYXRNYXAoKFtsZXZlbCwgY29sb3JWYWx1ZV0pID0+IFtgJHt0eXBlfSB7JHtsZXZlbH06ICR7Y29sb3JWYWx1ZX07fTtgXSlcbiAgICAgIClcbiAgICAgIC5qb2luKCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgbyB0ZW1hIGF0dWFsIGNvbW8gbyB0ZW1hIFwiUG9VSSBQYWRyw6NvXCIuXG4gICAqXG4gICAqIEBwYXJhbSB7UG9UaGVtZVR5cGVFbnVtfSB0eXBlIE8gdGlwbyBkZSBUZW1hIGEgc2VyIGFwbGljYWRvLCBsaWdodCAvIGRhcmsuXG4gICAqL1xuICBzZXREZWZhdWx0VGhlbWUodHlwZTogUG9UaGVtZVR5cGVFbnVtKTogdm9pZCB7XG4gICAgdGhpcy5zZXRUaGVtZShwb1RoZW1lRGVmYXVsdCwgdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRvY3NQcml2YXRlXG4gICAqXG4gICAqIFJldG9ybmEgbyBlc3RpbG8gQ1NTIHBhcmEgbyBmdW5kbyBkb3Mgw61jb25lcyBkbyBjb21wb25lbnRlIHBvLXNlbGVjdCwgY29tIGJhc2UgbmFzIGNvcmVzIGRvIHRlbWEuXG4gICAqXG4gICAqIEBwYXJhbSB7UG9UaGVtZUNvbG9yfSB0aGVtZUNvbG9yIC0gT2JqZXRvIGNvbnRlbmRvIGFzIGNvcmVzIGRvIHRlbWEuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRXN0aWxvIENTUyBwYXJhIG8gZnVuZG8gZG9zIMOtY29uZXMgZG8gcG8tc2VsZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RCZ0ljb25zU3R5bGUodGhlbWVDb2xvcjogUG9UaGVtZUNvbG9yKTogc3RyaW5nIHtcbiAgICBsZXQgc2VsZWN0QmdJY29uID0gJyc7XG5cbiAgICBpZiAodGhlbWVDb2xvcj8uYnJhbmQ/LlsnMDEnXT8uZGFyaykge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLmljb25OYW1lTGliID09PSAnUGhvc3Bob3JJY29uJyA/ICdwby1zZWxlY3QgLnBvLXNlbGVjdC1waG9zcGhvcicgOiAncG8tc2VsZWN0JztcbiAgICAgIHNlbGVjdEJnSWNvbiArPSBgJHtzZWxlY3Rvcn0geyAtLWJhY2tncm91bmQtaW1hZ2U6IHVybCgke3RoaXMuZ2V0U2VsZWN0QmdJY29uKHRoZW1lQ29sb3IubmV1dHJhbC5kYXJrWzcwXSl9KTsgfTtgO1xuICAgIH1cblxuICAgIGlmICh0aGVtZUNvbG9yPy5mZWVkYmFjaz8ubmVnYXRpdmU/LmJhc2UpIHtcbiAgICAgIGlmICh0aGlzLmljb25OYW1lTGliID09PSAnUG9JY29uJykge1xuICAgICAgICBzZWxlY3RCZ0ljb24gKz0gYHBvLXNlbGVjdC5uZy1kaXJ0eS5uZy1pbnZhbGlkIHNlbGVjdCB7IC0tYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7dGhpcy5nZXRTZWxlY3RCZ0ljb24odGhlbWVDb2xvci5mZWVkYmFjay5uZWdhdGl2ZS5iYXNlKX0pOyB9O2A7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmljb25OYW1lTGliID09PSAnUGhvc3Bob3JJY29uJykge1xuICAgICAgICBzZWxlY3RCZ0ljb24gKz0gYHBvLXNlbGVjdC5uZy1kaXJ0eS5uZy1pbnZhbGlkIHNlbGVjdC5wby1zZWxlY3QtcGhvc3Bob3IgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJHt0aGlzLmdldFNlbGVjdEJnSWNvbih0aGVtZUNvbG9yLmZlZWRiYWNrLm5lZ2F0aXZlLmJhc2UpfSk7IH07YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhlbWVDb2xvcj8ubmV1dHJhbD8ubGlnaHQ/LlsnMzAnXSkge1xuICAgICAgaWYgKHRoaXMuaWNvbk5hbWVMaWIgPT09ICdQb0ljb24nKSB7XG4gICAgICAgIHNlbGVjdEJnSWNvbiArPSBgc2VsZWN0OmRpc2FibGVkIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7dGhpcy5nZXRTZWxlY3RCZ0ljb24odGhlbWVDb2xvci5uZXV0cmFsLmxpZ2h0WyczMCddKX0pOyB9O2A7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmljb25OYW1lTGliID09PSAnUGhvc3Bob3JJY29uJykge1xuICAgICAgICBzZWxlY3RCZ0ljb24gKz0gYHBvLXNlbGVjdCBzZWxlY3QucG8tc2VsZWN0LXBob3NwaG9yOmRpc2FibGVkIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7dGhpcy5nZXRTZWxlY3RCZ0ljb24odGhlbWVDb2xvci5uZXV0cmFsLmxpZ2h0WyczMCddKX0pOyB9O2A7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdEJnSWNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZG9jc1ByaXZhdGVcbiAgICpcbiAgICogUmV0b3JuYSBhIGltYWdlbSBTVkcgdXRpbGl6YWRhIGNvbW8gZnVuZG8gZG8gcG8tc2VsZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgQ29yIGRhIEltYWdlbSAtIFV0aWxpemFkYSBubyBhdHJpYnV0byAnZmlsbCcuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IEltYWdlbSBTVkcgdXRpbGl6YWRhIG5vIHBvLXNlbGVjdC5cbiAgICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0QmdJY29uKGNvbG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBzdmc6IHN0cmluZztcblxuICAgIGlmICh0aGlzLmljb25OYW1lTGliID09PSAnUG9JY29uJykge1xuICAgICAgc3ZnID0gYFwiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgYDtcblxuICAgICAgc3ZnID0gc3ZnLmNvbmNhdChgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbC1ydWxlPSdldmVub2RkJyBjbGlwLXJ1bGU9J2V2ZW5vZGQnIGApO1xuICAgICAgc3ZnID0gc3ZnLmNvbmNhdChgZD0nTTE4LjcwNyA4LjI5MzAxQzE4LjMxNiA3LjkwMjAxIDE3LjY4NCA3LjkwMjAxIDE3LjI5MyA4LjI5MzAxTDEyIDEzLjU4Nkw2LjcwNzAxIGApO1xuICAgICAgc3ZnID0gc3ZnLmNvbmNhdChgOC4yOTMwMUM2LjMxNjAxIDcuOTAyMDEgNS42ODQwMSA3LjkwMjAxIDUuMjkzMDEgOC4yOTMwMUM0LjkwMjAxIDguNjg0MDEgNC45MDIwMSBgKTtcbiAgICAgIHN2ZyA9IHN2Zy5jb25jYXQoYDkuMzE2MDEgNS4yOTMwMSA5LjcwNzAxTDExLjI5MyAxNS43MDdDMTEuNDg4IDE1LjkwMiAxMS43NDQgMTYgMTIgMTZDMTIuMjU2IDE2IDEyLjUxMiBgKTtcbiAgICAgIHN2ZyA9IHN2Zy5jb25jYXQoYDE1LjkwMiAxMi43MDcgMTUuNzA3TDE4LjcwNyA5LjcwNzAxQzE5LjA5OCA5LjMxNjAxIDE5LjA5OCA4LjY4NDAxIDE4LjcwNyA4LjI5MzAxWicgYCk7XG4gICAgICBzdmcgPSBzdmcuY29uY2F0KGBmaWxsPScke2NvbG9yLnJlcGxhY2UoJyMnLCAnJTIzJyl9Jy8lM0UlM0Mvc3ZnJTNFJTBBXCIpO2ApO1xuXG4gICAgICByZXR1cm4gc3ZnO1xuICAgIH1cblxuICAgIHN2ZyA9IGBcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgd2lkdGg9JzI0JyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjU2IDI1NicgZmlsbD0nJHtjb2xvci5yZXBsYWNlKCcjJywgJyUyMycpfScgYDtcbiAgICBzdmcgPSBzdmcuY29uY2F0KGB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnJTNFJTNDcGF0aCBgKTtcbiAgICBzdmcgPSBzdmcuY29uY2F0KFxuICAgICAgYGQ9J00yMTMuNjYsMTAxLjY2bC04MCw4MGE4LDgsMCwwLDEtMTEuMzIsMGwtODAtODBBOCw4LDAsMCwxLDUzLjY2LDkwLjM0TDEyOCwxNjQuNjlsNzQuMzQtNzQuMzVhOCw4LDAsMCwxLDExLjMyLDExLjMyWidgXG4gICAgKTtcbiAgICBzdmcgPSBzdmcuY29uY2F0KGAlM0UlM0MvcGF0aCUzRSUzQy9zdmclM0VcIik7YCk7XG5cbiAgICByZXR1cm4gc3ZnO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBvIHRpcG8gKGxpZ2h0L2RhcmspIHF1YW5kbyB1bSB0ZW1hIGVzdMOhIHNlbmRvIGFwbGljYWRvLlxuICAgKlxuICAgKiBAcGFyYW0ge1BvVGhlbWV9IHRoZW1lIC0gT2JqZXRvIGNvbnRlbmRvIGFzIGRlZmluacOnw7VlcyBkZSB0ZW1hIGEgc2VyZW0gYXBsaWNhZGFzIG5vIGNvbXBvbmVudGUuXG4gICAqIEBwYXJhbSB7UG9UaGVtZVR5cGVFbnVtfSBbdGhlbWVUeXBlPVBvVGhlbWVUeXBlRW51bS5saWdodF0gLSAoT3BjaW9uYWwpIFRpcG8gZGUgdGVtYSBhIHNlciBhcGxpY2FkbywgcG9kZW5kbyBzZXIgJ2xpZ2h0JyAoY2xhcm8pIG91ICdkYXJrJyAoZXNjdXJvKS4gUG9yIHBhZHLDo28sIG8gdGVtYSBjbGFybyDDqSBhcGxpY2Fkby5cbiAgICovXG4gIHNldFRoZW1lVHlwZSh0aGVtZTogUG9UaGVtZSwgdGhlbWVUeXBlOiBQb1RoZW1lVHlwZUVudW0gPSBQb1RoZW1lVHlwZUVudW0ubGlnaHQpIHtcbiAgICBjb25zdCBfYWNjZXNzaWJpbGl0eSA9IHR5cGVvZiB0aGVtZS5hY3RpdmUgPT09ICdvYmplY3QnID8gdGhlbWUuYWN0aXZlLmExMXkgOiBQb1RoZW1lQTExeUVudW0uQUFBO1xuICAgIHRoaXMuc2V0VGhlbWUodGhlbWUsIHRoZW1lVHlwZSwgX2FjY2Vzc2liaWxpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqICBEZWZpbmUgbyB0aXBvIChsaWdodC9kYXJrKSBwYXJhIHVtIHRlbWEgasOhIGF0aXZvLlxuICAgKlxuICAgKiBAcGFyYW0ge1BvVGhlbWVUeXBlRW51bX0gW3RoZW1lVHlwZT1Qb1RoZW1lVHlwZUVudW0ubGlnaHRdIC0gKE9wY2lvbmFsKSBUaXBvIGRlIHRlbWEgYSBzZXIgYXBsaWNhZG8sIHBvZGVuZG8gc2VyICdsaWdodCcgKGNsYXJvKSBvdSAnZGFyaycgKGVzY3VybykuIFBvciBwYWRyw6NvLCBvIHRlbWEgY2xhcm8gw6kgYXBsaWNhZG8uXG4gICAqL1xuICBzZXRDdXJyZW50VGhlbWVUeXBlKHRoZW1lVHlwZTogUG9UaGVtZVR5cGVFbnVtID0gUG9UaGVtZVR5cGVFbnVtLmxpZ2h0KSB7XG4gICAgY29uc3QgX3RoZW1lID0gdGhpcy5nZXRUaGVtZUFjdGl2ZSgpO1xuICAgIHRoaXMuc2V0VGhlbWVUeXBlKF90aGVtZSwgdGhlbWVUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgbyBuaXZlbCBkZSBhY2Vzc2liaWxpZGFkZSBxdWFuZG8gdW0gdGVtYSBlc3TDoSBzZW5kbyBhcGxpY2Fkby5cbiAgICpcbiAgICogQHBhcmFtIHtQb1RoZW1lfSB0aGVtZSAtIE9iamV0byBjb250ZW5kbyBhcyBkZWZpbmnDp8O1ZXMgZGUgdGVtYSBhIHNlcmVtIGFwbGljYWRhcyBubyBjb21wb25lbnRlLlxuICAgKiBAcGFyYW0ge1BvVGhlbWVBMTF5RW51bX0gW2ExMXk9UG9UaGVtZUExMXlFbnVtLkFBQV0gLSAoT3BjaW9uYWwpIE7DrXZlbCBkZSBhY2Vzc2liaWxpZGFkZSBhIHNlciBhcGxpY2FkbyBhbyB0ZW1hLCBjb21vIEFBIG91IEFBQS4gU2UgbsOjbyBmb3IgaW5mb3JtYWRvLCBwb3IgcGFkcsOjbyBhIGFjZXNzaWJpbGlkYWRlIHNlcsOhIEFBQS5cbiAgICovXG4gIHNldFRoZW1lQTExeSh0aGVtZTogUG9UaGVtZSwgYTExeTogUG9UaGVtZUExMXlFbnVtID0gUG9UaGVtZUExMXlFbnVtLkFBQSkge1xuICAgIGNvbnN0IF90eXBlID0gKHR5cGVvZiB0aGVtZS5hY3RpdmUgPT09ICdvYmplY3QnID8gdGhlbWUuYWN0aXZlLnR5cGUgOiB0aGVtZS5hY3RpdmUpIHx8IDA7XG4gICAgdGhpcy5zZXRUaGVtZSh0aGVtZSwgX3R5cGUsIGExMXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBvIG5pdmVsIGRlIGFjZXNzaWJpbGlkYWRlIHBhcmEgdW0gdGVtYSBqw6EgYXRpdm8uXG4gICAqXG4gICAqIEBwYXJhbSB7UG9UaGVtZUExMXlFbnVtfSBbYTExeT1Qb1RoZW1lQTExeUVudW0uQUFBXSAtIChPcGNpb25hbCkgTsOtdmVsIGRlIGFjZXNzaWJpbGlkYWRlIGEgc2VyIGFwbGljYWRvIGFvIHRlbWEsIGNvbW8gQUEgb3UgQUFBLiBTZSBuw6NvIGZvciBpbmZvcm1hZG8sIHBvciBwYWRyw6NvIGEgYWNlc3NpYmlsaWRhZGUgc2Vyw6EgQUFBLlxuICAgKi9cbiAgc2V0Q3VycmVudFRoZW1lQTExeShhMTF5OiBQb1RoZW1lQTExeUVudW0gPSBQb1RoZW1lQTExeUVudW0uQUFBKSB7XG4gICAgY29uc3QgX3RoZW1lID0gdGhpcy5nZXRUaGVtZUFjdGl2ZSgpO1xuICAgIHRoaXMuc2V0VGhlbWVBMTF5KF90aGVtZSwgYTExeSk7XG4gIH1cbn1cbiJdfQ==