@oneteme/jquery-organizer 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -137,6 +137,17 @@ export interface OrganizerConfig {
137
137
  onPreferencesSave?: () => void;
138
138
  onPreferencesClear?: () => void;
139
139
 
140
+ // Actions du visuel
141
+ showActions?: boolean;
142
+ actions?: {
143
+ label?: string; // Défaut: Action ou Actions selon les entrées visibles
144
+ showCopy?: boolean; // Défaut: true si onCopyVisual est fourni
145
+ showFullscreen?: boolean; // Défaut: true si onToggleFullscreen est fourni
146
+ icon?: string; // Icône Material optionnelle, aucune par défaut
147
+ };
148
+ onCopyVisual?: () => void;
149
+ onToggleFullscreen?: () => void;
150
+
140
151
  // UI
141
152
  showReset?: boolean; // Défaut: true
142
153
  buttonLabel?: string;
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLWNvbmZpZy5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS1vcmdhbml6ZXIvc3JjL2xpYi9tb2RlbHMvb3JnYW5pemVyLWNvbmZpZy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNsaWNlQ29uZmlnIH0gZnJvbSAnLi4vc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwubW9kZWwnO1xuaW1wb3J0IHsgVW5pdENvbmZpZyB9IGZyb20gJ0BvbmV0ZW1lL2pxdWVyeS1jb3JlJztcblxuZXhwb3J0IHR5cGUgRmllbGRTdGF0ZSA9ICdyZWFkeScgfCAnbG9hZGluZycgfCAnZXJyb3InO1xuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJWaWV3RmllbGQge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xuICB2aXNpYmxlPzogYm9vbGVhbjtcbiAgc3RhdGU/OiBGaWVsZFN0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplclhGaWVsZCB7XG4gIGlkOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJZQWdncmVnYXRlIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJZRmllbGQge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBhZ2dyZWdhdGVzPzogT3JnYW5pemVyWUFnZ3JlZ2F0ZVtdO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemVyVmlld0dyb3VwIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJWaWV3U2xpY2Uge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplclRlbXBsYXRlIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbiAgeEZpZWxkPzogc3RyaW5nO1xuICB5RmllbGQ/OiBzdHJpbmc7XG4gIHlBZ2dyZWdhdGU/OiBzdHJpbmc7XG4gIGdyb3VwQnk/OiBzdHJpbmc7XG4gIHNlbGVjdGVkU2xpY2VzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemVyQ29uZmlnIHtcbiAgZmllbGRzPzogT3JnYW5pemVyVmlld0ZpZWxkW107XG4gIHhGaWVsZHM/OiBPcmdhbml6ZXJYRmllbGRbXTtcbiAgeUZpZWxkcz86IE9yZ2FuaXplcllGaWVsZFtdO1xuICBncm91cHM/OiBPcmdhbml6ZXJWaWV3R3JvdXBbXTtcbiAgc2xpY2VzPzogT3JnYW5pemVyVmlld1NsaWNlW107XG4gIHRlbXBsYXRlcz86IE9yZ2FuaXplclRlbXBsYXRlW107XG5cbiAgb25GZXRjaEZpZWxkRGF0YT86IChmaWVsZElkOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+W10+O1xuICBvbkZldGNoU2xpY2VEYXRhPzogKGZpbHRlcktleTogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPGFueVtdPiB8IFByb21pc2U8YW55W10+O1xuICBvblNsaWNlQ2xpY2s/OiAoKSA9PiB2b2lkO1xuXG4gIHNob3dFeHBvcnQ/OiBib29sZWFuO1xuICBvbkV4cG9ydD86ICgpID0+IHZvaWQ7XG4gIG9uRXhwb3J0VmlzdWFsPzogKCkgPT4gdm9pZDtcbiAgb25FeHBvcnREYXRhPzogKCkgPT4gdm9pZDtcblxuICBzaG93UHJlZmVyZW5jZXM/OiBib29sZWFuO1xuICBoYXNTYXZlZFByZWZlcmVuY2VzPzogYm9vbGVhbjtcbiAgb25QcmVmZXJlbmNlc0VkaXQ/OiAoKSA9PiB2b2lkO1xuICBvblByZWZlcmVuY2VzU2F2ZT86ICgpID0+IHZvaWQ7XG4gIG9uUHJlZmVyZW5jZXNDbGVhcj86ICgpID0+IHZvaWQ7XG5cbiAgc2hvd1Jlc2V0PzogYm9vbGVhbjtcbiAgbWVudVBvc2l0aW9uPzogJ2Fib3ZlJyB8ICdiZWxvdyc7XG4gIG1lbnVDbGFzcz86IHN0cmluZztcbiAgYnV0dG9uTGFiZWw/OiBzdHJpbmc7XG4gIGJ1dHRvbkljb24/OiBzdHJpbmc7XG4gIHNob3dCdXR0b25JY29uPzogYm9vbGVhbjtcblxuICBzd2l0Y2hWaWV3Pzoge1xuICAgIGN1cnJlbnRWaWV3OiAnY2hhcnQnIHwgJ3RhYmxlJztcbiAgICBvblN3aXRjaDogKG5ld1ZpZXc6ICdjaGFydCcgfCAndGFibGUnKSA9PiB2b2lkO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplclNsaWNlU3RhdGUge1xuICBzbGljZUNvbmZpZ3M6IFNsaWNlQ29uZmlnPGFueT5bXTtcbiAgdGFza3M6IGFueVtdO1xuICBmaWx0ZXJBcHBsaWVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJTdGF0ZSB7XG4gIHZpZXdNb2RlPzogJ2NoYXJ0JyB8ICd0YWJsZSc7XG5cbiAgdmlzaWJsZUZpZWxkcz86IHN0cmluZ1tdO1xuXG4gIHNlbGVjdGVkWD86IHN0cmluZztcbiAgc2VsZWN0ZWRZPzogc3RyaW5nO1xuICBzZWxlY3RlZFlBZ2dyZWdhdGU/OiBzdHJpbmc7XG5cbiAgc2VsZWN0ZWRHcm91cEJ5Pzogc3RyaW5nO1xuICBzZWxlY3RlZFNsaWNlcz86IHN0cmluZ1tdO1xuICBzZWxlY3RlZFRlbXBsYXRlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplckJ1dHRvbkV2ZW50IHtcbiAgdHlwZTogJ2ZpZWxkVG9nZ2xlZCcgfCAneFNlbGVjdGVkJyB8ICd5U2VsZWN0ZWQnIHwgJ2dyb3VwQnlTZWxlY3RlZCcgfCAndGVtcGxhdGVTZWxlY3RlZCcgfCAnc2xpY2VTZWxlY3RlZCcgfCAncmVzZXQnIHwgJ3ZpZXdTd2l0Y2hlZCc7XG4gIHN0YXRlOiBPcmdhbml6ZXJTdGF0ZTtcbiAgc291cmNlPzogJ3VzZXInIHwgJ2FwaSc7XG4gIHJlc29sdmVkWVVuaXQ/OiBzdHJpbmcgfCBVbml0Q29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplclVuaWZpZWRTdGF0ZSB7XG4gIHZpZXdNb2RlOiAnY2hhcnQnIHwgJ3RhYmxlJztcbiAgZGltZW5zaW9uPzogc3RyaW5nO1xuICBtZXRyaWM/OiBzdHJpbmc7XG4gIG1ldHJpY0FnZ3JlZ2F0ZT86IHN0cmluZztcbiAgYnJlYWtkb3duPzogc3RyaW5nO1xuICBmaWx0ZXJzPzogc3RyaW5nW107XG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLWNvbmZpZy5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS1vcmdhbml6ZXIvc3JjL2xpYi9tb2RlbHMvb3JnYW5pemVyLWNvbmZpZy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNsaWNlQ29uZmlnIH0gZnJvbSAnLi4vc2xpY2UtcGFuZWwvc2xpY2UtcGFuZWwubW9kZWwnO1xuaW1wb3J0IHsgVW5pdENvbmZpZyB9IGZyb20gJ0BvbmV0ZW1lL2pxdWVyeS1jb3JlJztcblxuZXhwb3J0IHR5cGUgRmllbGRTdGF0ZSA9ICdyZWFkeScgfCAnbG9hZGluZycgfCAnZXJyb3InO1xuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJWaWV3RmllbGQge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xuICB2aXNpYmxlPzogYm9vbGVhbjtcbiAgc3RhdGU/OiBGaWVsZFN0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplclhGaWVsZCB7XG4gIGlkOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJZQWdncmVnYXRlIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJZRmllbGQge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBhZ2dyZWdhdGVzPzogT3JnYW5pemVyWUFnZ3JlZ2F0ZVtdO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemVyVmlld0dyb3VwIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJWaWV3U2xpY2Uge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplclRlbXBsYXRlIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbiAgeEZpZWxkPzogc3RyaW5nO1xuICB5RmllbGQ/OiBzdHJpbmc7XG4gIHlBZ2dyZWdhdGU/OiBzdHJpbmc7XG4gIGdyb3VwQnk/OiBzdHJpbmc7XG4gIHNlbGVjdGVkU2xpY2VzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemVyQWN0aW9uc0NvbmZpZyB7XG4gIC8qKiBMaWJlbGzDqSBkdSBzb3VzLW1lbnUuIFBhciBkw6lmYXV0IDogQWN0aW9uIG91IEFjdGlvbnMgc2Vsb24gbGUgbm9tYnJlIGQnYWN0aW9ucyB2aXNpYmxlcy4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBBZmZpY2hlIGwnYWN0aW9uIGRlIGNvcGllIGxvcnNxdWUgb25Db3B5VmlzdWFsIGVzdCBmb3VybmkuIExlIGNhbGxiYWNrIHBldXQgb3V2cmlyIHVuZSBtb2RhbGUgb3UgdW5lIFVJIHBlcnNvbm5hbGlzw6llLiAqL1xuICBzaG93Q29weT86IGJvb2xlYW47XG4gIC8qKiBBZmZpY2hlIGwnYWN0aW9uIGRlIHBsZWluIMOpY3JhbiBsb3JzcXVlIG9uVG9nZ2xlRnVsbHNjcmVlbiBlc3QgZm91cm5pLiAqL1xuICBzaG93RnVsbHNjcmVlbj86IGJvb2xlYW47XG4gIC8qKiBJY8O0bmUgb3B0aW9ubmVsbGUgYWZmaWNow6llIGRldmFudCBsZSBsaWJlbGzDqSBkdSBzb3VzLW1lbnUuICovXG4gIGljb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemVyQ29uZmlnIHtcbiAgZmllbGRzPzogT3JnYW5pemVyVmlld0ZpZWxkW107XG4gIHhGaWVsZHM/OiBPcmdhbml6ZXJYRmllbGRbXTtcbiAgeUZpZWxkcz86IE9yZ2FuaXplcllGaWVsZFtdO1xuICBncm91cHM/OiBPcmdhbml6ZXJWaWV3R3JvdXBbXTtcbiAgc2xpY2VzPzogT3JnYW5pemVyVmlld1NsaWNlW107XG4gIHRlbXBsYXRlcz86IE9yZ2FuaXplclRlbXBsYXRlW107XG5cbiAgb25GZXRjaEZpZWxkRGF0YT86IChmaWVsZElkOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+W10+O1xuICBvbkZldGNoU2xpY2VEYXRhPzogKGZpbHRlcktleTogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPGFueVtdPiB8IFByb21pc2U8YW55W10+O1xuICBvblNsaWNlQ2xpY2s/OiAoKSA9PiB2b2lkO1xuXG4gIHNob3dFeHBvcnQ/OiBib29sZWFuO1xuICBvbkV4cG9ydD86ICgpID0+IHZvaWQ7XG4gIG9uRXhwb3J0VmlzdWFsPzogKCkgPT4gdm9pZDtcbiAgb25FeHBvcnREYXRhPzogKCkgPT4gdm9pZDtcblxuICAvKiogQWZmaWNoZSBsZXMgY29tbWFuZGVzIGxpw6llcyBhdSB2aXN1ZWwgY291cmFudCBkYW5zIGxlIHNvdXMtbWVudSBBY3Rpb25zLiAqL1xuICBzaG93QWN0aW9ucz86IGJvb2xlYW47XG4gIGFjdGlvbnM/OiBPcmdhbml6ZXJBY3Rpb25zQ29uZmlnO1xuICBvbkNvcHlWaXN1YWw/OiAoKSA9PiB2b2lkO1xuICBvblRvZ2dsZUZ1bGxzY3JlZW4/OiAoKSA9PiB2b2lkO1xuICBpc0Z1bGxzY3JlZW4/OiBib29sZWFuO1xuXG4gIHNob3dQcmVmZXJlbmNlcz86IGJvb2xlYW47XG4gIGhhc1NhdmVkUHJlZmVyZW5jZXM/OiBib29sZWFuO1xuICBvblByZWZlcmVuY2VzRWRpdD86ICgpID0+IHZvaWQ7XG4gIG9uUHJlZmVyZW5jZXNTYXZlPzogKCkgPT4gdm9pZDtcbiAgb25QcmVmZXJlbmNlc0NsZWFyPzogKCkgPT4gdm9pZDtcblxuICBzaG93UmVzZXQ/OiBib29sZWFuO1xuICBtZW51UG9zaXRpb24/OiAnYWJvdmUnIHwgJ2JlbG93JztcbiAgbWVudUNsYXNzPzogc3RyaW5nO1xuICBidXR0b25MYWJlbD86IHN0cmluZztcbiAgYnV0dG9uSWNvbj86IHN0cmluZztcbiAgc2hvd0J1dHRvbkljb24/OiBib29sZWFuO1xuXG4gIHN3aXRjaFZpZXc/OiB7XG4gICAgY3VycmVudFZpZXc6ICdjaGFydCcgfCAndGFibGUnO1xuICAgIG9uU3dpdGNoOiAobmV3VmlldzogJ2NoYXJ0JyB8ICd0YWJsZScpID0+IHZvaWQ7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemVyU2xpY2VTdGF0ZSB7XG4gIHNsaWNlQ29uZmlnczogU2xpY2VDb25maWc8YW55PltdO1xuICB0YXNrczogYW55W107XG4gIGZpbHRlckFwcGxpZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplclN0YXRlIHtcbiAgdmlld01vZGU/OiAnY2hhcnQnIHwgJ3RhYmxlJztcblxuICB2aXNpYmxlRmllbGRzPzogc3RyaW5nW107XG5cbiAgc2VsZWN0ZWRYPzogc3RyaW5nO1xuICBzZWxlY3RlZFk/OiBzdHJpbmc7XG4gIHNlbGVjdGVkWUFnZ3JlZ2F0ZT86IHN0cmluZztcblxuICBzZWxlY3RlZEdyb3VwQnk/OiBzdHJpbmc7XG4gIHNlbGVjdGVkU2xpY2VzPzogc3RyaW5nW107XG4gIHNlbGVjdGVkVGVtcGxhdGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemVyQnV0dG9uRXZlbnQge1xuICB0eXBlOiAnZmllbGRUb2dnbGVkJyB8ICd4U2VsZWN0ZWQnIHwgJ3lTZWxlY3RlZCcgfCAnZ3JvdXBCeVNlbGVjdGVkJyB8ICd0ZW1wbGF0ZVNlbGVjdGVkJyB8ICdzbGljZVNlbGVjdGVkJyB8ICdyZXNldCcgfCAndmlld1N3aXRjaGVkJztcbiAgc3RhdGU6IE9yZ2FuaXplclN0YXRlO1xuICBzb3VyY2U/OiAndXNlcicgfCAnYXBpJztcbiAgcmVzb2x2ZWRZVW5pdD86IHN0cmluZyB8IFVuaXRDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemVyVW5pZmllZFN0YXRlIHtcbiAgdmlld01vZGU6ICdjaGFydCcgfCAndGFibGUnO1xuICBkaW1lbnNpb24/OiBzdHJpbmc7XG4gIG1ldHJpYz86IHN0cmluZztcbiAgbWV0cmljQWdncmVnYXRlPzogc3RyaW5nO1xuICBicmVha2Rvd24/OiBzdHJpbmc7XG4gIGZpbHRlcnM/OiBzdHJpbmdbXTtcbn1cbiJdfQ==
@@ -110,7 +110,9 @@ export class OrganizerButtonComponent {
110
110
  const selectedSlices = this.state?.selectedSlices || [];
111
111
  let updated;
112
112
  if (sliceId) {
113
- updated = selectedSlices.includes(sliceId) ? [] : [sliceId];
113
+ updated = selectedSlices.includes(sliceId)
114
+ ? selectedSlices.filter(id => id !== sliceId)
115
+ : [...selectedSlices, sliceId];
114
116
  }
115
117
  else {
116
118
  updated = selectedSlices;
@@ -190,6 +192,41 @@ export class OrganizerButtonComponent {
190
192
  hasExportSubMenu() {
191
193
  return !!(this.config.onExportVisual || this.config.onExportData);
192
194
  }
195
+ isCopyActionVisible() {
196
+ return !!this.config.onCopyVisual && this.config.actions?.showCopy !== false;
197
+ }
198
+ isFullscreenActionVisible() {
199
+ return !!this.config.onToggleFullscreen && this.config.actions?.showFullscreen !== false;
200
+ }
201
+ hasActions() {
202
+ return this.config.showActions === true && (this.isCopyActionVisible() || this.isFullscreenActionVisible());
203
+ }
204
+ hasMenuItemsBeforeActions() {
205
+ return this.hasChartFields()
206
+ || this.hasTableFields()
207
+ || (this.config.groups?.length ?? 0) > 0
208
+ || (this.config.slices?.length ?? 0) > 0
209
+ || (this.config.templates?.length ?? 0) > 0;
210
+ }
211
+ hasOtherMenuItems() {
212
+ return this.hasMenuItemsBeforeActions()
213
+ || !!this.config.showExport
214
+ || !!this.config.showPreferences
215
+ || this.hasSwitchView();
216
+ }
217
+ actionsLabel() {
218
+ if (this.config.actions?.label)
219
+ return this.config.actions.label;
220
+ return this.isCopyActionVisible() && this.isFullscreenActionVisible() ? 'Actions' : 'Action';
221
+ }
222
+ onCopyVisual() {
223
+ this.config.onCopyVisual?.();
224
+ this.mainMenuTrigger?.closeMenu();
225
+ }
226
+ onToggleFullscreen() {
227
+ this.config.onToggleFullscreen?.();
228
+ this.mainMenuTrigger?.closeMenu();
229
+ }
193
230
  hasSwitchView() {
194
231
  return !!this.config.switchView;
195
232
  }
@@ -293,11 +330,11 @@ export class OrganizerButtonComponent {
293
330
  this.viewChange.emit(event);
294
331
  }
295
332
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OrganizerButtonComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
296
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: OrganizerButtonComponent, isStandalone: true, selector: "organizer-button", inputs: { config: "config", state: "state", hideMenuValues: "hideMenuValues" }, outputs: { viewChange: "viewChange", sliceStateChange: "sliceStateChange" }, viewQueries: [{ propertyName: "mainMenuTrigger", first: true, predicate: ["mainMenuTrigger"], descendants: true }], ngImport: i0, template: "<button type=\"button\" class=\"organizer-btn\" [matMenuTriggerFor]=\"viewMenu\" #mainMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"organizer-btn-icon\">{{ config.buttonIcon || 'settings' }}</mat-icon>\n</button>\n\n<mat-menu #viewMenu=\"matMenu\" panelClass=\"organizer-menu-panel\">\n\n <!-- Champs : mode chart (X + Y) -->\n <button *ngIf=\"hasChartFields()\" mat-menu-item [matMenuTriggerFor]=\"champsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && (activeXLabel() || activeYLabel())\">\n {{ activeXLabel() }}<ng-container *ngIf=\"activeXLabel() && activeYLabel()\"> / </ng-container>{{ activeYLabel() }}\n </span>\n </button>\n\n <!-- Champs : mode table (toggle colonnes) -->\n <button *ngIf=\"hasTableFields()\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues\">{{ fieldsSummary() }}</span>\n </button>\n\n <!-- Grouper par -->\n <button *ngIf=\"config.groups?.length\" mat-menu-item [matMenuTriggerFor]=\"groupsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Grouper par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeGroupByLabel()\">{{ activeGroupByLabel() }}</span>\n </button>\n\n <!-- Filtrer par -->\n <button *ngIf=\"config.slices?.length\" mat-menu-item [matMenuTriggerFor]=\"slicesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Filtrer par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeSlicesLabel()\">{{ activeSlicesLabel() }}</span>\n </button>\n\n <!-- Template -->\n <button *ngIf=\"config.templates?.length\" mat-menu-item [matMenuTriggerFor]=\"templateSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Template</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeTemplateLabel()\">{{ activeTemplateLabel() }}</span>\n </button>\n\n <!-- Export direct (mode table) -->\n <mat-divider *ngIf=\"config.showExport\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showExport && !hasExportSubMenu()\" mat-menu-item type=\"button\" class=\"organizer-menu-export\" (click)=\"onExport()\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Export graphique (mode chart) \u2014 ouvre un sous-menu -->\n <button *ngIf=\"config.showExport && hasExportSubMenu()\" mat-menu-item [matMenuTriggerFor]=\"exportSubMenu\" class=\"organizer-menu-trigger organizer-menu-export\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Pr\u00E9f\u00E9rences -->\n <mat-divider *ngIf=\"config.showPreferences\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showPreferences\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Pr\u00E9f\u00E9rences</span>\n </button>\n\n <!-- Switch chart / table -->\n <mat-divider *ngIf=\"hasSwitchView()\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"hasSwitchView()\" mat-menu-item type=\"button\" class=\"organizer-menu-trigger\" (click)=\"onSwitchView()\">\n <mat-icon class=\"organizer-menu-export-icon\">{{ config.switchView?.currentView === 'chart' ? 'table_chart' : 'bar_chart' }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ config.switchView?.currentView === 'chart' ? 'Tableau' : 'Graphique' }}</span>\n </button>\n\n</mat-menu>\n\n<!-- Sous-menu : Export graphique -->\n<mat-menu #exportSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button *ngIf=\"config.onExportVisual\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportVisual()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">image</mat-icon>\n Visuel\n </button>\n <button *ngIf=\"config.onExportData\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportData()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">table_chart</mat-icon>\n Donn\u00E9es\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Champs chart (X + Y) -->\n<mat-menu #champsSubMenu=\"matMenu\" panelClass=\"organizer-champs-panel\">\n <div class=\"organizer-champs-wrapper\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n\n <!-- Bloc X -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.xFields?.length\">\n <span class=\"organizer-champs-block-title\">Axe horizontal \u2014 X</span>\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let xField of config.xFields\"\n [class.active]=\"state?.selectedX === xField.id\"\n [disabled]=\"xField.disabled\"\n (mousedown)=\"onXFieldSelect(xField.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedX === xField.id ? '\u2713' : '' }}</span>\n {{ xField.label }}\n </button>\n </div>\n\n <mat-divider *ngIf=\"config.xFields?.length && config.yFields?.length\" class=\"organizer-champs-divider\"></mat-divider>\n\n <!-- Bloc Y -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.yFields?.length\">\n <span class=\"organizer-champs-block-title\">Axe vertical \u2014 Y</span>\n <ng-container *ngFor=\"let yField of config.yFields\">\n\n <!-- Y simple (Count sans agr\u00E9gat ni stack) -->\n <!-- Y simple (Count ou m\u00E9trique directe) -->\n <button *ngIf=\"!yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n (mousedown)=\"onYFieldSelect(yField.id)\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '\u2713' : '' }}</span>\n {{ yField.label }}\n </button>\n\n <!-- Y avec agr\u00E9gats \u2192 sous-menu -->\n <button *ngIf=\"yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item organizer-submenu-item--has-children\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n [matMenuTriggerFor]=\"yAggSubMenu\"\n [matMenuTriggerData]=\"{ yField: yField }\"\n (mousedown)=\"$event.stopPropagation()\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '\u2713' : '' }}</span>\n {{ yField.label }}\n <mat-icon class=\"organizer-submenu-arrow\">chevron_right</mat-icon>\n </button>\n\n </ng-container>\n </div>\n\n </div>\n</mat-menu>\n\n<!-- Sous-menu dynamique : agr\u00E9gats d'un champ Y -->\n<mat-menu #yAggSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <ng-template matMenuContent let-yField=\"yField\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let agg of yField.aggregates\"\n [class.active]=\"isYAggregateActive(yField.id, agg.id)\"\n (mousedown)=\"onYAggregateSelect(yField.id, agg.id)\">\n <span class=\"organizer-submenu-check\">{{ isYAggregateActive(yField.id, agg.id) ? '\u2713' : '' }}</span>\n {{ agg.label }}\n </button>\n </div>\n </ng-template>\n</mat-menu>\n\n<!-- Sous-menu : Champs table (toggle colonnes) -->\n<mat-menu #fieldsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let field of config.fields\"\n [class.active]=\"isFieldVisible(field.id)\"\n (mousedown)=\"onFieldToggle(field.id, !isFieldVisible(field.id))\">\n <span class=\"organizer-submenu-check\">{{ isFieldVisible(field.id) ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"field.icon\" class=\"organizer-submenu-icon\">{{ field.icon }}</mat-icon> {{ field.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Grouper par -->\n<mat-menu #groupsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let group of config.groups\"\n [class.active]=\"state?.selectedGroupBy === group.id\"\n (mousedown)=\"onGroupBySelect(group.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedGroupBy === group.id ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"group.icon\" class=\"organizer-submenu-icon\">{{ group.icon }}</mat-icon> {{ group.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Filtrer par -->\n<mat-menu #slicesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let slice of config.slices\"\n [class.active]=\"state?.selectedSlices?.includes(slice.id)\"\n (mousedown)=\"onSliceClick(slice.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedSlices?.includes(slice.id) ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"slice.icon\" class=\"organizer-submenu-icon\">{{ slice.icon }}</mat-icon> {{ slice.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Template -->\n<mat-menu #templateSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let tmpl of config.templates\"\n [class.active]=\"state?.selectedTemplate === tmpl.id\"\n [title]=\"tmpl.description || ''\"\n (mousedown)=\"onTemplateSelect(tmpl.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedTemplate === tmpl.id ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"tmpl.icon\" class=\"organizer-submenu-icon\">{{ tmpl.icon }}</mat-icon>\n {{ tmpl.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Pr\u00E9f\u00E9rences -->\n<mat-menu #preferencesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesEdit()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">edit</mat-icon>\u00C9diter\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesSave()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">save</mat-icon>Sauvegarder\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" [disabled]=\"!config.hasSavedPreferences\" (mousedown)=\"onPreferencesClear()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">delete_outline</mat-icon>R\u00E9initialiser\n </button>\n </div>\n</mat-menu>\n\n", styles: [".organizer-btn{display:inline-flex;align-items:center;height:34px;border:1px solid #e0e0e0;border-radius:8px;background:#fff;padding:0 10px;cursor:pointer;box-sizing:border-box}.organizer-btn:hover{border-color:#9e9e9e}.organizer-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;color:#000}.mat-mdc-menu-panel:has(.organizer-menu-label){min-width:170px!important;max-width:320px!important;overflow:visible!important}.mat-mdc-menu-panel:has(.organizer-menu-label) .mat-mdc-menu-content{padding:4px 0!important}.mat-mdc-menu-panel:has(.organizer-menu-label) .organizer-menu-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}.mat-mdc-menu-panel:has(.organizer-menu-label) .organizer-menu-trigger.mat-mdc-menu-item .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;overflow:hidden}.organizer-menu-label{font-size:13px;font-weight:500;color:#212121;flex:0 0 auto;white-space:nowrap;padding-right:8px}.organizer-menu-value{font-size:12px;color:#757575;flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}.organizer-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}.organizer-submenu .organizer-submenu-item{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:#212121;cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}.organizer-submenu .organizer-submenu-item:hover{background:#f5f5f5}.organizer-submenu .organizer-submenu-item.active{font-weight:600}.organizer-submenu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:#212121}.organizer-submenu-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#212121;margin-right:4px}.organizer-menu-export.mat-mdc-menu-item{min-height:42px;padding:0 14px}.organizer-menu-export-icon{font-size:16px!important;width:16px!important;height:16px!important;color:#424242;margin-right:8px}.organizer-divider{margin:4px 0!important}.organizer-champs-wrapper{padding:4px 6px;min-width:200px;box-sizing:border-box;display:flex;flex-direction:column}.organizer-champs-block{display:flex;flex-direction:column}.organizer-champs-block-title{font-size:10px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:#9e9e9e;padding:6px 2px 2px}.organizer-champs-divider{margin:4px 0!important}.organizer-champs-wrapper .organizer-submenu-item{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;font-family:inherit;color:#212121;cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}.organizer-champs-wrapper .organizer-submenu-item:hover:not([disabled]){background:#f5f5f5}.organizer-champs-wrapper .organizer-submenu-item.active{font-weight:600}.organizer-champs-wrapper .organizer-submenu-item[disabled]{opacity:.38;cursor:default}.organizer-champs-wrapper .organizer-submenu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:#212121}.organizer-champs-wrapper .organizer-submenu-item--has-children{padding-right:8px}.organizer-champs-wrapper .organizer-submenu-arrow{font-size:18px!important;width:18px!important;height:18px!important;color:#00000061;margin-left:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
333
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: OrganizerButtonComponent, isStandalone: true, selector: "organizer-button", inputs: { config: "config", state: "state", hideMenuValues: "hideMenuValues" }, outputs: { viewChange: "viewChange", sliceStateChange: "sliceStateChange" }, viewQueries: [{ propertyName: "mainMenuTrigger", first: true, predicate: ["mainMenuTrigger"], descendants: true }], ngImport: i0, template: "<button type=\"button\" class=\"organizer-btn\" [matMenuTriggerFor]=\"viewMenu\" #mainMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"organizer-btn-icon\">{{ config.buttonIcon || 'settings' }}</mat-icon>\n</button>\n\n<mat-menu #viewMenu=\"matMenu\" panelClass=\"organizer-menu-panel\">\n\n <!-- Champs : mode chart (X + Y) -->\n <button *ngIf=\"hasChartFields()\" mat-menu-item [matMenuTriggerFor]=\"champsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && (activeXLabel() || activeYLabel())\">\n {{ activeXLabel() }}<ng-container *ngIf=\"activeXLabel() && activeYLabel()\"> / </ng-container>{{ activeYLabel() }}\n </span>\n </button>\n\n <!-- Champs : mode table (toggle colonnes) -->\n <button *ngIf=\"hasTableFields()\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues\">{{ fieldsSummary() }}</span>\n </button>\n\n <!-- Grouper par -->\n <button *ngIf=\"config.groups?.length\" mat-menu-item [matMenuTriggerFor]=\"groupsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Grouper par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeGroupByLabel()\">{{ activeGroupByLabel() }}</span>\n </button>\n\n <!-- Filtrer par -->\n <button *ngIf=\"config.slices?.length\" mat-menu-item [matMenuTriggerFor]=\"slicesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Filtrer par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeSlicesLabel()\">{{ activeSlicesLabel() }}</span>\n </button>\n\n <!-- Template -->\n <button *ngIf=\"config.templates?.length\" mat-menu-item [matMenuTriggerFor]=\"templateSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Template</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeTemplateLabel()\">{{ activeTemplateLabel() }}</span>\n </button>\n\n <!-- Actions du visuel courant -->\n <mat-divider *ngIf=\"hasActions() && hasMenuItemsBeforeActions()\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"hasActions() && hasOtherMenuItems()\" mat-menu-item [matMenuTriggerFor]=\"actionsSubMenu\" class=\"organizer-menu-trigger\">\n <mat-icon *ngIf=\"config.actions?.icon\" class=\"organizer-menu-export-icon\">{{ config.actions?.icon }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ actionsLabel() }}</span>\n </button>\n\n <!-- Actions directes lorsqu'il n'y a aucun autre item principal -->\n <ng-container *ngIf=\"hasActions() && !hasOtherMenuItems()\">\n <button *ngIf=\"isCopyActionVisible()\" mat-menu-item type=\"button\" (click)=\"onCopyVisual()\">\n <mat-icon class=\"organizer-menu-export-icon\">content_copy</mat-icon>\n <span class=\"organizer-menu-label\">Copier</span>\n </button>\n <button *ngIf=\"isFullscreenActionVisible()\" mat-menu-item type=\"button\" (click)=\"onToggleFullscreen()\">\n <mat-icon class=\"organizer-menu-export-icon\">{{ config.isFullscreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ config.isFullscreen ? 'Quitter le plein \u00E9cran' : 'Plein \u00E9cran' }}</span>\n </button>\n </ng-container>\n\n <!-- Export direct (mode table) -->\n <mat-divider *ngIf=\"config.showExport\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showExport && !hasExportSubMenu()\" mat-menu-item type=\"button\" class=\"organizer-menu-export\" (click)=\"onExport()\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Export graphique (mode chart) \u2014 ouvre un sous-menu -->\n <button *ngIf=\"config.showExport && hasExportSubMenu()\" mat-menu-item [matMenuTriggerFor]=\"exportSubMenu\" class=\"organizer-menu-trigger organizer-menu-export\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Pr\u00E9f\u00E9rences -->\n <mat-divider *ngIf=\"config.showPreferences\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showPreferences\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Pr\u00E9f\u00E9rences</span>\n </button>\n\n <!-- Switch chart / table -->\n <mat-divider *ngIf=\"hasSwitchView()\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"hasSwitchView()\" mat-menu-item type=\"button\" class=\"organizer-menu-trigger\" (click)=\"onSwitchView()\">\n <mat-icon class=\"organizer-menu-export-icon\">{{ config.switchView?.currentView === 'chart' ? 'table_chart' : 'bar_chart' }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ config.switchView?.currentView === 'chart' ? 'Tableau' : 'Graphique' }}</span>\n </button>\n\n</mat-menu>\n\n<!-- Sous-menu : actions du visuel -->\n<mat-menu #actionsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button *ngIf=\"isCopyActionVisible()\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onCopyVisual()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">content_copy</mat-icon>\n Copier\n </button>\n <button *ngIf=\"isFullscreenActionVisible()\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onToggleFullscreen()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">{{ config.isFullscreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\n {{ config.isFullscreen ? 'Quitter le plein \u00E9cran' : 'Plein \u00E9cran' }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Export graphique -->\n<mat-menu #exportSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button *ngIf=\"config.onExportVisual\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportVisual()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">image</mat-icon>\n Visuel\n </button>\n <button *ngIf=\"config.onExportData\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportData()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">table_chart</mat-icon>\n Donn\u00E9es\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Champs chart (X + Y) -->\n<mat-menu #champsSubMenu=\"matMenu\" panelClass=\"organizer-champs-panel\">\n <div class=\"organizer-champs-wrapper\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n\n <!-- Bloc X -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.xFields?.length\">\n <span class=\"organizer-champs-block-title\">Axe horizontal \u2014 X</span>\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let xField of config.xFields\"\n [class.active]=\"state?.selectedX === xField.id\"\n [disabled]=\"xField.disabled\"\n (mousedown)=\"onXFieldSelect(xField.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedX === xField.id ? '\u2713' : '' }}</span>\n {{ xField.label }}\n </button>\n </div>\n\n <mat-divider *ngIf=\"config.xFields?.length && config.yFields?.length\" class=\"organizer-champs-divider\"></mat-divider>\n\n <!-- Bloc Y -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.yFields?.length\">\n <span class=\"organizer-champs-block-title\">Axe vertical \u2014 Y</span>\n <ng-container *ngFor=\"let yField of config.yFields\">\n\n <!-- Y simple (Count sans agr\u00E9gat ni stack) -->\n <!-- Y simple (Count ou m\u00E9trique directe) -->\n <button *ngIf=\"!yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n (mousedown)=\"onYFieldSelect(yField.id)\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '\u2713' : '' }}</span>\n {{ yField.label }}\n </button>\n\n <!-- Y avec agr\u00E9gats \u2192 sous-menu -->\n <button *ngIf=\"yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item organizer-submenu-item--has-children\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n [matMenuTriggerFor]=\"yAggSubMenu\"\n [matMenuTriggerData]=\"{ yField: yField }\"\n (mousedown)=\"$event.stopPropagation()\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '\u2713' : '' }}</span>\n {{ yField.label }}\n <mat-icon class=\"organizer-submenu-arrow\">chevron_right</mat-icon>\n </button>\n\n </ng-container>\n </div>\n\n </div>\n</mat-menu>\n\n<!-- Sous-menu dynamique : agr\u00E9gats d'un champ Y -->\n<mat-menu #yAggSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <ng-template matMenuContent let-yField=\"yField\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let agg of yField.aggregates\"\n [class.active]=\"isYAggregateActive(yField.id, agg.id)\"\n (mousedown)=\"onYAggregateSelect(yField.id, agg.id)\">\n <span class=\"organizer-submenu-check\">{{ isYAggregateActive(yField.id, agg.id) ? '\u2713' : '' }}</span>\n {{ agg.label }}\n </button>\n </div>\n </ng-template>\n</mat-menu>\n\n<!-- Sous-menu : Champs table (toggle colonnes) -->\n<mat-menu #fieldsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let field of config.fields\"\n [class.active]=\"isFieldVisible(field.id)\"\n (mousedown)=\"onFieldToggle(field.id, !isFieldVisible(field.id))\">\n <span class=\"organizer-submenu-check\">{{ isFieldVisible(field.id) ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"field.icon\" class=\"organizer-submenu-icon\">{{ field.icon }}</mat-icon> {{ field.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Grouper par -->\n<mat-menu #groupsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let group of config.groups\"\n [class.active]=\"state?.selectedGroupBy === group.id\"\n (mousedown)=\"onGroupBySelect(group.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedGroupBy === group.id ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"group.icon\" class=\"organizer-submenu-icon\">{{ group.icon }}</mat-icon> {{ group.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Filtrer par -->\n<mat-menu #slicesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let slice of config.slices\"\n [class.active]=\"state?.selectedSlices?.includes(slice.id)\"\n (mousedown)=\"onSliceClick(slice.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedSlices?.includes(slice.id) ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"slice.icon\" class=\"organizer-submenu-icon\">{{ slice.icon }}</mat-icon> {{ slice.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Template -->\n<mat-menu #templateSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let tmpl of config.templates\"\n [class.active]=\"state?.selectedTemplate === tmpl.id\"\n [title]=\"tmpl.description || ''\"\n (mousedown)=\"onTemplateSelect(tmpl.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedTemplate === tmpl.id ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"tmpl.icon\" class=\"organizer-submenu-icon\">{{ tmpl.icon }}</mat-icon>\n {{ tmpl.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Pr\u00E9f\u00E9rences -->\n<mat-menu #preferencesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesEdit()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">edit</mat-icon>\u00C9diter\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesSave()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">save</mat-icon>Sauvegarder\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" [disabled]=\"!config.hasSavedPreferences\" (mousedown)=\"onPreferencesClear()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">delete_outline</mat-icon>R\u00E9initialiser\n </button>\n </div>\n</mat-menu>\n\n", styles: [":host{display:inline-flex;align-items:center;justify-content:center;line-height:0}.organizer-btn{position:relative;display:block;height:34px;width:34px;border:1px solid #e0e0e0;border-radius:8px;background:#fff;padding:0;overflow:hidden;cursor:pointer;box-sizing:border-box}.organizer-btn:hover{border-color:#9e9e9e}.organizer-btn-icon.mat-icon,.organizer-btn-icon.material-icons{position:absolute;inset:0;display:block!important;width:18px!important;height:18px!important;margin:auto!important;padding:0!important;font-size:18px!important;line-height:18px!important;text-align:center;vertical-align:middle;transform:none;color:#000}.mat-mdc-menu-panel:has(.organizer-menu-label){min-width:170px!important;max-width:320px!important;overflow:visible!important}.mat-mdc-menu-panel:has(.organizer-menu-label) .mat-mdc-menu-content{padding:4px 0!important}.mat-mdc-menu-panel:has(.organizer-menu-label) .organizer-menu-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}.mat-mdc-menu-panel:has(.organizer-menu-label) .organizer-menu-trigger.mat-mdc-menu-item .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;overflow:hidden}.organizer-menu-label{font-size:13px;font-weight:500;color:#212121;flex:0 0 auto;white-space:nowrap;padding-right:8px}.organizer-menu-value{font-size:12px;color:#757575;flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}.organizer-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}.organizer-submenu .organizer-submenu-item{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:#212121;cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}.organizer-submenu .organizer-submenu-item:hover{background:#f5f5f5}.organizer-submenu .organizer-submenu-item.active{font-weight:600}.organizer-submenu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:#212121}.organizer-submenu-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#212121;margin-right:4px}.organizer-menu-export.mat-mdc-menu-item{min-height:42px;padding:0 14px}.organizer-menu-export-icon{font-size:16px!important;width:16px!important;height:16px!important;color:#424242;margin-right:8px}.organizer-divider{margin:4px 0!important}.organizer-champs-wrapper{padding:4px 6px;min-width:200px;box-sizing:border-box;display:flex;flex-direction:column}.organizer-champs-block{display:flex;flex-direction:column}.organizer-champs-block-title{font-size:10px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:#9e9e9e;padding:6px 2px 2px}.organizer-champs-divider{margin:4px 0!important}.organizer-champs-wrapper .organizer-submenu-item{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;font-family:inherit;color:#212121;cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}.organizer-champs-wrapper .organizer-submenu-item:hover:not([disabled]){background:#f5f5f5}.organizer-champs-wrapper .organizer-submenu-item.active{font-weight:600}.organizer-champs-wrapper .organizer-submenu-item[disabled]{opacity:.38;cursor:default}.organizer-champs-wrapper .organizer-submenu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:#212121}.organizer-champs-wrapper .organizer-submenu-item--has-children{padding-right:8px}.organizer-champs-wrapper .organizer-submenu-arrow{font-size:18px!important;width:18px!important;height:18px!important;color:#00000061;margin-left:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
297
334
  }
298
335
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OrganizerButtonComponent, decorators: [{
299
336
  type: Component,
300
- args: [{ standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatDividerModule], selector: 'organizer-button', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<button type=\"button\" class=\"organizer-btn\" [matMenuTriggerFor]=\"viewMenu\" #mainMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"organizer-btn-icon\">{{ config.buttonIcon || 'settings' }}</mat-icon>\n</button>\n\n<mat-menu #viewMenu=\"matMenu\" panelClass=\"organizer-menu-panel\">\n\n <!-- Champs : mode chart (X + Y) -->\n <button *ngIf=\"hasChartFields()\" mat-menu-item [matMenuTriggerFor]=\"champsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && (activeXLabel() || activeYLabel())\">\n {{ activeXLabel() }}<ng-container *ngIf=\"activeXLabel() && activeYLabel()\"> / </ng-container>{{ activeYLabel() }}\n </span>\n </button>\n\n <!-- Champs : mode table (toggle colonnes) -->\n <button *ngIf=\"hasTableFields()\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues\">{{ fieldsSummary() }}</span>\n </button>\n\n <!-- Grouper par -->\n <button *ngIf=\"config.groups?.length\" mat-menu-item [matMenuTriggerFor]=\"groupsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Grouper par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeGroupByLabel()\">{{ activeGroupByLabel() }}</span>\n </button>\n\n <!-- Filtrer par -->\n <button *ngIf=\"config.slices?.length\" mat-menu-item [matMenuTriggerFor]=\"slicesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Filtrer par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeSlicesLabel()\">{{ activeSlicesLabel() }}</span>\n </button>\n\n <!-- Template -->\n <button *ngIf=\"config.templates?.length\" mat-menu-item [matMenuTriggerFor]=\"templateSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Template</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeTemplateLabel()\">{{ activeTemplateLabel() }}</span>\n </button>\n\n <!-- Export direct (mode table) -->\n <mat-divider *ngIf=\"config.showExport\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showExport && !hasExportSubMenu()\" mat-menu-item type=\"button\" class=\"organizer-menu-export\" (click)=\"onExport()\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Export graphique (mode chart) \u2014 ouvre un sous-menu -->\n <button *ngIf=\"config.showExport && hasExportSubMenu()\" mat-menu-item [matMenuTriggerFor]=\"exportSubMenu\" class=\"organizer-menu-trigger organizer-menu-export\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Pr\u00E9f\u00E9rences -->\n <mat-divider *ngIf=\"config.showPreferences\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showPreferences\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Pr\u00E9f\u00E9rences</span>\n </button>\n\n <!-- Switch chart / table -->\n <mat-divider *ngIf=\"hasSwitchView()\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"hasSwitchView()\" mat-menu-item type=\"button\" class=\"organizer-menu-trigger\" (click)=\"onSwitchView()\">\n <mat-icon class=\"organizer-menu-export-icon\">{{ config.switchView?.currentView === 'chart' ? 'table_chart' : 'bar_chart' }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ config.switchView?.currentView === 'chart' ? 'Tableau' : 'Graphique' }}</span>\n </button>\n\n</mat-menu>\n\n<!-- Sous-menu : Export graphique -->\n<mat-menu #exportSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button *ngIf=\"config.onExportVisual\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportVisual()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">image</mat-icon>\n Visuel\n </button>\n <button *ngIf=\"config.onExportData\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportData()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">table_chart</mat-icon>\n Donn\u00E9es\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Champs chart (X + Y) -->\n<mat-menu #champsSubMenu=\"matMenu\" panelClass=\"organizer-champs-panel\">\n <div class=\"organizer-champs-wrapper\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n\n <!-- Bloc X -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.xFields?.length\">\n <span class=\"organizer-champs-block-title\">Axe horizontal \u2014 X</span>\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let xField of config.xFields\"\n [class.active]=\"state?.selectedX === xField.id\"\n [disabled]=\"xField.disabled\"\n (mousedown)=\"onXFieldSelect(xField.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedX === xField.id ? '\u2713' : '' }}</span>\n {{ xField.label }}\n </button>\n </div>\n\n <mat-divider *ngIf=\"config.xFields?.length && config.yFields?.length\" class=\"organizer-champs-divider\"></mat-divider>\n\n <!-- Bloc Y -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.yFields?.length\">\n <span class=\"organizer-champs-block-title\">Axe vertical \u2014 Y</span>\n <ng-container *ngFor=\"let yField of config.yFields\">\n\n <!-- Y simple (Count sans agr\u00E9gat ni stack) -->\n <!-- Y simple (Count ou m\u00E9trique directe) -->\n <button *ngIf=\"!yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n (mousedown)=\"onYFieldSelect(yField.id)\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '\u2713' : '' }}</span>\n {{ yField.label }}\n </button>\n\n <!-- Y avec agr\u00E9gats \u2192 sous-menu -->\n <button *ngIf=\"yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item organizer-submenu-item--has-children\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n [matMenuTriggerFor]=\"yAggSubMenu\"\n [matMenuTriggerData]=\"{ yField: yField }\"\n (mousedown)=\"$event.stopPropagation()\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '\u2713' : '' }}</span>\n {{ yField.label }}\n <mat-icon class=\"organizer-submenu-arrow\">chevron_right</mat-icon>\n </button>\n\n </ng-container>\n </div>\n\n </div>\n</mat-menu>\n\n<!-- Sous-menu dynamique : agr\u00E9gats d'un champ Y -->\n<mat-menu #yAggSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <ng-template matMenuContent let-yField=\"yField\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let agg of yField.aggregates\"\n [class.active]=\"isYAggregateActive(yField.id, agg.id)\"\n (mousedown)=\"onYAggregateSelect(yField.id, agg.id)\">\n <span class=\"organizer-submenu-check\">{{ isYAggregateActive(yField.id, agg.id) ? '\u2713' : '' }}</span>\n {{ agg.label }}\n </button>\n </div>\n </ng-template>\n</mat-menu>\n\n<!-- Sous-menu : Champs table (toggle colonnes) -->\n<mat-menu #fieldsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let field of config.fields\"\n [class.active]=\"isFieldVisible(field.id)\"\n (mousedown)=\"onFieldToggle(field.id, !isFieldVisible(field.id))\">\n <span class=\"organizer-submenu-check\">{{ isFieldVisible(field.id) ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"field.icon\" class=\"organizer-submenu-icon\">{{ field.icon }}</mat-icon> {{ field.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Grouper par -->\n<mat-menu #groupsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let group of config.groups\"\n [class.active]=\"state?.selectedGroupBy === group.id\"\n (mousedown)=\"onGroupBySelect(group.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedGroupBy === group.id ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"group.icon\" class=\"organizer-submenu-icon\">{{ group.icon }}</mat-icon> {{ group.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Filtrer par -->\n<mat-menu #slicesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let slice of config.slices\"\n [class.active]=\"state?.selectedSlices?.includes(slice.id)\"\n (mousedown)=\"onSliceClick(slice.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedSlices?.includes(slice.id) ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"slice.icon\" class=\"organizer-submenu-icon\">{{ slice.icon }}</mat-icon> {{ slice.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Template -->\n<mat-menu #templateSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let tmpl of config.templates\"\n [class.active]=\"state?.selectedTemplate === tmpl.id\"\n [title]=\"tmpl.description || ''\"\n (mousedown)=\"onTemplateSelect(tmpl.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedTemplate === tmpl.id ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"tmpl.icon\" class=\"organizer-submenu-icon\">{{ tmpl.icon }}</mat-icon>\n {{ tmpl.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Pr\u00E9f\u00E9rences -->\n<mat-menu #preferencesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesEdit()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">edit</mat-icon>\u00C9diter\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesSave()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">save</mat-icon>Sauvegarder\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" [disabled]=\"!config.hasSavedPreferences\" (mousedown)=\"onPreferencesClear()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">delete_outline</mat-icon>R\u00E9initialiser\n </button>\n </div>\n</mat-menu>\n\n", styles: [".organizer-btn{display:inline-flex;align-items:center;height:34px;border:1px solid #e0e0e0;border-radius:8px;background:#fff;padding:0 10px;cursor:pointer;box-sizing:border-box}.organizer-btn:hover{border-color:#9e9e9e}.organizer-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;color:#000}.mat-mdc-menu-panel:has(.organizer-menu-label){min-width:170px!important;max-width:320px!important;overflow:visible!important}.mat-mdc-menu-panel:has(.organizer-menu-label) .mat-mdc-menu-content{padding:4px 0!important}.mat-mdc-menu-panel:has(.organizer-menu-label) .organizer-menu-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}.mat-mdc-menu-panel:has(.organizer-menu-label) .organizer-menu-trigger.mat-mdc-menu-item .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;overflow:hidden}.organizer-menu-label{font-size:13px;font-weight:500;color:#212121;flex:0 0 auto;white-space:nowrap;padding-right:8px}.organizer-menu-value{font-size:12px;color:#757575;flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}.organizer-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}.organizer-submenu .organizer-submenu-item{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:#212121;cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}.organizer-submenu .organizer-submenu-item:hover{background:#f5f5f5}.organizer-submenu .organizer-submenu-item.active{font-weight:600}.organizer-submenu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:#212121}.organizer-submenu-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#212121;margin-right:4px}.organizer-menu-export.mat-mdc-menu-item{min-height:42px;padding:0 14px}.organizer-menu-export-icon{font-size:16px!important;width:16px!important;height:16px!important;color:#424242;margin-right:8px}.organizer-divider{margin:4px 0!important}.organizer-champs-wrapper{padding:4px 6px;min-width:200px;box-sizing:border-box;display:flex;flex-direction:column}.organizer-champs-block{display:flex;flex-direction:column}.organizer-champs-block-title{font-size:10px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:#9e9e9e;padding:6px 2px 2px}.organizer-champs-divider{margin:4px 0!important}.organizer-champs-wrapper .organizer-submenu-item{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;font-family:inherit;color:#212121;cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}.organizer-champs-wrapper .organizer-submenu-item:hover:not([disabled]){background:#f5f5f5}.organizer-champs-wrapper .organizer-submenu-item.active{font-weight:600}.organizer-champs-wrapper .organizer-submenu-item[disabled]{opacity:.38;cursor:default}.organizer-champs-wrapper .organizer-submenu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:#212121}.organizer-champs-wrapper .organizer-submenu-item--has-children{padding-right:8px}.organizer-champs-wrapper .organizer-submenu-arrow{font-size:18px!important;width:18px!important;height:18px!important;color:#00000061;margin-left:auto}\n"] }]
337
+ args: [{ standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatDividerModule], selector: 'organizer-button', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<button type=\"button\" class=\"organizer-btn\" [matMenuTriggerFor]=\"viewMenu\" #mainMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"organizer-btn-icon\">{{ config.buttonIcon || 'settings' }}</mat-icon>\n</button>\n\n<mat-menu #viewMenu=\"matMenu\" panelClass=\"organizer-menu-panel\">\n\n <!-- Champs : mode chart (X + Y) -->\n <button *ngIf=\"hasChartFields()\" mat-menu-item [matMenuTriggerFor]=\"champsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && (activeXLabel() || activeYLabel())\">\n {{ activeXLabel() }}<ng-container *ngIf=\"activeXLabel() && activeYLabel()\"> / </ng-container>{{ activeYLabel() }}\n </span>\n </button>\n\n <!-- Champs : mode table (toggle colonnes) -->\n <button *ngIf=\"hasTableFields()\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues\">{{ fieldsSummary() }}</span>\n </button>\n\n <!-- Grouper par -->\n <button *ngIf=\"config.groups?.length\" mat-menu-item [matMenuTriggerFor]=\"groupsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Grouper par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeGroupByLabel()\">{{ activeGroupByLabel() }}</span>\n </button>\n\n <!-- Filtrer par -->\n <button *ngIf=\"config.slices?.length\" mat-menu-item [matMenuTriggerFor]=\"slicesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Filtrer par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeSlicesLabel()\">{{ activeSlicesLabel() }}</span>\n </button>\n\n <!-- Template -->\n <button *ngIf=\"config.templates?.length\" mat-menu-item [matMenuTriggerFor]=\"templateSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Template</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeTemplateLabel()\">{{ activeTemplateLabel() }}</span>\n </button>\n\n <!-- Actions du visuel courant -->\n <mat-divider *ngIf=\"hasActions() && hasMenuItemsBeforeActions()\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"hasActions() && hasOtherMenuItems()\" mat-menu-item [matMenuTriggerFor]=\"actionsSubMenu\" class=\"organizer-menu-trigger\">\n <mat-icon *ngIf=\"config.actions?.icon\" class=\"organizer-menu-export-icon\">{{ config.actions?.icon }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ actionsLabel() }}</span>\n </button>\n\n <!-- Actions directes lorsqu'il n'y a aucun autre item principal -->\n <ng-container *ngIf=\"hasActions() && !hasOtherMenuItems()\">\n <button *ngIf=\"isCopyActionVisible()\" mat-menu-item type=\"button\" (click)=\"onCopyVisual()\">\n <mat-icon class=\"organizer-menu-export-icon\">content_copy</mat-icon>\n <span class=\"organizer-menu-label\">Copier</span>\n </button>\n <button *ngIf=\"isFullscreenActionVisible()\" mat-menu-item type=\"button\" (click)=\"onToggleFullscreen()\">\n <mat-icon class=\"organizer-menu-export-icon\">{{ config.isFullscreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ config.isFullscreen ? 'Quitter le plein \u00E9cran' : 'Plein \u00E9cran' }}</span>\n </button>\n </ng-container>\n\n <!-- Export direct (mode table) -->\n <mat-divider *ngIf=\"config.showExport\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showExport && !hasExportSubMenu()\" mat-menu-item type=\"button\" class=\"organizer-menu-export\" (click)=\"onExport()\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Export graphique (mode chart) \u2014 ouvre un sous-menu -->\n <button *ngIf=\"config.showExport && hasExportSubMenu()\" mat-menu-item [matMenuTriggerFor]=\"exportSubMenu\" class=\"organizer-menu-trigger organizer-menu-export\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Pr\u00E9f\u00E9rences -->\n <mat-divider *ngIf=\"config.showPreferences\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showPreferences\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Pr\u00E9f\u00E9rences</span>\n </button>\n\n <!-- Switch chart / table -->\n <mat-divider *ngIf=\"hasSwitchView()\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"hasSwitchView()\" mat-menu-item type=\"button\" class=\"organizer-menu-trigger\" (click)=\"onSwitchView()\">\n <mat-icon class=\"organizer-menu-export-icon\">{{ config.switchView?.currentView === 'chart' ? 'table_chart' : 'bar_chart' }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ config.switchView?.currentView === 'chart' ? 'Tableau' : 'Graphique' }}</span>\n </button>\n\n</mat-menu>\n\n<!-- Sous-menu : actions du visuel -->\n<mat-menu #actionsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button *ngIf=\"isCopyActionVisible()\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onCopyVisual()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">content_copy</mat-icon>\n Copier\n </button>\n <button *ngIf=\"isFullscreenActionVisible()\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onToggleFullscreen()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">{{ config.isFullscreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\n {{ config.isFullscreen ? 'Quitter le plein \u00E9cran' : 'Plein \u00E9cran' }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Export graphique -->\n<mat-menu #exportSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button *ngIf=\"config.onExportVisual\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportVisual()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">image</mat-icon>\n Visuel\n </button>\n <button *ngIf=\"config.onExportData\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportData()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">table_chart</mat-icon>\n Donn\u00E9es\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Champs chart (X + Y) -->\n<mat-menu #champsSubMenu=\"matMenu\" panelClass=\"organizer-champs-panel\">\n <div class=\"organizer-champs-wrapper\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n\n <!-- Bloc X -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.xFields?.length\">\n <span class=\"organizer-champs-block-title\">Axe horizontal \u2014 X</span>\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let xField of config.xFields\"\n [class.active]=\"state?.selectedX === xField.id\"\n [disabled]=\"xField.disabled\"\n (mousedown)=\"onXFieldSelect(xField.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedX === xField.id ? '\u2713' : '' }}</span>\n {{ xField.label }}\n </button>\n </div>\n\n <mat-divider *ngIf=\"config.xFields?.length && config.yFields?.length\" class=\"organizer-champs-divider\"></mat-divider>\n\n <!-- Bloc Y -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.yFields?.length\">\n <span class=\"organizer-champs-block-title\">Axe vertical \u2014 Y</span>\n <ng-container *ngFor=\"let yField of config.yFields\">\n\n <!-- Y simple (Count sans agr\u00E9gat ni stack) -->\n <!-- Y simple (Count ou m\u00E9trique directe) -->\n <button *ngIf=\"!yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n (mousedown)=\"onYFieldSelect(yField.id)\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '\u2713' : '' }}</span>\n {{ yField.label }}\n </button>\n\n <!-- Y avec agr\u00E9gats \u2192 sous-menu -->\n <button *ngIf=\"yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item organizer-submenu-item--has-children\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n [matMenuTriggerFor]=\"yAggSubMenu\"\n [matMenuTriggerData]=\"{ yField: yField }\"\n (mousedown)=\"$event.stopPropagation()\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '\u2713' : '' }}</span>\n {{ yField.label }}\n <mat-icon class=\"organizer-submenu-arrow\">chevron_right</mat-icon>\n </button>\n\n </ng-container>\n </div>\n\n </div>\n</mat-menu>\n\n<!-- Sous-menu dynamique : agr\u00E9gats d'un champ Y -->\n<mat-menu #yAggSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <ng-template matMenuContent let-yField=\"yField\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let agg of yField.aggregates\"\n [class.active]=\"isYAggregateActive(yField.id, agg.id)\"\n (mousedown)=\"onYAggregateSelect(yField.id, agg.id)\">\n <span class=\"organizer-submenu-check\">{{ isYAggregateActive(yField.id, agg.id) ? '\u2713' : '' }}</span>\n {{ agg.label }}\n </button>\n </div>\n </ng-template>\n</mat-menu>\n\n<!-- Sous-menu : Champs table (toggle colonnes) -->\n<mat-menu #fieldsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let field of config.fields\"\n [class.active]=\"isFieldVisible(field.id)\"\n (mousedown)=\"onFieldToggle(field.id, !isFieldVisible(field.id))\">\n <span class=\"organizer-submenu-check\">{{ isFieldVisible(field.id) ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"field.icon\" class=\"organizer-submenu-icon\">{{ field.icon }}</mat-icon> {{ field.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Grouper par -->\n<mat-menu #groupsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let group of config.groups\"\n [class.active]=\"state?.selectedGroupBy === group.id\"\n (mousedown)=\"onGroupBySelect(group.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedGroupBy === group.id ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"group.icon\" class=\"organizer-submenu-icon\">{{ group.icon }}</mat-icon> {{ group.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Filtrer par -->\n<mat-menu #slicesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let slice of config.slices\"\n [class.active]=\"state?.selectedSlices?.includes(slice.id)\"\n (mousedown)=\"onSliceClick(slice.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedSlices?.includes(slice.id) ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"slice.icon\" class=\"organizer-submenu-icon\">{{ slice.icon }}</mat-icon> {{ slice.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Template -->\n<mat-menu #templateSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let tmpl of config.templates\"\n [class.active]=\"state?.selectedTemplate === tmpl.id\"\n [title]=\"tmpl.description || ''\"\n (mousedown)=\"onTemplateSelect(tmpl.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedTemplate === tmpl.id ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"tmpl.icon\" class=\"organizer-submenu-icon\">{{ tmpl.icon }}</mat-icon>\n {{ tmpl.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Pr\u00E9f\u00E9rences -->\n<mat-menu #preferencesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesEdit()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">edit</mat-icon>\u00C9diter\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesSave()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">save</mat-icon>Sauvegarder\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" [disabled]=\"!config.hasSavedPreferences\" (mousedown)=\"onPreferencesClear()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">delete_outline</mat-icon>R\u00E9initialiser\n </button>\n </div>\n</mat-menu>\n\n", styles: [":host{display:inline-flex;align-items:center;justify-content:center;line-height:0}.organizer-btn{position:relative;display:block;height:34px;width:34px;border:1px solid #e0e0e0;border-radius:8px;background:#fff;padding:0;overflow:hidden;cursor:pointer;box-sizing:border-box}.organizer-btn:hover{border-color:#9e9e9e}.organizer-btn-icon.mat-icon,.organizer-btn-icon.material-icons{position:absolute;inset:0;display:block!important;width:18px!important;height:18px!important;margin:auto!important;padding:0!important;font-size:18px!important;line-height:18px!important;text-align:center;vertical-align:middle;transform:none;color:#000}.mat-mdc-menu-panel:has(.organizer-menu-label){min-width:170px!important;max-width:320px!important;overflow:visible!important}.mat-mdc-menu-panel:has(.organizer-menu-label) .mat-mdc-menu-content{padding:4px 0!important}.mat-mdc-menu-panel:has(.organizer-menu-label) .organizer-menu-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}.mat-mdc-menu-panel:has(.organizer-menu-label) .organizer-menu-trigger.mat-mdc-menu-item .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;overflow:hidden}.organizer-menu-label{font-size:13px;font-weight:500;color:#212121;flex:0 0 auto;white-space:nowrap;padding-right:8px}.organizer-menu-value{font-size:12px;color:#757575;flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}.organizer-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}.organizer-submenu .organizer-submenu-item{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:#212121;cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}.organizer-submenu .organizer-submenu-item:hover{background:#f5f5f5}.organizer-submenu .organizer-submenu-item.active{font-weight:600}.organizer-submenu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:#212121}.organizer-submenu-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#212121;margin-right:4px}.organizer-menu-export.mat-mdc-menu-item{min-height:42px;padding:0 14px}.organizer-menu-export-icon{font-size:16px!important;width:16px!important;height:16px!important;color:#424242;margin-right:8px}.organizer-divider{margin:4px 0!important}.organizer-champs-wrapper{padding:4px 6px;min-width:200px;box-sizing:border-box;display:flex;flex-direction:column}.organizer-champs-block{display:flex;flex-direction:column}.organizer-champs-block-title{font-size:10px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:#9e9e9e;padding:6px 2px 2px}.organizer-champs-divider{margin:4px 0!important}.organizer-champs-wrapper .organizer-submenu-item{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;font-family:inherit;color:#212121;cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}.organizer-champs-wrapper .organizer-submenu-item:hover:not([disabled]){background:#f5f5f5}.organizer-champs-wrapper .organizer-submenu-item.active{font-weight:600}.organizer-champs-wrapper .organizer-submenu-item[disabled]{opacity:.38;cursor:default}.organizer-champs-wrapper .organizer-submenu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:#212121}.organizer-champs-wrapper .organizer-submenu-item--has-children{padding-right:8px}.organizer-champs-wrapper .organizer-submenu-arrow{font-size:18px!important;width:18px!important;height:18px!important;color:#00000061;margin-left:auto}\n"] }]
301
338
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
302
339
  type: Input
303
340
  }], state: [{
@@ -312,4 +349,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
312
349
  type: ViewChild,
313
350
  args: ['mainMenuTrigger']
314
351
  }] } });
315
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS1vcmdhbml6ZXIvc3JjL2xpYi9vcmdhbml6ZXItYnV0dG9uL29yZ2FuaXplci1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktb3JnYW5pemVyL3NyYy9saWIvb3JnYW5pemVyLWJ1dHRvbi9vcmdhbml6ZXItYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQVUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQWEsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BLLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7O0FBVzdELE1BQU0sT0FBTyx3QkFBd0I7SUFjbkMsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFYakMsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBQ3RELHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUE4QixDQUFDO1FBSXBFLG1CQUFjLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7UUFDMUMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFJTSxDQUFDO0lBRTlDLFFBQVE7UUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixFQUFFO1lBQzdDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQztZQUM5QyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ3RCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztTQUNwQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsY0FBYyxDQUFDLE9BQWU7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxPQUFPLEtBQUssS0FBSyxDQUFDO1NBQzNFO1FBQ0QsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDO1FBQzNELE9BQU8sR0FBRyxPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFlLEVBQUUsT0FBZ0I7UUFDN0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUN0RCxNQUFNLE9BQU8sR0FBRyxPQUFPO1lBQ3JCLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxFQUFFLE9BQU8sQ0FBQztZQUM3QixDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxjQUFjLENBQUMsT0FBZTtRQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDakcseURBQXlEO1FBQ3pELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ3JDLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztZQUMzRSxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxjQUFjLENBQUMsT0FBZTtRQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDakcseURBQXlEO1FBQ3pELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ3JDLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztZQUMzRSxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRTtZQUMzQixTQUFTLEVBQUUsT0FBTztZQUNsQixrQkFBa0IsRUFBRSxTQUFTO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxRQUFnQixFQUFFLFdBQW1CO1FBQ3RELE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEVBQUUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUM1SCxnRUFBZ0U7UUFDaEUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLGtCQUFrQixLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDeEYsT0FBTyxDQUFDLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1lBQy9FLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO1lBQzNCLFNBQVMsRUFBRSxRQUFRO1lBQ25CLGtCQUFrQixFQUFFLFdBQVc7U0FDaEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFlO1FBQzdCLE9BQU8sQ0FBQyxLQUFLLENBQUMscUNBQXFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxlQUFlLEVBQUUsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUNqQyxPQUFPLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTTtZQUFFLE9BQU87UUFFM0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFdEIsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQWdCO1FBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzlELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUM1QjtRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUN4RCxJQUFJLE9BQWlCLENBQUM7UUFDdEIsSUFBSSxPQUFPLEVBQUU7WUFDWCxPQUFPLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdEO2FBQU07WUFDTCxPQUFPLEdBQUcsY0FBYyxDQUFDO1NBQzFCO1FBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7WUFDckUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzlELE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGNBQWMsQ0FBQyxjQUFvQyxFQUFFLFFBQXFCO1FBQ2hGLE1BQU0sT0FBTyxHQUFHLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO1lBQzdDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNiLE9BQU87U0FDUjtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNiLE9BQU87U0FDUjtRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2dCQUN6QixZQUFZLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxJQUFJLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ3JFLEtBQUs7Z0JBQ0wsYUFBYSxFQUFFLEtBQUssQ0FBRSw4REFBOEQ7YUFDckYsQ0FBQyxDQUFDO1lBQ0gsUUFBUSxFQUFFLEVBQUUsQ0FBQztRQUNmLENBQUMsQ0FBQztRQUVGLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZFO2FBQU07WUFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBZTtRQUNqQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUFFLE9BQU87UUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCO1lBQUUsT0FBTztRQUUxQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUVuQixJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXhCLElBQUk7WUFDRixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3hDO2dCQUFTO1lBQ1IsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7WUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYztZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDN0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUNoQixNQUFNLE9BQU8sR0FBc0IsRUFBRSxDQUFDLFdBQVcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ2xGLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ25FLElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUI7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbkUsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0I7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDckUsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFO1lBQ3ZCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLGtCQUFrQixFQUFFLFNBQVM7WUFDN0IsZUFBZSxFQUFFLFNBQVM7WUFDMUIsY0FBYyxFQUFFLEVBQUU7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ2xFLENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNwQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzVELE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDO1FBRWxDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBRTtZQUNsQyxNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ25GLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUM5QztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQztRQUN2QyxJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ2pFLENBQUM7SUFFRCxpQkFBaUI7UUFDZixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQztRQUN2QyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM1QixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3hFO1FBQ0QsT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLGVBQWUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUM7UUFDeEMsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxTQUFTLENBQUMsUUFBZ0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsS0FBSyxRQUFRLENBQUM7SUFDNUMsQ0FBQztJQUVELGtCQUFrQixDQUFDLFFBQWdCLEVBQUUsV0FBbUI7UUFDdEQsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsS0FBSyxXQUFXLENBQUM7SUFDOUYsQ0FBQztJQUVPLFVBQVUsQ0FBQyxJQUFrQyxFQUFFLFdBQXFEO1FBQzFHLE1BQU0sV0FBVyxHQUFHLFdBQVcsSUFBSSxXQUFXLElBQUksa0JBQWtCLElBQUksV0FBVyxDQUFDO1FBQ3BGLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUUsV0FBOEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUNuRyxNQUFNLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sS0FBSyxHQUF5QjtZQUNsQyxJQUFJO1lBQ0osS0FBSyxFQUFFO2dCQUNMLEdBQUcsZUFBZTtnQkFDbEIsZ0JBQWdCLEVBQUUseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDakc7WUFDRCxNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDOytHQXJUVSx3QkFBd0I7bUdBQXhCLHdCQUF3Qiw2VkN0QnJDLDR1WUFzUEEsdXpHRHZPYSxZQUFZLCtQQUFFLGVBQWUsOEJBQUUsYUFBYSxtTEFBRSxhQUFhLHdlQUFFLGdCQUFnQjs7NEZBTzdFLHdCQUF3QjtrQkFUcEMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUUsWUFDaEYsa0JBQWtCLGlCQUdiLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07d0dBR3RDLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFPdUIsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlLCBNYXRNZW51VHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgaXNPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE9yZ2FuaXplckNvbmZpZywgT3JnYW5pemVyQnV0dG9uRXZlbnQsIE9yZ2FuaXplclNsaWNlU3RhdGUsIE9yZ2FuaXplclN0YXRlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9yZ2FuaXplclN0YXRlLCByZXNvbHZlTWF0Y2hpbmdUZW1wbGF0ZUlkIH0gZnJvbSAnLi4vbW9kZWxzL29yZ2FuaXplci11dGlscyc7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tICcuL3RlbXBsYXRlLW1hbmFnZXIudXRpbGl0eSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbIENvbW1vbk1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRNZW51TW9kdWxlLCBNYXREaXZpZGVyTW9kdWxlIF0sXG4gIHNlbGVjdG9yOiAnb3JnYW5pemVyLWJ1dHRvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9vcmdhbml6ZXItYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vb3JnYW5pemVyLWJ1dHRvbi5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBPcmdhbml6ZXJCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IE9yZ2FuaXplckNvbmZpZztcbiAgQElucHV0KCkgc3RhdGU/OiBPcmdhbml6ZXJTdGF0ZTtcbiAgQElucHV0KCkgaGlkZU1lbnVWYWx1ZXMgPSBmYWxzZTtcbiAgQE91dHB1dCgpIHZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9yZ2FuaXplckJ1dHRvbkV2ZW50PigpO1xuICBAT3V0cHV0KCkgc2xpY2VTdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8T3JnYW5pemVyU2xpY2VTdGF0ZSB8IG51bGw+KCk7XG5cbiAgbG9hZGluZ0ZpZWxkSWQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBmaWVsZERhdGFDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnlbXT4oKTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWFpbk1lbnVUcmlnZ2VyJykgbWFpbk1lbnVUcmlnZ2VyPzogTWF0TWVudVRyaWdnZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJCdXR0b25dIEluaXRpYWxpemVkJywge1xuICAgICAgY29uZmlnRmllbGRzOiB0aGlzLmNvbmZpZz8uZmllbGRzPy5sZW5ndGggPz8gMCxcbiAgICAgIGhhc1N0YXRlOiAhIXRoaXMuc3RhdGUsXG4gICAgICBoaWRlTWVudVZhbHVlczogdGhpcy5oaWRlTWVudVZhbHVlc1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgaXNGaWVsZFZpc2libGUoZmllbGRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuc3RhdGU/LnZpc2libGVGaWVsZHM7XG4gICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuZmllbGRzPy5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRJZCk/LnZpc2libGUgIT09IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdmlzaWJsZS5pbmNsdWRlcyhmaWVsZElkKTtcbiAgfVxuXG4gIGZpZWxkc1N1bW1hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuY29uZmlnLmZpZWxkcz8ubGVuZ3RoID8/IDA7XG4gICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuc3RhdGU/LnZpc2libGVGaWVsZHM/Lmxlbmd0aCA/PyB0b3RhbDtcbiAgICByZXR1cm4gYCR7dmlzaWJsZX0vJHt0b3RhbH1gO1xuICB9XG5cbiAgb25GaWVsZFRvZ2dsZShmaWVsZElkOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbT3JnYW5pemVyQnV0dG9uXSBGaWVsZCB0b2dnbGVkJywgeyBmaWVsZElkLCB2aXNpYmxlIH0pO1xuICAgIGNvbnN0IHZpc2libGVGaWVsZHMgPSB0aGlzLnN0YXRlPy52aXNpYmxlRmllbGRzIHx8IFtdO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSB2aXNpYmxlXG4gICAgICA/IFsuLi52aXNpYmxlRmllbGRzLCBmaWVsZElkXVxuICAgICAgOiB2aXNpYmxlRmllbGRzLmZpbHRlcihmID0+IGYgIT09IGZpZWxkSWQpO1xuICAgIHRoaXMuZW1pdENoYW5nZSgnZmllbGRUb2dnbGVkJywgeyB2aXNpYmxlRmllbGRzOiB1cGRhdGVkIH0pO1xuICB9XG5cbiAgb25YRmllbGRTZWxlY3QoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckJ1dHRvbl0gWCBmaWVsZCBzZWxlY3RlZCcsIHsgZmllbGRJZCwgY3VycmVudDogdGhpcy5zdGF0ZT8uc2VsZWN0ZWRYIH0pO1xuICAgIC8vIMOJdml0ZSB1bmUgcmVxdcOqdGUgaW51dGlsZSBzaSBsZSBYIGVzdCBkw6lqw6Agc8OpbGVjdGlvbm7DqVxuICAgIGlmICh0aGlzLnN0YXRlPy5zZWxlY3RlZFggPT09IGZpZWxkSWQpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJCdXR0b25dIFggZmllbGQgYWxyZWFkeSBzZWxlY3RlZCwgc2tpcHBpbmcgZW1pdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ3hTZWxlY3RlZCcsIHsgc2VsZWN0ZWRYOiBmaWVsZElkIH0pO1xuICB9XG5cbiAgb25ZRmllbGRTZWxlY3QoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckJ1dHRvbl0gWSBmaWVsZCBzZWxlY3RlZCcsIHsgZmllbGRJZCwgY3VycmVudDogdGhpcy5zdGF0ZT8uc2VsZWN0ZWRZIH0pO1xuICAgIC8vIMOJdml0ZSB1bmUgcmVxdcOqdGUgaW51dGlsZSBzaSBsZSBZIGVzdCBkw6lqw6Agc8OpbGVjdGlvbm7DqVxuICAgIGlmICh0aGlzLnN0YXRlPy5zZWxlY3RlZFkgPT09IGZpZWxkSWQpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJCdXR0b25dIFkgZmllbGQgYWxyZWFkeSBzZWxlY3RlZCwgc2tpcHBpbmcgZW1pdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ3lTZWxlY3RlZCcsIHtcbiAgICAgIHNlbGVjdGVkWTogZmllbGRJZCxcbiAgICAgIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH1cblxuICBvbllBZ2dyZWdhdGVTZWxlY3QoeUZpZWxkSWQ6IHN0cmluZywgYWdncmVnYXRlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJCdXR0b25dIFkgYWdncmVnYXRlIHNlbGVjdGVkJywgeyB5RmllbGRJZCwgYWdncmVnYXRlSWQsIGN1cnJlbnQ6IHRoaXMuc3RhdGU/LnNlbGVjdGVkWUFnZ3JlZ2F0ZSB9KTtcbiAgICAvLyDDiXZpdGUgdW5lIHJlcXXDqnRlIGludXRpbGUgc2kgbCdhZ2dyZWdhdGUgZXN0IGTDqWrDoCBzw6lsZWN0aW9ubsOpXG4gICAgaWYgKHRoaXMuc3RhdGU/LnNlbGVjdGVkWUFnZ3JlZ2F0ZSA9PT0gYWdncmVnYXRlSWQgJiYgdGhpcy5zdGF0ZT8uc2VsZWN0ZWRZID09PSB5RmllbGRJZCkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckJ1dHRvbl0gWSBhZ2dyZWdhdGUgYWxyZWFkeSBzZWxlY3RlZCwgc2tpcHBpbmcgZW1pdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ3lTZWxlY3RlZCcsIHtcbiAgICAgIHNlbGVjdGVkWTogeUZpZWxkSWQsXG4gICAgICBzZWxlY3RlZFlBZ2dyZWdhdGU6IGFnZ3JlZ2F0ZUlkXG4gICAgfSk7XG4gIH1cblxuICBvbkdyb3VwQnlTZWxlY3QoZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckJ1dHRvbl0gR3JvdXAgYnkgc2VsZWN0ZWQnLCB7IGdyb3VwSWQgfSk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RhdGUuc2VsZWN0ZWRHcm91cEJ5O1xuICAgIHRoaXMuZW1pdENoYW5nZSgnZ3JvdXBCeVNlbGVjdGVkJywgeyBzZWxlY3RlZEdyb3VwQnk6IGN1cnJlbnQgPT09IGdyb3VwSWQgPyB1bmRlZmluZWQgOiBncm91cElkIH0pO1xuICB9XG5cbiAgb25UZW1wbGF0ZVNlbGVjdCh0ZW1wbGF0ZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbT3JnYW5pemVyQnV0dG9uXSBUZW1wbGF0ZSBzZWxlY3RlZCcsIHsgdGVtcGxhdGVJZCB9KTtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnRlbXBsYXRlcz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuY29uZmlnLnRlbXBsYXRlcz8uZmluZCh0ID0+IHQuaWQgPT09IHRlbXBsYXRlSWQpO1xuICAgIGlmICghdGVtcGxhdGUpIHJldHVybjtcblxuICAgIGNvbnN0IG5ld1N0YXRlID0gVGVtcGxhdGVNYW5hZ2VyLmFwcGx5VGVtcGxhdGUodGVtcGxhdGUsIHRoaXMuc3RhdGUsIHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ3RlbXBsYXRlU2VsZWN0ZWQnLCBuZXdTdGF0ZSk7XG4gICAgdGhpcy5zeW5jU2xpY2VTdGF0ZShuZXdTdGF0ZS5zZWxlY3RlZFNsaWNlcyk7XG4gIH1cblxuICBvblNsaWNlQ2xpY2soc2xpY2VJZD86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJCdXR0b25dIFNsaWNlIGNsaWNrZWQnLCB7IHNsaWNlSWQgfSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uU2xpY2VDbGljaykge1xuICAgICAgdGhpcy5jb25maWcub25TbGljZUNsaWNrKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRTbGljZXMgPSB0aGlzLnN0YXRlPy5zZWxlY3RlZFNsaWNlcyB8fCBbXTtcbiAgICBsZXQgdXBkYXRlZDogc3RyaW5nW107XG4gICAgaWYgKHNsaWNlSWQpIHtcbiAgICAgIHVwZGF0ZWQgPSBzZWxlY3RlZFNsaWNlcy5pbmNsdWRlcyhzbGljZUlkKSA/IFtdIDogW3NsaWNlSWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVkID0gc2VsZWN0ZWRTbGljZXM7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZWQubGVuZ3RoID09PSAwIHx8ICFzbGljZUlkIHx8ICF0aGlzLmNvbmZpZy5vbkZldGNoU2xpY2VEYXRhKSB7XG4gICAgICB0aGlzLnNsaWNlU3RhdGVDaGFuZ2UuZW1pdChudWxsKTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgnc2xpY2VTZWxlY3RlZCcsIHsgc2VsZWN0ZWRTbGljZXM6IHVwZGF0ZWQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zeW5jU2xpY2VTdGF0ZSh1cGRhdGVkLCAoKSA9PiB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoJ3NsaWNlU2VsZWN0ZWQnLCB7IHNlbGVjdGVkU2xpY2VzOiB1cGRhdGVkIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jU2xpY2VTdGF0ZShzZWxlY3RlZFNsaWNlczogc3RyaW5nW10gfCB1bmRlZmluZWQsIG9uTG9hZGVkPzogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IHNsaWNlSWQgPSBzZWxlY3RlZFNsaWNlcz8uWzBdO1xuICAgIGlmICghc2xpY2VJZCB8fCAhdGhpcy5jb25maWcub25GZXRjaFNsaWNlRGF0YSkge1xuICAgICAgdGhpcy5zbGljZVN0YXRlQ2hhbmdlLmVtaXQobnVsbCk7XG4gICAgICBvbkxvYWRlZD8uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2xpY2UgPSB0aGlzLmNvbmZpZy5zbGljZXM/LmZpbmQocyA9PiBzLmlkID09PSBzbGljZUlkKTtcbiAgICBpZiAoIXNsaWNlKSB7XG4gICAgICB0aGlzLnNsaWNlU3RhdGVDaGFuZ2UuZW1pdChudWxsKTtcbiAgICAgIG9uTG9hZGVkPy4oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5vbkZldGNoU2xpY2VEYXRhKHNsaWNlSWQpO1xuICAgIGNvbnN0IGhhbmRsZURhdGEgPSAodGFza3M6IGFueVtdKSA9PiB7XG4gICAgICB0aGlzLnNsaWNlU3RhdGVDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHNsaWNlQ29uZmlnczogW3sgdGl0bGU6IHNsaWNlLmxhYmVsID8/IHNsaWNlSWQsIGNvbHVtbktleTogc2xpY2VJZCB9XSxcbiAgICAgICAgdGFza3MsXG4gICAgICAgIGZpbHRlckFwcGxpZWQ6IGZhbHNlICAvLyBQYW5lbCB2aWVudCBkJ8OqdHJlIG91dmVydCwgcGFzIGRlIGZpbHRyZSBzw6lsZWN0aW9ubsOpIGVuY29yZVxuICAgICAgfSk7XG4gICAgICBvbkxvYWRlZD8uKCk7XG4gICAgfTtcblxuICAgIGlmIChpc09ic2VydmFibGUocmVzdWx0KSkge1xuICAgICAgcmVzdWx0LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoeyBuZXh0OiBoYW5kbGVEYXRhIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQudGhlbihoYW5kbGVEYXRhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkRmllbGREYXRhKGZpZWxkSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZpZWxkRGF0YUNhY2hlLmhhcyhmaWVsZElkKSkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jb25maWcub25GZXRjaEZpZWxkRGF0YSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmNvbmZpZy5maWVsZHM/LmZpbmQoZiA9PiBmLmlkID09PSBmaWVsZElkKTtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG5cbiAgICB0aGlzLmxvYWRpbmdGaWVsZElkID0gZmllbGRJZDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5jb25maWcub25GZXRjaEZpZWxkRGF0YShmaWVsZElkKTtcbiAgICAgIHRoaXMuZmllbGREYXRhQ2FjaGUuc2V0KGZpZWxkSWQsIGRhdGEpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmdGaWVsZElkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgb25FeHBvcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uRXhwb3J0KSB0aGlzLmNvbmZpZy5vbkV4cG9ydCgpO1xuICAgIHRoaXMubWFpbk1lbnVUcmlnZ2VyPy5jbG9zZU1lbnUoKTtcbiAgfVxuXG4gIG9uRXhwb3J0VmlzdWFsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkV4cG9ydFZpc3VhbCkgdGhpcy5jb25maWcub25FeHBvcnRWaXN1YWwoKTtcbiAgICB0aGlzLm1haW5NZW51VHJpZ2dlcj8uY2xvc2VNZW51KCk7XG4gIH1cblxuICBvbkV4cG9ydERhdGEoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uRXhwb3J0RGF0YSkgdGhpcy5jb25maWcub25FeHBvcnREYXRhKCk7XG4gICAgdGhpcy5tYWluTWVudVRyaWdnZXI/LmNsb3NlTWVudSgpO1xuICB9XG5cbiAgaGFzRXhwb3J0U3ViTWVudSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5jb25maWcub25FeHBvcnRWaXN1YWwgfHwgdGhpcy5jb25maWcub25FeHBvcnREYXRhKTtcbiAgfVxuXG4gIGhhc1N3aXRjaFZpZXcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWcuc3dpdGNoVmlldztcbiAgfVxuXG4gIG9uU3dpdGNoVmlldygpOiB2b2lkIHtcbiAgICBjb25zdCBzdiA9IHRoaXMuY29uZmlnLnN3aXRjaFZpZXc7XG4gICAgaWYgKCFzdikgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1ZpZXc6ICdjaGFydCcgfCAndGFibGUnID0gc3YuY3VycmVudFZpZXcgPT09ICdjaGFydCcgPyAndGFibGUnIDogJ2NoYXJ0JztcbiAgICBzdi5vblN3aXRjaChuZXdWaWV3KTtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ3ZpZXdTd2l0Y2hlZCcsIHsgdmlld01vZGU6IG5ld1ZpZXcgfSk7XG4gICAgdGhpcy5tYWluTWVudVRyaWdnZXI/LmNsb3NlTWVudSgpO1xuICB9XG5cbiAgb25QcmVmZXJlbmNlc0VkaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uUHJlZmVyZW5jZXNFZGl0KSB0aGlzLmNvbmZpZy5vblByZWZlcmVuY2VzRWRpdCgpO1xuICAgIHRoaXMubWFpbk1lbnVUcmlnZ2VyPy5jbG9zZU1lbnUoKTtcbiAgfVxuXG4gIG9uUHJlZmVyZW5jZXNTYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vblByZWZlcmVuY2VzU2F2ZSkgdGhpcy5jb25maWcub25QcmVmZXJlbmNlc1NhdmUoKTtcbiAgICB0aGlzLm1haW5NZW51VHJpZ2dlcj8uY2xvc2VNZW51KCk7XG4gIH1cblxuICBvblByZWZlcmVuY2VzQ2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uUHJlZmVyZW5jZXNDbGVhcikgdGhpcy5jb25maWcub25QcmVmZXJlbmNlc0NsZWFyKCk7XG4gICAgdGhpcy5tYWluTWVudVRyaWdnZXI/LmNsb3NlTWVudSgpO1xuICB9XG5cbiAgb25SZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ3Jlc2V0Jywge1xuICAgICAgdmlzaWJsZUZpZWxkczogW10sXG4gICAgICBzZWxlY3RlZFg6IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGVkWTogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0ZWRZQWdncmVnYXRlOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZEdyb3VwQnk6IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGVkU2xpY2VzOiBbXVxuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZlWExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YXRlPy5zZWxlY3RlZFg7XG4gICAgaWYgKCFpZCkgcmV0dXJuICcnO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy54RmllbGRzPy5maW5kKGYgPT4gZi5pZCA9PT0gaWQpPy5sYWJlbCA/PyBpZDtcbiAgfVxuXG4gIGFjdGl2ZVlMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHlJZCA9IHRoaXMuc3RhdGU/LnNlbGVjdGVkWTtcbiAgICBpZiAoIXlJZCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHlGaWVsZCA9IHRoaXMuY29uZmlnLnlGaWVsZHM/LmZpbmQoZiA9PiBmLmlkID09PSB5SWQpO1xuICAgIGNvbnN0IGJhc2UgPSB5RmllbGQ/LmxhYmVsID8/IHlJZDtcblxuICAgIGlmICh0aGlzLnN0YXRlPy5zZWxlY3RlZFlBZ2dyZWdhdGUpIHtcbiAgICAgIGNvbnN0IGFnZyA9IHlGaWVsZD8uYWdncmVnYXRlcz8uZmluZChhID0+IGEuaWQgPT09IHRoaXMuc3RhdGUhLnNlbGVjdGVkWUFnZ3JlZ2F0ZSk7XG4gICAgICByZXR1cm4gYWdnID8gYCR7YmFzZX0gwrcgJHthZ2cubGFiZWx9YCA6IGJhc2U7XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgYWN0aXZlR3JvdXBCeUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YXRlPy5zZWxlY3RlZEdyb3VwQnk7XG4gICAgaWYgKCFpZCkgcmV0dXJuICcnO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5ncm91cHM/LmZpbmQoZyA9PiBnLmlkID09PSBpZCk/LmxhYmVsID8/IGlkO1xuICB9XG5cbiAgYWN0aXZlU2xpY2VzTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpZHMgPSB0aGlzLnN0YXRlPy5zZWxlY3RlZFNsaWNlcztcbiAgICBpZiAoIWlkcz8ubGVuZ3RoKSByZXR1cm4gJyc7XG4gICAgaWYgKGlkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5zbGljZXM/LmZpbmQocyA9PiBzLmlkID09PSBpZHNbMF0pPy5sYWJlbCA/PyBpZHNbMF07XG4gICAgfVxuICAgIHJldHVybiBgJHtpZHMubGVuZ3RofSBzw6lsZWN0aW9ubsOpc2A7XG4gIH1cblxuICBhY3RpdmVUZW1wbGF0ZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnN0YXRlPy5zZWxlY3RlZFRlbXBsYXRlO1xuICAgIGlmICghaWQpIHJldHVybiAnJztcbiAgICByZXR1cm4gdGhpcy5jb25maWcudGVtcGxhdGVzPy5maW5kKHQgPT4gdC5pZCA9PT0gaWQpPy5sYWJlbCA/PyBpZDtcbiAgfVxuXG4gIGhhc0NoYXJ0RmllbGRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5jb25maWcueEZpZWxkcz8ubGVuZ3RoID8/IDApID4gMCB8fCAodGhpcy5jb25maWcueUZpZWxkcz8ubGVuZ3RoID8/IDApID4gMDtcbiAgfVxuXG4gIGhhc1RhYmxlRmllbGRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5jb25maWcuZmllbGRzPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgaXNZQWN0aXZlKHlGaWVsZElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZT8uc2VsZWN0ZWRZID09PSB5RmllbGRJZDtcbiAgfVxuXG4gIGlzWUFnZ3JlZ2F0ZUFjdGl2ZSh5RmllbGRJZDogc3RyaW5nLCBhZ2dyZWdhdGVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGU/LnNlbGVjdGVkWSA9PT0geUZpZWxkSWQgJiYgdGhpcy5zdGF0ZT8uc2VsZWN0ZWRZQWdncmVnYXRlID09PSBhZ2dyZWdhdGVJZDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENoYW5nZSh0eXBlOiBPcmdhbml6ZXJCdXR0b25FdmVudFsndHlwZSddLCBzdGF0ZVVwZGF0ZTogUGFydGlhbDxPcmdhbml6ZXJTdGF0ZT4gfCBPcmdhbml6ZXJTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IGlzRnVsbFN0YXRlID0gJ3NlbGVjdGVkWCcgaW4gc3RhdGVVcGRhdGUgJiYgJ3NlbGVjdGVkVGVtcGxhdGUnIGluIHN0YXRlVXBkYXRlO1xuICAgIGNvbnN0IHJhd1N0YXRlID0gaXNGdWxsU3RhdGUgPyAoc3RhdGVVcGRhdGUgYXMgT3JnYW5pemVyU3RhdGUpIDogeyAuLi50aGlzLnN0YXRlLCAuLi5zdGF0ZVVwZGF0ZSB9O1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTdGF0ZSA9IG5vcm1hbGl6ZU9yZ2FuaXplclN0YXRlKHJhd1N0YXRlLCB0aGlzLmNvbmZpZyk7XG4gICAgY29uc3QgZXZlbnQ6IE9yZ2FuaXplckJ1dHRvbkV2ZW50ID0ge1xuICAgICAgdHlwZSxcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIC4uLm5vcm1hbGl6ZWRTdGF0ZSxcbiAgICAgICAgc2VsZWN0ZWRUZW1wbGF0ZTogcmVzb2x2ZU1hdGNoaW5nVGVtcGxhdGVJZCh0aGlzLmNvbmZpZy50ZW1wbGF0ZXMsIG5vcm1hbGl6ZWRTdGF0ZSwgdGhpcy5jb25maWcpXG4gICAgICB9LFxuICAgICAgc291cmNlOiAndXNlcidcbiAgICB9O1xuICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KGV2ZW50KTtcbiAgfVxufVxuIiwiPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItYnRuXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInZpZXdNZW51XCIgI21haW5NZW51VHJpZ2dlcj1cIm1hdE1lbnVUcmlnZ2VyXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInVmlldydcIj5cbiAgPG1hdC1pY29uIGNsYXNzPVwib3JnYW5pemVyLWJ0bi1pY29uXCI+e3sgY29uZmlnLmJ1dHRvbkljb24gfHwgJ3NldHRpbmdzJyB9fTwvbWF0LWljb24+XG48L2J1dHRvbj5cblxuPG1hdC1tZW51ICN2aWV3TWVudT1cIm1hdE1lbnVcIiBwYW5lbENsYXNzPVwib3JnYW5pemVyLW1lbnUtcGFuZWxcIj5cblxuICA8IS0tIENoYW1wcyA6IG1vZGUgY2hhcnQgKFggKyBZKSAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cImhhc0NoYXJ0RmllbGRzKClcIiBtYXQtbWVudS1pdGVtIFttYXRNZW51VHJpZ2dlckZvcl09XCJjaGFtcHNTdWJNZW51XCIgY2xhc3M9XCJvcmdhbml6ZXItbWVudS10cmlnZ2VyXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1sYWJlbFwiPkNoYW1wczwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXZhbHVlXCIgKm5nSWY9XCIhaGlkZU1lbnVWYWx1ZXMgJiYgKGFjdGl2ZVhMYWJlbCgpIHx8IGFjdGl2ZVlMYWJlbCgpKVwiPlxuICAgICAge3sgYWN0aXZlWExhYmVsKCkgfX08bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlWExhYmVsKCkgJiYgYWN0aXZlWUxhYmVsKClcIj4gLyA8L25nLWNvbnRhaW5lcj57eyBhY3RpdmVZTGFiZWwoKSB9fVxuICAgIDwvc3Bhbj5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBDaGFtcHMgOiBtb2RlIHRhYmxlICh0b2dnbGUgY29sb25uZXMpIC0tPlxuICA8YnV0dG9uICpuZ0lmPVwiaGFzVGFibGVGaWVsZHMoKVwiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImZpZWxkc1N1Yk1lbnVcIiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXRyaWdnZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+Q2hhbXBzPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdmFsdWVcIiAqbmdJZj1cIiFoaWRlTWVudVZhbHVlc1wiPnt7IGZpZWxkc1N1bW1hcnkoKSB9fTwvc3Bhbj5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBHcm91cGVyIHBhciAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cImNvbmZpZy5ncm91cHM/Lmxlbmd0aFwiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImdyb3Vwc1N1Yk1lbnVcIiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXRyaWdnZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+R3JvdXBlciBwYXI8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS12YWx1ZVwiICpuZ0lmPVwiIWhpZGVNZW51VmFsdWVzICYmIGFjdGl2ZUdyb3VwQnlMYWJlbCgpXCI+e3sgYWN0aXZlR3JvdXBCeUxhYmVsKCkgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuXG4gIDwhLS0gRmlsdHJlciBwYXIgLS0+XG4gIDxidXR0b24gKm5nSWY9XCJjb25maWcuc2xpY2VzPy5sZW5ndGhcIiBtYXQtbWVudS1pdGVtIFttYXRNZW51VHJpZ2dlckZvcl09XCJzbGljZXNTdWJNZW51XCIgY2xhc3M9XCJvcmdhbml6ZXItbWVudS10cmlnZ2VyXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1sYWJlbFwiPkZpbHRyZXIgcGFyPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdmFsdWVcIiAqbmdJZj1cIiFoaWRlTWVudVZhbHVlcyAmJiBhY3RpdmVTbGljZXNMYWJlbCgpXCI+e3sgYWN0aXZlU2xpY2VzTGFiZWwoKSB9fTwvc3Bhbj5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBUZW1wbGF0ZSAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cImNvbmZpZy50ZW1wbGF0ZXM/Lmxlbmd0aFwiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInRlbXBsYXRlU3ViTWVudVwiIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdHJpZ2dlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtbGFiZWxcIj5UZW1wbGF0ZTwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXZhbHVlXCIgKm5nSWY9XCIhaGlkZU1lbnVWYWx1ZXMgJiYgYWN0aXZlVGVtcGxhdGVMYWJlbCgpXCI+e3sgYWN0aXZlVGVtcGxhdGVMYWJlbCgpIH19PC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8IS0tIEV4cG9ydCBkaXJlY3QgKG1vZGUgdGFibGUpIC0tPlxuICA8bWF0LWRpdmlkZXIgKm5nSWY9XCJjb25maWcuc2hvd0V4cG9ydFwiIGNsYXNzPVwib3JnYW5pemVyLWRpdmlkZXJcIj48L21hdC1kaXZpZGVyPlxuICA8YnV0dG9uICpuZ0lmPVwiY29uZmlnLnNob3dFeHBvcnQgJiYgIWhhc0V4cG9ydFN1Yk1lbnUoKVwiIG1hdC1tZW51LWl0ZW0gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtZXhwb3J0XCIgKGNsaWNrKT1cIm9uRXhwb3J0KClcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1leHBvcnQtaWNvblwiPmRvd25sb2FkPC9tYXQtaWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+RXhwb3J0ZXI8L3NwYW4+XG4gIDwvYnV0dG9uPlxuXG4gIDwhLS0gRXhwb3J0IGdyYXBoaXF1ZSAobW9kZSBjaGFydCkg4oCUIG91dnJlIHVuIHNvdXMtbWVudSAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cImNvbmZpZy5zaG93RXhwb3J0ICYmIGhhc0V4cG9ydFN1Yk1lbnUoKVwiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImV4cG9ydFN1Yk1lbnVcIiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXRyaWdnZXIgb3JnYW5pemVyLW1lbnUtZXhwb3J0XCI+XG4gICAgPG1hdC1pY29uIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtZXhwb3J0LWljb25cIj5kb3dubG9hZDwvbWF0LWljb24+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1sYWJlbFwiPkV4cG9ydGVyPC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8IS0tIFByw6lmw6lyZW5jZXMgLS0+XG4gIDxtYXQtZGl2aWRlciAqbmdJZj1cImNvbmZpZy5zaG93UHJlZmVyZW5jZXNcIiBjbGFzcz1cIm9yZ2FuaXplci1kaXZpZGVyXCI+PC9tYXQtZGl2aWRlcj5cbiAgPGJ1dHRvbiAqbmdJZj1cImNvbmZpZy5zaG93UHJlZmVyZW5jZXNcIiBtYXQtbWVudS1pdGVtIFttYXRNZW51VHJpZ2dlckZvcl09XCJwcmVmZXJlbmNlc1N1Yk1lbnVcIiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXRyaWdnZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+UHLDqWbDqXJlbmNlczwvc3Bhbj5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBTd2l0Y2ggY2hhcnQgLyB0YWJsZSAtLT5cbiAgPG1hdC1kaXZpZGVyICpuZ0lmPVwiaGFzU3dpdGNoVmlldygpXCIgY2xhc3M9XCJvcmdhbml6ZXItZGl2aWRlclwiPjwvbWF0LWRpdmlkZXI+XG4gIDxidXR0b24gKm5nSWY9XCJoYXNTd2l0Y2hWaWV3KClcIiBtYXQtbWVudS1pdGVtIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXRyaWdnZXJcIiAoY2xpY2spPVwib25Td2l0Y2hWaWV3KClcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1leHBvcnQtaWNvblwiPnt7IGNvbmZpZy5zd2l0Y2hWaWV3Py5jdXJyZW50VmlldyA9PT0gJ2NoYXJ0JyA/ICd0YWJsZV9jaGFydCcgOiAnYmFyX2NoYXJ0JyB9fTwvbWF0LWljb24+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1sYWJlbFwiPnt7IGNvbmZpZy5zd2l0Y2hWaWV3Py5jdXJyZW50VmlldyA9PT0gJ2NoYXJ0JyA/ICdUYWJsZWF1JyA6ICdHcmFwaGlxdWUnIH19PC9zcGFuPlxuICA8L2J1dHRvbj5cblxuPC9tYXQtbWVudT5cblxuPCEtLSBTb3VzLW1lbnUgOiBFeHBvcnQgZ3JhcGhpcXVlIC0tPlxuPG1hdC1tZW51ICNleHBvcnRTdWJNZW51PVwibWF0TWVudVwiIHBhbmVsQ2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1wYW5lbFwiPlxuICA8ZGl2IGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnVcIlxuICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiY29uZmlnLm9uRXhwb3J0VmlzdWFsXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbVwiXG4gICAgICAobW91c2Vkb3duKT1cIm9uRXhwb3J0VmlzdWFsKClcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj48L3NwYW4+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pY29uXCI+aW1hZ2U8L21hdC1pY29uPlxuICAgICAgVmlzdWVsXG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiAqbmdJZj1cImNvbmZpZy5vbkV4cG9ydERhdGFcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgIChtb3VzZWRvd24pPVwib25FeHBvcnREYXRhKClcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj48L3NwYW4+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pY29uXCI+dGFibGVfY2hhcnQ8L21hdC1pY29uPlxuICAgICAgRG9ubsOpZXNcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L21hdC1tZW51PlxuXG48IS0tIFNvdXMtbWVudSA6IENoYW1wcyBjaGFydCAoWCArIFkpIC0tPlxuPG1hdC1tZW51ICNjaGFtcHNTdWJNZW51PVwibWF0TWVudVwiIHBhbmVsQ2xhc3M9XCJvcmdhbml6ZXItY2hhbXBzLXBhbmVsXCI+XG4gIDxkaXYgY2xhc3M9XCJvcmdhbml6ZXItY2hhbXBzLXdyYXBwZXJcIlxuICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cblxuICAgIDwhLS0gQmxvYyBYIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJvcmdhbml6ZXItY2hhbXBzLWJsb2NrXCIgKm5nSWY9XCJjb25maWcueEZpZWxkcz8ubGVuZ3RoXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1jaGFtcHMtYmxvY2stdGl0bGVcIj5BeGUgaG9yaXpvbnRhbCDigJQgWDwvc3Bhbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbVwiXG4gICAgICAgICpuZ0Zvcj1cImxldCB4RmllbGQgb2YgY29uZmlnLnhGaWVsZHNcIlxuICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInN0YXRlPy5zZWxlY3RlZFggPT09IHhGaWVsZC5pZFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJ4RmllbGQuZGlzYWJsZWRcIlxuICAgICAgICAobW91c2Vkb3duKT1cIm9uWEZpZWxkU2VsZWN0KHhGaWVsZC5pZClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPnt7IHN0YXRlPy5zZWxlY3RlZFggPT09IHhGaWVsZC5pZCA/ICfinJMnIDogJycgfX08L3NwYW4+XG4gICAgICAgIHt7IHhGaWVsZC5sYWJlbCB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8bWF0LWRpdmlkZXIgKm5nSWY9XCJjb25maWcueEZpZWxkcz8ubGVuZ3RoICYmIGNvbmZpZy55RmllbGRzPy5sZW5ndGhcIiBjbGFzcz1cIm9yZ2FuaXplci1jaGFtcHMtZGl2aWRlclwiPjwvbWF0LWRpdmlkZXI+XG5cbiAgICA8IS0tIEJsb2MgWSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwib3JnYW5pemVyLWNoYW1wcy1ibG9ja1wiICpuZ0lmPVwiY29uZmlnLnlGaWVsZHM/Lmxlbmd0aFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItY2hhbXBzLWJsb2NrLXRpdGxlXCI+QXhlIHZlcnRpY2FsIOKAlCBZPC9zcGFuPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgeUZpZWxkIG9mIGNvbmZpZy55RmllbGRzXCI+XG5cbiAgICAgICAgPCEtLSBZIHNpbXBsZSAoQ291bnQgc2FucyBhZ3LDqWdhdCBuaSBzdGFjaykgLS0+XG4gICAgICAgIDwhLS0gWSBzaW1wbGUgKENvdW50IG91IG3DqXRyaXF1ZSBkaXJlY3RlKSAtLT5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiF5RmllbGQuYWdncmVnYXRlcz8ubGVuZ3RoXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzWUFjdGl2ZSh5RmllbGQuaWQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwieUZpZWxkLmRpc2FibGVkXCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cIm9uWUZpZWxkU2VsZWN0KHlGaWVsZC5pZClcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWNoZWNrXCI+e3sgaXNZQWN0aXZlKHlGaWVsZC5pZCkgPyAn4pyTJyA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgIHt7IHlGaWVsZC5sYWJlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8IS0tIFkgYXZlYyBhZ3LDqWdhdHMg4oaSIHNvdXMtbWVudSAtLT5cbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInlGaWVsZC5hZ2dyZWdhdGVzPy5sZW5ndGhcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW0gb3JnYW5pemVyLXN1Ym1lbnUtaXRlbS0taGFzLWNoaWxkcmVuXCJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzWUFjdGl2ZSh5RmllbGQuaWQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwieUZpZWxkLmRpc2FibGVkXCJcbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwieUFnZ1N1Yk1lbnVcIlxuICAgICAgICAgIFttYXRNZW51VHJpZ2dlckRhdGFdPVwieyB5RmllbGQ6IHlGaWVsZCB9XCJcbiAgICAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj57eyBpc1lBY3RpdmUoeUZpZWxkLmlkKSA/ICfinJMnIDogJycgfX08L3NwYW4+XG4gICAgICAgICAge3sgeUZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtYXJyb3dcIj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuPC9tYXQtbWVudT5cblxuPCEtLSBTb3VzLW1lbnUgZHluYW1pcXVlIDogYWdyw6lnYXRzIGQndW4gY2hhbXAgWSAtLT5cbjxtYXQtbWVudSAjeUFnZ1N1Yk1lbnU9XCJtYXRNZW51XCIgcGFuZWxDbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LXBhbmVsXCI+XG4gIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudCBsZXQteUZpZWxkPVwieUZpZWxkXCI+XG4gICAgPGRpdiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51XCJcbiAgICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW1cIlxuICAgICAgICAqbmdGb3I9XCJsZXQgYWdnIG9mIHlGaWVsZC5hZ2dyZWdhdGVzXCJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc1lBZ2dyZWdhdGVBY3RpdmUoeUZpZWxkLmlkLCBhZ2cuaWQpXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvbllBZ2dyZWdhdGVTZWxlY3QoeUZpZWxkLmlkLCBhZ2cuaWQpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj57eyBpc1lBZ2dyZWdhdGVBY3RpdmUoeUZpZWxkLmlkLCBhZ2cuaWQpID8gJ+KckycgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAge3sgYWdnLmxhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gU291cy1tZW51IDogQ2hhbXBzIHRhYmxlICh0b2dnbGUgY29sb25uZXMpIC0tPlxuPG1hdC1tZW51ICNmaWVsZHNTdWJNZW51PVwibWF0TWVudVwiIHBhbmVsQ2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1wYW5lbFwiPlxuICA8ZGl2IGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnVcIlxuICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW1cIlxuICAgICAgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGNvbmZpZy5maWVsZHNcIlxuICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc0ZpZWxkVmlzaWJsZShmaWVsZC5pZClcIlxuICAgICAgKG1vdXNlZG93bik9XCJvbkZpZWxkVG9nZ2xlKGZpZWxkLmlkLCAhaXNGaWVsZFZpc2libGUoZmllbGQuaWQpKVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPnt7IGlzRmllbGRWaXNpYmxlKGZpZWxkLmlkKSA/ICfinJMnIDogJycgfX08L3NwYW4+ICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZmllbGQuaWNvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaWNvblwiPnt7IGZpZWxkLmljb24gfX08L21hdC1pY29uPiAgICAgIHt7IGZpZWxkLmxhYmVsIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9tYXQtbWVudT5cblxuPCEtLSBTb3VzLW1lbnUgOiBHcm91cGVyIHBhciAtLT5cbjxtYXQtbWVudSAjZ3JvdXBzU3ViTWVudT1cIm1hdE1lbnVcIiBwYW5lbENsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtcGFuZWxcIj5cbiAgPGRpdiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51XCJcbiAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgICpuZ0Zvcj1cImxldCBncm91cCBvZiBjb25maWcuZ3JvdXBzXCJcbiAgICAgIFtjbGFzcy5hY3RpdmVdPVwic3RhdGU/LnNlbGVjdGVkR3JvdXBCeSA9PT0gZ3JvdXAuaWRcIlxuICAgICAgKG1vdXNlZG93bik9XCJvbkdyb3VwQnlTZWxlY3QoZ3JvdXAuaWQpXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWNoZWNrXCI+e3sgc3RhdGU/LnNlbGVjdGVkR3JvdXBCeSA9PT0gZ3JvdXAuaWQgPyAn4pyTJyA6ICcnIH19PC9zcGFuPiAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImdyb3VwLmljb25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWljb25cIj57eyBncm91cC5pY29uIH19PC9tYXQtaWNvbj4gICAgICB7eyBncm91cC5sYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gU291cy1tZW51IDogRmlsdHJlciBwYXIgLS0+XG48bWF0LW1lbnUgI3NsaWNlc1N1Yk1lbnU9XCJtYXRNZW51XCIgcGFuZWxDbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LXBhbmVsXCI+XG4gIDxkaXYgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudVwiXG4gICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbVwiXG4gICAgICAqbmdGb3I9XCJsZXQgc2xpY2Ugb2YgY29uZmlnLnNsaWNlc1wiXG4gICAgICBbY2xhc3MuYWN0aXZlXT1cInN0YXRlPy5zZWxlY3RlZFNsaWNlcz8uaW5jbHVkZXMoc2xpY2UuaWQpXCJcbiAgICAgIChtb3VzZWRvd24pPVwib25TbGljZUNsaWNrKHNsaWNlLmlkKVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPnt7IHN0YXRlPy5zZWxlY3RlZFNsaWNlcz8uaW5jbHVkZXMoc2xpY2UuaWQpID8gJ+KckycgOiAnJyB9fTwvc3Bhbj4gICAgICA8bWF0LWljb24gKm5nSWY9XCJzbGljZS5pY29uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pY29uXCI+e3sgc2xpY2UuaWNvbiB9fTwvbWF0LWljb24+ICAgICAge3sgc2xpY2UubGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L21hdC1tZW51PlxuXG48IS0tIFNvdXMtbWVudSA6IFRlbXBsYXRlIC0tPlxuPG1hdC1tZW51ICN0ZW1wbGF0ZVN1Yk1lbnU9XCJtYXRNZW51XCIgcGFuZWxDbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LXBhbmVsXCI+XG4gIDxkaXYgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudVwiXG4gICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbVwiXG4gICAgICAqbmdGb3I9XCJsZXQgdG1wbCBvZiBjb25maWcudGVtcGxhdGVzXCJcbiAgICAgIFtjbGFzcy5hY3RpdmVdPVwic3RhdGU/LnNlbGVjdGVkVGVtcGxhdGUgPT09IHRtcGwuaWRcIlxuICAgICAgW3RpdGxlXT1cInRtcGwuZGVzY3JpcHRpb24gfHwgJydcIlxuICAgICAgKG1vdXNlZG93bik9XCJvblRlbXBsYXRlU2VsZWN0KHRtcGwuaWQpXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWNoZWNrXCI+e3sgc3RhdGU/LnNlbGVjdGVkVGVtcGxhdGUgPT09IHRtcGwuaWQgPyAn4pyTJyA6ICcnIH19PC9zcGFuPlxuICAgICAgPG1hdC1pY29uICpuZ0lmPVwidG1wbC5pY29uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pY29uXCI+e3sgdG1wbC5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgIHt7IHRtcGwubGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L21hdC1tZW51PlxuXG48IS0tIFNvdXMtbWVudSA6IFByw6lmw6lyZW5jZXMgLS0+XG48bWF0LW1lbnUgI3ByZWZlcmVuY2VzU3ViTWVudT1cIm1hdE1lbnVcIiBwYW5lbENsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtcGFuZWxcIj5cbiAgPGRpdiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51XCJcbiAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCIgKG1vdXNlZG93bik9XCJvblByZWZlcmVuY2VzRWRpdCgpXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWNoZWNrXCI+PC9zcGFuPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaWNvblwiPmVkaXQ8L21hdC1pY29uPsOJZGl0ZXJcbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW1cIiAobW91c2Vkb3duKT1cIm9uUHJlZmVyZW5jZXNTYXZlKClcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj48L3NwYW4+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pY29uXCI+c2F2ZTwvbWF0LWljb24+U2F1dmVnYXJkZXJcbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW1cIiBbZGlzYWJsZWRdPVwiIWNvbmZpZy5oYXNTYXZlZFByZWZlcmVuY2VzXCIgKG1vdXNlZG93bik9XCJvblByZWZlcmVuY2VzQ2xlYXIoKVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPjwvc3Bhbj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWljb25cIj5kZWxldGVfb3V0bGluZTwvbWF0LWljb24+UsOpaW5pdGlhbGlzZXJcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L21hdC1tZW51PlxuXG4iXX0=
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS1vcmdhbml6ZXIvc3JjL2xpYi9vcmdhbml6ZXItYnV0dG9uL29yZ2FuaXplci1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktb3JnYW5pemVyL3NyYy9saWIvb3JnYW5pemVyLWJ1dHRvbi9vcmdhbml6ZXItYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQVUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQWEsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BLLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7O0FBVzdELE1BQU0sT0FBTyx3QkFBd0I7SUFjbkMsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFYakMsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBQ3RELHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUE4QixDQUFDO1FBSXBFLG1CQUFjLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7UUFDMUMsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFJTSxDQUFDO0lBRTlDLFFBQVE7UUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixFQUFFO1lBQzdDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQztZQUM5QyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ3RCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztTQUNwQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsY0FBYyxDQUFDLE9BQWU7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxPQUFPLEtBQUssS0FBSyxDQUFDO1NBQzNFO1FBQ0QsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDO1FBQzNELE9BQU8sR0FBRyxPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFlLEVBQUUsT0FBZ0I7UUFDN0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUN0RCxNQUFNLE9BQU8sR0FBRyxPQUFPO1lBQ3JCLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxFQUFFLE9BQU8sQ0FBQztZQUM3QixDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxjQUFjLENBQUMsT0FBZTtRQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDakcseURBQXlEO1FBQ3pELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ3JDLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztZQUMzRSxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxjQUFjLENBQUMsT0FBZTtRQUM1QixPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDakcseURBQXlEO1FBQ3pELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ3JDLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztZQUMzRSxPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRTtZQUMzQixTQUFTLEVBQUUsT0FBTztZQUNsQixrQkFBa0IsRUFBRSxTQUFTO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxRQUFnQixFQUFFLFdBQW1CO1FBQ3RELE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEVBQUUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUM1SCxnRUFBZ0U7UUFDaEUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLGtCQUFrQixLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDeEYsT0FBTyxDQUFDLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1lBQy9FLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO1lBQzNCLFNBQVMsRUFBRSxRQUFRO1lBQ25CLGtCQUFrQixFQUFFLFdBQVc7U0FDaEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFlO1FBQzdCLE9BQU8sQ0FBQyxLQUFLLENBQUMscUNBQXFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxlQUFlLEVBQUUsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUNqQyxPQUFPLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTTtZQUFFLE9BQU87UUFFM0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFdEIsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQWdCO1FBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzlELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUM1QjtRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxJQUFJLEVBQUUsQ0FBQztRQUN4RCxJQUFJLE9BQWlCLENBQUM7UUFDdEIsSUFBSSxPQUFPLEVBQUU7WUFDWCxPQUFPLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7Z0JBQ3hDLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDbEM7YUFBTTtZQUNMLE9BQU8sR0FBRyxjQUFjLENBQUM7U0FDMUI7UUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtZQUNyRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDOUQsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sY0FBYyxDQUFDLGNBQW9DLEVBQUUsUUFBcUI7UUFDaEYsTUFBTSxPQUFPLEdBQUcsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2IsT0FBTztTQUNSO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2IsT0FBTztTQUNSO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRCxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7Z0JBQ3pCLFlBQVksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLElBQUksT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDckUsS0FBSztnQkFDTCxhQUFhLEVBQUUsS0FBSyxDQUFFLDhEQUE4RDthQUNyRixDQUFDLENBQUM7WUFDSCxRQUFRLEVBQUUsRUFBRSxDQUFDO1FBQ2YsQ0FBQyxDQUFDO1FBRUYsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDdkU7YUFBTTtZQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFlO1FBQ2pDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPO1FBRTFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBRW5CLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFeEIsSUFBSTtZQUNGLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDeEM7Z0JBQVM7WUFDUixJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztZQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM3RCxJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFFBQVEsS0FBSyxLQUFLLENBQUM7SUFDL0UsQ0FBQztJQUVELHlCQUF5QjtRQUN2QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGNBQWMsS0FBSyxLQUFLLENBQUM7SUFDM0YsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUM7SUFDOUcsQ0FBQztJQUVELHlCQUF5QjtRQUN2QixPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUU7ZUFDdkIsSUFBSSxDQUFDLGNBQWMsRUFBRTtlQUNyQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO2VBQ3JDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUM7ZUFDckMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtlQUNsQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO2VBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWU7ZUFDN0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDL0YsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUNoQixNQUFNLE9BQU8sR0FBc0IsRUFBRSxDQUFDLFdBQVcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ2xGLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ25FLElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUI7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbkUsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0I7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDckUsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFO1lBQ3ZCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLGtCQUFrQixFQUFFLFNBQVM7WUFDN0IsZUFBZSxFQUFFLFNBQVM7WUFDMUIsY0FBYyxFQUFFLEVBQUU7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ2xFLENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUM7UUFDbEMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNwQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQzVELE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDO1FBRWxDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBRTtZQUNsQyxNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ25GLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUM5QztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQztRQUN2QyxJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ2pFLENBQUM7SUFFRCxpQkFBaUI7UUFDZixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQztRQUN2QyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM1QixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3hFO1FBQ0QsT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLGVBQWUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUM7UUFDeEMsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxTQUFTLENBQUMsUUFBZ0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsS0FBSyxRQUFRLENBQUM7SUFDNUMsQ0FBQztJQUVELGtCQUFrQixDQUFDLFFBQWdCLEVBQUUsV0FBbUI7UUFDdEQsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsS0FBSyxXQUFXLENBQUM7SUFDOUYsQ0FBQztJQUVPLFVBQVUsQ0FBQyxJQUFrQyxFQUFFLFdBQXFEO1FBQzFHLE1BQU0sV0FBVyxHQUFHLFdBQVcsSUFBSSxXQUFXLElBQUksa0JBQWtCLElBQUksV0FBVyxDQUFDO1FBQ3BGLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUUsV0FBOEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUNuRyxNQUFNLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sS0FBSyxHQUF5QjtZQUNsQyxJQUFJO1lBQ0osS0FBSyxFQUFFO2dCQUNMLEdBQUcsZUFBZTtnQkFDbEIsZ0JBQWdCLEVBQUUseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDakc7WUFDRCxNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDOytHQWpXVSx3QkFBd0I7bUdBQXhCLHdCQUF3Qiw2VkN0QnJDLDJnZEE4UkEsa29IRC9RYSxZQUFZLCtQQUFFLGVBQWUsOEJBQUUsYUFBYSxtTEFBRSxhQUFhLHdlQUFFLGdCQUFnQjs7NEZBTzdFLHdCQUF3QjtrQkFUcEMsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUUsWUFDaEYsa0JBQWtCLGlCQUdiLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07d0dBR3RDLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFPdUIsZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlLCBNYXRNZW51VHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgaXNPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE9yZ2FuaXplckNvbmZpZywgT3JnYW5pemVyQnV0dG9uRXZlbnQsIE9yZ2FuaXplclNsaWNlU3RhdGUsIE9yZ2FuaXplclN0YXRlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9yZ2FuaXplclN0YXRlLCByZXNvbHZlTWF0Y2hpbmdUZW1wbGF0ZUlkIH0gZnJvbSAnLi4vbW9kZWxzL29yZ2FuaXplci11dGlscyc7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tICcuL3RlbXBsYXRlLW1hbmFnZXIudXRpbGl0eSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbIENvbW1vbk1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRNZW51TW9kdWxlLCBNYXREaXZpZGVyTW9kdWxlIF0sXG4gIHNlbGVjdG9yOiAnb3JnYW5pemVyLWJ1dHRvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9vcmdhbml6ZXItYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vb3JnYW5pemVyLWJ1dHRvbi5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBPcmdhbml6ZXJCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IE9yZ2FuaXplckNvbmZpZztcbiAgQElucHV0KCkgc3RhdGU/OiBPcmdhbml6ZXJTdGF0ZTtcbiAgQElucHV0KCkgaGlkZU1lbnVWYWx1ZXMgPSBmYWxzZTtcbiAgQE91dHB1dCgpIHZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9yZ2FuaXplckJ1dHRvbkV2ZW50PigpO1xuICBAT3V0cHV0KCkgc2xpY2VTdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8T3JnYW5pemVyU2xpY2VTdGF0ZSB8IG51bGw+KCk7XG5cbiAgbG9hZGluZ0ZpZWxkSWQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBmaWVsZERhdGFDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnlbXT4oKTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWFpbk1lbnVUcmlnZ2VyJykgbWFpbk1lbnVUcmlnZ2VyPzogTWF0TWVudVRyaWdnZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJCdXR0b25dIEluaXRpYWxpemVkJywge1xuICAgICAgY29uZmlnRmllbGRzOiB0aGlzLmNvbmZpZz8uZmllbGRzPy5sZW5ndGggPz8gMCxcbiAgICAgIGhhc1N0YXRlOiAhIXRoaXMuc3RhdGUsXG4gICAgICBoaWRlTWVudVZhbHVlczogdGhpcy5oaWRlTWVudVZhbHVlc1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgaXNGaWVsZFZpc2libGUoZmllbGRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuc3RhdGU/LnZpc2libGVGaWVsZHM7XG4gICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuZmllbGRzPy5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRJZCk/LnZpc2libGUgIT09IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdmlzaWJsZS5pbmNsdWRlcyhmaWVsZElkKTtcbiAgfVxuXG4gIGZpZWxkc1N1bW1hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuY29uZmlnLmZpZWxkcz8ubGVuZ3RoID8/IDA7XG4gICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuc3RhdGU/LnZpc2libGVGaWVsZHM/Lmxlbmd0aCA/PyB0b3RhbDtcbiAgICByZXR1cm4gYCR7dmlzaWJsZX0vJHt0b3RhbH1gO1xuICB9XG5cbiAgb25GaWVsZFRvZ2dsZShmaWVsZElkOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbT3JnYW5pemVyQnV0dG9uXSBGaWVsZCB0b2dnbGVkJywgeyBmaWVsZElkLCB2aXNpYmxlIH0pO1xuICAgIGNvbnN0IHZpc2libGVGaWVsZHMgPSB0aGlzLnN0YXRlPy52aXNpYmxlRmllbGRzIHx8IFtdO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSB2aXNpYmxlXG4gICAgICA/IFsuLi52aXNpYmxlRmllbGRzLCBmaWVsZElkXVxuICAgICAgOiB2aXNpYmxlRmllbGRzLmZpbHRlcihmID0+IGYgIT09IGZpZWxkSWQpO1xuICAgIHRoaXMuZW1pdENoYW5nZSgnZmllbGRUb2dnbGVkJywgeyB2aXNpYmxlRmllbGRzOiB1cGRhdGVkIH0pO1xuICB9XG5cbiAgb25YRmllbGRTZWxlY3QoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckJ1dHRvbl0gWCBmaWVsZCBzZWxlY3RlZCcsIHsgZmllbGRJZCwgY3VycmVudDogdGhpcy5zdGF0ZT8uc2VsZWN0ZWRYIH0pO1xuICAgIC8vIMOJdml0ZSB1bmUgcmVxdcOqdGUgaW51dGlsZSBzaSBsZSBYIGVzdCBkw6lqw6Agc8OpbGVjdGlvbm7DqVxuICAgIGlmICh0aGlzLnN0YXRlPy5zZWxlY3RlZFggPT09IGZpZWxkSWQpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJCdXR0b25dIFggZmllbGQgYWxyZWFkeSBzZWxlY3RlZCwgc2tpcHBpbmcgZW1pdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ3hTZWxlY3RlZCcsIHsgc2VsZWN0ZWRYOiBmaWVsZElkIH0pO1xuICB9XG5cbiAgb25ZRmllbGRTZWxlY3QoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckJ1dHRvbl0gWSBmaWVsZCBzZWxlY3RlZCcsIHsgZmllbGRJZCwgY3VycmVudDogdGhpcy5zdGF0ZT8uc2VsZWN0ZWRZIH0pO1xuICAgIC8vIMOJdml0ZSB1bmUgcmVxdcOqdGUgaW51dGlsZSBzaSBsZSBZIGVzdCBkw6lqw6Agc8OpbGVjdGlvbm7DqVxuICAgIGlmICh0aGlzLnN0YXRlPy5zZWxlY3RlZFkgPT09IGZpZWxkSWQpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJCdXR0b25dIFkgZmllbGQgYWxyZWFkeSBzZWxlY3RlZCwgc2tpcHBpbmcgZW1pdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ3lTZWxlY3RlZCcsIHtcbiAgICAgIHNlbGVjdGVkWTogZmllbGRJZCxcbiAgICAgIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH1cblxuICBvbllBZ2dyZWdhdGVTZWxlY3QoeUZpZWxkSWQ6IHN0cmluZywgYWdncmVnYXRlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJCdXR0b25dIFkgYWdncmVnYXRlIHNlbGVjdGVkJywgeyB5RmllbGRJZCwgYWdncmVnYXRlSWQsIGN1cnJlbnQ6IHRoaXMuc3RhdGU/LnNlbGVjdGVkWUFnZ3JlZ2F0ZSB9KTtcbiAgICAvLyDDiXZpdGUgdW5lIHJlcXXDqnRlIGludXRpbGUgc2kgbCdhZ2dyZWdhdGUgZXN0IGTDqWrDoCBzw6lsZWN0aW9ubsOpXG4gICAgaWYgKHRoaXMuc3RhdGU/LnNlbGVjdGVkWUFnZ3JlZ2F0ZSA9PT0gYWdncmVnYXRlSWQgJiYgdGhpcy5zdGF0ZT8uc2VsZWN0ZWRZID09PSB5RmllbGRJZCkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckJ1dHRvbl0gWSBhZ2dyZWdhdGUgYWxyZWFkeSBzZWxlY3RlZCwgc2tpcHBpbmcgZW1pdCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ3lTZWxlY3RlZCcsIHtcbiAgICAgIHNlbGVjdGVkWTogeUZpZWxkSWQsXG4gICAgICBzZWxlY3RlZFlBZ2dyZWdhdGU6IGFnZ3JlZ2F0ZUlkXG4gICAgfSk7XG4gIH1cblxuICBvbkdyb3VwQnlTZWxlY3QoZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckJ1dHRvbl0gR3JvdXAgYnkgc2VsZWN0ZWQnLCB7IGdyb3VwSWQgfSk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RhdGUuc2VsZWN0ZWRHcm91cEJ5O1xuICAgIHRoaXMuZW1pdENoYW5nZSgnZ3JvdXBCeVNlbGVjdGVkJywgeyBzZWxlY3RlZEdyb3VwQnk6IGN1cnJlbnQgPT09IGdyb3VwSWQgPyB1bmRlZmluZWQgOiBncm91cElkIH0pO1xuICB9XG5cbiAgb25UZW1wbGF0ZVNlbGVjdCh0ZW1wbGF0ZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbT3JnYW5pemVyQnV0dG9uXSBUZW1wbGF0ZSBzZWxlY3RlZCcsIHsgdGVtcGxhdGVJZCB9KTtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnRlbXBsYXRlcz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuY29uZmlnLnRlbXBsYXRlcz8uZmluZCh0ID0+IHQuaWQgPT09IHRlbXBsYXRlSWQpO1xuICAgIGlmICghdGVtcGxhdGUpIHJldHVybjtcblxuICAgIGNvbnN0IG5ld1N0YXRlID0gVGVtcGxhdGVNYW5hZ2VyLmFwcGx5VGVtcGxhdGUodGVtcGxhdGUsIHRoaXMuc3RhdGUsIHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ3RlbXBsYXRlU2VsZWN0ZWQnLCBuZXdTdGF0ZSk7XG4gICAgdGhpcy5zeW5jU2xpY2VTdGF0ZShuZXdTdGF0ZS5zZWxlY3RlZFNsaWNlcyk7XG4gIH1cblxuICBvblNsaWNlQ2xpY2soc2xpY2VJZD86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJCdXR0b25dIFNsaWNlIGNsaWNrZWQnLCB7IHNsaWNlSWQgfSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uU2xpY2VDbGljaykge1xuICAgICAgdGhpcy5jb25maWcub25TbGljZUNsaWNrKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRTbGljZXMgPSB0aGlzLnN0YXRlPy5zZWxlY3RlZFNsaWNlcyB8fCBbXTtcbiAgICBsZXQgdXBkYXRlZDogc3RyaW5nW107XG4gICAgaWYgKHNsaWNlSWQpIHtcbiAgICAgIHVwZGF0ZWQgPSBzZWxlY3RlZFNsaWNlcy5pbmNsdWRlcyhzbGljZUlkKVxuICAgICAgICA/IHNlbGVjdGVkU2xpY2VzLmZpbHRlcihpZCA9PiBpZCAhPT0gc2xpY2VJZClcbiAgICAgICAgOiBbLi4uc2VsZWN0ZWRTbGljZXMsIHNsaWNlSWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVkID0gc2VsZWN0ZWRTbGljZXM7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZWQubGVuZ3RoID09PSAwIHx8ICFzbGljZUlkIHx8ICF0aGlzLmNvbmZpZy5vbkZldGNoU2xpY2VEYXRhKSB7XG4gICAgICB0aGlzLnNsaWNlU3RhdGVDaGFuZ2UuZW1pdChudWxsKTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgnc2xpY2VTZWxlY3RlZCcsIHsgc2VsZWN0ZWRTbGljZXM6IHVwZGF0ZWQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zeW5jU2xpY2VTdGF0ZSh1cGRhdGVkLCAoKSA9PiB7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UoJ3NsaWNlU2VsZWN0ZWQnLCB7IHNlbGVjdGVkU2xpY2VzOiB1cGRhdGVkIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jU2xpY2VTdGF0ZShzZWxlY3RlZFNsaWNlczogc3RyaW5nW10gfCB1bmRlZmluZWQsIG9uTG9hZGVkPzogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IHNsaWNlSWQgPSBzZWxlY3RlZFNsaWNlcz8uWzBdO1xuICAgIGlmICghc2xpY2VJZCB8fCAhdGhpcy5jb25maWcub25GZXRjaFNsaWNlRGF0YSkge1xuICAgICAgdGhpcy5zbGljZVN0YXRlQ2hhbmdlLmVtaXQobnVsbCk7XG4gICAgICBvbkxvYWRlZD8uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2xpY2UgPSB0aGlzLmNvbmZpZy5zbGljZXM/LmZpbmQocyA9PiBzLmlkID09PSBzbGljZUlkKTtcbiAgICBpZiAoIXNsaWNlKSB7XG4gICAgICB0aGlzLnNsaWNlU3RhdGVDaGFuZ2UuZW1pdChudWxsKTtcbiAgICAgIG9uTG9hZGVkPy4oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5vbkZldGNoU2xpY2VEYXRhKHNsaWNlSWQpO1xuICAgIGNvbnN0IGhhbmRsZURhdGEgPSAodGFza3M6IGFueVtdKSA9PiB7XG4gICAgICB0aGlzLnNsaWNlU3RhdGVDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHNsaWNlQ29uZmlnczogW3sgdGl0bGU6IHNsaWNlLmxhYmVsID8/IHNsaWNlSWQsIGNvbHVtbktleTogc2xpY2VJZCB9XSxcbiAgICAgICAgdGFza3MsXG4gICAgICAgIGZpbHRlckFwcGxpZWQ6IGZhbHNlICAvLyBQYW5lbCB2aWVudCBkJ8OqdHJlIG91dmVydCwgcGFzIGRlIGZpbHRyZSBzw6lsZWN0aW9ubsOpIGVuY29yZVxuICAgICAgfSk7XG4gICAgICBvbkxvYWRlZD8uKCk7XG4gICAgfTtcblxuICAgIGlmIChpc09ic2VydmFibGUocmVzdWx0KSkge1xuICAgICAgcmVzdWx0LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoeyBuZXh0OiBoYW5kbGVEYXRhIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQudGhlbihoYW5kbGVEYXRhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkRmllbGREYXRhKGZpZWxkSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZpZWxkRGF0YUNhY2hlLmhhcyhmaWVsZElkKSkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jb25maWcub25GZXRjaEZpZWxkRGF0YSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmNvbmZpZy5maWVsZHM/LmZpbmQoZiA9PiBmLmlkID09PSBmaWVsZElkKTtcbiAgICBpZiAoIWZpZWxkKSByZXR1cm47XG5cbiAgICB0aGlzLmxvYWRpbmdGaWVsZElkID0gZmllbGRJZDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5jb25maWcub25GZXRjaEZpZWxkRGF0YShmaWVsZElkKTtcbiAgICAgIHRoaXMuZmllbGREYXRhQ2FjaGUuc2V0KGZpZWxkSWQsIGRhdGEpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmdGaWVsZElkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgb25FeHBvcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uRXhwb3J0KSB0aGlzLmNvbmZpZy5vbkV4cG9ydCgpO1xuICAgIHRoaXMubWFpbk1lbnVUcmlnZ2VyPy5jbG9zZU1lbnUoKTtcbiAgfVxuXG4gIG9uRXhwb3J0VmlzdWFsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkV4cG9ydFZpc3VhbCkgdGhpcy5jb25maWcub25FeHBvcnRWaXN1YWwoKTtcbiAgICB0aGlzLm1haW5NZW51VHJpZ2dlcj8uY2xvc2VNZW51KCk7XG4gIH1cblxuICBvbkV4cG9ydERhdGEoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uRXhwb3J0RGF0YSkgdGhpcy5jb25maWcub25FeHBvcnREYXRhKCk7XG4gICAgdGhpcy5tYWluTWVudVRyaWdnZXI/LmNsb3NlTWVudSgpO1xuICB9XG5cbiAgaGFzRXhwb3J0U3ViTWVudSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5jb25maWcub25FeHBvcnRWaXN1YWwgfHwgdGhpcy5jb25maWcub25FeHBvcnREYXRhKTtcbiAgfVxuXG4gIGlzQ29weUFjdGlvblZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWcub25Db3B5VmlzdWFsICYmIHRoaXMuY29uZmlnLmFjdGlvbnM/LnNob3dDb3B5ICE9PSBmYWxzZTtcbiAgfVxuXG4gIGlzRnVsbHNjcmVlbkFjdGlvblZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25maWcub25Ub2dnbGVGdWxsc2NyZWVuICYmIHRoaXMuY29uZmlnLmFjdGlvbnM/LnNob3dGdWxsc2NyZWVuICE9PSBmYWxzZTtcbiAgfVxuXG4gIGhhc0FjdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnNob3dBY3Rpb25zID09PSB0cnVlICYmICh0aGlzLmlzQ29weUFjdGlvblZpc2libGUoKSB8fCB0aGlzLmlzRnVsbHNjcmVlbkFjdGlvblZpc2libGUoKSk7XG4gIH1cblxuICBoYXNNZW51SXRlbXNCZWZvcmVBY3Rpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0NoYXJ0RmllbGRzKClcbiAgICAgIHx8IHRoaXMuaGFzVGFibGVGaWVsZHMoKVxuICAgICAgfHwgKHRoaXMuY29uZmlnLmdyb3Vwcz8ubGVuZ3RoID8/IDApID4gMFxuICAgICAgfHwgKHRoaXMuY29uZmlnLnNsaWNlcz8ubGVuZ3RoID8/IDApID4gMFxuICAgICAgfHwgKHRoaXMuY29uZmlnLnRlbXBsYXRlcz8ubGVuZ3RoID8/IDApID4gMDtcbiAgfVxuXG4gIGhhc090aGVyTWVudUl0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc01lbnVJdGVtc0JlZm9yZUFjdGlvbnMoKVxuICAgICAgfHwgISF0aGlzLmNvbmZpZy5zaG93RXhwb3J0XG4gICAgICB8fCAhIXRoaXMuY29uZmlnLnNob3dQcmVmZXJlbmNlc1xuICAgICAgfHwgdGhpcy5oYXNTd2l0Y2hWaWV3KCk7XG4gIH1cblxuICBhY3Rpb25zTGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb25maWcuYWN0aW9ucz8ubGFiZWwpIHJldHVybiB0aGlzLmNvbmZpZy5hY3Rpb25zLmxhYmVsO1xuICAgIHJldHVybiB0aGlzLmlzQ29weUFjdGlvblZpc2libGUoKSAmJiB0aGlzLmlzRnVsbHNjcmVlbkFjdGlvblZpc2libGUoKSA/ICdBY3Rpb25zJyA6ICdBY3Rpb24nO1xuICB9XG5cbiAgb25Db3B5VmlzdWFsKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLm9uQ29weVZpc3VhbD8uKCk7XG4gICAgdGhpcy5tYWluTWVudVRyaWdnZXI/LmNsb3NlTWVudSgpO1xuICB9XG5cbiAgb25Ub2dnbGVGdWxsc2NyZWVuKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLm9uVG9nZ2xlRnVsbHNjcmVlbj8uKCk7XG4gICAgdGhpcy5tYWluTWVudVRyaWdnZXI/LmNsb3NlTWVudSgpO1xuICB9XG5cbiAgaGFzU3dpdGNoVmlldygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbmZpZy5zd2l0Y2hWaWV3O1xuICB9XG5cbiAgb25Td2l0Y2hWaWV3KCk6IHZvaWQge1xuICAgIGNvbnN0IHN2ID0gdGhpcy5jb25maWcuc3dpdGNoVmlldztcbiAgICBpZiAoIXN2KSByZXR1cm47XG4gICAgY29uc3QgbmV3VmlldzogJ2NoYXJ0JyB8ICd0YWJsZScgPSBzdi5jdXJyZW50VmlldyA9PT0gJ2NoYXJ0JyA/ICd0YWJsZScgOiAnY2hhcnQnO1xuICAgIHN2Lm9uU3dpdGNoKG5ld1ZpZXcpO1xuICAgIHRoaXMuZW1pdENoYW5nZSgndmlld1N3aXRjaGVkJywgeyB2aWV3TW9kZTogbmV3VmlldyB9KTtcbiAgICB0aGlzLm1haW5NZW51VHJpZ2dlcj8uY2xvc2VNZW51KCk7XG4gIH1cblxuICBvblByZWZlcmVuY2VzRWRpdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcub25QcmVmZXJlbmNlc0VkaXQpIHRoaXMuY29uZmlnLm9uUHJlZmVyZW5jZXNFZGl0KCk7XG4gICAgdGhpcy5tYWluTWVudVRyaWdnZXI/LmNsb3NlTWVudSgpO1xuICB9XG5cbiAgb25QcmVmZXJlbmNlc1NhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uUHJlZmVyZW5jZXNTYXZlKSB0aGlzLmNvbmZpZy5vblByZWZlcmVuY2VzU2F2ZSgpO1xuICAgIHRoaXMubWFpbk1lbnVUcmlnZ2VyPy5jbG9zZU1lbnUoKTtcbiAgfVxuXG4gIG9uUHJlZmVyZW5jZXNDbGVhcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcub25QcmVmZXJlbmNlc0NsZWFyKSB0aGlzLmNvbmZpZy5vblByZWZlcmVuY2VzQ2xlYXIoKTtcbiAgICB0aGlzLm1haW5NZW51VHJpZ2dlcj8uY2xvc2VNZW51KCk7XG4gIH1cblxuICBvblJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZW1pdENoYW5nZSgncmVzZXQnLCB7XG4gICAgICB2aXNpYmxlRmllbGRzOiBbXSxcbiAgICAgIHNlbGVjdGVkWDogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0ZWRZOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZFlBZ2dyZWdhdGU6IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGVkR3JvdXBCeTogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0ZWRTbGljZXM6IFtdXG4gICAgfSk7XG4gIH1cblxuICBhY3RpdmVYTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuc3RhdGU/LnNlbGVjdGVkWDtcbiAgICBpZiAoIWlkKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnhGaWVsZHM/LmZpbmQoZiA9PiBmLmlkID09PSBpZCk/LmxhYmVsID8/IGlkO1xuICB9XG5cbiAgYWN0aXZlWUxhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeUlkID0gdGhpcy5zdGF0ZT8uc2VsZWN0ZWRZO1xuICAgIGlmICgheUlkKSByZXR1cm4gJyc7XG4gICAgY29uc3QgeUZpZWxkID0gdGhpcy5jb25maWcueUZpZWxkcz8uZmluZChmID0+IGYuaWQgPT09IHlJZCk7XG4gICAgY29uc3QgYmFzZSA9IHlGaWVsZD8ubGFiZWwgPz8geUlkO1xuXG4gICAgaWYgKHRoaXMuc3RhdGU/LnNlbGVjdGVkWUFnZ3JlZ2F0ZSkge1xuICAgICAgY29uc3QgYWdnID0geUZpZWxkPy5hZ2dyZWdhdGVzPy5maW5kKGEgPT4gYS5pZCA9PT0gdGhpcy5zdGF0ZSEuc2VsZWN0ZWRZQWdncmVnYXRlKTtcbiAgICAgIHJldHVybiBhZ2cgPyBgJHtiYXNlfSDCtyAke2FnZy5sYWJlbH1gIDogYmFzZTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBhY3RpdmVHcm91cEJ5TGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuc3RhdGU/LnNlbGVjdGVkR3JvdXBCeTtcbiAgICBpZiAoIWlkKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdyb3Vwcz8uZmluZChnID0+IGcuaWQgPT09IGlkKT8ubGFiZWwgPz8gaWQ7XG4gIH1cblxuICBhY3RpdmVTbGljZXNMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlkcyA9IHRoaXMuc3RhdGU/LnNlbGVjdGVkU2xpY2VzO1xuICAgIGlmICghaWRzPy5sZW5ndGgpIHJldHVybiAnJztcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnNsaWNlcz8uZmluZChzID0+IHMuaWQgPT09IGlkc1swXSk/LmxhYmVsID8/IGlkc1swXTtcbiAgICB9XG4gICAgcmV0dXJuIGAke2lkcy5sZW5ndGh9IHPDqWxlY3Rpb25uw6lzYDtcbiAgfVxuXG4gIGFjdGl2ZVRlbXBsYXRlTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuc3RhdGU/LnNlbGVjdGVkVGVtcGxhdGU7XG4gICAgaWYgKCFpZCkgcmV0dXJuICcnO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy50ZW1wbGF0ZXM/LmZpbmQodCA9PiB0LmlkID09PSBpZCk/LmxhYmVsID8/IGlkO1xuICB9XG5cbiAgaGFzQ2hhcnRGaWVsZHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZy54RmllbGRzPy5sZW5ndGggPz8gMCkgPiAwIHx8ICh0aGlzLmNvbmZpZy55RmllbGRzPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgaGFzVGFibGVGaWVsZHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZy5maWVsZHM/Lmxlbmd0aCA/PyAwKSA+IDA7XG4gIH1cblxuICBpc1lBY3RpdmUoeUZpZWxkSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlPy5zZWxlY3RlZFkgPT09IHlGaWVsZElkO1xuICB9XG5cbiAgaXNZQWdncmVnYXRlQWN0aXZlKHlGaWVsZElkOiBzdHJpbmcsIGFnZ3JlZ2F0ZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZT8uc2VsZWN0ZWRZID09PSB5RmllbGRJZCAmJiB0aGlzLnN0YXRlPy5zZWxlY3RlZFlBZ2dyZWdhdGUgPT09IGFnZ3JlZ2F0ZUlkO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlKHR5cGU6IE9yZ2FuaXplckJ1dHRvbkV2ZW50Wyd0eXBlJ10sIHN0YXRlVXBkYXRlOiBQYXJ0aWFsPE9yZ2FuaXplclN0YXRlPiB8IE9yZ2FuaXplclN0YXRlKTogdm9pZCB7XG4gICAgY29uc3QgaXNGdWxsU3RhdGUgPSAnc2VsZWN0ZWRYJyBpbiBzdGF0ZVVwZGF0ZSAmJiAnc2VsZWN0ZWRUZW1wbGF0ZScgaW4gc3RhdGVVcGRhdGU7XG4gICAgY29uc3QgcmF3U3RhdGUgPSBpc0Z1bGxTdGF0ZSA/IChzdGF0ZVVwZGF0ZSBhcyBPcmdhbml6ZXJTdGF0ZSkgOiB7IC4uLnRoaXMuc3RhdGUsIC4uLnN0YXRlVXBkYXRlIH07XG4gICAgY29uc3Qgbm9ybWFsaXplZFN0YXRlID0gbm9ybWFsaXplT3JnYW5pemVyU3RhdGUocmF3U3RhdGUsIHRoaXMuY29uZmlnKTtcbiAgICBjb25zdCBldmVudDogT3JnYW5pemVyQnV0dG9uRXZlbnQgPSB7XG4gICAgICB0eXBlLFxuICAgICAgc3RhdGU6IHtcbiAgICAgICAgLi4ubm9ybWFsaXplZFN0YXRlLFxuICAgICAgICBzZWxlY3RlZFRlbXBsYXRlOiByZXNvbHZlTWF0Y2hpbmdUZW1wbGF0ZUlkKHRoaXMuY29uZmlnLnRlbXBsYXRlcywgbm9ybWFsaXplZFN0YXRlLCB0aGlzLmNvbmZpZylcbiAgICAgIH0sXG4gICAgICBzb3VyY2U6ICd1c2VyJ1xuICAgIH07XG4gICAgdGhpcy52aWV3Q2hhbmdlLmVtaXQoZXZlbnQpO1xuICB9XG59XG4iLCI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1idG5cIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidmlld01lbnVcIiAjbWFpbk1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidWaWV3J1wiPlxuICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItYnRuLWljb25cIj57eyBjb25maWcuYnV0dG9uSWNvbiB8fCAnc2V0dGluZ3MnIH19PC9tYXQtaWNvbj5cbjwvYnV0dG9uPlxuXG48bWF0LW1lbnUgI3ZpZXdNZW51PVwibWF0TWVudVwiIHBhbmVsQ2xhc3M9XCJvcmdhbml6ZXItbWVudS1wYW5lbFwiPlxuXG4gIDwhLS0gQ2hhbXBzIDogbW9kZSBjaGFydCAoWCArIFkpIC0tPlxuICA8YnV0dG9uICpuZ0lmPVwiaGFzQ2hhcnRGaWVsZHMoKVwiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNoYW1wc1N1Yk1lbnVcIiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXRyaWdnZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+Q2hhbXBzPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdmFsdWVcIiAqbmdJZj1cIiFoaWRlTWVudVZhbHVlcyAmJiAoYWN0aXZlWExhYmVsKCkgfHwgYWN0aXZlWUxhYmVsKCkpXCI+XG4gICAgICB7eyBhY3RpdmVYTGFiZWwoKSB9fTxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVYTGFiZWwoKSAmJiBhY3RpdmVZTGFiZWwoKVwiPiAvIDwvbmctY29udGFpbmVyPnt7IGFjdGl2ZVlMYWJlbCgpIH19XG4gICAgPC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8IS0tIENoYW1wcyA6IG1vZGUgdGFibGUgKHRvZ2dsZSBjb2xvbm5lcykgLS0+XG4gIDxidXR0b24gKm5nSWY9XCJoYXNUYWJsZUZpZWxkcygpXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZmllbGRzU3ViTWVudVwiIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdHJpZ2dlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtbGFiZWxcIj5DaGFtcHM8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS12YWx1ZVwiICpuZ0lmPVwiIWhpZGVNZW51VmFsdWVzXCI+e3sgZmllbGRzU3VtbWFyeSgpIH19PC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8IS0tIEdyb3VwZXIgcGFyIC0tPlxuICA8YnV0dG9uICpuZ0lmPVwiY29uZmlnLmdyb3Vwcz8ubGVuZ3RoXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZ3JvdXBzU3ViTWVudVwiIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdHJpZ2dlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtbGFiZWxcIj5Hcm91cGVyIHBhcjwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXZhbHVlXCIgKm5nSWY9XCIhaGlkZU1lbnVWYWx1ZXMgJiYgYWN0aXZlR3JvdXBCeUxhYmVsKClcIj57eyBhY3RpdmVHcm91cEJ5TGFiZWwoKSB9fTwvc3Bhbj5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBGaWx0cmVyIHBhciAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cImNvbmZpZy5zbGljZXM/Lmxlbmd0aFwiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInNsaWNlc1N1Yk1lbnVcIiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXRyaWdnZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+RmlsdHJlciBwYXI8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS12YWx1ZVwiICpuZ0lmPVwiIWhpZGVNZW51VmFsdWVzICYmIGFjdGl2ZVNsaWNlc0xhYmVsKClcIj57eyBhY3RpdmVTbGljZXNMYWJlbCgpIH19PC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8IS0tIFRlbXBsYXRlIC0tPlxuICA8YnV0dG9uICpuZ0lmPVwiY29uZmlnLnRlbXBsYXRlcz8ubGVuZ3RoXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwidGVtcGxhdGVTdWJNZW51XCIgY2xhc3M9XCJvcmdhbml6ZXItbWVudS10cmlnZ2VyXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1sYWJlbFwiPlRlbXBsYXRlPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdmFsdWVcIiAqbmdJZj1cIiFoaWRlTWVudVZhbHVlcyAmJiBhY3RpdmVUZW1wbGF0ZUxhYmVsKClcIj57eyBhY3RpdmVUZW1wbGF0ZUxhYmVsKCkgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuXG4gIDwhLS0gQWN0aW9ucyBkdSB2aXN1ZWwgY291cmFudCAtLT5cbiAgPG1hdC1kaXZpZGVyICpuZ0lmPVwiaGFzQWN0aW9ucygpICYmIGhhc01lbnVJdGVtc0JlZm9yZUFjdGlvbnMoKVwiIGNsYXNzPVwib3JnYW5pemVyLWRpdmlkZXJcIj48L21hdC1kaXZpZGVyPlxuICA8YnV0dG9uICpuZ0lmPVwiaGFzQWN0aW9ucygpICYmIGhhc090aGVyTWVudUl0ZW1zKClcIiBtYXQtbWVudS1pdGVtIFttYXRNZW51VHJpZ2dlckZvcl09XCJhY3Rpb25zU3ViTWVudVwiIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdHJpZ2dlclwiPlxuICAgIDxtYXQtaWNvbiAqbmdJZj1cImNvbmZpZy5hY3Rpb25zPy5pY29uXCIgY2xhc3M9XCJvcmdhbml6ZXItbWVudS1leHBvcnQtaWNvblwiPnt7IGNvbmZpZy5hY3Rpb25zPy5pY29uIH19PC9tYXQtaWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+e3sgYWN0aW9uc0xhYmVsKCkgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuXG4gIDwhLS0gQWN0aW9ucyBkaXJlY3RlcyBsb3JzcXUnaWwgbid5IGEgYXVjdW4gYXV0cmUgaXRlbSBwcmluY2lwYWwgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNBY3Rpb25zKCkgJiYgIWhhc090aGVyTWVudUl0ZW1zKClcIj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiaXNDb3B5QWN0aW9uVmlzaWJsZSgpXCIgbWF0LW1lbnUtaXRlbSB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ29weVZpc3VhbCgpXCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1leHBvcnQtaWNvblwiPmNvbnRlbnRfY29weTwvbWF0LWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+Q29waWVyPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gKm5nSWY9XCJpc0Z1bGxzY3JlZW5BY3Rpb25WaXNpYmxlKClcIiBtYXQtbWVudS1pdGVtIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25Ub2dnbGVGdWxsc2NyZWVuKClcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWV4cG9ydC1pY29uXCI+e3sgY29uZmlnLmlzRnVsbHNjcmVlbiA/ICdmdWxsc2NyZWVuX2V4aXQnIDogJ2Z1bGxzY3JlZW4nIH19PC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtbGFiZWxcIj57eyBjb25maWcuaXNGdWxsc2NyZWVuID8gJ1F1aXR0ZXIgbGUgcGxlaW4gw6ljcmFuJyA6ICdQbGVpbiDDqWNyYW4nIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIEV4cG9ydCBkaXJlY3QgKG1vZGUgdGFibGUpIC0tPlxuICA8bWF0LWRpdmlkZXIgKm5nSWY9XCJjb25maWcuc2hvd0V4cG9ydFwiIGNsYXNzPVwib3JnYW5pemVyLWRpdmlkZXJcIj48L21hdC1kaXZpZGVyPlxuICA8YnV0dG9uICpuZ0lmPVwiY29uZmlnLnNob3dFeHBvcnQgJiYgIWhhc0V4cG9ydFN1Yk1lbnUoKVwiIG1hdC1tZW51LWl0ZW0gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtZXhwb3J0XCIgKGNsaWNrKT1cIm9uRXhwb3J0KClcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1leHBvcnQtaWNvblwiPmRvd25sb2FkPC9tYXQtaWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+RXhwb3J0ZXI8L3NwYW4+XG4gIDwvYnV0dG9uPlxuXG4gIDwhLS0gRXhwb3J0IGdyYXBoaXF1ZSAobW9kZSBjaGFydCkg4oCUIG91dnJlIHVuIHNvdXMtbWVudSAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cImNvbmZpZy5zaG93RXhwb3J0ICYmIGhhc0V4cG9ydFN1Yk1lbnUoKVwiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImV4cG9ydFN1Yk1lbnVcIiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXRyaWdnZXIgb3JnYW5pemVyLW1lbnUtZXhwb3J0XCI+XG4gICAgPG1hdC1pY29uIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtZXhwb3J0LWljb25cIj5kb3dubG9hZDwvbWF0LWljb24+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1sYWJlbFwiPkV4cG9ydGVyPC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8IS0tIFByw6lmw6lyZW5jZXMgLS0+XG4gIDxtYXQtZGl2aWRlciAqbmdJZj1cImNvbmZpZy5zaG93UHJlZmVyZW5jZXNcIiBjbGFzcz1cIm9yZ2FuaXplci1kaXZpZGVyXCI+PC9tYXQtZGl2aWRlcj5cbiAgPGJ1dHRvbiAqbmdJZj1cImNvbmZpZy5zaG93UHJlZmVyZW5jZXNcIiBtYXQtbWVudS1pdGVtIFttYXRNZW51VHJpZ2dlckZvcl09XCJwcmVmZXJlbmNlc1N1Yk1lbnVcIiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXRyaWdnZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+UHLDqWbDqXJlbmNlczwvc3Bhbj5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBTd2l0Y2ggY2hhcnQgLyB0YWJsZSAtLT5cbiAgPG1hdC1kaXZpZGVyICpuZ0lmPVwiaGFzU3dpdGNoVmlldygpXCIgY2xhc3M9XCJvcmdhbml6ZXItZGl2aWRlclwiPjwvbWF0LWRpdmlkZXI+XG4gIDxidXR0b24gKm5nSWY9XCJoYXNTd2l0Y2hWaWV3KClcIiBtYXQtbWVudS1pdGVtIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXRyaWdnZXJcIiAoY2xpY2spPVwib25Td2l0Y2hWaWV3KClcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1leHBvcnQtaWNvblwiPnt7IGNvbmZpZy5zd2l0Y2hWaWV3Py5jdXJyZW50VmlldyA9PT0gJ2NoYXJ0JyA/ICd0YWJsZV9jaGFydCcgOiAnYmFyX2NoYXJ0JyB9fTwvbWF0LWljb24+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1sYWJlbFwiPnt7IGNvbmZpZy5zd2l0Y2hWaWV3Py5jdXJyZW50VmlldyA9PT0gJ2NoYXJ0JyA/ICdUYWJsZWF1JyA6ICdHcmFwaGlxdWUnIH19PC9zcGFuPlxuICA8L2J1dHRvbj5cblxuPC9tYXQtbWVudT5cblxuPCEtLSBTb3VzLW1lbnUgOiBhY3Rpb25zIGR1IHZpc3VlbCAtLT5cbjxtYXQtbWVudSAjYWN0aW9uc1N1Yk1lbnU9XCJtYXRNZW51XCIgcGFuZWxDbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LXBhbmVsXCI+XG4gIDxkaXYgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudVwiXG4gICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxidXR0b24gKm5nSWY9XCJpc0NvcHlBY3Rpb25WaXNpYmxlKClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgIChtb3VzZWRvd24pPVwib25Db3B5VmlzdWFsKClcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj48L3NwYW4+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pY29uXCI+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgIENvcGllclxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gKm5nSWY9XCJpc0Z1bGxzY3JlZW5BY3Rpb25WaXNpYmxlKClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgIChtb3VzZWRvd24pPVwib25Ub2dnbGVGdWxsc2NyZWVuKClcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj48L3NwYW4+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pY29uXCI+e3sgY29uZmlnLmlzRnVsbHNjcmVlbiA/ICdmdWxsc2NyZWVuX2V4aXQnIDogJ2Z1bGxzY3JlZW4nIH19PC9tYXQtaWNvbj5cbiAgICAgIHt7IGNvbmZpZy5pc0Z1bGxzY3JlZW4gPyAnUXVpdHRlciBsZSBwbGVpbiDDqWNyYW4nIDogJ1BsZWluIMOpY3JhbicgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L21hdC1tZW51PlxuXG48IS0tIFNvdXMtbWVudSA6IEV4cG9ydCBncmFwaGlxdWUgLS0+XG48bWF0LW1lbnUgI2V4cG9ydFN1Yk1lbnU9XCJtYXRNZW51XCIgcGFuZWxDbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LXBhbmVsXCI+XG4gIDxkaXYgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudVwiXG4gICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxidXR0b24gKm5nSWY9XCJjb25maWcub25FeHBvcnRWaXN1YWxcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgIChtb3VzZWRvd24pPVwib25FeHBvcnRWaXN1YWwoKVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPjwvc3Bhbj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWljb25cIj5pbWFnZTwvbWF0LWljb24+XG4gICAgICBWaXN1ZWxcbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiY29uZmlnLm9uRXhwb3J0RGF0YVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW1cIlxuICAgICAgKG1vdXNlZG93bik9XCJvbkV4cG9ydERhdGEoKVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPjwvc3Bhbj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWljb25cIj50YWJsZV9jaGFydDwvbWF0LWljb24+XG4gICAgICBEb25uw6llc1xuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gU291cy1tZW51IDogQ2hhbXBzIGNoYXJ0IChYICsgWSkgLS0+XG48bWF0LW1lbnUgI2NoYW1wc1N1Yk1lbnU9XCJtYXRNZW51XCIgcGFuZWxDbGFzcz1cIm9yZ2FuaXplci1jaGFtcHMtcGFuZWxcIj5cbiAgPGRpdiBjbGFzcz1cIm9yZ2FuaXplci1jaGFtcHMtd3JhcHBlclwiXG4gICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuXG4gICAgPCEtLSBCbG9jIFggLS0+XG4gICAgPGRpdiBjbGFzcz1cIm9yZ2FuaXplci1jaGFtcHMtYmxvY2tcIiAqbmdJZj1cImNvbmZpZy54RmllbGRzPy5sZW5ndGhcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLWNoYW1wcy1ibG9jay10aXRsZVwiPkF4ZSBob3Jpem9udGFsIOKAlCBYPC9zcGFuPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IHhGaWVsZCBvZiBjb25maWcueEZpZWxkc1wiXG4gICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic3RhdGU/LnNlbGVjdGVkWCA9PT0geEZpZWxkLmlkXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInhGaWVsZC5kaXNhYmxlZFwiXG4gICAgICAgIChtb3VzZWRvd24pPVwib25YRmllbGRTZWxlY3QoeEZpZWxkLmlkKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWNoZWNrXCI+e3sgc3RhdGU/LnNlbGVjdGVkWCA9PT0geEZpZWxkLmlkID8gJ+KckycgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAge3sgeEZpZWxkLmxhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtZGl2aWRlciAqbmdJZj1cImNvbmZpZy54RmllbGRzPy5sZW5ndGggJiYgY29uZmlnLnlGaWVsZHM/Lmxlbmd0aFwiIGNsYXNzPVwib3JnYW5pemVyLWNoYW1wcy1kaXZpZGVyXCI+PC9tYXQtZGl2aWRlcj5cblxuICAgIDwhLS0gQmxvYyBZIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJvcmdhbml6ZXItY2hhbXBzLWJsb2NrXCIgKm5nSWY9XCJjb25maWcueUZpZWxkcz8ubGVuZ3RoXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1jaGFtcHMtYmxvY2stdGl0bGVcIj5BeGUgdmVydGljYWwg4oCUIFk8L3NwYW4+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB5RmllbGQgb2YgY29uZmlnLnlGaWVsZHNcIj5cblxuICAgICAgICA8IS0tIFkgc2ltcGxlIChDb3VudCBzYW5zIGFncsOpZ2F0IG5pIHN0YWNrKSAtLT5cbiAgICAgICAgPCEtLSBZIHNpbXBsZSAoQ291bnQgb3UgbcOpdHJpcXVlIGRpcmVjdGUpIC0tPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXlGaWVsZC5hZ2dyZWdhdGVzPy5sZW5ndGhcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW1cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNZQWN0aXZlKHlGaWVsZC5pZClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJ5RmllbGQuZGlzYWJsZWRcIlxuICAgICAgICAgIChtb3VzZWRvd24pPVwib25ZRmllbGRTZWxlY3QoeUZpZWxkLmlkKVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj57eyBpc1lBY3RpdmUoeUZpZWxkLmlkKSA/ICfinJMnIDogJycgfX08L3NwYW4+XG4gICAgICAgICAge3sgeUZpZWxkLmxhYmVsIH19XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDwhLS0gWSBhdmVjIGFncsOpZ2F0cyDihpIgc291cy1tZW51IC0tPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwieUZpZWxkLmFnZ3JlZ2F0ZXM/Lmxlbmd0aFwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbSBvcmdhbml6ZXItc3VibWVudS1pdGVtLS1oYXMtY2hpbGRyZW5cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNZQWN0aXZlKHlGaWVsZC5pZClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJ5RmllbGQuZGlzYWJsZWRcIlxuICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJ5QWdnU3ViTWVudVwiXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRGF0YV09XCJ7IHlGaWVsZDogeUZpZWxkIH1cIlxuICAgICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPnt7IGlzWUFjdGl2ZSh5RmllbGQuaWQpID8gJ+KckycgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAgICB7eyB5RmllbGQubGFiZWwgfX1cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1hcnJvd1wiPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG48L21hdC1tZW51PlxuXG48IS0tIFNvdXMtbWVudSBkeW5hbWlxdWUgOiBhZ3LDqWdhdHMgZCd1biBjaGFtcCBZIC0tPlxuPG1hdC1tZW51ICN5QWdnU3ViTWVudT1cIm1hdE1lbnVcIiBwYW5lbENsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtcGFuZWxcIj5cbiAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50IGxldC15RmllbGQ9XCJ5RmllbGRcIj5cbiAgICA8ZGl2IGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnVcIlxuICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbVwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBhZ2cgb2YgeUZpZWxkLmFnZ3JlZ2F0ZXNcIlxuICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzWUFnZ3JlZ2F0ZUFjdGl2ZSh5RmllbGQuaWQsIGFnZy5pZClcIlxuICAgICAgICAobW91c2Vkb3duKT1cIm9uWUFnZ3JlZ2F0ZVNlbGVjdCh5RmllbGQuaWQsIGFnZy5pZClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPnt7IGlzWUFnZ3JlZ2F0ZUFjdGl2ZSh5RmllbGQuaWQsIGFnZy5pZCkgPyAn4pyTJyA6ICcnIH19PC9zcGFuPlxuICAgICAgICB7eyBhZ2cubGFiZWwgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPCEtLSBTb3VzLW1lbnUgOiBDaGFtcHMgdGFibGUgKHRvZ2dsZSBjb2xvbm5lcykgLS0+XG48bWF0LW1lbnUgI2ZpZWxkc1N1Yk1lbnU9XCJtYXRNZW51XCIgcGFuZWxDbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LXBhbmVsXCI+XG4gIDxkaXYgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudVwiXG4gICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbVwiXG4gICAgICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgY29uZmlnLmZpZWxkc1wiXG4gICAgICBbY2xhc3MuYWN0aXZlXT1cImlzRmllbGRWaXNpYmxlKGZpZWxkLmlkKVwiXG4gICAgICAobW91c2Vkb3duKT1cIm9uRmllbGRUb2dnbGUoZmllbGQuaWQsICFpc0ZpZWxkVmlzaWJsZShmaWVsZC5pZCkpXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWNoZWNrXCI+e3sgaXNGaWVsZFZpc2libGUoZmllbGQuaWQpID8gJ+KckycgOiAnJyB9fTwvc3Bhbj4gICAgICA8bWF0LWljb24gKm5nSWY9XCJmaWVsZC5pY29uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pY29uXCI+e3sgZmllbGQuaWNvbiB9fTwvbWF0LWljb24+ICAgICAge3sgZmllbGQubGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L21hdC1tZW51PlxuXG48IS0tIFNvdXMtbWVudSA6IEdyb3VwZXIgcGFyIC0tPlxuPG1hdC1tZW51ICNncm91cHNTdWJNZW51PVwibWF0TWVudVwiIHBhbmVsQ2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1wYW5lbFwiPlxuICA8ZGl2IGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnVcIlxuICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW1cIlxuICAgICAgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGNvbmZpZy5ncm91cHNcIlxuICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzdGF0ZT8uc2VsZWN0ZWRHcm91cEJ5ID09PSBncm91cC5pZFwiXG4gICAgICAobW91c2Vkb3duKT1cIm9uR3JvdXBCeVNlbGVjdChncm91cC5pZClcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj57eyBzdGF0ZT8uc2VsZWN0ZWRHcm91cEJ5ID09PSBncm91cC5pZCA/ICfinJMnIDogJycgfX08L3NwYW4+ICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZ3JvdXAuaWNvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaWNvblwiPnt7IGdyb3VwLmljb24gfX08L21hdC1pY29uPiAgICAgIHt7IGdyb3VwLmxhYmVsIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9tYXQtbWVudT5cblxuPCEtLSBTb3VzLW1lbnUgOiBGaWx0cmVyIHBhciAtLT5cbjxtYXQtbWVudSAjc2xpY2VzU3ViTWVudT1cIm1hdE1lbnVcIiBwYW5lbENsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtcGFuZWxcIj5cbiAgPGRpdiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51XCJcbiAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgICpuZ0Zvcj1cImxldCBzbGljZSBvZiBjb25maWcuc2xpY2VzXCJcbiAgICAgIFtjbGFzcy5hY3RpdmVdPVwic3RhdGU/LnNlbGVjdGVkU2xpY2VzPy5pbmNsdWRlcyhzbGljZS5pZClcIlxuICAgICAgKG1vdXNlZG93bik9XCJvblNsaWNlQ2xpY2soc2xpY2UuaWQpXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWNoZWNrXCI+e3sgc3RhdGU/LnNlbGVjdGVkU2xpY2VzPy5pbmNsdWRlcyhzbGljZS5pZCkgPyAn4pyTJyA6ICcnIH19PC9zcGFuPiAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInNsaWNlLmljb25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWljb25cIj57eyBzbGljZS5pY29uIH19PC9tYXQtaWNvbj4gICAgICB7eyBzbGljZS5sYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gU291cy1tZW51IDogVGVtcGxhdGUgLS0+XG48bWF0LW1lbnUgI3RlbXBsYXRlU3ViTWVudT1cIm1hdE1lbnVcIiBwYW5lbENsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtcGFuZWxcIj5cbiAgPGRpdiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51XCJcbiAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgICpuZ0Zvcj1cImxldCB0bXBsIG9mIGNvbmZpZy50ZW1wbGF0ZXNcIlxuICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzdGF0ZT8uc2VsZWN0ZWRUZW1wbGF0ZSA9PT0gdG1wbC5pZFwiXG4gICAgICBbdGl0bGVdPVwidG1wbC5kZXNjcmlwdGlvbiB8fCAnJ1wiXG4gICAgICAobW91c2Vkb3duKT1cIm9uVGVtcGxhdGVTZWxlY3QodG1wbC5pZClcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj57eyBzdGF0ZT8uc2VsZWN0ZWRUZW1wbGF0ZSA9PT0gdG1wbC5pZCA/ICfinJMnIDogJycgfX08L3NwYW4+XG4gICAgICA8bWF0LWljb24gKm5nSWY9XCJ0bXBsLmljb25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWljb25cIj57eyB0bXBsLmljb24gfX08L21hdC1pY29uPlxuICAgICAge3sgdG1wbC5sYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gU291cy1tZW51IDogUHLDqWbDqXJlbmNlcyAtLT5cbjxtYXQtbWVudSAjcHJlZmVyZW5jZXNTdWJNZW51PVwibWF0TWVudVwiIHBhbmVsQ2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1wYW5lbFwiPlxuICA8ZGl2IGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnVcIlxuICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW1cIiAobW91c2Vkb3duKT1cIm9uUHJlZmVyZW5jZXNFZGl0KClcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj48L3NwYW4+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pY29uXCI+ZWRpdDwvbWF0LWljb24+w4lkaXRlclxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbVwiIChtb3VzZWRvd24pPVwib25QcmVmZXJlbmNlc1NhdmUoKVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPjwvc3Bhbj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWljb25cIj5zYXZlPC9tYXQtaWNvbj5TYXV2ZWdhcmRlclxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbVwiIFtkaXNhYmxlZF09XCIhY29uZmlnLmhhc1NhdmVkUHJlZmVyZW5jZXNcIiAobW91c2Vkb3duKT1cIm9uUHJlZmVyZW5jZXNDbGVhcigpXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWNoZWNrXCI+PC9zcGFuPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaWNvblwiPmRlbGV0ZV9vdXRsaW5lPC9tYXQtaWNvbj5Sw6lpbml0aWFsaXNlclxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbWF0LW1lbnU+XG5cbiJdfQ==