ngx-material-navigation 0.0.1
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/CONTRIBUTING.md +97 -0
- package/LICENSE.md +21 -0
- package/README.md +119 -0
- package/components/footer/footer.component.d.ts +13 -0
- package/components/footer/footer.module.d.ts +8 -0
- package/components/navbar/nav-element/nav-element.component.d.ts +35 -0
- package/components/navbar/nav-element/nav-element.module.d.ts +13 -0
- package/components/navbar/nav-menu/nav-menu.component.d.ts +42 -0
- package/components/navbar/nav-menu/nav-menu.module.d.ts +11 -0
- package/components/navbar/navbar.component.d.ts +53 -0
- package/components/navbar/navbar.module.d.ts +11 -0
- package/esm2020/components/footer/footer.component.mjs +17 -0
- package/esm2020/components/footer/footer.module.mjs +22 -0
- package/esm2020/components/navbar/nav-element/nav-element.component.mjs +51 -0
- package/esm2020/components/navbar/nav-element/nav-element.module.mjs +42 -0
- package/esm2020/components/navbar/nav-menu/nav-menu.component.mjs +71 -0
- package/esm2020/components/navbar/nav-menu/nav-menu.module.mjs +34 -0
- package/esm2020/components/navbar/navbar.component.mjs +97 -0
- package/esm2020/components/navbar/navbar.module.mjs +34 -0
- package/esm2020/models/nav-button.model.mjs +2 -0
- package/esm2020/models/nav-image.model.mjs +2 -0
- package/esm2020/models/nav-link.model.mjs +8 -0
- package/esm2020/models/nav-menu.model.mjs +2 -0
- package/esm2020/models/nav-title.model.mjs +2 -0
- package/esm2020/models/nav.model.mjs +4 -0
- package/esm2020/models/navbar.model.mjs +2 -0
- package/esm2020/ngx-material-navigation.mjs +5 -0
- package/esm2020/public-api.mjs +16 -0
- package/esm2020/utilities/nav.utilities.mjs +198 -0
- package/fesm2015/ngx-material-navigation.mjs +551 -0
- package/fesm2015/ngx-material-navigation.mjs.map +1 -0
- package/fesm2020/ngx-material-navigation.mjs +551 -0
- package/fesm2020/ngx-material-navigation.mjs.map +1 -0
- package/models/nav-button.model.d.ts +11 -0
- package/models/nav-image.model.d.ts +40 -0
- package/models/nav-link.model.d.ts +39 -0
- package/models/nav-menu.model.d.ts +28 -0
- package/models/nav-title.model.d.ts +52 -0
- package/models/nav.model.d.ts +23 -0
- package/models/navbar.model.d.ts +11 -0
- package/ngx-material-navigation.d.ts +5 -0
- package/package.json +39 -0
- package/public-api.d.ts +12 -0
- package/utilities/nav.utilities.d.ts +81 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contains HelperMethods around handling Navigation.
|
|
3
|
+
*/
|
|
4
|
+
export class NavUtilities {
|
|
5
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
6
|
+
static asTitle(element) {
|
|
7
|
+
return element;
|
|
8
|
+
}
|
|
9
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
10
|
+
static asAngularRoute(route) {
|
|
11
|
+
return route;
|
|
12
|
+
}
|
|
13
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
14
|
+
static asStringRoute(route) {
|
|
15
|
+
return route;
|
|
16
|
+
}
|
|
17
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
18
|
+
static asInternalLink(element) {
|
|
19
|
+
return element;
|
|
20
|
+
}
|
|
21
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
22
|
+
static asExternalLink(element) {
|
|
23
|
+
return element;
|
|
24
|
+
}
|
|
25
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
26
|
+
static asMenu(element) {
|
|
27
|
+
return element;
|
|
28
|
+
}
|
|
29
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
30
|
+
static asButton(element) {
|
|
31
|
+
return element;
|
|
32
|
+
}
|
|
33
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
34
|
+
static asImage(element) {
|
|
35
|
+
return element;
|
|
36
|
+
}
|
|
37
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
38
|
+
static asImageWithInternalLink(element) {
|
|
39
|
+
return element;
|
|
40
|
+
}
|
|
41
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
42
|
+
static asImageWithExternalLink(element) {
|
|
43
|
+
return element;
|
|
44
|
+
}
|
|
45
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
46
|
+
static asTitleWithInternalLink(element) {
|
|
47
|
+
return element;
|
|
48
|
+
}
|
|
49
|
+
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
50
|
+
static asTitleWithExternalLink(element) {
|
|
51
|
+
return element;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Checks if the provided element is a NavInternalLink.
|
|
55
|
+
*
|
|
56
|
+
* @param element - The element to check.
|
|
57
|
+
* @returns Whether or not the given element is a NavInternalLink.
|
|
58
|
+
*/
|
|
59
|
+
static isInternalLink(element) {
|
|
60
|
+
if (element.route) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Checks if the provided element is a NavMenu.
|
|
67
|
+
*
|
|
68
|
+
* @param element - The element to check.
|
|
69
|
+
* @returns Whether or not the given element is a NavMenu.
|
|
70
|
+
*/
|
|
71
|
+
static isMenu(element) {
|
|
72
|
+
if (element.elements) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Checks if the provided value is an angular route.
|
|
79
|
+
*
|
|
80
|
+
* @param route - The value to check.
|
|
81
|
+
* @returns Whether or not the given value is an angular route.
|
|
82
|
+
*/
|
|
83
|
+
static isAngularRoute(route) {
|
|
84
|
+
if (route.path) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Checks if the provided element is a NavElement.
|
|
91
|
+
*
|
|
92
|
+
* @param value - The element to check.
|
|
93
|
+
* @returns Whether or not the given element is a NavElement.
|
|
94
|
+
*/
|
|
95
|
+
static isNavElement(value) {
|
|
96
|
+
if (value.type) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Gets the angular routes.
|
|
103
|
+
* Extracts them from the navbarRows and adds any additional routes provided in additionalRoutes.
|
|
104
|
+
*
|
|
105
|
+
* @param navbarRows - The NavbarRows used as a configuration for the navbar element.
|
|
106
|
+
* @param additionalRoutes - Any additional routes that aren't included in the NavbarRows.
|
|
107
|
+
* @returns All found angular routes.
|
|
108
|
+
*/
|
|
109
|
+
static getAngularRoutes(navbarRows = [], additionalRoutes = []) {
|
|
110
|
+
let allRoutes = [];
|
|
111
|
+
allRoutes = allRoutes.concat(NavUtilities.getRoutesFromNavbar(navbarRows));
|
|
112
|
+
allRoutes = allRoutes.concat(additionalRoutes);
|
|
113
|
+
// Filters to only contain unique paths
|
|
114
|
+
const uniquePaths = [];
|
|
115
|
+
const res = [];
|
|
116
|
+
for (const route of allRoutes) {
|
|
117
|
+
if (!uniquePaths.find(r => r === route.path)) {
|
|
118
|
+
res.push(route);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return res;
|
|
122
|
+
}
|
|
123
|
+
static getRoutesFromNavbar(navbarRows) {
|
|
124
|
+
let res = [];
|
|
125
|
+
for (const row of navbarRows) {
|
|
126
|
+
res = res.concat(NavUtilities.getRoutesFromElements(row.elements));
|
|
127
|
+
}
|
|
128
|
+
;
|
|
129
|
+
return res;
|
|
130
|
+
}
|
|
131
|
+
static getRoutesFromElements(elements) {
|
|
132
|
+
let res = [];
|
|
133
|
+
const internalLinks = elements.filter(e => NavUtilities.isInternalLink(e));
|
|
134
|
+
const angularRoutes = internalLinks.filter(l => NavUtilities.isAngularRoute(l.route)).map(l => l.route);
|
|
135
|
+
res = res.concat(angularRoutes);
|
|
136
|
+
const menus = elements.filter(e => NavUtilities.isMenu(e));
|
|
137
|
+
for (const menu of menus) {
|
|
138
|
+
res = res.concat(NavUtilities.getRoutesFromElements(menu.elements));
|
|
139
|
+
}
|
|
140
|
+
return res;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get all elements at the provided position with the provided screenWidth from the given elements.
|
|
144
|
+
*
|
|
145
|
+
* @param position - The position for which to get the elements.
|
|
146
|
+
* @param screenWidth - The current screen width. Is needed to hide elements that are already collapsed into the sidenav.
|
|
147
|
+
* @param rows - The rows to get the elements from.
|
|
148
|
+
* @returns All Elements for the provided input.
|
|
149
|
+
*/
|
|
150
|
+
static getNavbarElements(position, screenWidth, rows) {
|
|
151
|
+
if (!rows || !rows.length) {
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
let res = [];
|
|
155
|
+
for (const row of rows) {
|
|
156
|
+
res = res.concat(row.elements);
|
|
157
|
+
}
|
|
158
|
+
if (position === 'left') {
|
|
159
|
+
res = res.filter(e => !e.position || e.position === position);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
res = res.filter(e => e.position === position);
|
|
163
|
+
}
|
|
164
|
+
switch (screenWidth) {
|
|
165
|
+
case 'lg':
|
|
166
|
+
return res.filter(e => e.collapse !== 'always' && e.collapse !== 'lg');
|
|
167
|
+
case 'md':
|
|
168
|
+
return res.filter(e => e.collapse !== 'always' && e.collapse !== 'lg' && e.collapse !== 'md');
|
|
169
|
+
case 'sm':
|
|
170
|
+
return res.filter(e => e.collapse !== 'always' && e.collapse !== 'lg' && e.collapse !== 'md' && e.collapse !== 'sm');
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Gets all the elements to display in the sidenav.
|
|
175
|
+
*
|
|
176
|
+
* @param screenWidth - The current screen width.
|
|
177
|
+
* @param rows - The rows to get the elements from.
|
|
178
|
+
* @returns The NavElements to display in the sidenav.
|
|
179
|
+
*/
|
|
180
|
+
static getSidenavElements(screenWidth, rows) {
|
|
181
|
+
if (!rows || !rows.length) {
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
let res = [];
|
|
185
|
+
for (const row of rows) {
|
|
186
|
+
res = res.concat(row.elements);
|
|
187
|
+
}
|
|
188
|
+
switch (screenWidth) {
|
|
189
|
+
case 'lg':
|
|
190
|
+
return res.filter(e => e.collapse === 'always' || e.collapse === 'lg');
|
|
191
|
+
case 'md':
|
|
192
|
+
return res.filter(e => e.collapse === 'always' || e.collapse === 'lg' || e.collapse === 'md');
|
|
193
|
+
case 'sm':
|
|
194
|
+
return res.filter(e => e.collapse === 'always' || e.collapse === 'lg' || e.collapse === 'md' || e.collapse === 'sm');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LnV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1uYXZpZ2F0aW9uL3NyYy91dGlsaXRpZXMvbmF2LnV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQTs7R0FFRztBQUNILE1BQU0sT0FBZ0IsWUFBWTtJQUU5QiwrQ0FBK0M7SUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFtQjtRQUM5QixPQUFPLE9BQW1CLENBQUM7SUFDL0IsQ0FBQztJQUVELCtDQUErQztJQUMvQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQXFCO1FBQ3ZDLE9BQU8sS0FBYyxDQUFDO0lBQzFCLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFxQjtRQUN0QyxPQUFPLEtBQWUsQ0FBQztJQUMzQixDQUFDO0lBRUQsK0NBQStDO0lBQy9DLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBb0M7UUFDdEQsT0FBTyxPQUEwQixDQUFDO0lBQ3RDLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFvQztRQUN0RCxPQUFPLE9BQTBCLENBQUM7SUFDdEMsQ0FBQztJQUVELCtDQUErQztJQUMvQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQW9DO1FBQzlDLE9BQU8sT0FBa0IsQ0FBQztJQUM5QixDQUFDO0lBRUQsK0NBQStDO0lBQy9DLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBbUI7UUFDL0IsT0FBTyxPQUFvQixDQUFDO0lBQ2hDLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFtQjtRQUM5QixPQUFPLE9BQW1CLENBQUM7SUFDL0IsQ0FBQztJQUVELCtDQUErQztJQUMvQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsT0FBbUI7UUFDOUMsT0FBTyxPQUFtQyxDQUFDO0lBQy9DLENBQUM7SUFFRCwr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LFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQzNFLEtBQUssSUFBSTtnQkFDTCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ2xHLEtBQUssSUFBSTtnQkFDTCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO1NBQzVIO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91dGUsIFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE5hdkJ1dHRvbiB9IGZyb20gJy4uL21vZGVscy9uYXYtYnV0dG9uLm1vZGVsJztcclxuaW1wb3J0IHsgTmF2TWVudSwgTmF2TWVudUVsZW1lbnQgfSBmcm9tICcuLi9tb2RlbHMvbmF2LW1lbnUubW9kZWwnO1xyXG5pbXBvcnQgeyBOYXZJbWFnZSwgTmF2SW1hZ2VXaXRoRXh0ZXJuYWxMaW5rLCBOYXZJbWFnZVdpdGhJbnRlcm5hbExpbmsgfSBmcm9tICcuLi9tb2RlbHMvbmF2LWltYWdlLm1vZGVsJztcclxuaW1wb3J0IHsgTmF2VGl0bGUsIE5hdlRpdGxlV2l0aEV4dGVybmFsTGluaywgTmF2VGl0bGVXaXRoSW50ZXJuYWxMaW5rIH0gZnJvbSAnLi4vbW9kZWxzL25hdi10aXRsZS5tb2RlbCc7XHJcbmltcG9ydCB7IE5hdkVsZW1lbnQgfSBmcm9tICcuLi9tb2RlbHMvbmF2Lm1vZGVsJztcclxuaW1wb3J0IHsgTmF2RXh0ZXJuYWxMaW5rLCBOYXZJbnRlcm5hbExpbmsgfSBmcm9tICcuLi9tb2RlbHMvbmF2LWxpbmsubW9kZWwnO1xyXG5pbXBvcnQgeyBOYXZiYXJSb3cgfSBmcm9tICcuLi9tb2RlbHMvbmF2YmFyLm1vZGVsJztcclxuXHJcbi8qKlxyXG4gKiBDb250YWlucyBIZWxwZXJNZXRob2RzIGFyb3VuZCBoYW5kbGluZyBOYXZpZ2F0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5hdlV0aWxpdGllcyB7XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc1RpdGxlKGVsZW1lbnQ6IE5hdkVsZW1lbnQpOiBOYXZUaXRsZSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgYXMgTmF2VGl0bGU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc0FuZ3VsYXJSb3V0ZShyb3V0ZTogUm91dGUgfCBzdHJpbmcpOiBSb3V0ZSB7XHJcbiAgICAgICAgcmV0dXJuIHJvdXRlIGFzIFJvdXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXHJcbiAgICBzdGF0aWMgYXNTdHJpbmdSb3V0ZShyb3V0ZTogUm91dGUgfCBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiByb3V0ZSBhcyBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc0ludGVybmFsTGluayhlbGVtZW50OiBOYXZFbGVtZW50IHwgTmF2TWVudUVsZW1lbnQpOiBOYXZJbnRlcm5hbExpbmsge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50IGFzIE5hdkludGVybmFsTGluaztcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xyXG4gICAgc3RhdGljIGFzRXh0ZXJuYWxMaW5rKGVsZW1lbnQ6IE5hdkVsZW1lbnQgfCBOYXZNZW51RWxlbWVudCk6IE5hdkV4dGVybmFsTGluayB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgYXMgTmF2RXh0ZXJuYWxMaW5rO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXHJcbiAgICBzdGF0aWMgYXNNZW51KGVsZW1lbnQ6IE5hdkVsZW1lbnQgfCBOYXZNZW51RWxlbWVudCk6IE5hdk1lbnUge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50IGFzIE5hdk1lbnU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc0J1dHRvbihlbGVtZW50OiBOYXZFbGVtZW50KTogTmF2QnV0dG9uIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCBhcyBOYXZCdXR0b247XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc0ltYWdlKGVsZW1lbnQ6IE5hdkVsZW1lbnQpOiBOYXZJbWFnZSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQgYXMgTmF2SW1hZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc0ltYWdlV2l0aEludGVybmFsTGluayhlbGVtZW50OiBOYXZFbGVtZW50KTogTmF2SW1hZ2VXaXRoSW50ZXJuYWxMaW5rIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCBhcyBOYXZJbWFnZVdpdGhJbnRlcm5hbExpbms7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc0ltYWdlV2l0aEV4dGVybmFsTGluayhlbGVtZW50OiBOYXZFbGVtZW50KTogTmF2SW1hZ2VXaXRoRXh0ZXJuYWxMaW5rIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCBhcyBOYXZJbWFnZVdpdGhFeHRlcm5hbExpbms7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc1RpdGxlV2l0aEludGVybmFsTGluayhlbGVtZW50OiBOYXZFbGVtZW50KTogTmF2VGl0bGVXaXRoSW50ZXJuYWxMaW5rIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCBhcyBOYXZUaXRsZVdpdGhJbnRlcm5hbExpbms7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcclxuICAgIHN0YXRpYyBhc1RpdGxlV2l0aEV4dGVybmFsTGluayhlbGVtZW50OiBOYXZFbGVtZW50KTogTmF2VGl0bGVXaXRoRXh0ZXJuYWxMaW5rIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudCBhcyBOYXZUaXRsZVdpdGhFeHRlcm5hbExpbms7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgYSBOYXZJbnRlcm5hbExpbmsuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBjaGVjay5cclxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBlbGVtZW50IGlzIGEgTmF2SW50ZXJuYWxMaW5rLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaXNJbnRlcm5hbExpbmsoZWxlbWVudDogTmF2RWxlbWVudCk6IGVsZW1lbnQgaXMgTmF2SW50ZXJuYWxMaW5rIHtcclxuICAgICAgICBpZiAoKGVsZW1lbnQgYXMgTmF2SW50ZXJuYWxMaW5rKS5yb3V0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBlbGVtZW50IGlzIGEgTmF2TWVudS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGNoZWNrLlxyXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGdpdmVuIGVsZW1lbnQgaXMgYSBOYXZNZW51LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaXNNZW51KGVsZW1lbnQ6IE5hdkVsZW1lbnQpOiBlbGVtZW50IGlzIE5hdk1lbnUge1xyXG4gICAgICAgIGlmICgoZWxlbWVudCBhcyBOYXZNZW51KS5lbGVtZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCB2YWx1ZSBpcyBhbiBhbmd1bGFyIHJvdXRlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSByb3V0ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cclxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB2YWx1ZSBpcyBhbiBhbmd1bGFyIHJvdXRlLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaXNBbmd1bGFyUm91dGUocm91dGU6IFJvdXRlIHwgc3RyaW5nKTogcm91dGUgaXMgUm91dGUge1xyXG4gICAgICAgIGlmICgocm91dGUgYXMgUm91dGUpLnBhdGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgZWxlbWVudCBpcyBhIE5hdkVsZW1lbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGVsZW1lbnQgdG8gY2hlY2suXHJcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBhIE5hdkVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpc05hdkVsZW1lbnQodmFsdWU6IE5hdkVsZW1lbnQgfCBOYXZiYXJSb3cpOiB2YWx1ZSBpcyBOYXZFbGVtZW50IHtcclxuICAgICAgICBpZiAoKHZhbHVlIGFzIE5hdkVsZW1lbnQpLnR5cGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGFuZ3VsYXIgcm91dGVzLlxyXG4gICAgICogRXh0cmFjdHMgdGhlbSBmcm9tIHRoZSBuYXZiYXJSb3dzIGFuZCBhZGRzIGFueSBhZGRpdGlvbmFsIHJvdXRlcyBwcm92aWRlZCBpbiBhZGRpdGlvbmFsUm91dGVzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYXZiYXJSb3dzIC0gVGhlIE5hdmJhclJvd3MgdXNlZCBhcyBhIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBuYXZiYXIgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSBhZGRpdGlvbmFsUm91dGVzIC0gQW55IGFkZGl0aW9uYWwgcm91dGVzIHRoYXQgYXJlbid0IGluY2x1ZGVkIGluIHRoZSBOYXZiYXJSb3dzLlxyXG4gICAgICogQHJldHVybnMgQWxsIGZvdW5kIGFuZ3VsYXIgcm91dGVzLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0QW5ndWxhclJvdXRlcyhuYXZiYXJSb3dzOiBOYXZiYXJSb3dbXSA9IFtdLCBhZGRpdGlvbmFsUm91dGVzOiBSb3V0ZXMgPSBbXSk6IFJvdXRlcyB7XHJcbiAgICAgICAgbGV0IGFsbFJvdXRlczogUm91dGVzID0gW107XHJcbiAgICAgICAgYWxsUm91dGVzID0gYWxsUm91dGVzLmNvbmNhdChOYXZVdGlsaXRpZXMuZ2V0Um91dGVzRnJvbU5hdmJhcihuYXZiYXJSb3dzKSk7XHJcbiAgICAgICAgYWxsUm91dGVzID0gYWxsUm91dGVzLmNvbmNhdChhZGRpdGlvbmFsUm91dGVzKTtcclxuICAgICAgICAvLyBGaWx0ZXJzIHRvIG9ubHkgY29udGFpbiB1bmlxdWUgcGF0aHNcclxuICAgICAgICBjb25zdCB1bmlxdWVQYXRoczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBjb25zdCByZXM6IFJvdXRlcyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qgcm91dGUgb2YgYWxsUm91dGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghdW5pcXVlUGF0aHMuZmluZChyID0+IHIgPT09IHJvdXRlLnBhdGgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXMucHVzaChyb3V0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRSb3V0ZXNGcm9tTmF2YmFyKG5hdmJhclJvd3M6IE5hdmJhclJvd1tdKTogUm91dGVzIHtcclxuICAgICAgICBsZXQgcmVzOiBSb3V0ZXMgPSBbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBuYXZiYXJSb3dzKSB7XHJcbiAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoTmF2VXRpbGl0aWVzLmdldFJvdXRlc0Zyb21FbGVtZW50cyhyb3cuZWxlbWVudHMpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Um91dGVzRnJvbUVsZW1lbnRzKGVsZW1lbnRzOiBOYXZFbGVtZW50W10pOiBSb3V0ZXMge1xyXG4gICAgICAgIGxldCByZXM6IFJvdXRlcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGludGVybmFsTGlua3M6IE5hdkludGVybmFsTGlua1tdID0gZWxlbWVudHMuZmlsdGVyKGUgPT4gTmF2VXRpbGl0aWVzLmlzSW50ZXJuYWxMaW5rKGUpKSBhcyBOYXZJbnRlcm5hbExpbmtbXTtcclxuICAgICAgICBjb25zdCBhbmd1bGFyUm91dGVzOiBSb3V0ZXMgPSBpbnRlcm5hbExpbmtzLmZpbHRlcihsID0+IE5hdlV0aWxpdGllcy5pc0FuZ3VsYXJSb3V0ZShsLnJvdXRlKSkubWFwKGwgPT4gbC5yb3V0ZSkgYXMgUm91dGVzO1xyXG4gICAgICAgIHJlcyA9IHJlcy5jb25jYXQoYW5ndWxhclJvdXRlcyk7XHJcbiAgICAgICAgY29uc3QgbWVudXM6IE5hdk1lbnVbXSA9IGVsZW1lbnRzLmZpbHRlcihlID0+IE5hdlV0aWxpdGllcy5pc01lbnUoZSkpIGFzIE5hdk1lbnVbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IG1lbnUgb2YgbWVudXMpIHtcclxuICAgICAgICAgICAgcmVzID0gcmVzLmNvbmNhdChOYXZVdGlsaXRpZXMuZ2V0Um91dGVzRnJvbUVsZW1lbnRzKG1lbnUuZWxlbWVudHMgYXMgTmF2RWxlbWVudFtdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYWxsIGVsZW1lbnRzIGF0IHRoZSBwcm92aWRlZCBwb3NpdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBzY3JlZW5XaWR0aCBmcm9tIHRoZSBnaXZlbiBlbGVtZW50cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gZm9yIHdoaWNoIHRvIGdldCB0aGUgZWxlbWVudHMuXHJcbiAgICAgKiBAcGFyYW0gc2NyZWVuV2lkdGggLSBUaGUgY3VycmVudCBzY3JlZW4gd2lkdGguIElzIG5lZWRlZCB0byBoaWRlIGVsZW1lbnRzIHRoYXQgYXJlIGFscmVhZHkgY29sbGFwc2VkIGludG8gdGhlIHNpZGVuYXYuXHJcbiAgICAgKiBAcGFyYW0gcm93cyAtIFRoZSByb3dzIHRvIGdldCB0aGUgZWxlbWVudHMgZnJvbS5cclxuICAgICAqIEByZXR1cm5zIEFsbCBFbGVtZW50cyBmb3IgdGhlIHByb3ZpZGVkIGlucHV0LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0TmF2YmFyRWxlbWVudHMoXHJcbiAgICAgICAgcG9zaXRpb246ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0JyxcclxuICAgICAgICBzY3JlZW5XaWR0aDogJ2xnJyB8ICdtZCcgfCAnc20nLFxyXG4gICAgICAgIHJvd3M/OiBOYXZiYXJSb3dbXVxyXG4gICAgKTogTmF2RWxlbWVudFtdIHtcclxuICAgICAgICBpZiAoIXJvd3MgfHwgIXJvd3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJlczogTmF2RWxlbWVudFtdID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cyApIHtcclxuICAgICAgICAgICAgcmVzID0gcmVzLmNvbmNhdChyb3cuZWxlbWVudHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAnbGVmdCcpIHtcclxuICAgICAgICAgICAgcmVzID0gcmVzLmZpbHRlcihlID0+ICFlLnBvc2l0aW9uIHx8IGUucG9zaXRpb24gPT09IHBvc2l0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJlcyA9IHJlcy5maWx0ZXIoZSA9PiBlLnBvc2l0aW9uID09PSBwb3NpdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN3aXRjaCAoc2NyZWVuV2lkdGgpIHtcclxuICAgICAgICAgICAgY2FzZSAnbGcnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5maWx0ZXIoZSA9PiBlLmNvbGxhcHNlICE9PSAnYWx3YXlzJyAmJiBlLmNvbGxhcHNlICE9PSAnbGcnKTtcclxuICAgICAgICAgICAgY2FzZSAnbWQnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5maWx0ZXIoZSA9PiBlLmNvbGxhcHNlICE9PSAnYWx3YXlzJyAmJiBlLmNvbGxhcHNlICE9PSAnbGcnICYmIGUuY29sbGFwc2UgIT09ICdtZCcpO1xyXG4gICAgICAgICAgICBjYXNlICdzbSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmZpbHRlcihlID0+IGUuY29sbGFwc2UgIT09ICdhbHdheXMnICYmIGUuY29sbGFwc2UgIT09ICdsZycgJiYgZS5jb2xsYXBzZSAhPT0gJ21kJyAmJiBlLmNvbGxhcHNlICE9PSAnc20nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCB0aGUgZWxlbWVudHMgdG8gZGlzcGxheSBpbiB0aGUgc2lkZW5hdi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc2NyZWVuV2lkdGggLSBUaGUgY3VycmVudCBzY3JlZW4gd2lkdGguXHJcbiAgICAgKiBAcGFyYW0gcm93cyAtIFRoZSByb3dzIHRvIGdldCB0aGUgZWxlbWVudHMgZnJvbS5cclxuICAgICAqIEByZXR1cm5zIFRoZSBOYXZFbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSBzaWRlbmF2LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgZ2V0U2lkZW5hdkVsZW1lbnRzKHNjcmVlbldpZHRoOiAnbGcnIHwgJ21kJyB8ICdzbScsIHJvd3M/OiBOYXZiYXJSb3dbXSk6IE5hdkVsZW1lbnRbXSB7XHJcbiAgICAgICAgaWYgKCFyb3dzIHx8ICFyb3dzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZXM6IE5hdkVsZW1lbnRbXSA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcclxuICAgICAgICAgICAgcmVzID0gcmVzLmNvbmNhdChyb3cuZWxlbWVudHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzd2l0Y2ggKHNjcmVlbldpZHRoKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2xnJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXMuZmlsdGVyKGUgPT4gZS5jb2xsYXBzZSA9PT0gJ2Fsd2F5cycgfHwgZS5jb2xsYXBzZSA9PT0gJ2xnJyk7XHJcbiAgICAgICAgICAgIGNhc2UgJ21kJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXMuZmlsdGVyKGUgPT4gZS5jb2xsYXBzZSA9PT0gJ2Fsd2F5cycgfHwgZS5jb2xsYXBzZSA9PT0gJ2xnJyB8fCBlLmNvbGxhcHNlID09PSAnbWQnKTtcclxuICAgICAgICAgICAgY2FzZSAnc20nOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5maWx0ZXIoZSA9PiBlLmNvbGxhcHNlID09PSAnYWx3YXlzJyB8fCBlLmNvbGxhcHNlID09PSAnbGcnIHx8IGUuY29sbGFwc2UgPT09ICdtZCcgfHwgZS5jb2xsYXBzZSA9PT0gJ3NtJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19
|