@entake/particle 17.0.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/LICENSE +7 -0
- package/README.md +396 -0
- package/app/modules/accordion/accordion.component.d.ts +26 -0
- package/app/modules/accordion/accordion.module.d.ts +11 -0
- package/app/modules/accordion/directives/accordion-content.directive.d.ts +8 -0
- package/app/modules/accordion/directives/accordion-header.directive.d.ts +8 -0
- package/app/modules/accordion/directives/accordion-item.directive.d.ts +13 -0
- package/app/modules/background-carousel/background-carousel.directive.d.ts +42 -0
- package/app/modules/background-carousel/carousel-options.model.d.ts +30 -0
- package/app/modules/background-carousel/particle-background-carousel.module.d.ts +8 -0
- package/app/modules/checkbox/checkbox.component.d.ts +43 -0
- package/app/modules/checkbox/checkbox.module.d.ts +9 -0
- package/app/modules/color-picker/color-picker.component.d.ts +149 -0
- package/app/modules/color-picker/color-picker.module.d.ts +9 -0
- package/app/modules/date-picker/components/calendar/calendar.component.d.ts +211 -0
- package/app/modules/date-picker/components/date-range-picker/date-range-picker.component.d.ts +95 -0
- package/app/modules/date-picker/date-picker.component.d.ts +259 -0
- package/app/modules/date-picker/date-picker.module.d.ts +15 -0
- package/app/modules/dialog/dialog.component.d.ts +87 -0
- package/app/modules/dialog/dialog.module.d.ts +9 -0
- package/app/modules/dropdown/dropdown.component.d.ts +288 -0
- package/app/modules/dropdown/dropdown.module.d.ts +9 -0
- package/app/modules/dropdown/models/dropdown-option-group.model.d.ts +16 -0
- package/app/modules/dropdown/models/dropdown-option.model.d.ts +25 -0
- package/app/modules/endpoint-state/components/endpoint-state.component.d.ts +46 -0
- package/app/modules/endpoint-state/endpoint-state.module.d.ts +8 -0
- package/app/modules/icons/components/icon-select.component.d.ts +229 -0
- package/app/modules/icons/models/fontawesome-icons-brands.model.d.ts +13 -0
- package/app/modules/icons/models/fontawesome-icons-regular.model.d.ts +13 -0
- package/app/modules/icons/models/fontawesome-icons-solid.model.d.ts +13 -0
- package/app/modules/icons/models/particle-icons-light.model.d.ts +197 -0
- package/app/modules/icons/models/particle-icons-regular.model.d.ts +205 -0
- package/app/modules/icons/models/particle-icons-solid.model.d.ts +365 -0
- package/app/modules/icons/particle-icons.module.d.ts +13 -0
- package/app/modules/icons/services/icons.service.d.ts +44 -0
- package/app/modules/idle-timeout/idle-timeout.component.d.ts +35 -0
- package/app/modules/idle-timeout/idle-timer.d.ts +14 -0
- package/app/modules/idle-timeout/particle-idle-timeout.module.d.ts +9 -0
- package/app/modules/input-mask/input-mask.component.d.ts +86 -0
- package/app/modules/input-mask/input-mask.module.d.ts +8 -0
- package/app/modules/keyfilter/keyfilter.directive.d.ts +60 -0
- package/app/modules/keyfilter/keyfilter.module.d.ts +8 -0
- package/app/modules/layout/components/layout-full-framing/layout-full-framing.component.d.ts +27 -0
- package/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +23 -0
- package/app/modules/layout/layout.module.d.ts +10 -0
- package/app/modules/loader/components/loader.component.d.ts +11 -0
- package/app/modules/loader/loader.module.d.ts +8 -0
- package/app/modules/multi-select/models/multi-select-option-group.model.d.ts +16 -0
- package/app/modules/multi-select/models/multi-select-option.model.d.ts +25 -0
- package/app/modules/multi-select/multi-select.component.d.ts +279 -0
- package/app/modules/multi-select/multi-select.module.d.ts +8 -0
- package/app/modules/notification/models/notification.model.d.ts +21 -0
- package/app/modules/notification/notification.component.d.ts +46 -0
- package/app/modules/notification/notification.module.d.ts +8 -0
- package/app/modules/notification/services/notification.service.d.ts +54 -0
- package/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.d.ts +8 -0
- package/app/modules/ordinal-number-pipe/ordinal-number.pipe.d.ts +15 -0
- package/app/modules/paginator/pagination-event.model.d.ts +24 -0
- package/app/modules/paginator/paginator.component.d.ts +103 -0
- package/app/modules/paginator/particle-paginator.module.d.ts +13 -0
- package/app/modules/popover/popover.component.d.ts +140 -0
- package/app/modules/popover/popover.module.d.ts +9 -0
- package/app/modules/profile-pic/particle-profile-pic.module.d.ts +9 -0
- package/app/modules/profile-pic/profile-pic.component.d.ts +32 -0
- package/app/modules/progress-bar/progress-bar.component.d.ts +16 -0
- package/app/modules/progress-bar/progress-bar.module.d.ts +8 -0
- package/app/modules/push-container/particle-push-container.module.d.ts +9 -0
- package/app/modules/push-container/push-container-state.model.d.ts +7 -0
- package/app/modules/push-container/push-container.component.d.ts +137 -0
- package/app/modules/rich-text/particle-rich-text.module.d.ts +15 -0
- package/app/modules/rich-text/render-rich-text.component.d.ts +6 -0
- package/app/modules/rich-text/rich-text-capabilities.model.d.ts +7 -0
- package/app/modules/rich-text/rich-text.component.d.ts +48 -0
- package/app/modules/scroll-to-top/particle-scroll-to-top.module.d.ts +8 -0
- package/app/modules/scroll-to-top/scroll-to-top.component.d.ts +19 -0
- package/app/modules/slideover/particle-slideover.module.d.ts +8 -0
- package/app/modules/slideover/slideover.component.d.ts +35 -0
- package/app/modules/slider/slider.component.d.ts +143 -0
- package/app/modules/slider/slider.module.d.ts +9 -0
- package/app/modules/theming/components/theming.component.d.ts +43 -0
- package/app/modules/theming/models/theme.model.d.ts +88 -0
- package/app/modules/theming/services/theme-change-detection.service.d.ts +26 -0
- package/app/modules/theming/services/theming.service.d.ts +142 -0
- package/app/modules/theming/theming.module.d.ts +12 -0
- package/app/modules/toggle-switch/models/toggle-options.model.d.ts +11 -0
- package/app/modules/toggle-switch/toggle-switch.component.d.ts +43 -0
- package/app/modules/toggle-switch/toggle-switch.module.d.ts +8 -0
- package/app/modules/tooltip/tooltip.directive.d.ts +157 -0
- package/app/modules/tooltip/tooltip.module.d.ts +8 -0
- package/app/modules/week-picker/week-picker.component.d.ts +289 -0
- package/app/modules/week-picker/week-picker.module.d.ts +13 -0
- package/app/shared/enums/endpoint-status.enum.d.ts +9 -0
- package/app/shared/interceptors/json.interceptor.d.ts +17 -0
- package/app/shared/models/auditable.model.d.ts +21 -0
- package/app/shared/models/data-list.model.d.ts +9 -0
- package/app/shared/models/id.model.d.ts +9 -0
- package/app/shared/models/observable-container.d.ts +8 -0
- package/app/shared/models/particle-component-text.model.d.ts +211 -0
- package/app/shared/services/base-data.service.d.ts +130 -0
- package/app/shared/services/dialog.service.d.ts +10 -0
- package/app/shared/services/local-storage.service.d.ts +41 -0
- package/esm2022/app/modules/accordion/accordion.component.mjs +101 -0
- package/esm2022/app/modules/accordion/accordion.module.mjs +37 -0
- package/esm2022/app/modules/accordion/directives/accordion-content.directive.mjs +17 -0
- package/esm2022/app/modules/accordion/directives/accordion-header.directive.mjs +17 -0
- package/esm2022/app/modules/accordion/directives/accordion-item.directive.mjs +36 -0
- package/esm2022/app/modules/background-carousel/background-carousel.directive.mjs +91 -0
- package/esm2022/app/modules/background-carousel/carousel-options.model.mjs +36 -0
- package/esm2022/app/modules/background-carousel/particle-background-carousel.module.mjs +24 -0
- package/esm2022/app/modules/checkbox/checkbox.component.mjs +108 -0
- package/esm2022/app/modules/checkbox/checkbox.module.mjs +28 -0
- package/esm2022/app/modules/color-picker/color-picker.component.mjs +306 -0
- package/esm2022/app/modules/color-picker/color-picker.module.mjs +19 -0
- package/esm2022/app/modules/date-picker/components/calendar/calendar.component.mjs +496 -0
- package/esm2022/app/modules/date-picker/components/date-range-picker/date-range-picker.component.mjs +250 -0
- package/esm2022/app/modules/date-picker/date-picker.component.mjs +538 -0
- package/esm2022/app/modules/date-picker/date-picker.module.mjs +56 -0
- package/esm2022/app/modules/dialog/dialog.component.mjs +177 -0
- package/esm2022/app/modules/dialog/dialog.module.mjs +28 -0
- package/esm2022/app/modules/dropdown/dropdown.component.mjs +682 -0
- package/esm2022/app/modules/dropdown/dropdown.module.mjs +28 -0
- package/esm2022/app/modules/dropdown/models/dropdown-option-group.model.mjs +2 -0
- package/esm2022/app/modules/dropdown/models/dropdown-option.model.mjs +2 -0
- package/esm2022/app/modules/endpoint-state/components/endpoint-state.component.mjs +75 -0
- package/esm2022/app/modules/endpoint-state/endpoint-state.module.mjs +22 -0
- package/esm2022/app/modules/icons/components/icon-select.component.mjs +377 -0
- package/esm2022/app/modules/icons/models/fontawesome-icons-brands.model.mjs +471 -0
- package/esm2022/app/modules/icons/models/fontawesome-icons-regular.model.mjs +166 -0
- package/esm2022/app/modules/icons/models/fontawesome-icons-solid.model.mjs +1016 -0
- package/esm2022/app/modules/icons/models/particle-icons-light.model.mjs +310 -0
- package/esm2022/app/modules/icons/models/particle-icons-regular.model.mjs +324 -0
- package/esm2022/app/modules/icons/models/particle-icons-solid.model.mjs +581 -0
- package/esm2022/app/modules/icons/particle-icons.module.mjs +66 -0
- package/esm2022/app/modules/icons/services/icons.service.mjs +86 -0
- package/esm2022/app/modules/idle-timeout/idle-timeout.component.mjs +85 -0
- package/esm2022/app/modules/idle-timeout/idle-timer.mjs +66 -0
- package/esm2022/app/modules/idle-timeout/particle-idle-timeout.module.mjs +28 -0
- package/esm2022/app/modules/input-mask/input-mask.component.mjs +594 -0
- package/esm2022/app/modules/input-mask/input-mask.module.mjs +18 -0
- package/esm2022/app/modules/keyfilter/keyfilter.directive.mjs +158 -0
- package/esm2022/app/modules/keyfilter/keyfilter.module.mjs +18 -0
- package/esm2022/app/modules/layout/components/layout-full-framing/layout-full-framing.component.mjs +79 -0
- package/esm2022/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.mjs +65 -0
- package/esm2022/app/modules/layout/layout.module.mjs +33 -0
- package/esm2022/app/modules/loader/components/loader.component.mjs +30 -0
- package/esm2022/app/modules/loader/loader.module.mjs +24 -0
- package/esm2022/app/modules/multi-select/models/multi-select-option-group.model.mjs +2 -0
- package/esm2022/app/modules/multi-select/models/multi-select-option.model.mjs +2 -0
- package/esm2022/app/modules/multi-select/multi-select.component.mjs +665 -0
- package/esm2022/app/modules/multi-select/multi-select.module.mjs +18 -0
- package/esm2022/app/modules/notification/models/notification.model.mjs +2 -0
- package/esm2022/app/modules/notification/notification.component.mjs +122 -0
- package/esm2022/app/modules/notification/notification.module.mjs +18 -0
- package/esm2022/app/modules/notification/services/notification.service.mjs +84 -0
- package/esm2022/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.mjs +20 -0
- package/esm2022/app/modules/ordinal-number-pipe/ordinal-number.pipe.mjs +49 -0
- package/esm2022/app/modules/paginator/pagination-event.model.mjs +29 -0
- package/esm2022/app/modules/paginator/paginator.component.mjs +207 -0
- package/esm2022/app/modules/paginator/particle-paginator.module.mjs +48 -0
- package/esm2022/app/modules/popover/popover.component.mjs +352 -0
- package/esm2022/app/modules/popover/popover.module.mjs +24 -0
- package/esm2022/app/modules/profile-pic/particle-profile-pic.module.mjs +28 -0
- package/esm2022/app/modules/profile-pic/profile-pic.component.mjs +74 -0
- package/esm2022/app/modules/progress-bar/progress-bar.component.mjs +43 -0
- package/esm2022/app/modules/progress-bar/progress-bar.module.mjs +24 -0
- package/esm2022/app/modules/push-container/particle-push-container.module.mjs +26 -0
- package/esm2022/app/modules/push-container/push-container-state.model.mjs +2 -0
- package/esm2022/app/modules/push-container/push-container.component.mjs +363 -0
- package/esm2022/app/modules/rich-text/particle-rich-text.module.mjs +64 -0
- package/esm2022/app/modules/rich-text/render-rich-text.component.mjs +18 -0
- package/esm2022/app/modules/rich-text/rich-text-capabilities.model.mjs +2 -0
- package/esm2022/app/modules/rich-text/rich-text.component.mjs +187 -0
- package/esm2022/app/modules/scroll-to-top/particle-scroll-to-top.module.mjs +24 -0
- package/esm2022/app/modules/scroll-to-top/scroll-to-top.component.mjs +49 -0
- package/esm2022/app/modules/slideover/particle-slideover.module.mjs +24 -0
- package/esm2022/app/modules/slideover/slideover.component.mjs +115 -0
- package/esm2022/app/modules/slider/slider.component.mjs +243 -0
- package/esm2022/app/modules/slider/slider.module.mjs +26 -0
- package/esm2022/app/modules/theming/components/theming.component.mjs +86 -0
- package/esm2022/app/modules/theming/models/theme.model.mjs +9 -0
- package/esm2022/app/modules/theming/services/theme-change-detection.service.mjs +38 -0
- package/esm2022/app/modules/theming/services/theming.service.mjs +507 -0
- package/esm2022/app/modules/theming/theming.module.mjs +55 -0
- package/esm2022/app/modules/toggle-switch/models/toggle-options.model.mjs +2 -0
- package/esm2022/app/modules/toggle-switch/toggle-switch.component.mjs +107 -0
- package/esm2022/app/modules/toggle-switch/toggle-switch.module.mjs +24 -0
- package/esm2022/app/modules/tooltip/tooltip.directive.mjs +381 -0
- package/esm2022/app/modules/tooltip/tooltip.module.mjs +18 -0
- package/esm2022/app/modules/week-picker/week-picker.component.mjs +511 -0
- package/esm2022/app/modules/week-picker/week-picker.module.mjs +40 -0
- package/esm2022/app/shared/enums/endpoint-status.enum.mjs +11 -0
- package/esm2022/app/shared/interceptors/json.interceptor.mjs +23 -0
- package/esm2022/app/shared/models/auditable.model.mjs +2 -0
- package/esm2022/app/shared/models/data-list.model.mjs +2 -0
- package/esm2022/app/shared/models/id.model.mjs +2 -0
- package/esm2022/app/shared/models/observable-container.mjs +15 -0
- package/esm2022/app/shared/models/particle-component-text.model.mjs +2 -0
- package/esm2022/app/shared/services/base-data.service.mjs +190 -0
- package/esm2022/app/shared/services/dialog.service.mjs +50 -0
- package/esm2022/app/shared/services/local-storage.service.mjs +60 -0
- package/esm2022/entake-particle.mjs +5 -0
- package/esm2022/public_api.mjs +98 -0
- package/fesm2022/entake-particle.mjs +12477 -0
- package/fesm2022/entake-particle.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +65 -0
- package/particle.css +1 -0
- package/public_api.d.ts +97 -0
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import { Z_INDEX_LAYERS } from '../models/theme.model';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../../../shared/services/local-storage.service";
|
|
6
|
+
import * as i2 from "./theme-change-detection.service";
|
|
7
|
+
export class ThemingService {
|
|
8
|
+
localStorageService;
|
|
9
|
+
themeChangeDetectionService;
|
|
10
|
+
// PSA: ORDER MATTERS, DO NOT MOVE ITEMS AROUND
|
|
11
|
+
defaultZIndexes = [
|
|
12
|
+
Z_INDEX_LAYERS.BASE,
|
|
13
|
+
Z_INDEX_LAYERS.FRAME,
|
|
14
|
+
Z_INDEX_LAYERS.OVERLAY,
|
|
15
|
+
Z_INDEX_LAYERS.DIALOG,
|
|
16
|
+
Z_INDEX_LAYERS.NOTIFICATION
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Prefix used to build the key for local storage of the theme
|
|
20
|
+
*/
|
|
21
|
+
THEME_KEY = 'theme';
|
|
22
|
+
/**
|
|
23
|
+
* A private BehaviorSubject to store the loaded themes
|
|
24
|
+
*/
|
|
25
|
+
themes = new BehaviorSubject([]);
|
|
26
|
+
$selectedTheme = new BehaviorSubject(null);
|
|
27
|
+
get selectedTheme() {
|
|
28
|
+
return this.$selectedTheme.asObservable();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Key for the product this is deployed into
|
|
32
|
+
*/
|
|
33
|
+
applicationName = null;
|
|
34
|
+
/**
|
|
35
|
+
* Constructor
|
|
36
|
+
*
|
|
37
|
+
* @param localStorageService
|
|
38
|
+
* @param themeChangeDetectionService
|
|
39
|
+
*/
|
|
40
|
+
constructor(localStorageService, themeChangeDetectionService) {
|
|
41
|
+
this.localStorageService = localStorageService;
|
|
42
|
+
this.themeChangeDetectionService = themeChangeDetectionService;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Converts a JSON property name to snake case
|
|
46
|
+
*
|
|
47
|
+
* @param prop
|
|
48
|
+
*/
|
|
49
|
+
toSnakeCase(prop) {
|
|
50
|
+
return prop.split(/(?=[A-Z])/).join('_').toLowerCase();
|
|
51
|
+
}
|
|
52
|
+
toKebabCase(prop) {
|
|
53
|
+
return prop.split(/(?=[A-Z])/).join('-').toLowerCase();
|
|
54
|
+
}
|
|
55
|
+
convertUnderscoreToDash(prop) {
|
|
56
|
+
return prop.split('_').join('-').toLowerCase();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* For the given color, it'll lighten or darken the color by the percentage supplied. Positive percent will lighten, negative to darken.
|
|
60
|
+
*
|
|
61
|
+
* @param color
|
|
62
|
+
* @param percent
|
|
63
|
+
*/
|
|
64
|
+
lightenDarkenColor(color, percent) {
|
|
65
|
+
let usePound = false;
|
|
66
|
+
if (color[0] === '#') {
|
|
67
|
+
color = color.slice(1);
|
|
68
|
+
usePound = true;
|
|
69
|
+
}
|
|
70
|
+
const num = parseInt(color, 16);
|
|
71
|
+
let r = (num >> 16) + percent;
|
|
72
|
+
if (r > 255) {
|
|
73
|
+
r = 255;
|
|
74
|
+
}
|
|
75
|
+
else if (r < 0) {
|
|
76
|
+
r = 0;
|
|
77
|
+
}
|
|
78
|
+
let b = ((num >> 8) & 0x00FF) + percent;
|
|
79
|
+
if (b > 255) {
|
|
80
|
+
b = 255;
|
|
81
|
+
}
|
|
82
|
+
else if (b < 0) {
|
|
83
|
+
b = 0;
|
|
84
|
+
}
|
|
85
|
+
let g = (num & 0x0000FF) + percent;
|
|
86
|
+
if (g > 255) {
|
|
87
|
+
g = 255;
|
|
88
|
+
}
|
|
89
|
+
else if (g < 0) {
|
|
90
|
+
g = 0;
|
|
91
|
+
}
|
|
92
|
+
let newColor = (g | (b << 8) | (r << 16)).toString(16);
|
|
93
|
+
while (newColor.length < 6) {
|
|
94
|
+
newColor = '0' + newColor;
|
|
95
|
+
}
|
|
96
|
+
return (usePound ? '#' : '') + newColor;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Converts a hex value to a Javascript object with r,g, and b variables.
|
|
100
|
+
*
|
|
101
|
+
* @param hex
|
|
102
|
+
*/
|
|
103
|
+
hexToRgb(hex) {
|
|
104
|
+
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
105
|
+
return result ? {
|
|
106
|
+
r: parseInt(result[1], 16),
|
|
107
|
+
g: parseInt(result[2], 16),
|
|
108
|
+
b: parseInt(result[3], 16)
|
|
109
|
+
} : null;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Generates a random hex color
|
|
113
|
+
*/
|
|
114
|
+
getRandomColor() {
|
|
115
|
+
return '#' + Math.floor(Math.random() * 16777215).toString(16);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* On App Initialization (in app.component.ts, ngOnInit) call this to load themes and apply the user selected theme or default theme.
|
|
119
|
+
*
|
|
120
|
+
* @param applicationName
|
|
121
|
+
* @param themes
|
|
122
|
+
*/
|
|
123
|
+
appInit(applicationName, themes) {
|
|
124
|
+
if (!applicationName) {
|
|
125
|
+
throw new Error('Application Name was not supplied.');
|
|
126
|
+
}
|
|
127
|
+
this.applicationName = applicationName;
|
|
128
|
+
this.themes.next(themes);
|
|
129
|
+
this.applySettings();
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Return the themes for the current app
|
|
133
|
+
*/
|
|
134
|
+
getThemes() {
|
|
135
|
+
return this.themes;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Apply the selected theme
|
|
139
|
+
*/
|
|
140
|
+
applySettings() {
|
|
141
|
+
const settings = this.getTheme();
|
|
142
|
+
this.$selectedTheme.next(settings);
|
|
143
|
+
this.changeColors(settings);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Constructs a theme object based on another theme object
|
|
147
|
+
*
|
|
148
|
+
* @param theme
|
|
149
|
+
*/
|
|
150
|
+
generateTheme(theme) {
|
|
151
|
+
let newTheme = {};
|
|
152
|
+
if (theme) {
|
|
153
|
+
for (const prop of Object.keys(theme)) {
|
|
154
|
+
// @ts-ignore
|
|
155
|
+
newTheme[prop] = theme[prop];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
newTheme = this.themes.getValue().find(theTheme => theTheme.isDefault);
|
|
160
|
+
}
|
|
161
|
+
return newTheme;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Returns a list of the color classes specifically based on the properties of the theme model
|
|
165
|
+
*/
|
|
166
|
+
getClassesFromTheme(theme) {
|
|
167
|
+
const classes = [];
|
|
168
|
+
for (const prop of Object.keys(theme)) {
|
|
169
|
+
if (prop.toLowerCase().includes('bg') || prop.toLowerCase().includes('color')) {
|
|
170
|
+
classes.push(prop.split(/(?=[A-Z])/).join('_').toLowerCase());
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return classes;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Returns the user selected theme from local storage
|
|
177
|
+
*/
|
|
178
|
+
getTheme() {
|
|
179
|
+
const themeId = this.localStorageService.getObject(this.applicationName + this.THEME_KEY);
|
|
180
|
+
let defaultTheme = this.themes.value.filter(theme => theme.isDefault)[0];
|
|
181
|
+
for (const theme of this.themes.value) {
|
|
182
|
+
if (theme.themeId === themeId) {
|
|
183
|
+
return theme;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return defaultTheme;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Persists the user selected theme in local storage
|
|
190
|
+
*
|
|
191
|
+
* @param settings
|
|
192
|
+
*/
|
|
193
|
+
saveTheme(settings) {
|
|
194
|
+
this.$selectedTheme.next(settings);
|
|
195
|
+
this.localStorageService.putObject(this.applicationName + this.THEME_KEY, settings.themeId);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Writes the theme information to a style tag in the header so that the theme is applied.
|
|
199
|
+
*
|
|
200
|
+
* @param theme
|
|
201
|
+
* @param prefix
|
|
202
|
+
*/
|
|
203
|
+
changeColors(theme, prefix) {
|
|
204
|
+
if (!prefix) {
|
|
205
|
+
prefix = '';
|
|
206
|
+
}
|
|
207
|
+
const style = document.createElement('style');
|
|
208
|
+
let rootVars = ':root {';
|
|
209
|
+
// Render the color palette styles
|
|
210
|
+
if (theme.colorPalette) {
|
|
211
|
+
for (const prop of Object.keys(theme.colorPalette)) {
|
|
212
|
+
if (prop !== 'extension') {
|
|
213
|
+
const value = theme.colorPalette[prop];
|
|
214
|
+
const color = this.addHashmark(value);
|
|
215
|
+
this.generateColors(style, color, prefix + this.toSnakeCase(prop));
|
|
216
|
+
rootVars += `--${prefix}${this.toKebabCase(prop)}-color: ${color};`;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
for (const extension of theme.colorPalette.extension) {
|
|
220
|
+
if (extension.textColor && !extension.color) {
|
|
221
|
+
style.appendChild(document.createTextNode(`.${prefix}${extension.className}{color: ${this.addHashmark(extension.textColor)};}`));
|
|
222
|
+
}
|
|
223
|
+
if (extension.color) {
|
|
224
|
+
if (!extension.textColor) {
|
|
225
|
+
this.generateColors(style, this.addHashmark(extension.color), prefix + extension.className);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
style.appendChild(document.createTextNode(`.${prefix}${extension.className}{background-color: ${this.addHashmark(extension.color)};color: ${this.addHashmark(extension.textColor)};fill: currentColor;}`));
|
|
229
|
+
}
|
|
230
|
+
rootVars += `--${prefix}${this.convertUnderscoreToDash(extension.className)}: ${this.addHashmark(extension.color)};`;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Render the layout color styles
|
|
235
|
+
if (theme.layoutColors) {
|
|
236
|
+
for (const prop of Object.keys(theme.layoutColors)) {
|
|
237
|
+
const value = theme.layoutColors[prop];
|
|
238
|
+
const color = value.startsWith('#') ? value : '#' + value;
|
|
239
|
+
this.generateColors(style, color, prefix + this.toSnakeCase(prop));
|
|
240
|
+
rootVars += `--${prefix}${this.toKebabCase(prop)}: ${color};`;
|
|
241
|
+
}
|
|
242
|
+
if (this.isDarkTheme(theme.layoutColors.bodyColor)) {
|
|
243
|
+
style.appendChild(document.createTextNode(`.${prefix}bg_overlay{background-color:rgba(255,255,255,0.05);color:inherit;}`));
|
|
244
|
+
style.appendChild(document.createTextNode(`.${prefix}bg_overlay_rev{background-color:rgba(0,0,0,0.05);color:inherit;}`));
|
|
245
|
+
style.appendChild(document.createTextNode(`.${prefix}brdr{border:1px solid rgba(150,150,150,0.5);}`));
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
style.appendChild(document.createTextNode(`.${prefix}bg_overlay{background-color:rgba(255,255,255,0.1);color:inherit;}`));
|
|
249
|
+
style.appendChild(document.createTextNode(`.${prefix}bg_overlay_rev{background-color:rgba(0,0,0,0.04);color:inherit;}`));
|
|
250
|
+
style.appendChild(document.createTextNode(`.${prefix}brdr{border:1px solid rgba(150,150,150,0.5);}`));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (theme.accessibility && theme.accessibility.enabled) {
|
|
254
|
+
const outlineColor = theme.accessibility.highlightColor.startsWith('#') ? theme.accessibility.highlightColor : '#' + theme.accessibility.highlightColor;
|
|
255
|
+
style.appendChild(document.createTextNode(`.${prefix}access{outline: ${outlineColor} ${theme.accessibility.highlightThickness} solid !important;outline-color: transparent !important;transition:all 0.3s ease-in-out;}`));
|
|
256
|
+
style.appendChild(document.createTextNode(`.${prefix}access:focus{outline: ${outlineColor} ${theme.accessibility.highlightThickness} solid !important;outline-offset: ${theme.accessibility.highlightOffset};}`));
|
|
257
|
+
if (theme.accessibility.hoverEnabled) {
|
|
258
|
+
style.appendChild(document.createTextNode(`.${prefix}access:hover{outline: ${outlineColor} ${theme.accessibility.highlightThickness} solid !important;outline-offset: ${theme.accessibility.highlightOffset};}`));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Render the button color styles
|
|
262
|
+
if (theme.buttonColorPalette) {
|
|
263
|
+
for (const prop of Object.keys(theme.buttonColorPalette)) {
|
|
264
|
+
const value = theme.buttonColorPalette[prop];
|
|
265
|
+
const color = value.startsWith('#') ? value : '#' + value;
|
|
266
|
+
this.generateColors(style, color, prefix + this.toSnakeCase(prop));
|
|
267
|
+
rootVars += `--${prefix}${this.toKebabCase(prop)}: ${color};`;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (theme.stylingVariables) {
|
|
271
|
+
if (theme.stylingVariables.inputTextSize) {
|
|
272
|
+
style.appendChild(document.createTextNode(`.${prefix}ptl_input_text_size{font-size: ${theme.stylingVariables.inputTextSize};}`));
|
|
273
|
+
}
|
|
274
|
+
if (theme.stylingVariables.inputLabelSize) {
|
|
275
|
+
style.appendChild(document.createTextNode(`.${prefix}ptl_input_label_size{font-size: ${theme.stylingVariables.inputLabelSize};}`));
|
|
276
|
+
}
|
|
277
|
+
if (theme.stylingVariables.inputBgColor) {
|
|
278
|
+
style.appendChild(document.createTextNode(`.${prefix}ptl_input_bg_color{background-color: ${this.addHashmark(theme.stylingVariables.inputBgColor)};color: ${this.getTextColor(theme.stylingVariables.inputBgColor)}}`));
|
|
279
|
+
}
|
|
280
|
+
if (theme.stylingVariables.borderColor) {
|
|
281
|
+
style.appendChild(document.createTextNode(`.${prefix}ptl_brdr_color{border-color: ${this.addHashmark(theme.stylingVariables.borderColor)};}`));
|
|
282
|
+
}
|
|
283
|
+
if (theme.stylingVariables.borderSize) {
|
|
284
|
+
style.appendChild(document.createTextNode(`.${prefix}ptl_brdr_size{border-width: ${theme.stylingVariables.borderSize};border-style:solid;}`));
|
|
285
|
+
}
|
|
286
|
+
if (theme.stylingVariables.borderRadius) {
|
|
287
|
+
style.appendChild(document.createTextNode(`.${prefix}ptl_brdr_radius{border-radius: ${theme.stylingVariables.borderRadius};}`));
|
|
288
|
+
}
|
|
289
|
+
if (theme.stylingVariables.inputHeight) {
|
|
290
|
+
style.appendChild(document.createTextNode(`.${prefix}ptl_input_height{height: ${theme.stylingVariables.inputHeight};}`));
|
|
291
|
+
}
|
|
292
|
+
if (theme.stylingVariables.inputPadding) {
|
|
293
|
+
style.appendChild(document.createTextNode(`.${prefix}ptl_input_padding{padding: ${theme.stylingVariables.inputPadding};}`));
|
|
294
|
+
}
|
|
295
|
+
if (theme.stylingVariables.tooltipTextSize || theme.stylingVariables.tooltipBackgroundColor) {
|
|
296
|
+
const bgColor = theme.stylingVariables.tooltipBackgroundColor;
|
|
297
|
+
const textSize = theme.stylingVariables.tooltipTextSize;
|
|
298
|
+
const borderSize = theme.stylingVariables.tooltipBorderSize;
|
|
299
|
+
const borderColor = theme.stylingVariables.tooltipBorderColor;
|
|
300
|
+
const caretSize = theme.stylingVariables.tooltipCaretSize ?? '6px';
|
|
301
|
+
let tooltipStyle = '.particle_tooltip{';
|
|
302
|
+
if (bgColor) {
|
|
303
|
+
const textColor = this.getTextColor(bgColor);
|
|
304
|
+
tooltipStyle += `color: ${textColor};`;
|
|
305
|
+
tooltipStyle += `background-color: ${bgColor};`;
|
|
306
|
+
}
|
|
307
|
+
if (borderColor && borderSize) {
|
|
308
|
+
tooltipStyle += `border: ${borderSize} solid ${borderColor};`;
|
|
309
|
+
}
|
|
310
|
+
if (textSize) {
|
|
311
|
+
tooltipStyle += 'font-size: ' + textSize + ';';
|
|
312
|
+
}
|
|
313
|
+
tooltipStyle += '}';
|
|
314
|
+
style.appendChild(document.createTextNode(tooltipStyle));
|
|
315
|
+
let caretStyleColor = null;
|
|
316
|
+
if (borderColor && borderSize) {
|
|
317
|
+
caretStyleColor = borderColor;
|
|
318
|
+
}
|
|
319
|
+
else if (bgColor) {
|
|
320
|
+
caretStyleColor = bgColor;
|
|
321
|
+
}
|
|
322
|
+
if (caretStyleColor) {
|
|
323
|
+
style.appendChild(document.createTextNode(`.particle_tooltip.right::after{border-color: transparent ${caretStyleColor} transparent transparent;margin-top: -${caretSize};border-width: ${caretSize};}`));
|
|
324
|
+
style.appendChild(document.createTextNode(`.particle_tooltip.left::after{border-color: transparent transparent transparent ${caretStyleColor};margin-top: -${caretSize};border-width: ${caretSize};}`));
|
|
325
|
+
style.appendChild(document.createTextNode(`.particle_tooltip.top::after{border-color: ${caretStyleColor} transparent transparent transparent;margin-left: -${caretSize};border-width: ${caretSize};}`));
|
|
326
|
+
style.appendChild(document.createTextNode(`.particle_tooltip.bottom::after{border-color: transparent transparent ${caretStyleColor} transparent;margin-left: -${caretSize};border-width: ${caretSize};}`));
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
const head = document.head || document.getElementsByTagName('head')[0];
|
|
331
|
+
this.removeThemeFromHeader(prefix);
|
|
332
|
+
// Write the fonts to the header
|
|
333
|
+
if (prefix === '') {
|
|
334
|
+
this.addFonts(theme, head, style);
|
|
335
|
+
rootVars = this.createZIndexes(rootVars, theme.zIndexList);
|
|
336
|
+
}
|
|
337
|
+
rootVars += '}';
|
|
338
|
+
style.appendChild(document.createTextNode(rootVars));
|
|
339
|
+
style.setAttribute('id', (prefix ? prefix + '-' : '') + 'particle-theme');
|
|
340
|
+
head.appendChild(style);
|
|
341
|
+
this.themeChangeDetectionService.changeTheme();
|
|
342
|
+
}
|
|
343
|
+
addHashmark(color) {
|
|
344
|
+
return color.startsWith('#') ? color : '#' + color;
|
|
345
|
+
}
|
|
346
|
+
addFonts(theme, head, style) {
|
|
347
|
+
if (!theme.fonts) {
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
let defaultFont = null;
|
|
351
|
+
for (const font of theme.fonts) {
|
|
352
|
+
if (font.isDefault || theme.fonts.length === 1) {
|
|
353
|
+
defaultFont = font;
|
|
354
|
+
}
|
|
355
|
+
if (!this.fontExists(head, font)) {
|
|
356
|
+
let element = document.createElement('link');
|
|
357
|
+
if (font.source === 'adobe') {
|
|
358
|
+
element.setAttribute('href', `https://use.typekit.net/${font.id}.css`);
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
element.setAttribute('href', `https://fonts.googleapis.com/css?family=${font.name.replace(' ', '+')}&display=swap`);
|
|
362
|
+
}
|
|
363
|
+
element.setAttribute('rel', 'stylesheet');
|
|
364
|
+
head.appendChild(element);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
style.appendChild(document.createTextNode(`html * { font-family: ${defaultFont.name}, ${defaultFont.isSerif ? 'serif' : 'sans-serif'}; }`));
|
|
368
|
+
}
|
|
369
|
+
fontExists(head, font) {
|
|
370
|
+
for (const child of head.childNodes) {
|
|
371
|
+
if (child.href && font.source === 'adobe' && child.href.indexOf(font.id) > -1) {
|
|
372
|
+
return true;
|
|
373
|
+
}
|
|
374
|
+
else if (child.href && child.href.indexOf(font.name.replace(' ', '+')) > -1) {
|
|
375
|
+
return true;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
removeThemeFromHeader(prefix) {
|
|
381
|
+
const head = document.head || document.getElementsByTagName('head')[0];
|
|
382
|
+
for (const child of head.childNodes) {
|
|
383
|
+
if (child.id === (prefix ? prefix + '-' : '') + 'particle-theme') {
|
|
384
|
+
head.removeChild(child);
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Determines the contrast between a given color and its auto-selected text color
|
|
391
|
+
*
|
|
392
|
+
* @param color
|
|
393
|
+
*/
|
|
394
|
+
getContrast(color) {
|
|
395
|
+
const colorRgb = this.hexToRgb(color);
|
|
396
|
+
const textColorRgb = this.hexToRgb(this.getTextColor(color));
|
|
397
|
+
return this.contrast(colorRgb, textColorRgb);
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Calculates luminance
|
|
401
|
+
*
|
|
402
|
+
* @param r
|
|
403
|
+
* @param g
|
|
404
|
+
* @param b
|
|
405
|
+
*/
|
|
406
|
+
luminance(r, g, b) {
|
|
407
|
+
const a = [r, g, b].map(function (v) {
|
|
408
|
+
v /= 255;
|
|
409
|
+
return v <= 0.03928
|
|
410
|
+
? v / 12.92
|
|
411
|
+
: Math.pow((v + 0.055) / 1.055, 2.4);
|
|
412
|
+
});
|
|
413
|
+
return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;
|
|
414
|
+
}
|
|
415
|
+
isDarkTheme(color) {
|
|
416
|
+
const rgb = this.hexToRgb(color);
|
|
417
|
+
return (this.luminance(rgb.r, rgb.g, rgb.b) * 100) < 50;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Calculates the contrast
|
|
421
|
+
*
|
|
422
|
+
* @param rgb1
|
|
423
|
+
* @param rgb2
|
|
424
|
+
*/
|
|
425
|
+
contrast(rgb1, rgb2) {
|
|
426
|
+
let contrast = (this.luminance(rgb1.r, rgb1.g, rgb1.b) + 0.05)
|
|
427
|
+
/ (this.luminance(rgb2.r, rgb2.g, rgb2.b) + 0.05);
|
|
428
|
+
if (contrast < 1) {
|
|
429
|
+
contrast = (this.luminance(rgb2.r, rgb2.g, rgb2.b) + 0.05)
|
|
430
|
+
/ (this.luminance(rgb1.r, rgb1.g, rgb1.b) + 0.05);
|
|
431
|
+
}
|
|
432
|
+
return contrast;
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Returns the maximally contrasting text color for the supplied background color
|
|
436
|
+
*
|
|
437
|
+
* @param color
|
|
438
|
+
*/
|
|
439
|
+
getTextColor(color) {
|
|
440
|
+
const rgb = this.hexToRgb(color);
|
|
441
|
+
let textRgb = this.hexToRgb('#FFFFFF');
|
|
442
|
+
const whiteContrast = this.contrast(textRgb, rgb);
|
|
443
|
+
textRgb = this.hexToRgb('#222222');
|
|
444
|
+
const blackContrast = this.contrast(textRgb, rgb);
|
|
445
|
+
// 7 is the contrast ratio for WCAG AAA, if we're less than that, go full black for max contrast
|
|
446
|
+
if (blackContrast > whiteContrast && blackContrast < 7) {
|
|
447
|
+
return '#000000';
|
|
448
|
+
}
|
|
449
|
+
return whiteContrast > blackContrast ? '#FFFFFF' : '#222222';
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Generates the CSS for each of the colors in the theme. Will write the base color and 9 light and dark variants of the given color.
|
|
453
|
+
*
|
|
454
|
+
* @param style
|
|
455
|
+
* @param color
|
|
456
|
+
* @param className
|
|
457
|
+
*/
|
|
458
|
+
generateColors(style, color, className) {
|
|
459
|
+
if (!color) {
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
let textColor = this.getTextColor(color);
|
|
463
|
+
style.appendChild(document.createTextNode(`.${className}{background-color: ${color};color: ${textColor};fill: currentColor;}`));
|
|
464
|
+
for (let i = 1; i < 10; i++) {
|
|
465
|
+
const newColor = this.lightenDarkenColor(color, i * 10);
|
|
466
|
+
textColor = this.getTextColor(newColor);
|
|
467
|
+
style.appendChild(document.createTextNode(`.${className}_light_${i}{background-color: ${newColor};color: ${textColor};fill: currentColor;}`));
|
|
468
|
+
}
|
|
469
|
+
for (let i = 1; i < 10; i++) {
|
|
470
|
+
const newColor = this.lightenDarkenColor(color, 0 - (i * 10));
|
|
471
|
+
textColor = this.getTextColor(newColor);
|
|
472
|
+
style.appendChild(document.createTextNode(`.${className}_dark_${i}{background-color: ${newColor};color: ${textColor};fill: currentColor;}`));
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
getDefaultZIndexes() {
|
|
476
|
+
return this.defaultZIndexes;
|
|
477
|
+
}
|
|
478
|
+
createZIndexes(rootVars, zIndexes) {
|
|
479
|
+
let zIndexesToCreate = this.defaultZIndexes;
|
|
480
|
+
if (zIndexes) {
|
|
481
|
+
if (zIndexes.includes(Z_INDEX_LAYERS.BASE)
|
|
482
|
+
&& zIndexes.includes(Z_INDEX_LAYERS.FRAME)
|
|
483
|
+
&& zIndexes.includes(Z_INDEX_LAYERS.OVERLAY)
|
|
484
|
+
&& zIndexes.includes(Z_INDEX_LAYERS.DIALOG)
|
|
485
|
+
&& zIndexes.includes(Z_INDEX_LAYERS.NOTIFICATION)) {
|
|
486
|
+
zIndexesToCreate = zIndexes;
|
|
487
|
+
}
|
|
488
|
+
else {
|
|
489
|
+
console.warn('THEMING: Z Index List missing required layers, ignoring provided list.');
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
let i = 0;
|
|
493
|
+
for (const zIndex of zIndexesToCreate) {
|
|
494
|
+
rootVars += `--z-${zIndex}: ${i++};`;
|
|
495
|
+
}
|
|
496
|
+
return rootVars;
|
|
497
|
+
}
|
|
498
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: ThemingService, deps: [{ token: i1.LocalStorageService }, { token: i2.ThemeChangeDetectionService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
499
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: ThemingService, providedIn: 'root' });
|
|
500
|
+
}
|
|
501
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.2", ngImport: i0, type: ThemingService, decorators: [{
|
|
502
|
+
type: Injectable,
|
|
503
|
+
args: [{
|
|
504
|
+
providedIn: 'root'
|
|
505
|
+
}]
|
|
506
|
+
}], ctorParameters: () => [{ type: i1.LocalStorageService }, { type: i2.ThemeChangeDetectionService }] });
|
|
507
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWluZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL3RoZW1pbmcvc2VydmljZXMvdGhlbWluZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBYSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQW1CLGNBQWMsRUFBQyxNQUFNLHVCQUF1QixDQUFDOzs7O0FBT3ZFLE1BQU0sT0FBTyxjQUFjO0lBd0NmO0lBQ0E7SUF2Q1YsK0NBQStDO0lBQzlCLGVBQWUsR0FBa0I7UUFDaEQsY0FBYyxDQUFDLElBQUk7UUFDbkIsY0FBYyxDQUFDLEtBQUs7UUFDcEIsY0FBYyxDQUFDLE9BQU87UUFDdEIsY0FBYyxDQUFDLE1BQU07UUFDckIsY0FBYyxDQUFDLFlBQVk7S0FDNUIsQ0FBQztJQUVGOztPQUVHO0lBQ2MsU0FBUyxHQUFHLE9BQU8sQ0FBQztJQUVyQzs7T0FFRztJQUNLLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBVSxFQUFFLENBQUMsQ0FBQztJQUUxQyxjQUFjLEdBQUcsSUFBSSxlQUFlLENBQVEsSUFBVyxDQUFDLENBQUM7SUFFakUsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFHRDs7T0FFRztJQUNPLGVBQWUsR0FBVyxJQUFXLENBQUM7SUFFaEQ7Ozs7O09BS0c7SUFDSCxZQUNVLG1CQUF3QyxFQUN4QywyQkFBd0Q7UUFEeEQsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxnQ0FBMkIsR0FBM0IsMkJBQTJCLENBQTZCO0lBRWxFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssV0FBVyxDQUFDLElBQVk7UUFDOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFD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QUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFTyxjQUFjLENBQUMsUUFBZ0IsRUFBRSxRQUF1QjtRQUM5RCxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFFNUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO21CQUNyQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7bUJBQ3ZDLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQzttQkFDekMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO21CQUN4QyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFDakQsQ0FBQztnQkFDRCxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7WUFDOUIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0VBQXdFLENBQUMsQ0FBQztZQUN6RixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLEtBQUssTUFBTSxNQUFNLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUN0QyxRQUFRLElBQUksT0FBTyxNQUFNLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQztRQUN2QyxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzt1R0Fya0JVLGNBQWM7MkdBQWQsY0FBYyxjQUZiLE1BQU07OzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1RoZW1lLCBUaGVtZUZvbnQsIFpfSU5ERVhfTEFZRVJTfSBmcm9tICcuLi9tb2RlbHMvdGhlbWUubW9kZWwnO1xyXG5pbXBvcnQge1RoZW1lQ2hhbmdlRGV0ZWN0aW9uU2VydmljZX0gZnJvbSAnLi90aGVtZS1jaGFuZ2UtZGV0ZWN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge0xvY2FsU3RvcmFnZVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9sb2NhbC1zdG9yYWdlLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGhlbWluZ1NlcnZpY2Uge1xyXG5cclxuICAvLyBQU0E6IE9SREVSIE1BVFRFUlMsIERPIE5PVCBNT1ZFIElURU1TIEFST1VORFxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFpJbmRleGVzOiBBcnJheTxzdHJpbmc+ID0gW1xyXG4gICAgWl9JTkRFWF9MQVlFUlMuQkFTRSxcclxuICAgIFpfSU5ERVhfTEFZRVJTLkZSQU1FLFxyXG4gICAgWl9JTkRFWF9MQVlFUlMuT1ZFUkxBWSxcclxuICAgIFpfSU5ERVhfTEFZRVJTLkRJQUxPRyxcclxuICAgIFpfSU5ERVhfTEFZRVJTLk5PVElGSUNBVElPTlxyXG4gIF07XHJcblxyXG4gIC8qKlxyXG4gICAqIFByZWZpeCB1c2VkIHRvIGJ1aWxkIHRoZSBrZXkgZm9yIGxvY2FsIHN0b3JhZ2Ugb2YgdGhlIHRoZW1lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBUSEVNRV9LRVkgPSAndGhlbWUnO1xyXG5cclxuICAvKipcclxuICAgKiBBIHByaXZhdGUgQmVoYXZpb3JTdWJqZWN0IHRvIHN0b3JlIHRoZSBsb2FkZWQgdGhlbWVzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0aGVtZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRoZW1lW10+KFtdKTtcclxuXHJcbiAgcHJpdmF0ZSAkc2VsZWN0ZWRUaGVtZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGhlbWU+KG51bGwgYXMgYW55KTtcclxuXHJcbiAgZ2V0IHNlbGVjdGVkVGhlbWUoKTogT2JzZXJ2YWJsZTxUaGVtZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuJHNlbGVjdGVkVGhlbWUuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogS2V5IGZvciB0aGUgcHJvZHVjdCB0aGlzIGlzIGRlcGxveWVkIGludG9cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXBwbGljYXRpb25OYW1lOiBzdHJpbmcgPSBudWxsIGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0b3JcclxuICAgKlxyXG4gICAqIEBwYXJhbSBsb2NhbFN0b3JhZ2VTZXJ2aWNlXHJcbiAgICogQHBhcmFtIHRoZW1lQ2hhbmdlRGV0ZWN0aW9uU2VydmljZVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0aGVtZUNoYW5nZURldGVjdGlvblNlcnZpY2U6IFRoZW1lQ2hhbmdlRGV0ZWN0aW9uU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydHMgYSBKU09OIHByb3BlcnR5IG5hbWUgdG8gc25ha2UgY2FzZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHByb3BcclxuICAgKi9cclxuICBwcml2YXRlIHRvU25ha2VDYXNlKHByb3A6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcHJvcC5zcGxpdCgvKD89W0EtWl0pLykuam9pbignXycpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvS2ViYWJDYXNlKHByb3A6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcHJvcC5zcGxpdCgvKD89W0EtWl0pLykuam9pbignLScpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnZlcnRVbmRlcnNjb3JlVG9EYXNoKHByb3A6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcHJvcC5zcGxpdCgnXycpLmpvaW4oJy0nKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yIHRoZSBnaXZlbiBjb2xvciwgaXQnbGwgbGlnaHRlbiBvciBkYXJrZW4gdGhlIGNvbG9yIGJ5IHRoZSBwZXJjZW50YWdlIHN1cHBsaWVkLiBQb3NpdGl2ZSBwZXJjZW50IHdpbGwgbGlnaHRlbiwgbmVnYXRpdmUgdG8gZGFya2VuLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvbG9yXHJcbiAgICogQHBhcmFtIHBlcmNlbnRcclxuICAgKi9cclxuICBwcml2YXRlIGxpZ2h0ZW5EYXJrZW5Db2xvcihjb2xvcjogc3RyaW5nLCBwZXJjZW50OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IHVzZVBvdW5kID0gZmFsc2U7XHJcbiAgICBpZiAoY29sb3JbMF0gPT09ICcjJykge1xyXG4gICAgICBjb2xvciA9IGNvbG9yLnNsaWNlKDEpO1xyXG4gICAgICB1c2VQb3VuZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbnVtID0gcGFyc2VJbnQoY29sb3IsIDE2KTtcclxuXHJcbiAgICBsZXQgciA9IChudW0gPj4gMTYpICsgcGVyY2VudDtcclxuICAgIGlmIChyID4gMjU1KSB7XHJcbiAgICAgIHIgPSAyNTU7XHJcbiAgICB9IGVsc2UgaWYgKHIgPCAwKSB7XHJcbiAgICAgIHIgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBiID0gKChudW0gPj4gOCkgJiAweDAwRkYpICsgcGVyY2VudDtcclxuICAgIGlmIChiID4gMjU1KSB7XHJcbiAgICAgIGIgPSAyNTU7XHJcbiAgICB9IGVsc2UgaWYgKGIgPCAwKSB7XHJcbiAgICAgIGIgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBnID0gKG51bSAmIDB4MDAwMEZGKSArIHBlcmNlbnQ7XHJcbiAgICBpZiAoZyA+IDI1NSkge1xyXG4gICAgICBnID0gMjU1O1xyXG4gICAgfSBlbHNlIGlmIChnIDwgMCkge1xyXG4gICAgICBnID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbmV3Q29sb3IgPSAoZyB8IChiIDw8IDgpIHwgKHIgPDwgMTYpKS50b1N0cmluZygxNik7XHJcblxyXG4gICAgd2hpbGUgKG5ld0NvbG9yLmxlbmd0aCA8IDYpIHtcclxuICAgICAgbmV3Q29sb3IgPSAnMCcgKyBuZXdDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKHVzZVBvdW5kID8gJyMnIDogJycpICsgbmV3Q29sb3I7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0cyBhIGhleCB2YWx1ZSB0byBhIEphdmFzY3JpcHQgb2JqZWN0IHdpdGggcixnLCBhbmQgYiB2YXJpYWJsZXMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaGV4XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoZXhUb1JnYihoZXg6IHN0cmluZyk6IGFueSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSAvXiM/KFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pJC9pLmV4ZWMoaGV4KTtcclxuICAgIHJldHVybiByZXN1bHQgPyB7XHJcbiAgICAgIHI6IHBhcnNlSW50KHJlc3VsdFsxXSwgMTYpLFxyXG4gICAgICBnOiBwYXJzZUludChyZXN1bHRbMl0sIDE2KSxcclxuICAgICAgYjogcGFyc2VJbnQocmVzdWx0WzNdLCAxNilcclxuICAgIH0gOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGVzIGEgcmFuZG9tIGhleCBjb2xvclxyXG4gICAqL1xyXG4gIGdldFJhbmRvbUNvbG9yKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJyMnICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTY3NzcyMTUpLnRvU3RyaW5nKDE2KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIEFwcCBJbml0aWFsaXphdGlvbiAoaW4gYXBwLmNvbXBvbmVudC50cywgbmdPbkluaXQpIGNhbGwgdGhpcyB0byBsb2FkIHRoZW1lcyBhbmQgYXBwbHkgdGhlIHVzZXIgc2VsZWN0ZWQgdGhlbWUgb3IgZGVmYXVsdCB0aGVtZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBhcHBsaWNhdGlvbk5hbWVcclxuICAgKiBAcGFyYW0gdGhlbWVzXHJcbiAgICovXHJcbiAgYXBwSW5pdChhcHBsaWNhdGlvbk5hbWU6IHN0cmluZywgdGhlbWVzOiBUaGVtZVtdKTogdm9pZCB7XHJcbiAgICAgIGlmICghYXBwbGljYXRpb25OYW1lKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHBsaWNhdGlvbiBOYW1lIHdhcyBub3Qgc3VwcGxpZWQuJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYXBwbGljYXRpb25OYW1lID0gYXBwbGljYXRpb25OYW1lO1xyXG4gICAgICB0aGlzLnRoZW1lcy5uZXh0KHRoZW1lcyk7XHJcbiAgICAgIHRoaXMuYXBwbHlTZXR0aW5ncygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSB0aGVtZXMgZm9yIHRoZSBjdXJyZW50IGFwcFxyXG4gICAqL1xyXG4gIGdldFRoZW1lcygpOiBPYnNlcnZhYmxlPFRoZW1lW10+IHtcclxuICAgIHJldHVybiB0aGlzLnRoZW1lcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IHRoZSBzZWxlY3RlZCB0aGVtZVxyXG4gICAqL1xyXG4gIGFwcGx5U2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0VGhlbWUoKTtcclxuICAgIHRoaXMuJHNlbGVjdGVkVGhlbWUubmV4dChzZXR0aW5ncyk7XHJcbiAgICB0aGlzLmNoYW5nZUNvbG9ycyhzZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgdGhlbWUgb2JqZWN0IGJhc2VkIG9uIGFub3RoZXIgdGhlbWUgb2JqZWN0XHJcbiAgICpcclxuICAgKiBAcGFyYW0gdGhlbWVcclxuICAgKi9cclxuICBnZW5lcmF0ZVRoZW1lKHRoZW1lPzogVGhlbWUpOiBUaGVtZSB7XHJcbiAgICBsZXQgbmV3VGhlbWU6IFRoZW1lID0ge30gYXMgVGhlbWU7XHJcbiAgICBpZiAodGhlbWUpIHtcclxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKHRoZW1lKSkge1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICBuZXdUaGVtZVtwcm9wXSA9IHRoZW1lW3Byb3BdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBuZXdUaGVtZSA9IHRoaXMudGhlbWVzLmdldFZhbHVlKCkuZmluZCh0aGVUaGVtZSA9PiB0aGVUaGVtZS5pc0RlZmF1bHQpIGFzIFRoZW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXdUaGVtZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBjb2xvciBjbGFzc2VzIHNwZWNpZmljYWxseSBiYXNlZCBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgdGhlbWUgbW9kZWxcclxuICAgKi9cclxuICBnZXRDbGFzc2VzRnJvbVRoZW1lKHRoZW1lOiBUaGVtZSk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGNsYXNzZXMgPSBbXTtcclxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGVtZSkpIHtcclxuICAgICAgaWYgKHByb3AudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYmcnKSB8fCBwcm9wLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2NvbG9yJykpIHtcclxuICAgICAgICBjbGFzc2VzLnB1c2gocHJvcC5zcGxpdCgvKD89W0EtWl0pLykuam9pbignXycpLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNsYXNzZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSB1c2VyIHNlbGVjdGVkIHRoZW1lIGZyb20gbG9jYWwgc3RvcmFnZVxyXG4gICAqL1xyXG4gIGdldFRoZW1lKCk6IFRoZW1lIHtcclxuICAgIGNvbnN0IHRoZW1lSWQgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0T2JqZWN0KHRoaXMuYXBwbGljYXRpb25OYW1lICsgdGhpcy5USEVNRV9LRVkpO1xyXG4gICAgbGV0IGRlZmF1bHRUaGVtZSA9IHRoaXMudGhlbWVzLnZhbHVlLmZpbHRlcih0aGVtZSA9PiB0aGVtZS5pc0RlZmF1bHQpWzBdO1xyXG5cclxuICAgIGZvciAoY29uc3QgdGhlbWUgb2YgdGhpcy50aGVtZXMudmFsdWUpIHtcclxuICAgICAgaWYgKHRoZW1lLnRoZW1lSWQgPT09IHRoZW1lSWQpIHtcclxuICAgICAgICByZXR1cm4gdGhlbWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGVmYXVsdFRoZW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyc2lzdHMgdGhlIHVzZXIgc2VsZWN0ZWQgdGhlbWUgaW4gbG9jYWwgc3RvcmFnZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHNldHRpbmdzXHJcbiAgICovXHJcbiAgc2F2ZVRoZW1lKHNldHRpbmdzOiBUaGVtZSk6IHZvaWQge1xyXG4gICAgdGhpcy4kc2VsZWN0ZWRUaGVtZS5uZXh0KHNldHRpbmdzKTtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5wdXRPYmplY3QodGhpcy5hcHBsaWNhdGlvbk5hbWUgKyB0aGlzLlRIRU1FX0tFWSwgc2V0dGluZ3MudGhlbWVJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXcml0ZXMgdGhlIHRoZW1lIGluZm9ybWF0aW9uIHRvIGEgc3R5bGUgdGFnIGluIHRoZSBoZWFkZXIgc28gdGhhdCB0aGUgdGhlbWUgaXMgYXBwbGllZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB0aGVtZVxyXG4gICAqIEBwYXJhbSBwcmVmaXhcclxuICAgKi9cclxuICBjaGFuZ2VDb2xvcnModGhlbWU6IFRoZW1lLCBwcmVmaXg/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghcHJlZml4KSB7XHJcbiAgICAgIHByZWZpeCA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuICAgIGxldCByb290VmFycyA9ICc6cm9vdCB7JztcclxuXHJcbiAgICAvLyBSZW5kZXIgdGhlIGNvbG9yIHBhbGV0dGUgc3R5bGVzXHJcbiAgICBpZiAodGhlbWUuY29sb3JQYWxldHRlKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGVtZS5jb2xvclBhbGV0dGUpKSB7XHJcbiAgICAgICAgaWYgKHByb3AgIT09ICdleHRlbnNpb24nKSB7XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGVtZS5jb2xvclBhbGV0dGUgYXMgYW55KVtwcm9wXSBhcyBzdHJpbmc7XHJcblxyXG4gICAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLmFkZEhhc2htYXJrKHZhbHVlKTtcclxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDb2xvcnMoc3R5bGUsIGNvbG9yLCBwcmVmaXggKyB0aGlzLnRvU25ha2VDYXNlKHByb3ApKTtcclxuXHJcbiAgICAgICAgICByb290VmFycyArPSBgLS0ke3ByZWZpeH0ke3RoaXMudG9LZWJhYkNhc2UocHJvcCl9LWNvbG9yOiAke2NvbG9yfTtgO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgdGhlbWUuY29sb3JQYWxldHRlLmV4dGVuc2lvbikge1xyXG4gICAgICAgIGlmIChleHRlbnNpb24udGV4dENvbG9yICYmICFleHRlbnNpb24uY29sb3IpIHtcclxuICAgICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9JHtleHRlbnNpb24uY2xhc3NOYW1lfXtjb2xvcjogJHt0aGlzLmFkZEhhc2htYXJrKGV4dGVuc2lvbi50ZXh0Q29sb3IpfTt9YCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5jb2xvcikge1xyXG4gICAgICAgICAgaWYgKCFleHRlbnNpb24udGV4dENvbG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVDb2xvcnMoc3R5bGUsIHRoaXMuYWRkSGFzaG1hcmsoZXh0ZW5zaW9uLmNvbG9yIGFzIHN0cmluZyksIHByZWZpeCArIGV4dGVuc2lvbi5jbGFzc05hbWUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC4ke3ByZWZpeH0ke2V4dGVuc2lvbi5jbGFzc05hbWV9e2JhY2tncm91bmQtY29sb3I6ICR7dGhpcy5hZGRIYXNobWFyayhleHRlbnNpb24uY29sb3IpfTtjb2xvcjogJHt0aGlzLmFkZEhhc2htYXJrKGV4dGVuc2lvbi50ZXh0Q29sb3IpfTtmaWxsOiBjdXJyZW50Q29sb3I7fWApKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByb290VmFycyArPSBgLS0ke3ByZWZpeH0ke3RoaXMuY29udmVydFVuZGVyc2NvcmVUb0Rhc2goZXh0ZW5zaW9uLmNsYXNzTmFtZSl9OiAke3RoaXMuYWRkSGFzaG1hcmsoZXh0ZW5zaW9uLmNvbG9yIGFzIHN0cmluZyl9O2A7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVuZGVyIHRoZSBsYXlvdXQgY29sb3Igc3R5bGVzXHJcbiAgICBpZiAodGhlbWUubGF5b3V0Q29sb3JzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGVtZS5sYXlvdXRDb2xvcnMpKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSAodGhlbWUubGF5b3V0Q29sb3JzIGFzIGFueSlbcHJvcF0gYXMgc3RyaW5nO1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvciA9IHZhbHVlLnN0YXJ0c1dpdGgoJyMnKSA/IHZhbHVlIDogJyMnICsgdmFsdWU7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNvbG9ycyhzdHlsZSwgY29sb3IsIHByZWZpeCArIHRoaXMudG9TbmFrZUNhc2UocHJvcCkpO1xyXG4gICAgICAgIHJvb3RWYXJzICs9IGAtLSR7cHJlZml4fSR7dGhpcy50b0tlYmFiQ2FzZShwcm9wKX06ICR7Y29sb3J9O2A7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmlzRGFya1RoZW1lKHRoZW1lLmxheW91dENvbG9ycy5ib2R5Q29sb3IpKSB7XHJcbiAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC4ke3ByZWZpeH1iZ19vdmVybGF5e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwLjA1KTtjb2xvcjppbmhlcml0O31gKSk7XHJcbiAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC4ke3ByZWZpeH1iZ19vdmVybGF5X3JldntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMC4wNSk7Y29sb3I6aW5oZXJpdDt9YCkpO1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9YnJkcntib3JkZXI6MXB4IHNvbGlkIHJnYmEoMTUwLDE1MCwxNTAsMC41KTt9YCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9Ymdfb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMC4xKTtjb2xvcjppbmhlcml0O31gKSk7XHJcbiAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC4ke3ByZWZpeH1iZ19vdmVybGF5X3JldntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMC4wNCk7Y29sb3I6aW5oZXJpdDt9YCkpO1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9YnJkcntib3JkZXI6MXB4IHNvbGlkIHJnYmEoMTUwLDE1MCwxNTAsMC41KTt9YCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoZW1lLmFjY2Vzc2liaWxpdHkgJiYgdGhlbWUuYWNjZXNzaWJpbGl0eS5lbmFibGVkKSB7XHJcbiAgICAgIGNvbnN0IG91dGxpbmVDb2xvciA9IHRoZW1lLmFjY2Vzc2liaWxpdHkuaGlnaGxpZ2h0Q29sb3Iuc3RhcnRzV2l0aCgnIycpID8gdGhlbWUuYWNjZXNzaWJpbGl0eS5oaWdobGlnaHRDb2xvciA6ICcjJyArIHRoZW1lLmFjY2Vzc2liaWxpdHkuaGlnaGxpZ2h0Q29sb3I7XHJcbiAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9YWNjZXNze291dGxpbmU6ICR7b3V0bGluZUNvbG9yfSAke3RoZW1lLmFjY2Vzc2liaWxpdHkuaGlnaGxpZ2h0VGhpY2tuZXNzfSBzb2xpZCAhaW1wb3J0YW50O291dGxpbmUtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7dHJhbnNpdGlvbjphbGwgMC4zcyBlYXNlLWluLW91dDt9YCkpO1xyXG4gICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgLiR7cHJlZml4fWFjY2Vzczpmb2N1c3tvdXRsaW5lOiAke291dGxpbmVDb2xvcn0gJHt0aGVtZS5hY2Nlc3NpYmlsaXR5LmhpZ2hsaWdodFRoaWNrbmVzc30gc29saWQgIWltcG9ydGFudDtvdXRsaW5lLW9mZnNldDogJHt0aGVtZS5hY2Nlc3NpYmlsaXR5LmhpZ2hsaWdodE9mZnNldH07fWApKTtcclxuXHJcbiAgICAgIGlmICh0aGVtZS5hY2Nlc3NpYmlsaXR5LmhvdmVyRW5hYmxlZCkge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9YWNjZXNzOmhvdmVye291dGxpbmU6ICR7b3V0bGluZUNvbG9yfSAke3RoZW1lLmFjY2Vzc2liaWxpdHkuaGlnaGxpZ2h0VGhpY2tuZXNzfSBzb2xpZCAhaW1wb3J0YW50O291dGxpbmUtb2Zmc2V0OiAke3RoZW1lLmFjY2Vzc2liaWxpdHkuaGlnaGxpZ2h0T2Zmc2V0fTt9YCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVuZGVyIHRoZSBidXR0b24gY29sb3Igc3R5bGVzXHJcbiAgICBpZiAodGhlbWUuYnV0dG9uQ29sb3JQYWxldHRlKSB7XHJcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyh0aGVtZS5idXR0b25Db2xvclBhbGV0dGUpKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSAodGhlbWUuYnV0dG9uQ29sb3JQYWxldHRlIGFzIGFueSlbcHJvcF0gYXMgc3RyaW5nO1xyXG5cclxuICAgICAgICBjb25zdCBjb2xvciA9IHZhbHVlLnN0YXJ0c1dpdGgoJyMnKSA/IHZhbHVlIDogJyMnICsgdmFsdWU7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNvbG9ycyhzdHlsZSwgY29sb3IsIHByZWZpeCArIHRoaXMudG9TbmFrZUNhc2UocHJvcCkpO1xyXG5cclxuICAgICAgICByb290VmFycyArPSBgLS0ke3ByZWZpeH0ke3RoaXMudG9LZWJhYkNhc2UocHJvcCl9OiAke2NvbG9yfTtgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoZW1lLnN0eWxpbmdWYXJpYWJsZXMpIHtcclxuICAgICAgaWYgKHRoZW1lLnN0eWxpbmdWYXJpYWJsZXMuaW5wdXRUZXh0U2l6ZSkge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9cHRsX2lucHV0X3RleHRfc2l6ZXtmb250LXNpemU6ICR7dGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5pbnB1dFRleHRTaXplfTt9YCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5pbnB1dExhYmVsU2l6ZSkge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9cHRsX2lucHV0X2xhYmVsX3NpemV7Zm9udC1zaXplOiAke3RoZW1lLnN0eWxpbmdWYXJpYWJsZXMuaW5wdXRMYWJlbFNpemV9O31gKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGVtZS5zdHlsaW5nVmFyaWFibGVzLmlucHV0QmdDb2xvcikge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9cHRsX2lucHV0X2JnX2NvbG9ye2JhY2tncm91bmQtY29sb3I6ICR7dGhpcy5hZGRIYXNobWFyayh0aGVtZS5zdHlsaW5nVmFyaWFibGVzLmlucHV0QmdDb2xvcil9O2NvbG9yOiAke3RoaXMuZ2V0VGV4dENvbG9yKHRoZW1lLnN0eWxpbmdWYXJpYWJsZXMuaW5wdXRCZ0NvbG9yKX19YCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5ib3JkZXJDb2xvcikge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9cHRsX2JyZHJfY29sb3J7Ym9yZGVyLWNvbG9yOiAke3RoaXMuYWRkSGFzaG1hcmsodGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5ib3JkZXJDb2xvcil9O31gKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGVtZS5zdHlsaW5nVmFyaWFibGVzLmJvcmRlclNpemUpIHtcclxuICAgICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgLiR7cHJlZml4fXB0bF9icmRyX3NpemV7Ym9yZGVyLXdpZHRoOiAke3RoZW1lLnN0eWxpbmdWYXJpYWJsZXMuYm9yZGVyU2l6ZX07Ym9yZGVyLXN0eWxlOnNvbGlkO31gKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGVtZS5zdHlsaW5nVmFyaWFibGVzLmJvcmRlclJhZGl1cykge1xyXG4gICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtwcmVmaXh9cHRsX2JyZHJfcmFkaXVze2JvcmRlci1yYWRpdXM6ICR7dGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5ib3JkZXJSYWRpdXN9O31gKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGVtZS5zdHlsaW5nVmFyaWFibGVzLmlucHV0SGVpZ2h0KSB7XHJcbiAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC4ke3ByZWZpeH1wdGxfaW5wdXRfaGVpZ2h0e2hlaWdodDogJHt0aGVtZS5zdHlsaW5nVmFyaWFibGVzLmlucHV0SGVpZ2h0fTt9YCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5pbnB1dFBhZGRpbmcpIHtcclxuICAgICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgLiR7cHJlZml4fXB0bF9pbnB1dF9wYWRkaW5ne3BhZGRpbmc6ICR7dGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy5pbnB1dFBhZGRpbmd9O31gKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGVtZS5zdHlsaW5nVmFyaWFibGVzLnRvb2x0aXBUZXh0U2l6ZSB8fCB0aGVtZS5zdHlsaW5nVmFyaWFibGVzLnRvb2x0aXBCYWNrZ3JvdW5kQ29sb3IpIHtcclxuICAgICAgICBjb25zdCBiZ0NvbG9yID0gdGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy50b29sdGlwQmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgIGNvbnN0IHRleHRTaXplID0gdGhlbWUuc3R5bGluZ1ZhcmlhYmxlcy50b29sdGlwVGV4dFNpemU7XHJcbiAgICAgICAgY29uc3QgYm9yZGVyU2l6ZSA9IHRoZW1lLnN0eWxpbmdWYXJpYWJsZXMudG9vbHRpcEJvcmRlclNpemU7XHJcbiAgICAgICAgY29uc3QgYm9yZGVyQ29sb3IgPSB0aGVtZS5zdHlsaW5nVmFyaWFibGVzLnRvb2x0aXBCb3JkZXJDb2xvcjtcclxuICAgICAgICBjb25zdCBjYXJldFNpemUgPSB0aGVtZS5zdHlsaW5nVmFyaWFibGVzLnRvb2x0aXBDYXJldFNpemUgPz8gJzZweCc7XHJcblxyXG4gICAgICAgIGxldCB0b29sdGlwU3R5bGUgPSAnLnBhcnRpY2xlX3Rvb2x0aXB7JztcclxuXHJcbiAgICAgICAgaWYgKGJnQ29sb3IpIHtcclxuICAgICAgICAgIGNvbnN0IHRleHRDb2xvciA9IHRoaXMuZ2V0VGV4dENvbG9yKGJnQ29sb3IpO1xyXG4gICAgICAgICAgdG9vbHRpcFN0eWxlICs9IGBjb2xvcjogJHt0ZXh0Q29sb3J9O2A7XHJcbiAgICAgICAgICB0b29sdGlwU3R5bGUgKz0gYGJhY2tncm91bmQtY29sb3I6ICR7YmdDb2xvcn07YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChib3JkZXJDb2xvciAmJiBib3JkZXJTaXplKSB7XHJcbiAgICAgICAgICB0b29sdGlwU3R5bGUgKz0gYGJvcmRlcjogJHtib3JkZXJTaXplfSBzb2xpZCAke2JvcmRlckNvbG9yfTtgO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRleHRTaXplKSB7XHJcbiAgICAgICAgICB0b29sdGlwU3R5bGUgKz0gJ2ZvbnQtc2l6ZTogJyArIHRleHRTaXplICsgJzsnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdG9vbHRpcFN0eWxlICs9ICd9JztcclxuICAgICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0b29sdGlwU3R5bGUpKTtcclxuXHJcbiAgICAgICAgbGV0IGNhcmV0U3R5bGVDb2xvcjogc3RyaW5nID0gbnVsbCBhcyBhbnk7XHJcbiAgICAgICAgaWYgKGJvcmRlckNvbG9yICYmIGJvcmRlclNpemUpIHtcclxuICAgICAgICAgIGNhcmV0U3R5bGVDb2xvciA9IGJvcmRlckNvbG9yO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYmdDb2xvcikge1xyXG4gICAgICAgICAgY2FyZXRTdHlsZUNvbG9yID0gYmdDb2xvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYXJldFN0eWxlQ29sb3IpIHtcclxuICAgICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAucGFydGljbGVfdG9vbHRpcC5yaWdodDo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCAke2NhcmV0U3R5bGVDb2xvcn0gdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7bWFyZ2luLXRvcDogLSR7Y2FyZXRTaXplfTtib3JkZXItd2lkdGg6ICR7Y2FyZXRTaXplfTt9YCkpO1xyXG4gICAgICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC5wYXJ0aWNsZV90b29sdGlwLmxlZnQ6OmFmdGVye2JvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgJHtjYXJldFN0eWxlQ29sb3J9O21hcmdpbi10b3A6IC0ke2NhcmV0U2l6ZX07Ym9yZGVyLXdpZHRoOiAke2NhcmV0U2l6ZX07fWApKTtcclxuICAgICAgICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAucGFydGljbGVfdG9vbHRpcC50b3A6OmFmdGVye2JvcmRlci1jb2xvcjogJHtjYXJldFN0eWxlQ29sb3J9IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O21hcmdpbi1sZWZ0OiAtJHtjYXJldFNpemV9O2JvcmRlci13aWR0aDogJHtjYXJldFNpemV9O31gKSk7XHJcbiAgICAgICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgLnBhcnRpY2xlX3Rvb2x0aXAuYm90dG9tOjphZnRlcntib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICR7Y2FyZXRTdHlsZUNvbG9yfSB0cmFuc3BhcmVudDttYXJnaW4tbGVmdDogLSR7Y2FyZXRTaXplfTtib3JkZXItd2lkdGg6ICR7Y2FyZXRTaXplfTt9YCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07XHJcblxyXG4gICAgdGhpcy5yZW1vdmVUaGVtZUZyb21IZWFkZXIocHJlZml4KTtcclxuXHJcbiAgICAvLyBXcml0ZSB0aGUgZm9udHMgdG8gdGhlIGhlYWRlclxyXG4gICAgaWYgKHByZWZpeCA9PT0gJycpIHtcclxuICAgICAgdGhpcy5hZGRGb250cyh0aGVtZSwgaGVhZCwgc3R5bGUpO1xyXG4gICAgICByb290VmFycyA9IHRoaXMuY3JlYXRlWkluZGV4ZXMocm9vdFZhcnMsIHRoZW1lLnpJbmRleExpc3QgYXMgQXJyYXk8c3RyaW5nPik7XHJcbiAgICB9XHJcblxyXG4gICAgcm9vdFZhcnMgKz0gJ30nO1xyXG4gICAgc3R5bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocm9vdFZhcnMpKTtcclxuICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgnaWQnLCAocHJlZml4ID8gcHJlZml4ICsgJy0nIDogJycpICsgJ3BhcnRpY2xlLXRoZW1lJyk7XHJcbiAgICBoZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcclxuXHJcbiAgICB0aGlzLnRoZW1lQ2hhbmdlRGV0ZWN0aW9uU2VydmljZS5jaGFuZ2VUaGVtZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRIYXNobWFyayhjb2xvcjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBjb2xvci5zdGFydHNXaXRoKCcjJykgPyBjb2xvciA6ICcjJyArIGNvbG9yO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRGb250cyh0aGVtZTogVGhlbWUsIGhlYWQ6IEhUTUxIZWFkRWxlbWVudCwgc3R5bGU6IEhUTUxTdHlsZUVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhlbWUuZm9udHMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkZWZhdWx0Rm9udDogVGhlbWVGb250ID0gbnVsbCBhcyBhbnk7XHJcbiAgICBmb3IgKGNvbnN0IGZvbnQgb2YgdGhlbWUuZm9udHMpIHtcclxuICAgICAgaWYgKGZvbnQuaXNEZWZhdWx0IHx8IHRoZW1lLmZvbnRzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGRlZmF1bHRGb250ID0gZm9udDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLmZvbnRFeGlzdHMoaGVhZCwgZm9udCkpIHtcclxuICAgICAgICBsZXQgZWxlbWVudDogSFRNTExpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xyXG4gICAgICAgIGlmIChmb250LnNvdXJjZSA9PT0gJ2Fkb2JlJykge1xyXG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBgaHR0cHM6Ly91c2UudHlwZWtpdC5uZXQvJHtmb250LmlkfS5jc3NgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBgaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PSR7Zm9udC5uYW1lLnJlcGxhY2UoJyAnLCAnKycpfSZkaXNwbGF5PXN3YXBgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdzdHlsZXNoZWV0Jyk7XHJcbiAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGBodG1sICogeyBmb250LWZhbWlseTogJHtkZWZhdWx0Rm9udC5uYW1lfSwgJHtkZWZhdWx0Rm9udC5pc1NlcmlmID8gJ3NlcmlmJyA6ICdzYW5zLXNlcmlmJ307IH1gKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvbnRFeGlzdHMoaGVhZDogSFRNTEhlYWRFbGVtZW50LCBmb250OiBUaGVtZUZvbnQpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgPGFueT5oZWFkLmNoaWxkTm9kZXMpIHtcclxuICAgICAgaWYgKGNoaWxkLmhyZWYgJiYgZm9udC5zb3VyY2UgPT09ICdhZG9iZScgJiYgY2hpbGQuaHJlZi5pbmRleE9mKGZvbnQuaWQpID4gLTEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmIChjaGlsZC5ocmVmICYmIGNoaWxkLmhyZWYuaW5kZXhPZihmb250Lm5hbWUucmVwbGFjZSgnICcsICcrJykpID4gLTEpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVRoZW1lRnJvbUhlYWRlcihwcmVmaXg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIDxhbnk+aGVhZC5jaGlsZE5vZGVzKSB7XHJcbiAgICAgIGlmICgoY2hpbGQgYXMgRWxlbWVudCkuaWQgPT09IChwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJykgKyAncGFydGljbGUtdGhlbWUnKSB7XHJcbiAgICAgICAgaGVhZC5yZW1vdmVDaGlsZChjaGlsZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgdGhlIGNvbnRyYXN0IGJldHdlZW4gYSBnaXZlbiBjb2xvciBhbmQgaXRzIGF1dG8tc2VsZWN0ZWQgdGV4dCBjb2xvclxyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvbG9yXHJcbiAgICovXHJcbiAgZ2V0Q29udHJhc3QoY29sb3I6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBjb2xvclJnYiA9IHRoaXMuaGV4VG9SZ2IoY29sb3IpO1xyXG4gICAgY29uc3QgdGV4dENvbG9yUmdiID0gdGhpcy5oZXhUb1JnYih0aGlzLmdldFRleHRDb2xvcihjb2xvcikpO1xyXG4gICAgcmV0dXJuIHRoaXMuY29udHJhc3QoY29sb3JSZ2IsIHRleHRDb2xvclJnYik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxjdWxhdGVzIGx1bWluYW5jZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJcclxuICAgKiBAcGFyYW0gZ1xyXG4gICAqIEBwYXJhbSBiXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsdW1pbmFuY2UocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBjb25zdCBhID0gW3IsIGcsIGJdLm1hcChmdW5jdGlvbiAodikge1xyXG4gICAgICB2IC89IDI1NTtcclxuICAgICAgcmV0dXJuIHYgPD0gMC4wMzkyOFxyXG4gICAgICAgID8gdiAvIDEyLjkyXHJcbiAgICAgICAgOiBNYXRoLnBvdygodiArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYVswXSAqIDAuMjEyNiArIGFbMV0gKiAwLjcxNTIgKyBhWzJdICogMC4wNzIyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0RhcmtUaGVtZShjb2xvcjogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCByZ2IgPSB0aGlzLmhleFRvUmdiKGNvbG9yKTtcclxuICAgIHJldHVybiAodGhpcy5sdW1pbmFuY2UocmdiLnIsIHJnYi5nLCByZ2IuYikgKiAxMDApIDwgNTA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxjdWxhdGVzIHRoZSBjb250cmFzdFxyXG4gICAqXHJcbiAgICogQHBhcmFtIHJnYjFcclxuICAgKiBAcGFyYW0gcmdiMlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY29udHJhc3QocmdiMTogYW55LCByZ2IyOiBhbnkpOiBudW1iZXIge1xyXG4gICAgbGV0IGNvbnRyYXN0ID0gKHRoaXMubHVtaW5hbmNlKHJnYjEuciwgcmdiMS5nLCByZ2IxLmIpICsgMC4wNSlcclxuICAgICAgLyAodGhpcy5sdW1pbmFuY2UocmdiMi5yLCByZ2IyLmcsIHJnYjIuYikgKyAwLjA1KTtcclxuXHJcbiAgICBpZiAoY29udHJhc3QgPCAxKSB7XHJcbiAgICAgIGNvbnRyYXN0ID0gKHRoaXMubHVtaW5hbmNlKHJnYjIuciwgcmdiMi5nLCByZ2IyLmIpICsgMC4wNSlcclxuICAgICAgICAvICh0aGlzLmx1bWluYW5jZShyZ2IxLnIsIHJnYjEuZywgcmdiMS5iKSArIDAuMDUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb250cmFzdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG1heGltYWxseSBjb250cmFzdGluZyB0ZXh0IGNvbG9yIGZvciB0aGUgc3VwcGxpZWQgYmFja2dyb3VuZCBjb2xvclxyXG4gICAqXHJcbiAgICogQHBhcmFtIGNvbG9yXHJcbiAgICovXHJcbiAgZ2V0VGV4dENvbG9yKGNvbG9yOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmdiID0gdGhpcy5oZXhUb1JnYihjb2xvcik7XHJcbiAgICBsZXQgdGV4dFJnYiA9IHRoaXMuaGV4VG9SZ2IoJyNGRkZGRkYnKTtcclxuICAgIGNvbnN0IHdoaXRlQ29udHJhc3QgPSB0aGlzLmNvbnRyYXN0KHRleHRSZ2IsIHJnYik7XHJcblxyXG4gICAgdGV4dFJnYiA9IHRoaXMuaGV4VG9SZ2IoJyMyMjIyMjInKTtcclxuICAgIGNvbnN0IGJsYWNrQ29udHJhc3QgPSB0aGlzLmNvbnRyYXN0KHRleHRSZ2IsIHJnYik7XHJcblxyXG4gICAgLy8gNyBpcyB0aGUgY29udHJhc3QgcmF0aW8gZm9yIFdDQUcgQUFBLCBpZiB3ZSdyZSBsZXNzIHRoYW4gdGhhdCwgZ28gZnVsbCBibGFjayBmb3IgbWF4IGNvbnRyYXN0XHJcbiAgICBpZiAoYmxhY2tDb250cmFzdCA+IHdoaXRlQ29udHJhc3QgJiYgYmxhY2tDb250cmFzdCA8IDcpIHtcclxuICAgICAgcmV0dXJuICcjMDAwMDAwJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gd2hpdGVDb250cmFzdCA+IGJsYWNrQ29udHJhc3QgPyAnI0ZGRkZGRicgOiAnIzIyMjIyMic7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgdGhlIENTUyBmb3IgZWFjaCBvZiB0aGUgY29sb3JzIGluIHRoZSB0aGVtZS4gV2lsbCB3cml0ZSB0aGUgYmFzZSBjb2xvciBhbmQgOSBsaWdodCBhbmQgZGFyayB2YXJpYW50cyBvZiB0aGUgZ2l2ZW4gY29sb3IuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gc3R5bGVcclxuICAgKiBAcGFyYW0gY29sb3JcclxuICAgKiBAcGFyYW0gY2xhc3NOYW1lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUNvbG9ycyhzdHlsZTogSFRNTFN0eWxlRWxlbWVudCwgY29sb3I6IHN0cmluZywgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghY29sb3IpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0ZXh0Q29sb3IgPSB0aGlzLmdldFRleHRDb2xvcihjb2xvcik7XHJcbiAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShgLiR7Y2xhc3NOYW1lfXtiYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9yfTtjb2xvcjogJHt0ZXh0Q29sb3J9O2ZpbGw6IGN1cnJlbnRDb2xvcjt9YCkpO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCAxMDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IG5ld0NvbG9yID0gdGhpcy5saWdodGVuRGFya2VuQ29sb3IoY29sb3IsIGkgKiAxMCk7XHJcbiAgICAgIHRleHRDb2xvciA9IHRoaXMuZ2V0VGV4dENvbG9yKG5ld0NvbG9yKTtcclxuXHJcbiAgICAgIHN0eWxlLmFwcGVuZENoaWxkKFxyXG4gICAgICAgIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAuJHtjbGFzc05hbWV9X2xpZ2h0XyR7aX17YmFja2dyb3VuZC1jb2xvcjogJHtuZXdDb2xvcn07Y29sb3I6ICR7dGV4dENvbG9yfTtmaWxsOiBjdXJyZW50Q29sb3I7fWApKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IDEwOyBpKyspIHtcclxuICAgICAgY29uc3QgbmV3Q29sb3IgPSB0aGlzLmxpZ2h0ZW5EYXJrZW5Db2xvcihjb2xvciwgMCAtIChpICogMTApKTtcclxuICAgICAgdGV4dENvbG9yID0gdGhpcy5nZXRUZXh0Q29sb3IobmV3Q29sb3IpO1xyXG5cclxuICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoXHJcbiAgICAgICAgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYC4ke2NsYXNzTmFtZX1fZGFya18ke2l9e2JhY2tncm91bmQtY29sb3I6ICR7bmV3Q29sb3J9O2NvbG9yOiAke3RleHRDb2xvcn07ZmlsbDogY3VycmVudENvbG9yO31gKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXREZWZhdWx0WkluZGV4ZXMoKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0WkluZGV4ZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVpJbmRleGVzKHJvb3RWYXJzOiBzdHJpbmcsIHpJbmRleGVzOiBBcnJheTxzdHJpbmc+KTogc3RyaW5nIHtcclxuICAgIGxldCB6SW5kZXhlc1RvQ3JlYXRlID0gdGhpcy5kZWZhdWx0WkluZGV4ZXM7XHJcblxyXG4gICAgaWYgKHpJbmRleGVzKSB7XHJcbiAgICAgIGlmICh6SW5kZXhlcy5pbmNsdWRlcyhaX0lOREVYX0xBWUVSUy5CQVNFKVxyXG4gICAgICAgICYmIHpJbmRleGVzLmluY2x1ZGVzKFpfSU5ERVhfTEFZRVJTLkZSQU1FKVxyXG4gICAgICAgICYmIHpJbmRleGVzLmluY2x1ZGVzKFpfSU5ERVhfTEFZRVJTLk9WRVJMQVkpXHJcbiAgICAgICAgJiYgekluZGV4ZXMuaW5jbHVkZXMoWl9JTkRFWF9MQVlFUlMuRElBTE9HKVxyXG4gICAgICAgICYmIHpJbmRleGVzLmluY2x1ZGVzKFpfSU5ERVhfTEFZRVJTLk5PVElGSUNBVElPTilcclxuICAgICAgKSB7XHJcbiAgICAgICAgekluZGV4ZXNUb0NyZWF0ZSA9IHpJbmRleGVzO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignVEhFTUlORzogWiBJbmRleCBMaXN0IG1pc3NpbmcgcmVxdWlyZWQgbGF5ZXJzLCBpZ25vcmluZyBwcm92aWRlZCBsaXN0LicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZm9yIChjb25zdCB6SW5kZXggb2YgekluZGV4ZXNUb0NyZWF0ZSkge1xyXG4gICAgICByb290VmFycyArPSBgLS16LSR7ekluZGV4fTogJHtpKyt9O2A7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJvb3RWYXJzO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|