@dotglitch/ngx-common 1.0.51 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/components/command-palette/command-palette.component.d.ts +20 -0
  2. package/components/command-palette/shortcut/shortcut.component.d.ts +9 -0
  3. package/components/dynamic-html/dynamic-html.component.d.ts +1 -1
  4. package/components/filemanager/file-grid/file-grid.component.d.ts +1 -1
  5. package/components/filemanager/filemanager.component.d.ts +1 -1
  6. package/components/filemanager/folder-rename/folder-rename.component.d.ts +1 -1
  7. package/components/filemanager/toolbar/breadcrumb/breadcrumb.component.d.ts +1 -1
  8. package/components/filemanager/toolbar/icon-button/icon-button.component.d.ts +1 -1
  9. package/components/filemanager/toolbar/toolbar.component.d.ts +1 -1
  10. package/components/filemanager/tree-view/tree-view.component.d.ts +1 -1
  11. package/components/lazy-loader/lazy-loader.component.d.ts +1 -1
  12. package/components/menu/menu.component.d.ts +1 -1
  13. package/components/tabulator/tabulator.component.d.ts +1 -1
  14. package/components/tooltip/tooltip.component.d.ts +1 -1
  15. package/components/vscode/vscode.component.d.ts +1 -1
  16. package/directives/menu.directive.d.ts +2 -2
  17. package/directives/tooltip.directive.d.ts +1 -1
  18. package/esm2022/components/command-palette/command-palette.component.mjs +107 -0
  19. package/esm2022/components/command-palette/shortcut/shortcut.component.mjs +19 -0
  20. package/{esm2020 → esm2022}/components/dynamic-html/dynamic-html.component.mjs +5 -5
  21. package/esm2022/components/dynamic-html/dynamic-html.module.mjs +27 -0
  22. package/{esm2020 → esm2022}/components/dynamic-html/dynamic-html.service.mjs +6 -6
  23. package/{esm2020 → esm2022}/components/filemanager/file-grid/file-grid.component.mjs +5 -5
  24. package/esm2022/components/filemanager/filemanager.component.mjs +302 -0
  25. package/{esm2020 → esm2022}/components/filemanager/folder-rename/folder-rename.component.mjs +5 -5
  26. package/{esm2020 → esm2022}/components/filemanager/toolbar/breadcrumb/breadcrumb.component.mjs +5 -5
  27. package/{esm2020 → esm2022}/components/filemanager/toolbar/icon-button/icon-button.component.mjs +4 -4
  28. package/{esm2020 → esm2022}/components/filemanager/toolbar/toolbar.component.mjs +5 -5
  29. package/{esm2020 → esm2022}/components/filemanager/tree-view/tree-view.component.mjs +6 -6
  30. package/{esm2020 → esm2022}/components/lazy-loader/lazy-loader.component.mjs +6 -6
  31. package/esm2022/components/lazy-loader/lazy-loader.module.mjs +29 -0
  32. package/esm2022/components/lazy-loader/lazy-loader.service.mjs +215 -0
  33. package/{esm2020 → esm2022}/components/menu/menu.component.mjs +7 -7
  34. package/{esm2020 → esm2022}/components/react-magic-wrapper/react-magic-wrapper.component.mjs +5 -5
  35. package/esm2022/components/tabulator/tabulator.component.mjs +92 -0
  36. package/{esm2020 → esm2022}/components/tooltip/tooltip.component.mjs +10 -10
  37. package/{esm2020 → esm2022}/components/vscode/vscode.component.mjs +5 -5
  38. package/{esm2020 → esm2022}/directives/menu.directive.mjs +7 -7
  39. package/{esm2020 → esm2022}/directives/tooltip.directive.mjs +7 -7
  40. package/{esm2020 → esm2022}/pipes/html-bypass.pipe.mjs +5 -5
  41. package/{esm2020 → esm2022}/pipes/resource-bypass.pipe.mjs +5 -5
  42. package/{esm2020 → esm2022}/pipes/script-bypass.pipe.mjs +5 -5
  43. package/{esm2020 → esm2022}/pipes/style-bypass.pipe.mjs +5 -5
  44. package/{esm2020 → esm2022}/pipes/url-bypass.pipe.mjs +5 -5
  45. package/esm2022/public-api.mjs +58 -0
  46. package/esm2022/services/command-palette.service.mjs +194 -0
  47. package/{esm2020 → esm2022}/services/dependency.service.mjs +6 -6
  48. package/{esm2020 → esm2022}/services/dialog.service.mjs +5 -5
  49. package/{esm2020 → esm2022}/services/fetch.service.mjs +5 -5
  50. package/{esm2020 → esm2022}/services/file.service.mjs +5 -5
  51. package/{esm2020 → esm2022}/services/keyboard.service.mjs +5 -5
  52. package/{esm2020 → esm2022}/services/navigation.service.mjs +5 -5
  53. package/{esm2020 → esm2022}/services/theme.service.mjs +5 -5
  54. package/{fesm2020/dotglitch-ngx-common-folder-rename.component-dcb5b712.mjs → fesm2022/dotglitch-ngx-common-folder-rename.component-jf2j2TId.mjs} +7 -7
  55. package/{fesm2020/dotglitch-ngx-common-folder-rename.component-dcb5b712.mjs.map → fesm2022/dotglitch-ngx-common-folder-rename.component-jf2j2TId.mjs.map} +1 -1
  56. package/{fesm2020 → fesm2022}/dotglitch-ngx-common.mjs +460 -158
  57. package/fesm2022/dotglitch-ngx-common.mjs.map +1 -0
  58. package/package.json +9 -15
  59. package/public-api.d.ts +5 -1
  60. package/services/command-palette.service.d.ts +103 -0
  61. package/esm2020/components/dynamic-html/dynamic-html.module.mjs +0 -27
  62. package/esm2020/components/filemanager/filemanager.component.mjs +0 -302
  63. package/esm2020/components/lazy-loader/lazy-loader.module.mjs +0 -29
  64. package/esm2020/components/lazy-loader/lazy-loader.service.mjs +0 -215
  65. package/esm2020/components/tabulator/tabulator.component.mjs +0 -92
  66. package/esm2020/public-api.mjs +0 -54
  67. package/fesm2015/dotglitch-ngx-common-folder-rename.component-984ccea3.mjs +0 -82
  68. package/fesm2015/dotglitch-ngx-common-folder-rename.component-984ccea3.mjs.map +0 -1
  69. package/fesm2015/dotglitch-ngx-common.mjs +0 -10815
  70. package/fesm2015/dotglitch-ngx-common.mjs.map +0 -1
  71. package/fesm2020/dotglitch-ngx-common.mjs.map +0 -1
  72. /package/{esm2020 → esm2022}/assets/mat-icons.mjs +0 -0
  73. /package/{esm2020 → esm2022}/components/dynamic-html/types.mjs +0 -0
  74. /package/{esm2020 → esm2022}/components/filemanager/helpers.mjs +0 -0
  75. /package/{esm2020 → esm2022}/components/filemanager/icon-resolver.mjs +0 -0
  76. /package/{esm2020 → esm2022}/components/filemanager/textextensions.mjs +0 -0
  77. /package/{esm2020 → esm2022}/components/lazy-loader/types.mjs +0 -0
  78. /package/{esm2020 → esm2022}/components/types.mjs +0 -0
  79. /package/{esm2020 → esm2022}/components/vscode/ts-type-resolver/dependency-parser.mjs +0 -0
  80. /package/{esm2020 → esm2022}/components/vscode/ts-type-resolver/dummy-source-cache.mjs +0 -0
  81. /package/{esm2020 → esm2022}/components/vscode/ts-type-resolver/import-resolver.mjs +0 -0
  82. /package/{esm2020 → esm2022}/components/vscode/ts-type-resolver/main.mjs +0 -0
  83. /package/{esm2020 → esm2022}/components/vscode/ts-type-resolver/recursion-depth.mjs +0 -0
  84. /package/{esm2020 → esm2022}/components/vscode/ts-type-resolver/types.mjs +0 -0
  85. /package/{esm2020 → esm2022}/components/vscode/ts-type-resolver/unpkg-source-resolver.mjs +0 -0
  86. /package/{esm2020 → esm2022}/components/vscode/ts-type-resolver/update-emitter.mjs +0 -0
  87. /package/{esm2020 → esm2022}/directives/utils.mjs +0 -0
  88. /package/{esm2020 → esm2022}/dotglitch-ngx-common.mjs +0 -0
  89. /package/{esm2020 → esm2022}/types/menu.mjs +0 -0
  90. /package/{esm2020 → esm2022}/types/popup.mjs +0 -0
  91. /package/{esm2020 → esm2022}/types/tooltip.mjs +0 -0
  92. /package/{esm2020 → esm2022}/utils/index.mjs +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dotglitch/ngx-common",
3
3
  "private": false,
4
- "version": "1.0.51",
4
+ "version": "1.1.1",
5
5
  "repository": {
6
6
  "url": "https://github.com/knackstedt/dotglitch-ngx/tree/main/packages/common"
7
7
  },
@@ -21,10 +21,10 @@
21
21
  "angular-service"
22
22
  ],
23
23
  "peerDependencies": {
24
- "@angular/common": ">=15.0.0",
25
- "@angular/core": ">=15.0.0",
26
- "@angular/cdk": ">=15.0.0",
27
- "@angular/material": ">=15.0.0"
24
+ "@angular/common": ">=17.0.0",
25
+ "@angular/core": ">=17.0.0",
26
+ "@angular/cdk": ">=17.0.0",
27
+ "@angular/material": ">=17.0.0"
28
28
  },
29
29
  "dependencies": {
30
30
  "tslib": "^2.3.0",
@@ -38,11 +38,7 @@
38
38
  "ulidx": ">=2.0.0"
39
39
  },
40
40
  "sideEffects": false,
41
- "module": "fesm2015/dotglitch-ngx-common.mjs",
42
- "es2020": "fesm2020/dotglitch-ngx-common.mjs",
43
- "esm2020": "esm2020/dotglitch-ngx-common.mjs",
44
- "fesm2020": "fesm2020/dotglitch-ngx-common.mjs",
45
- "fesm2015": "fesm2015/dotglitch-ngx-common.mjs",
41
+ "module": "fesm2022/dotglitch-ngx-common.mjs",
46
42
  "typings": "index.d.ts",
47
43
  "exports": {
48
44
  "./package.json": {
@@ -50,11 +46,9 @@
50
46
  },
51
47
  ".": {
52
48
  "types": "./index.d.ts",
53
- "esm2020": "./esm2020/dotglitch-ngx-common.mjs",
54
- "es2020": "./fesm2020/dotglitch-ngx-common.mjs",
55
- "es2015": "./fesm2015/dotglitch-ngx-common.mjs",
56
- "node": "./fesm2015/dotglitch-ngx-common.mjs",
57
- "default": "./fesm2020/dotglitch-ngx-common.mjs"
49
+ "esm2022": "./esm2022/dotglitch-ngx-common.mjs",
50
+ "esm": "./esm2022/dotglitch-ngx-common.mjs",
51
+ "default": "./fesm2022/dotglitch-ngx-common.mjs"
58
52
  }
59
53
  }
60
54
  }
package/public-api.d.ts CHANGED
@@ -26,6 +26,7 @@ export * from './services/keyboard.service';
26
26
  export * from './services/file.service';
27
27
  export * from './services/theme.service';
28
28
  export * from './services/navigation.service';
29
+ export * from './services/command-palette.service';
29
30
  /**
30
31
  ** Lazy loader component & service
31
32
  */
@@ -34,12 +35,15 @@ export * from './components/lazy-loader/lazy-loader.module';
34
35
  export * from './components/lazy-loader/lazy-loader.component';
35
36
  export * from './components/lazy-loader/types';
36
37
  /**
37
- ** Services
38
+ ** Dynamic HTML (WIP)
38
39
  */
39
40
  export * from './components/dynamic-html/dynamic-html.service';
40
41
  export * from './components/dynamic-html/dynamic-html.module';
41
42
  export * from './components/dynamic-html/dynamic-html.component';
42
43
  export * from './components/dynamic-html/types';
44
+ /**
45
+ ** Components
46
+ */
43
47
  export * from './components/filemanager/filemanager.component';
44
48
  export * from './components/tabulator/tabulator.component';
45
49
  export * from './components/vscode/vscode.component';
@@ -0,0 +1,103 @@
1
+ import { MatDialog } from '@angular/material/dialog';
2
+ import { LazyLoaderService } from '../components/lazy-loader/lazy-loader.service';
3
+ import { CommandPaletteComponent } from '../components/command-palette/command-palette.component';
4
+ import * as i0 from "@angular/core";
5
+ type KeyCode = "Backspace" | "Tab" | "Enter" | "ShiftLeft" | "ShiftRight" | "ControlLeft" | "ControlRight" | "AltLeft" | "AltRight" | "Pause" | "CapsLock" | "Escape" | "Space" | "PageUp" | "PageDown" | "End" | "Home" | "ArrowLeft" | "ArrowUp" | "ArrowRight" | "ArrowDown" | "PrintScreen" | "Insert" | "Delete" | "MetaLeft" | "MetaRight" | "ContextMenu" | "Numpad0" | "Numpad1" | "Numpad2" | "Numpad3" | "Numpad4" | "Numpad5" | "Numpad6" | "Numpad7" | "Numpad8" | "Numpad9" | "NumpadMultiply" | "NumpadAdd" | "NumpadSubtract" | "NumpadDecimal" | "NumpadDivide" | "F1" | "F2" | "F3" | "F4" | "F5" | "F6" | "F7" | "F8" | "F9" | "F10" | "F11" | "F12" | "NumLock" | "ScrollLock" | "Semicolon" | "Equal" | "Comma" | "Minus" | "Period" | "Slash" | "Backquote" | "BracketLeft" | "Backslash" | "BracketRight" | "Quote" | "backspace" | "tab" | "enter" | "shiftleft" | "shiftright" | "controlleft" | "controlright" | "altleft" | "altright" | "pause" | "capslock" | "escape" | "space" | "pageup" | "pagedown" | "end" | "home" | "arrowleft" | "arrowup" | "arrowright" | "arrowdown" | "printscreen" | "insert" | "delete" | "metaleft" | "metaright" | "contextmenu" | "numpad0" | "numpad1" | "numpad2" | "numpad3" | "numpad4" | "numpad5" | "numpad6" | "numpad7" | "numpad8" | "numpad9" | "numpadmultiply" | "numpadadd" | "numpadsubtract" | "numpaddecimal" | "numpaddivide" | "f1" | "f2" | "f3" | "f4" | "f5" | "f6" | "f7" | "f8" | "f9" | "f10" | "f11" | "f12" | "numlock" | "scrolllock" | "semicolon" | "equal" | "comma" | "minus" | "period" | "slash" | "backquote" | "bracketleft" | "backslash" | "bracketright" | "quote" | "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z";
6
+ type KeyPrefix = `ctrl` | `ctrl+alt` | `ctrl+alt+shift` | `ctrl+alt+shift+meta` | `ctrl+alt+meta` | `ctrl+shift` | `ctrl+shift+meta` | `ctrl+meta` | `alt` | `alt+shift` | `alt+shift+meta` | `alt+meta` | `shift` | `shift+meta` | `meta`;
7
+ export type KeybindEvent = (e: KeyboardEvent) => void;
8
+ export type KeybindCode = `${KeyPrefix}+${KeyCode}` | KeyCode;
9
+ export type CommandAction<T = any> = {
10
+ /**
11
+ * The non-modifier key(s) that must be pressed for the event to fire.
12
+ */
13
+ shortcutKey: KeybindCode | KeybindCode[];
14
+ /**
15
+ * Action that is invoked when the keyboard shortcut is pressed or the item
16
+ * is activated in the GUI menu
17
+ * If the GUI menu is open, it will show a spinner if the action returns a `Promise`
18
+ */
19
+ action: (evt: KeyboardEvent, data?: T) => Promise<any> | any;
20
+ /**
21
+ * Arbitrary data object to be passed into the action
22
+ */
23
+ data?: T;
24
+ /**
25
+ * Label in the command palette popup
26
+ */
27
+ label?: string;
28
+ /**
29
+ * Keywords that can help pick this command
30
+ */
31
+ keywords?: string | string[];
32
+ /**
33
+ * Description for the popup
34
+ */
35
+ description?: string;
36
+ /**
37
+ * The root ancestor element of the action
38
+ * (This allows scoping commands to specific HTML elements)
39
+ * This requires that the event target must be a descendant
40
+ *
41
+ * If there are multiple matching descendants, only
42
+ * the furthest descendant will be fired
43
+ */
44
+ rootElement?: HTMLElement;
45
+ /**
46
+ * The label for the root. Used for the UI control and debugging.
47
+ */
48
+ rootName?: string;
49
+ };
50
+ export type CommandPaletteOptions = {
51
+ keybind: KeybindCode;
52
+ };
53
+ /**
54
+ *
55
+ */
56
+ export declare class CommandPaletteService {
57
+ private readonly dialog;
58
+ private readonly lazyLoader;
59
+ private commandBlocks;
60
+ private interval;
61
+ constructor(dialog: MatDialog, lazyLoader: LazyLoaderService);
62
+ private ngOnDestroy;
63
+ private getCommandBlocks;
64
+ /**
65
+ * Handle keydown events
66
+ *
67
+ * If an event has been removed from the DOM tree, we don't need
68
+ * to explicitly remove the bindings, as they will never fire
69
+ *
70
+ * We periodically check and remove unconnected command blocks
71
+ */
72
+ private onKeyDown;
73
+ private addCommand;
74
+ private removeCommand;
75
+ /**
76
+ *
77
+ */
78
+ initialize(options: CommandPaletteOptions): void;
79
+ /**
80
+ * Open the command palette
81
+ */
82
+ openPalette(): import("@angular/material/dialog").MatDialogRef<CommandPaletteComponent, any>;
83
+ /**
84
+ * Public helper to invoke an action.
85
+ */
86
+ invokeAction(action: CommandAction, args?: any): void;
87
+ /**
88
+ * Attach commands to an Element and it's subtree
89
+ */
90
+ attachElementCommands(actions: CommandAction[]): any;
91
+ attachElementCommands(element: HTMLElement, actions: CommandAction[]): any;
92
+ /**
93
+ * Detach specified commands from an Element subtree
94
+ */
95
+ detachElementCommands(element?: HTMLElement, actions?: CommandAction[]): void;
96
+ /**
97
+ * Return the list of registered commands under a given element
98
+ */
99
+ getRegisteredCommands(element?: HTMLElement): CommandAction<any>[];
100
+ static ɵfac: i0.ɵɵFactoryDeclaration<CommandPaletteService, never>;
101
+ static ɵprov: i0.ɵɵInjectableDeclaration<CommandPaletteService>;
102
+ }
103
+ export {};
@@ -1,27 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { DynamicHTMLComponent } from './dynamic-html.component';
3
- import { NGX_DYNAMIC_CONFIG } from './types';
4
- import { DynamicHTMLRenderer } from './dynamic-html.service';
5
- import * as i0 from "@angular/core";
6
- export class NgxDynamicHTMLModule {
7
- static forRoot(config) {
8
- return {
9
- ngModule: NgxDynamicHTMLModule,
10
- providers: [
11
- DynamicHTMLRenderer,
12
- { provide: NGX_DYNAMIC_CONFIG, useValue: config }
13
- ],
14
- };
15
- }
16
- }
17
- NgxDynamicHTMLModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NgxDynamicHTMLModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
18
- NgxDynamicHTMLModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: NgxDynamicHTMLModule, imports: [DynamicHTMLComponent], exports: [DynamicHTMLComponent] });
19
- NgxDynamicHTMLModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NgxDynamicHTMLModule, imports: [DynamicHTMLComponent] });
20
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NgxDynamicHTMLModule, decorators: [{
21
- type: NgModule,
22
- args: [{
23
- imports: [DynamicHTMLComponent],
24
- exports: [DynamicHTMLComponent],
25
- }]
26
- }] });
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1odG1sLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy9keW5hbWljLWh0bWwvZHluYW1pYy1odG1sLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQXNCLGtCQUFrQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQU03RCxNQUFNLE9BQU8sb0JBQW9CO0lBQ3RCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBMEI7UUFDNUMsT0FBTztZQUNILFFBQVEsRUFBRSxvQkFBb0I7WUFDOUIsU0FBUyxFQUFFO2dCQUNQLG1CQUFtQjtnQkFDbkIsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRTthQUNwRDtTQUNKLENBQUM7SUFDTixDQUFDOztpSEFUUSxvQkFBb0I7a0hBQXBCLG9CQUFvQixZQUhuQixvQkFBb0IsYUFDcEIsb0JBQW9CO2tIQUVyQixvQkFBb0IsWUFIbkIsb0JBQW9COzJGQUdyQixvQkFBb0I7a0JBSmhDLFFBQVE7bUJBQUM7b0JBQ04sT0FBTyxFQUFFLENBQUMsb0JBQW9CLENBQUM7b0JBQy9CLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixDQUFDO2lCQUNsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljSFRNTENvbXBvbmVudCB9IGZyb20gJy4vZHluYW1pYy1odG1sLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEeW5hbWljSFRNTE9wdGlvbnMsIE5HWF9EWU5BTUlDX0NPTkZJRyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgRHluYW1pY0hUTUxSZW5kZXJlciB9IGZyb20gJy4vZHluYW1pYy1odG1sLnNlcnZpY2UnO1xuXG5ATmdNb2R1bGUoe1xuICAgIGltcG9ydHM6IFtEeW5hbWljSFRNTENvbXBvbmVudF0sXG4gICAgZXhwb3J0czogW0R5bmFtaWNIVE1MQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgTmd4RHluYW1pY0hUTUxNb2R1bGUge1xuICAgIHB1YmxpYyBzdGF0aWMgZm9yUm9vdChjb25maWc6IER5bmFtaWNIVE1MT3B0aW9ucyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8Tmd4RHluYW1pY0hUTUxNb2R1bGU+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5nTW9kdWxlOiBOZ3hEeW5hbWljSFRNTE1vZHVsZSxcbiAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICAgIER5bmFtaWNIVE1MUmVuZGVyZXIsXG4gICAgICAgICAgICAgICAgeyBwcm92aWRlOiBOR1hfRFlOQU1JQ19DT05GSUcsIHVzZVZhbHVlOiBjb25maWcgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iXX0=
@@ -1,302 +0,0 @@
1
- import { Component, EventEmitter, Inject, Input, Optional, Output, ViewChild, ViewChildren } from '@angular/core';
2
- import { NgForOf, NgIf } from '@angular/common';
3
- import { MatTabsModule } from '@angular/material/tabs';
4
- import { MatIconModule } from '@angular/material/icon';
5
- import { MatDrawerContainer, MatSidenavModule } from '@angular/material/sidenav';
6
- import { AngularSplitModule } from 'angular-split';
7
- import { FileGridComponent } from './file-grid/file-grid.component';
8
- import { ToolbarComponent } from './toolbar/toolbar.component';
9
- import { TreeViewComponent } from './tree-view/tree-view.component';
10
- import { NGX_WEB_COMPONENTS_CONFIG } from '../types';
11
- import { IconResolver } from './icon-resolver';
12
- import { ulid } from 'ulidx';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "../lazy-loader/lazy-loader.service";
15
- import * as i2 from "../../public-api";
16
- import * as i3 from "angular-split";
17
- import * as i4 from "@angular/material/tabs";
18
- import * as i5 from "@angular/material/icon";
19
- import * as i6 from "@angular/material/sidenav";
20
- export class FilemanagerComponent {
21
- get currentFileGrid() { return this.fileGrids[this.tabIndex]; }
22
- constructor(libConfig = {}, lazyLoader, viewContainer, fetch) {
23
- this.libConfig = libConfig;
24
- this.lazyLoader = lazyLoader;
25
- this.viewContainer = viewContainer;
26
- this.fetch = fetch;
27
- this.config = {
28
- apiSettings: {
29
- listEntriesUrl: `/api/filesystem/`,
30
- uploadEntryUrl: `/api/filesystem/`,
31
- downloadEntryUrl: `/api/filesystem/`,
32
- deleteEntryUrl: `/api/filesystem/`,
33
- createDirectoryUrl: `/api/filesystem/folder`,
34
- renameEntryUrl: `/api/filesystem/rename`
35
- }
36
- };
37
- this.gridSize = "normal";
38
- this.value = [];
39
- this.valueChange = new EventEmitter();
40
- this.gridValues = [];
41
- /**
42
- * Emits when focused files change.
43
- * Only available in `focusFiles` mode.
44
- */
45
- this.focusedFilesChange = new EventEmitter();
46
- /**
47
- * Emits when a file is uploaded.
48
- */
49
- this.fileUpload = new EventEmitter();
50
- /**
51
- * Emits when a file is downloaded.
52
- */
53
- this.fileDownload = new EventEmitter();
54
- this.fileRename = new EventEmitter();
55
- this.fileDelete = new EventEmitter();
56
- this.fileCopy = new EventEmitter();
57
- this.filePaste = new EventEmitter();
58
- this.fileSelect = new EventEmitter();
59
- this.fileDblClick = new EventEmitter();
60
- this.folderSelect = new EventEmitter();
61
- this.folderDblClick = new EventEmitter();
62
- /**
63
- * Emits when multiple file selections change.
64
- */
65
- this.filesSelect = new EventEmitter();
66
- /**
67
- * Emits when any selection changes, single or multiple files.
68
- */
69
- // @Output() selectionChange = new EventEmitter<FSDescriptor[]>();
70
- this.showHiddenFiles = false;
71
- this.showSidebar = true;
72
- this.sidebarOverlay = false;
73
- this.width = 0;
74
- this.isHomeAncestor = false;
75
- this.currentTab = {};
76
- this.tabIndex = 0;
77
- this.tabs = [];
78
- lazyLoader.registerComponent({
79
- id: "folder-rename",
80
- group: "@dotglitch/ngx-web-components",
81
- load: () => import('./folder-rename/folder-rename.component')
82
- });
83
- this.iconResolver = new IconResolver(libConfig.assetPath);
84
- }
85
- ngOnInit() {
86
- this.initTab(this.config.path);
87
- this.currentTab = this.tabs[0];
88
- }
89
- ngAfterViewInit() {
90
- this.onResize();
91
- setTimeout(() => this.onResize(), 250);
92
- }
93
- onTreeViewLoadChildren({ item, cb }) {
94
- const url = this.config.apiSettings.listEntriesUrlTemplate
95
- ? this.config.apiSettings.listEntriesUrlTemplate(item.path + item.name)
96
- : this.config.apiSettings.listEntriesUrl;
97
- this.fetch.post(url, { path: item.path + item.name, showHidden: this.showHiddenFiles })
98
- .then((data) => {
99
- const dirs = data.dirs;
100
- cb(dirs);
101
- });
102
- }
103
- initTab(path) {
104
- this.tabs.push(this.currentTab = {
105
- id: ulid(),
106
- label: this.getTabLabel(path),
107
- breadcrumb: this.calcBreadcrumb(path),
108
- path,
109
- selection: [],
110
- viewMode: this.mode || 'grid',
111
- historyIndex: 0,
112
- history: [],
113
- sidebarItems: [],
114
- sortOrder: 'a-z'
115
- });
116
- this.tabIndex = this.tabs.length;
117
- }
118
- closeTab(tab) {
119
- this.tabs.splice(this.tabs.findIndex(t => t.id == tab.id), 1);
120
- }
121
- calcBreadcrumb(path) {
122
- if (!path)
123
- return null;
124
- path = path.replace("#/", '/');
125
- // If we're acting like we're in a changed root, we wipe out
126
- // breadcrumbs below the root
127
- if (this.config.chrootPath) {
128
- path = path.replace(this.config.chrootPath, '');
129
- const parts = path.split('/');
130
- path = path.replace(/^\//, this.config.chrootPath);
131
- return parts.map((p, i) => {
132
- const path = parts.slice(0, i + 1).join('/');
133
- return {
134
- id: (this.config.chrootPath + (path || '/')).replace(/\/+/g, '/'),
135
- label: p || ""
136
- };
137
- });
138
- }
139
- else {
140
- const parts = path.split('/');
141
- return parts.map((p, i) => {
142
- const path = parts.slice(0, i + 1).join('/');
143
- return {
144
- id: path || '/',
145
- label: p || ""
146
- };
147
- });
148
- }
149
- }
150
- onBreadcrumbClick(crumb) {
151
- if (crumb.id) {
152
- this.currentTab.path = crumb.id;
153
- this.currentTab.breadcrumb = this.calcBreadcrumb(crumb.id);
154
- }
155
- }
156
- onTabPathChange(tab) {
157
- tab.label = this.getTabLabel(tab.path);
158
- tab.breadcrumb = this.calcBreadcrumb(tab.path);
159
- tab.historyIndex++;
160
- tab.history.push(tab.path);
161
- tab.history.splice(typeof this.config.maxHistoryLength == 'number' ? this.config.maxHistoryLength : 50);
162
- }
163
- onTreeViewSelect(item) {
164
- this.currentTab.path = item.path + item.name;
165
- }
166
- onTabLoadFiles(tab, files) {
167
- if (tab.sidebarItems.length == 0) {
168
- tab.sidebarItems = files.filter(f => f.kind == "directory");
169
- return;
170
- }
171
- const currentItems = tab.sidebarItems;
172
- const dirItems = files.filter(f => f.kind == "directory");
173
- function recurse(items) {
174
- return items.find(i => tab.path?.startsWith(i.path));
175
- }
176
- const target = recurse(currentItems);
177
- if (target)
178
- target['_children'] = dirItems;
179
- tab.sidebarItems = currentItems;
180
- }
181
- onGridValueChange() {
182
- this.value = this.gridValues.flat(1);
183
- this.valueChange.emit(this.value);
184
- }
185
- getTabLabel(path) {
186
- return path?.split('/').filter(p => p).pop();
187
- }
188
- async onResize() {
189
- // Trigger re-calculation of the view
190
- this.fileGrids.forEach(g => g.resize());
191
- const el = this.viewContainer.element.nativeElement;
192
- const bounds = el.getBoundingClientRect();
193
- this.width = bounds.width;
194
- // If the view area is less than 650px wide, use overlay the sidebar panel
195
- this.sidebarOverlay = bounds.width < 650;
196
- if (this.sidebarOverlay == false && [...this.drawer._drawers][0].opened) {
197
- this.drawer.close();
198
- }
199
- }
200
- async onResizeEnd() {
201
- this.onResize();
202
- setTimeout(() => this.onResize(), 250);
203
- }
204
- getSelection() {
205
- if (this.currentTab.viewMode == "grid") {
206
- return this.currentTab.selection;
207
- }
208
- else {
209
- return this.value;
210
- }
211
- }
212
- clearSelection() {
213
- this.fileGrids.forEach(g => g.clearSelection());
214
- }
215
- // Tell the child grid to refresh it's sorting
216
- refreshSorting() {
217
- this.fileGrids.forEach(g => g.sort());
218
- }
219
- refreshData() {
220
- this.fileGrids.forEach(g => g.loadFolder());
221
- }
222
- getFileData(file) {
223
- let url = this.config.apiSettings.renameEntryUrlTemplate
224
- ? this.config.apiSettings.renameEntryUrlTemplate(file.path + file.name)
225
- : this.config.apiSettings.renameEntryUrl;
226
- url = (url.includes('?') ? '&' : '?') + `dir=${file.path}&file=${file.name}`;
227
- return url;
228
- }
229
- }
230
- FilemanagerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FilemanagerComponent, deps: [{ token: NGX_WEB_COMPONENTS_CONFIG, optional: true }, { token: i1.LazyLoaderService }, { token: i0.ViewContainerRef }, { token: i2.Fetch }], target: i0.ɵɵFactoryTarget.Component });
231
- FilemanagerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FilemanagerComponent, isStandalone: true, selector: "app-filemanager", inputs: { config: "config", gridSize: "gridSize", mode: "mode", contextTags: "contextTags", value: "value" }, outputs: { valueChange: "valueChange", focusedFilesChange: "focusedFilesChange", fileUpload: "fileUpload", fileDownload: "fileDownload", fileRename: "fileRename", fileDelete: "fileDelete", fileCopy: "fileCopy", filePaste: "filePaste", fileSelect: "fileSelect", fileDblClick: "fileDblClick", folderSelect: "folderSelect", folderDblClick: "folderDblClick", filesSelect: "filesSelect" }, viewQueries: [{ propertyName: "tabGroup", first: true, predicate: ["tabGroup"], descendants: true }, { propertyName: "treeView", first: true, predicate: TreeViewComponent, descendants: true }, { propertyName: "toolbar", first: true, predicate: ToolbarComponent, descendants: true }, { propertyName: "drawer", first: true, predicate: MatDrawerContainer, descendants: true }, { propertyName: "fileGrids", predicate: FileGridComponent, descendants: true }], ngImport: i0, template: "<app-toolbar\n [currentTab]=\"currentTab\"\n [(showHiddenFiles)]=\"showHiddenFiles\"\n [(showSidebar)]=\"showSidebar\"\n [config]=\"config\"\n [showBareMinimum]=\"width < 500 && config.showBreadcrumb != false\"\n (onBreadcrumbClick)=\"onBreadcrumbClick($event)\"\n/>\n\n<mat-drawer-container>\n <mat-drawer #drawer mode=\"over\">\n <app-toolbar\n *ngIf=\"width < 500 && config.showBreadcrumb != false\"\n [currentTab]=\"currentTab\"\n [(showHiddenFiles)]=\"showHiddenFiles\"\n [(showSidebar)]=\"showSidebar\"\n [config]=\"config\"\n [drawerMode]=\"true\"\n (onBreadcrumbClick)=\"onBreadcrumbClick($event)\"\n />\n <app-tree-view\n [data]=\"currentTab.sidebarItems\"\n (loadChildren)=\"onTreeViewLoadChildren($event)\"\n (click)=\"onTreeViewSelect($event)\"\n />\n </mat-drawer>\n <mat-drawer-content>\n <as-split direction=\"horizontal\" [gutterSize]=\"sidebarOverlay ? 0 : 2\" [unit]=\"'pixel'\" (dragEnd)=\"onResizeEnd()\">\n <as-split-area\n style=\"background-color: var(--filemanager-sidebar-background-color, #2c2c2c)\"\n [size]=\"215\"\n [minSize]=\"215\"\n [maxSize]=\"width/4\"\n [visible]=\"!sidebarOverlay && config.showTreeview != false\"\n >\n <div class=\"sidebar\"\n *ngIf=\"!sidebarOverlay && config.showTreeview != false\"\n (click)=\"currentTab.selection = []\"\n >\n <app-tree-view\n [data]=\"currentTab.sidebarItems\"\n (loadChildren)=\"onTreeViewLoadChildren($event)\"\n (click)=\"onTreeViewSelect($event)\"\n />\n </div>\n </as-split-area>\n <as-split-area style=\"background-color: var(--filemanager-background-color, #272727);\">\n <div class=\"content\"\n [style.--tab-height]=\"tabs.length > 1 ? '36px' : '0'\"\n >\n <mat-tab-group #tabGroup (selectedTabChange)=\"currentTab = tabs[$event.index]\" [(selectedIndex)]=\"tabIndex\">\n <mat-tab *ngFor=\"let tab of tabs; let i = index\">\n <ng-template mat-tab-label>\n {{tab.label}}\n <mat-icon\n class=\"close\"\n (click)=\"closeTab(tab)\">\n close\n </mat-icon>\n </ng-template>\n\n <ng-template matTabContent>\n <app-file-grid\n [viewMode]=\"tab.viewMode\"\n [tab]=\"tab\"\n [config]=\"config\"\n [gridSize]=\"gridSize\"\n [sortOrder]=\"tab.sortOrder\"\n [(selection)]=\"tab.selection\"\n [(path)]=\"tab.path\"\n (pathChange)=\"onTabPathChange(tab)\"\n [(value)]=\"gridValues[i]\"\n (valueChange)=\"onGridValueChange()\"\n (loadFiles)=\"onTabLoadFiles(tab, $event)\"\n\n (fileSelect)=\"fileSelect.next($event)\"\n (fileDblClick)=\"fileDblClick.next($event)\"\n (folderSelect)=\"folderSelect.next($event)\"\n (folderDblClick)=\"folderDblClick.next($event)\"\n />\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n </div>\n </as-split-area>\n </as-split>\n </mat-drawer-content>\n</mat-drawer-container>\n\n", styles: [":host{display:flex;flex-direction:column;height:100%;width:100%}:host .content{display:flex;height:100%;overflow:hidden}:host ::ng-deep .as-split-gutter{background-color:var(--gutter-color, #121212)!important}:host ::ng-deep .mat-mdc-tab-header{height:var(--tab-height, 0);transition:height .25s ease}:host ::ng-deep .mat-mdc-tab-header .mdc-tab{height:var(--tab-height, 0);background-color:var(--filemanager-tab-background-color, #303030)}:host ::ng-deep .mat-mdc-tab .mdc-tab__content{position:static}:host ::ng-deep .mat-mdc-tab:not(.mat-mdc-tab-disabled).mdc-tab--active .mdc-tab__text-label,:host ::ng-deep .mat-mdc-tab-link:not(.mat-mdc-tab-disabled).mdc-tab--active .mdc-tab__text-label{color:var(--text-subdued-color)}.sidebar{border-right:1px solid transparent;transition:background-color .2s cubic-bezier(0,0,.2,1),border-color .2s ease}.sidebar ul{list-style-type:none;text-align:left;margin:0;padding:0;display:flex;flex-direction:column}.sidebar ul li{display:flex;align-items:center;transition:all .2s ease;font-size:14px;padding:6px 6px 6px 24px}.sidebar ul li mat-icon{margin-right:8px}.sidebar ul li:hover{background-color:#343434}.sidebar ul .tooltip{background-color:#101010cc;border:1px solid #414141;opacity:0;pointer-events:none;transition:all .2s ease}.active .sidebar{background-color:#2c2c2c;border-right-color:#1c1c1c}.active .sidebar li:hover{background-color:#343434}.close{position:absolute;right:12px;color:#666;transition:color .25s ease}.close:hover{color:#ccc}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: AngularSplitModule }, { kind: "component", type: i3.SplitComponent, selector: "as-split", inputs: ["direction", "unit", "gutterSize", "gutterStep", "restrictMove", "useTransition", "disabled", "dir", "gutterDblClickDuration", "gutterClickDeltaPx", "gutterAriaLabel"], outputs: ["transitionEnd", "dragStart", "dragEnd", "gutterClick", "gutterDblClick"], exportAs: ["asSplit"] }, { kind: "directive", type: i3.SplitAreaDirective, selector: "as-split-area, [as-split-area]", inputs: ["order", "size", "minSize", "maxSize", "lockSize", "visible"], exportAs: ["asSplitArea"] }, { kind: "component", type: FileGridComponent, selector: "app-file-grid", inputs: ["path", "config", "showHiddenFiles", "viewMode", "gridSize", "tab", "selection", "value", "sortOrder"], outputs: ["pathChange", "fileSelect", "fileDblClick", "folderSelect", "folderDblClick", "newTab", "loadFiles", "selectionChange", "valueChange"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "directive", type: i4.MatTabContent, selector: "[matTabContent]" }, { kind: "directive", type: i4.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i4.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i6.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i6.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i6.MatDrawerContent, selector: "mat-drawer-content" }, { kind: "component", type: ToolbarComponent, selector: "app-toolbar", inputs: ["config", "currentTab", "showHiddenFiles", "showSidebar", "drawerMode", "showBareMinimum"], outputs: ["onBreadcrumbClick", "showHiddenFilesChange", "showSidebarChange"] }, { kind: "component", type: TreeViewComponent, selector: "app-tree-view", inputs: ["rowTemplate", "data"], outputs: ["click", "loadChildren"] }] });
232
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FilemanagerComponent, decorators: [{
233
- type: Component,
234
- args: [{ selector: 'app-filemanager', imports: [
235
- NgIf,
236
- NgForOf,
237
- AngularSplitModule,
238
- FileGridComponent,
239
- MatTabsModule,
240
- MatIconModule,
241
- MatSidenavModule,
242
- ToolbarComponent,
243
- TreeViewComponent
244
- ], standalone: true, template: "<app-toolbar\n [currentTab]=\"currentTab\"\n [(showHiddenFiles)]=\"showHiddenFiles\"\n [(showSidebar)]=\"showSidebar\"\n [config]=\"config\"\n [showBareMinimum]=\"width < 500 && config.showBreadcrumb != false\"\n (onBreadcrumbClick)=\"onBreadcrumbClick($event)\"\n/>\n\n<mat-drawer-container>\n <mat-drawer #drawer mode=\"over\">\n <app-toolbar\n *ngIf=\"width < 500 && config.showBreadcrumb != false\"\n [currentTab]=\"currentTab\"\n [(showHiddenFiles)]=\"showHiddenFiles\"\n [(showSidebar)]=\"showSidebar\"\n [config]=\"config\"\n [drawerMode]=\"true\"\n (onBreadcrumbClick)=\"onBreadcrumbClick($event)\"\n />\n <app-tree-view\n [data]=\"currentTab.sidebarItems\"\n (loadChildren)=\"onTreeViewLoadChildren($event)\"\n (click)=\"onTreeViewSelect($event)\"\n />\n </mat-drawer>\n <mat-drawer-content>\n <as-split direction=\"horizontal\" [gutterSize]=\"sidebarOverlay ? 0 : 2\" [unit]=\"'pixel'\" (dragEnd)=\"onResizeEnd()\">\n <as-split-area\n style=\"background-color: var(--filemanager-sidebar-background-color, #2c2c2c)\"\n [size]=\"215\"\n [minSize]=\"215\"\n [maxSize]=\"width/4\"\n [visible]=\"!sidebarOverlay && config.showTreeview != false\"\n >\n <div class=\"sidebar\"\n *ngIf=\"!sidebarOverlay && config.showTreeview != false\"\n (click)=\"currentTab.selection = []\"\n >\n <app-tree-view\n [data]=\"currentTab.sidebarItems\"\n (loadChildren)=\"onTreeViewLoadChildren($event)\"\n (click)=\"onTreeViewSelect($event)\"\n />\n </div>\n </as-split-area>\n <as-split-area style=\"background-color: var(--filemanager-background-color, #272727);\">\n <div class=\"content\"\n [style.--tab-height]=\"tabs.length > 1 ? '36px' : '0'\"\n >\n <mat-tab-group #tabGroup (selectedTabChange)=\"currentTab = tabs[$event.index]\" [(selectedIndex)]=\"tabIndex\">\n <mat-tab *ngFor=\"let tab of tabs; let i = index\">\n <ng-template mat-tab-label>\n {{tab.label}}\n <mat-icon\n class=\"close\"\n (click)=\"closeTab(tab)\">\n close\n </mat-icon>\n </ng-template>\n\n <ng-template matTabContent>\n <app-file-grid\n [viewMode]=\"tab.viewMode\"\n [tab]=\"tab\"\n [config]=\"config\"\n [gridSize]=\"gridSize\"\n [sortOrder]=\"tab.sortOrder\"\n [(selection)]=\"tab.selection\"\n [(path)]=\"tab.path\"\n (pathChange)=\"onTabPathChange(tab)\"\n [(value)]=\"gridValues[i]\"\n (valueChange)=\"onGridValueChange()\"\n (loadFiles)=\"onTabLoadFiles(tab, $event)\"\n\n (fileSelect)=\"fileSelect.next($event)\"\n (fileDblClick)=\"fileDblClick.next($event)\"\n (folderSelect)=\"folderSelect.next($event)\"\n (folderDblClick)=\"folderDblClick.next($event)\"\n />\n </ng-template>\n </mat-tab>\n </mat-tab-group>\n </div>\n </as-split-area>\n </as-split>\n </mat-drawer-content>\n</mat-drawer-container>\n\n", styles: [":host{display:flex;flex-direction:column;height:100%;width:100%}:host .content{display:flex;height:100%;overflow:hidden}:host ::ng-deep .as-split-gutter{background-color:var(--gutter-color, #121212)!important}:host ::ng-deep .mat-mdc-tab-header{height:var(--tab-height, 0);transition:height .25s ease}:host ::ng-deep .mat-mdc-tab-header .mdc-tab{height:var(--tab-height, 0);background-color:var(--filemanager-tab-background-color, #303030)}:host ::ng-deep .mat-mdc-tab .mdc-tab__content{position:static}:host ::ng-deep .mat-mdc-tab:not(.mat-mdc-tab-disabled).mdc-tab--active .mdc-tab__text-label,:host ::ng-deep .mat-mdc-tab-link:not(.mat-mdc-tab-disabled).mdc-tab--active .mdc-tab__text-label{color:var(--text-subdued-color)}.sidebar{border-right:1px solid transparent;transition:background-color .2s cubic-bezier(0,0,.2,1),border-color .2s ease}.sidebar ul{list-style-type:none;text-align:left;margin:0;padding:0;display:flex;flex-direction:column}.sidebar ul li{display:flex;align-items:center;transition:all .2s ease;font-size:14px;padding:6px 6px 6px 24px}.sidebar ul li mat-icon{margin-right:8px}.sidebar ul li:hover{background-color:#343434}.sidebar ul .tooltip{background-color:#101010cc;border:1px solid #414141;opacity:0;pointer-events:none;transition:all .2s ease}.active .sidebar{background-color:#2c2c2c;border-right-color:#1c1c1c}.active .sidebar li:hover{background-color:#343434}.close{position:absolute;right:12px;color:#666;transition:color .25s ease}.close:hover{color:#ccc}\n"] }]
245
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
246
- type: Optional
247
- }, {
248
- type: Inject,
249
- args: [NGX_WEB_COMPONENTS_CONFIG]
250
- }] }, { type: i1.LazyLoaderService }, { type: i0.ViewContainerRef }, { type: i2.Fetch }]; }, propDecorators: { tabGroup: [{
251
- type: ViewChild,
252
- args: ['tabGroup']
253
- }], fileGrids: [{
254
- type: ViewChildren,
255
- args: [FileGridComponent]
256
- }], treeView: [{
257
- type: ViewChild,
258
- args: [TreeViewComponent]
259
- }], toolbar: [{
260
- type: ViewChild,
261
- args: [ToolbarComponent]
262
- }], drawer: [{
263
- type: ViewChild,
264
- args: [MatDrawerContainer]
265
- }], config: [{
266
- type: Input
267
- }], gridSize: [{
268
- type: Input
269
- }], mode: [{
270
- type: Input
271
- }], contextTags: [{
272
- type: Input
273
- }], value: [{
274
- type: Input
275
- }], valueChange: [{
276
- type: Output
277
- }], focusedFilesChange: [{
278
- type: Output
279
- }], fileUpload: [{
280
- type: Output
281
- }], fileDownload: [{
282
- type: Output
283
- }], fileRename: [{
284
- type: Output
285
- }], fileDelete: [{
286
- type: Output
287
- }], fileCopy: [{
288
- type: Output
289
- }], filePaste: [{
290
- type: Output
291
- }], fileSelect: [{
292
- type: Output
293
- }], fileDblClick: [{
294
- type: Output
295
- }], folderSelect: [{
296
- type: Output
297
- }], folderDblClick: [{
298
- type: Output
299
- }], filesSelect: [{
300
- type: Output
301
- }] } });
302
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZW1hbmFnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy9jb21wb25lbnRzL2ZpbGVtYW5hZ2VyL2ZpbGVtYW5hZ2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy9maWxlbWFuYWdlci9maWxlbWFuYWdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDNUksT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQWUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQWUseUJBQXlCLEVBQTBCLE1BQU0sVUFBVSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUcvQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDOzs7Ozs7OztBQTRKN0IsTUFBTSxPQUFPLG9CQUFvQjtJQW9FN0IsSUFBSSxlQUFlLEtBQUssT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFNOUQsWUFDNEQsWUFBb0MsRUFBRSxFQUM3RSxVQUE2QixFQUN0QyxhQUErQixFQUMvQixLQUFZO1FBSG9DLGNBQVMsR0FBVCxTQUFTLENBQTZCO1FBQzdFLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBdkVmLFdBQU0sR0FBZ0M7WUFDM0MsV0FBVyxFQUFFO2dCQUNULGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLGdCQUFnQixFQUFFLGtCQUFrQjtnQkFDcEMsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsa0JBQWtCLEVBQUUsd0JBQXdCO2dCQUM1QyxjQUFjLEVBQUUsd0JBQXdCO2FBQzNDO1NBQ0osQ0FBQztRQUVPLGFBQVEsR0FBaUMsUUFBUSxDQUFDO1FBS2xELFVBQUssR0FBbUIsRUFBRSxDQUFDO1FBQzFCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFM0QsZUFBVSxHQUFxQixFQUFFLENBQUM7UUFFbEM7OztXQUdHO1FBQ08sdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsRDs7V0FFRztRQUNPLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDOztXQUVHO1FBQ08saUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2xDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzlCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRS9CLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUNoRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBQ2xELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7UUFDdkQsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUVuRTs7V0FFRztRQUNPLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFDM0Q7O1dBRUc7UUFDSCxrRUFBa0U7UUFFbEUsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsVUFBSyxHQUFHLENBQUMsQ0FBQztRQUVWLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRXZCLGVBQVUsR0FBZ0IsRUFBUyxDQUFDO1FBRXBDLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixTQUFJLEdBQWtCLEVBQUUsQ0FBQztRQVVyQixVQUFVLENBQUMsaUJBQWlCLENBQUM7WUFDekIsRUFBRSxFQUFFLGVBQWU7WUFDbkIsS0FBSyxFQUFFLCtCQUErQjtZQUN0QyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLHlDQUF5QyxDQUFDO1NBQ2hFLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoQixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxFQUFDLElBQUksRUFBRSxFQUFFLEVBQUM7UUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsc0JBQXNCO1lBQ2hELENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdkUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQTtRQUVsRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDbEYsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEdBQTBCLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDOUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUE7SUFDVixDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVk7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUM3QixFQUFFLEVBQUUsSUFBSSxFQUFFO1lBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQzdCLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUNyQyxJQUFJO1lBQ0osU0FBUyxFQUFFLEVBQUU7WUFDYixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxNQUFNO1lBQzdCLFlBQVksRUFBRSxDQUFDO1lBQ2YsT0FBTyxFQUFFLEVBQUU7WUFDWCxZQUFZLEVBQUUsRUFBRTtZQUNoQixTQUFTLEVBQUUsS0FBSztTQUNuQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxRQUFRLENBQUMsR0FBZ0I7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVk7UUFDdkIsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV2QixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFL0IsNERBQTREO1FBQzVELDZCQUE2QjtRQUM3QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQ3hCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFOUIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkQsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN0QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUU3QyxPQUFPO29CQUNILEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7b0JBQ2pFLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRTtpQkFDakIsQ0FBQztZQUNOLENBQUMsQ0FBQyxDQUFDO1NBQ047YUFDSTtZQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFOUIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN0QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUU3QyxPQUFPO29CQUNILEVBQUUsRUFBRSxJQUFJLElBQUksR0FBRztvQkFDZixLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUU7aUJBQ2pCLENBQUM7WUFDTixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQUs7UUFDbkIsSUFBSSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ1YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM5RDtJQUNMLENBQUM7SUFFRCxlQUFlLENBQUMsR0FBZ0I7UUFDNUIsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9DLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuQixHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQWtCO1FBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNqRCxDQUFDO0lBRUQsY0FBYyxDQUFDLEdBQWdCLEVBQUUsS0FBcUI7UUFDbEQsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDOUIsR0FBRyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsQ0FBQztZQUM1RCxPQUFPO1NBQ1Y7UUFFRCxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxDQUFDO1FBRTFELFNBQVMsT0FBTyxDQUFDLEtBQUs7WUFDbEIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVyQyxJQUFJLE1BQU07WUFDTixNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDO1FBRW5DLEdBQUcsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxpQkFBaUI7UUFDYixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQVk7UUFDcEIsT0FBTyxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNWLHFDQUFxQztRQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRXhDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQTRCLENBQUM7UUFDbkUsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRTFCLDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ3pDLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQ3JFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDdkI7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDYixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsWUFBWTtRQUNSLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUksTUFBTSxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUE7U0FDbkM7YUFDSTtZQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztTQUNyQjtJQUNMLENBQUM7SUFFRCxjQUFjO1FBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsOENBQThDO0lBQzlDLGNBQWM7UUFDVixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQW9CO1FBQzVCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLHNCQUFzQjtZQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUM7UUFFN0MsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLElBQUksQ0FBQyxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTdFLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQzs7aUhBM1FRLG9CQUFvQixrQkEyRUwseUJBQXlCO3FHQTNFeEMsb0JBQW9CLDJyQkFHbEIsaUJBQWlCLDBFQUNqQixnQkFBZ0IseUVBQ2hCLGtCQUFrQiwrREFIZixpQkFBaUIsZ0RDNUtuQyxrb0lBeUZBLGloRERxRVEsSUFBSSw2RkFDSixPQUFPLGtIQUNQLGtCQUFrQixza0JBQ2xCLGlCQUFpQiw0VEFDakIsYUFBYSw2ZEFDYixhQUFhLG1MQUNiLGdCQUFnQiwyaUJBQ2hCLGdCQUFnQiwyT0FDaEIsaUJBQWlCOzJGQUlaLG9CQUFvQjtrQkFqQmhDLFNBQVM7K0JBQ0ksaUJBQWlCLFdBR2xCO3dCQUNMLElBQUk7d0JBQ0osT0FBTzt3QkFDUCxrQkFBa0I7d0JBQ2xCLGlCQUFpQjt3QkFDakIsYUFBYTt3QkFDYixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixpQkFBaUI7cUJBQ3BCLGNBQ1csSUFBSTs7MEJBNkVYLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMseUJBQXlCOytIQTFFMUIsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQUNZLFNBQVM7c0JBQXpDLFlBQVk7dUJBQUMsaUJBQWlCO2dCQUNELFFBQVE7c0JBQXJDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNDLE9BQU87c0JBQW5DLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNJLE1BQU07c0JBQXBDLFNBQVM7dUJBQUMsa0JBQWtCO2dCQUVwQixNQUFNO3NCQUFkLEtBQUs7Z0JBV0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFRRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBSUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFJRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFLRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nRm9yT2YsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0VGFiR3JvdXAsIE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdERyYXdlckNvbnRhaW5lciwgTWF0U2lkZW5hdk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NpZGVuYXYnO1xuaW1wb3J0IHsgQW5ndWxhclNwbGl0TW9kdWxlIH0gZnJvbSAnYW5ndWxhci1zcGxpdCc7XG5cbmltcG9ydCB7IEZpbGVHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi9maWxlLWdyaWQvZmlsZS1ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi90b29sYmFyL3Rvb2xiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IFRyZWVWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi90cmVlLXZpZXcvdHJlZS12aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWxlU29ydGluZywgTkdYX1dFQl9DT01QT05FTlRTX0NPTkZJRywgTmd4V2ViQ29tcG9uZW50c0NvbmZpZyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEljb25SZXNvbHZlciB9IGZyb20gJy4vaWNvbi1yZXNvbHZlcic7XG5pbXBvcnQgeyBMYXp5TG9hZGVyU2VydmljZSwgTkdYX0xBWllfTE9BREVSX0NPTkZJRyB9IGZyb20gJy4uL2xhenktbG9hZGVyL2xhenktbG9hZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmV0Y2ggfSBmcm9tICcuLi8uLi9wdWJsaWMtYXBpJztcbmltcG9ydCB7IHVsaWQgfSBmcm9tICd1bGlkeCc7XG5cbi8vIFRPRE86XG4vKipcbiAqIE11bHRpcGxlIG11c2ljIC8gdmlkZW8gLyBpbWFnZSBmaWxlcyBzZWxlY3RlZCB0dXJucyBpbnRvIGEgcGxheWxpc3RcbiAqIERyYWdnaW5nIG11c2ljIC8gdmlkZW8gLyBpbWFnZSBxdWV1ZXMgdGhlIGZpbGUocylcbiAqIENhbiBzYXZlIGFuZCBlZGl0IGEgbGlzdCBvZiBmaWxlcyBhcyBwbGF5bGlzdFxuICogQ2FuIFwibG9vcFwiIFwicmFuZG9taXplXCJcbiAqL1xuXG5leHBvcnQgdHlwZSBEaXJlY3RvcnlEZXNjcmlwdG9yID0ge1xuICAgIGtpbmQ6IFwiZGlyZWN0b3J5XCIsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZ1xuICAgIGNvbnRlbnRzOiB7XG4gICAgICAgIGRpcnM6IERpcmVjdG9yeURlc2NyaXB0b3JbXSxcbiAgICAgICAgZmlsZXM6IEZpbGVEZXNjcmlwdG9yW11cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZpbGVEZXNjcmlwdG9yID0ge1xuICAgIGtpbmQ6IFwiZmlsZVwiLFxuICAgIHN0YXRzOiB7XG4gICAgICAgIHNpemU6IG51bWJlcjtcbiAgICAgICAgLy8gU2l6ZSBmb3IgemlwcGVkIGZpbGVcbiAgICAgICAgY29tcHJlc3NlZFNpemU/OiBudW1iZXIsXG4gICAgICAgIGF0aW1lTXM6IG51bWJlcjtcbiAgICAgICAgbXRpbWVNczogbnVtYmVyO1xuICAgICAgICBjdGltZU1zOiBudW1iZXI7XG4gICAgICAgIGJpcnRodGltZU1zOiBudW1iZXI7XG4gICAgfSxcbiAgICBwYXRoOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZXh0OiBzdHJpbmcsXG4gICAgLy8gQ29tbWVudCBmb3IgZW50cmllcyBpbiBhIHppcCBmaWxlLlxuICAgIGNvbW1lbnQ/OiBzdHJpbmdcbn07XG5cbmV4cG9ydCB0eXBlIEZTRGVzY3JpcHRvciA9IERpcmVjdG9yeURlc2NyaXB0b3IgfCBGaWxlRGVzY3JpcHRvcjtcblxuZXhwb3J0IHR5cGUgRmlsZVZpZXdUYWIgPSB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGJyZWFkY3J1bWI6IHtcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgbGFiZWw6IHN0cmluZ1xuICAgIH1bXSxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgc2VsZWN0aW9uOiBGU0Rlc2NyaXB0b3JbXSxcbiAgICB2aWV3TW9kZTogXCJncmlkXCIgfCBcImxpc3RcIixcbiAgICBoaXN0b3J5SW5kZXg6IG51bWJlcixcbiAgICBoaXN0b3J5OiBzdHJpbmdbXSxcbiAgICBzaWRlYmFySXRlbXM6IEZTRGVzY3JpcHRvcltdLFxuICAgIHNvcnRPcmRlcjogRmlsZVNvcnRpbmdcbn1cblxuLy8gVE9ETzogcmVwbGFjZSBodHRwIGNvbmZpZ3NcbnR5cGUgSHR0cENvbmZpZ3VyYXRpb24gPSAoXG4gICAgeyB1cmw6IHN0cmluZyB9IHxcbiAgICB7IHVybFRlbXBsYXRlOiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmcgfVxuKSAmIHtcbiAgICBtZXRob2Q/OiBcImdldFwiIHwgXCJwdXRcIiB8IFwicG9zdFwiIHwgXCJwYXRjaFwiIHwgXCJkZWxldGVcIixcbiAgICBoZWFkZXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVxufVxuXG5leHBvcnQgdHlwZSBOZ3hGaWxlTWFuYWdlckNvbmZpZ3VyYXRpb24gPSBQYXJ0aWFsPHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsIHBhdGhcbiAgICAgKi9cbiAgICBwYXRoOiBzdHJpbmcsXG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gcm9vdCBwYXRoICh3aWxsIGFwcGVhciBhcyAnLycpLlxuICAgICAqIERlZmF1bHRzIHRvICcvJy5cbiAgICAgKlxuICAgICAqIFVzZXIgY2Fubm90IHZpZXcgb3V0c2lkZSBvZiB0aGlzIHBhdGguXG4gICAgICogICAoTm90IHRvIGJlIHVzZWQgYXMgYSBzZWN1cml0eSBtZWFzdXJlISlcbiAgICAgKi9cbiAgICBjaHJvb3RQYXRoOiBzdHJpbmcsXG5cbiAgICAvKipcbiAgICAgKiBSZXN0cmljdCB1c2VycyB0byBvbmx5IG5hdmlnYXRlIGFyb3VuZCB0byBzdWJwYXRocyBvZiB0aGUgc3BlY2lmaWVkIGBwYXRoYFxuICAgICAqL1xuICAgIG5hdmlnYXRlT25seVRvRGVzY2VuZGFudHM6IGJvb2xlYW4sXG4gICAgc2hvd0JyZWFkY3J1bWI6IGJvb2xlYW4sXG4gICAgc2hvd1RyZWV2aWV3OiBib29sZWFuLFxuXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgXCJyb290XCIgcGF0aCBgL2BcbiAgICAgKiBEZWZhdWx0cyB0byBcIlN0b3JhZ2VcIlxuICAgICAqL1xuICAgIHJvb3ROYW1lOiBzdHJpbmcsXG5cbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byBiZSBzdG9yZWQgaW4gaGlzdG9yeS5cbiAgICAgKi9cbiAgICBtYXhIaXN0b3J5TGVuZ3RoOiBudW1iZXIsXG5cbiAgICBhcGlTZXR0aW5nczoge1xuICAgICAgICBsaXN0RW50cmllc1VybD86IHN0cmluZyxcbiAgICAgICAgbGlzdEVudHJpZXNVcmxUZW1wbGF0ZT86IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZyxcbiAgICAgICAgZG93bmxvYWRFbnRyeVVybD86IHN0cmluZyxcbiAgICAgICAgZG93bmxvYWRFbnRyeVVybFRlbXBsYXRlPzogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nLFxuICAgICAgICB1cGxvYWRFbnRyeVVybD86IHN0cmluZyxcbiAgICAgICAgdXBsb2FkRW50cnlVcmxUZW1wbGF0ZT86IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZyxcbiAgICAgICAgZGVsZXRlRW50cnlVcmw/OiBzdHJpbmcsXG4gICAgICAgIGRlbGV0ZUVudHJ5VXJsVGVtcGxhdGU/OiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmcsXG4gICAgICAgIHJlbmFtZUVudHJ5VXJsPzogc3RyaW5nLFxuICAgICAgICByZW5hbWVFbnRyeVVybFRlbXBsYXRlPzogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nLFxuICAgICAgICBjcmVhdGVEaXJlY3RvcnlVcmw/OiBzdHJpbmcsXG4gICAgICAgIGNyZWF0ZURpcmVjdG9yeVVybFRlbXBsYXRlPzogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBwYXRoIHRoYXQgaW1hZ2VzIGFyZSBsb2FkZWQgZnJvbS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGAvYXNzZXRzL2RvdGdsaXRjaC93ZWJjb21wb25lbnRzL2BcbiAgICAgKi9cbiAgICBhc3NldFBhdGg6IHN0cmluZyxcbiAgICBzaWRlYmFyTG9jYXRpb25TdHJhdGVneTogXCJrbm93blwiIHwgXCJjdXJyZW50RGlyZWN0b3J5XCIsXG5cbiAgICBpY29uUmVzb2x2ZXI6IChmaWxlOiBGU0Rlc2NyaXB0b3IpID0+IHN0cmluZyxcblxuICAgIGltYWdlU2l6ZTogXCJub3JtYWxcIiB8IFwic21hbGxcIiB8IFwiaHVnZVwiLFxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKi9cbiAgICBzZWxlY3Rpb25Nb2RlOiBcInNpbmdsZVwiIHwgXCJtdWx0aXBsZVwiLFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBkZXRlcm1pbmVzIGlmIHRoZSBmaWxlbWFuYWdlciBzaG93cyBzZWxlY3RlZCBlbnRyaWVzXG4gICAgICpcbiAgICAgKiBJZiBzZXQgdG8gYGZvY3VzRmlsZXNgLCBmaWxlIHBhdGhzIHRoYXQgbWF0Y2ggZnJvbSB0aGUgcHJvdmlkZWQgYGZvY3VzZWRGaWxlc2BcbiAgICAgKiB3aWxsIGJlIGhpZ2hsaWdodGVkLCBhbmQgY2FuIGJlIHNlbGVjdGVkIC8gZGVzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBtb2RlOiBcImZvY3VzRmlsZXNcIiB8IFwibm9ybWFsXCIsXG4gICAgZm9jdXNlZEZpbGVzOiBzdHJpbmdbXVxufT5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtZmlsZW1hbmFnZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWxlbWFuYWdlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZmlsZW1hbmFnZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE5nRm9yT2YsXG4gICAgICAgIEFuZ3VsYXJTcGxpdE1vZHVsZSxcbiAgICAgICAgRmlsZUdyaWRDb21wb25lbnQsXG4gICAgICAgIE1hdFRhYnNNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIE1hdFNpZGVuYXZNb2R1bGUsXG4gICAgICAgIFRvb2xiYXJDb21wb25lbnQsXG4gICAgICAgIFRyZWVWaWV3Q29tcG9uZW50XG4gICAgXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVtYW5hZ2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBAVmlld0NoaWxkKCd0YWJHcm91cCcpIHRhYkdyb3VwOiBNYXRUYWJHcm91cDtcbiAgICBAVmlld0NoaWxkcmVuKEZpbGVHcmlkQ29tcG9uZW50KSBmaWxlR3JpZHM6IEZpbGVHcmlkQ29tcG9uZW50W107XG4gICAgQFZpZXdDaGlsZChUcmVlVmlld0NvbXBvbmVudCkgdHJlZVZpZXc6IFRyZWVWaWV3Q29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoVG9vbGJhckNvbXBvbmVudCkgdG9vbGJhcjogVG9vbGJhckNvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKE1hdERyYXdlckNvbnRhaW5lcikgZHJhd2VyOiBNYXREcmF3ZXJDb250YWluZXI7XG5cbiAgICBASW5wdXQoKSBjb25maWc6IE5neEZpbGVNYW5hZ2VyQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgYXBpU2V0dGluZ3M6IHtcbiAgICAgICAgICAgIGxpc3RFbnRyaWVzVXJsOiBgL2FwaS9maWxlc3lzdGVtL2AsXG4gICAgICAgICAgICB1cGxvYWRFbnRyeVVybDogYC9hcGkvZmlsZXN5c3RlbS9gLFxuICAgICAgICAgICAgZG93bmxvYWRFbnRyeVVybDogYC9hcGkvZmlsZXN5c3RlbS9gLFxuICAgICAgICAgICAgZGVsZXRlRW50cnlVcmw6IGAvYXBpL2ZpbGVzeXN0ZW0vYCxcbiAgICAgICAgICAgIGNyZWF0ZURpcmVjdG9yeVVybDogYC9hcGkvZmlsZXN5c3RlbS9mb2xkZXJgLFxuICAgICAgICAgICAgcmVuYW1lRW50cnlVcmw6IGAvYXBpL2ZpbGVzeXN0ZW0vcmVuYW1lYFxuICAgICAgICB9XG4gICAgfTtcblxuICAgIEBJbnB1dCgpIGdyaWRTaXplOiBcInNtYWxsXCIgfCBcIm5vcm1hbFwiIHwgXCJsYXJnZVwiID0gXCJub3JtYWxcIjtcbiAgICBASW5wdXQoKSBtb2RlOiBcImdyaWRcIiB8IFwibGlzdFwiO1xuICAgIEBJbnB1dCgpIGNvbnRleHRUYWdzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuXG4gICAgQElucHV0KCkgdmFsdWU6IEZTRGVzY3JpcHRvcltdID0gW107XG4gICAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGU0Rlc2NyaXB0b3JbXT4oKTtcblxuICAgIGdyaWRWYWx1ZXM6IEZTRGVzY3JpcHRvcltdW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHdoZW4gZm9jdXNlZCBmaWxlcyBjaGFuZ2UuXG4gICAgICogT25seSBhdmFpbGFibGUgaW4gYGZvY3VzRmlsZXNgIG1vZGUuXG4gICAgICovXG4gICAgQE91dHB1dCgpIGZvY3VzZWRGaWxlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAvKipcbiAgICAgKiBFbWl0cyB3aGVuIGEgZmlsZSBpcyB1cGxvYWRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZmlsZVVwbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAvKipcbiAgICAgKiBFbWl0cyB3aGVuIGEgZmlsZSBpcyBkb3dubG9hZGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBmaWxlRG93bmxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGZpbGVSZW5hbWUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGZpbGVEZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGZpbGVDb3B5ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKSBmaWxlUGFzdGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KCkgZmlsZVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZURlc2NyaXB0b3I+KCk7XG4gICAgQE91dHB1dCgpIGZpbGVEYmxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZURlc2NyaXB0b3I+KCk7XG4gICAgQE91dHB1dCgpIGZvbGRlclNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RGlyZWN0b3J5RGVzY3JpcHRvcj4oKTtcbiAgICBAT3V0cHV0KCkgZm9sZGVyRGJsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPERpcmVjdG9yeURlc2NyaXB0b3I+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyB3aGVuIG11bHRpcGxlIGZpbGUgc2VsZWN0aW9ucyBjaGFuZ2UuXG4gICAgICovXG4gICAgQE91dHB1dCgpIGZpbGVzU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxGU0Rlc2NyaXB0b3JbXT4oKTtcbiAgICAvKipcbiAgICAgKiBFbWl0cyB3aGVuIGFueSBzZWxlY3Rpb24gY2hhbmdlcywgc2luZ2xlIG9yIG11bHRpcGxlIGZpbGVzLlxuICAgICAqL1xuICAgIC8vIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZTRGVzY3JpcHRvcltdPigpO1xuXG4gICAgc2hvd0hpZGRlbkZpbGVzID0gZmFsc2U7XG4gICAgc2hvd1NpZGViYXIgPSB0cnVlO1xuICAgIHNpZGViYXJPdmVybGF5ID0gZmFsc2U7XG4gICAgd2lkdGggPSAwO1xuXG4gICAgaXNIb21lQW5jZXN0b3IgPSBmYWxzZTtcblxuICAgIGN1cnJlbnRUYWI6IEZpbGVWaWV3VGFiID0ge30gYXMgYW55O1xuICAgIGdldCBjdXJyZW50RmlsZUdyaWQoKSB7IHJldHVybiB0aGlzLmZpbGVHcmlkc1t0aGlzLnRhYkluZGV4XSB9XG4gICAgdGFiSW5kZXggPSAwO1xuICAgIHRhYnM6IEZpbGVWaWV3VGFiW10gPSBbXTtcblxuICAgIGljb25SZXNvbHZlcjogSWNvblJlc29sdmVyO1xuXG4gICAgY29uc3RydWN0b3IgKFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5HWF9XRUJfQ09NUE9ORU5UU19DT05GSUcpIHJlYWRvbmx5IGxpYkNvbmZpZzogTmd4V2ViQ29tcG9uZW50c0NvbmZpZyA9IHt9LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGxhenlMb2FkZXI6IExhenlMb2FkZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgZmV0Y2g6IEZldGNoXG4gICAgKSB7XG4gICAgICAgIGxhenlMb2FkZXIucmVnaXN0ZXJDb21wb25lbnQoe1xuICAgICAgICAgICAgaWQ6IFwiZm9sZGVyLXJlbmFtZVwiLFxuICAgICAgICAgICAgZ3JvdXA6IFwiQGRvdGdsaXRjaC9uZ3gtd2ViLWNvbXBvbmVudHNcIixcbiAgICAgICAgICAgIGxvYWQ6ICgpID0+IGltcG9ydCgnLi9mb2xkZXItcmVuYW1lL2ZvbGRlci1yZW5hbWUuY29tcG9uZW50JylcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmljb25SZXNvbHZlciA9IG5ldyBJY29uUmVzb2x2ZXIobGliQ29uZmlnLmFzc2V0UGF0aCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5pdFRhYih0aGlzLmNvbmZpZy5wYXRoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50VGFiID0gdGhpcy50YWJzWzBdO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vblJlc2l6ZSgpLCAyNTApO1xuICAgIH1cblxuICAgIG9uVHJlZVZpZXdMb2FkQ2hpbGRyZW4oe2l0ZW0sIGNifSkge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNvbmZpZy5hcGlTZXR0aW5ncy5saXN0RW50cmllc1VybFRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuY29uZmlnLmFwaVNldHRpbmdzLmxpc3RFbnRyaWVzVXJsVGVtcGxhdGUoaXRlbS5wYXRoICsgaXRlbS5uYW1lKVxuICAgICAgICAgICAgICAgICAgOiB0aGlzLmNvbmZpZy5hcGlTZXR0aW5ncy5saXN0RW50cmllc1VybFxuXG4gICAgICAgIHRoaXMuZmV0Y2gucG9zdCh1cmwsIHsgcGF0aDogaXRlbS5wYXRoICsgaXRlbS5uYW1lLCBzaG93SGlkZGVuOiB0aGlzLnNob3dIaWRkZW5GaWxlcyB9KVxuICAgICAgICAgICAgLnRoZW4oKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpcnM6IERpcmVjdG9yeURlc2NyaXB0b3JbXSA9IGRhdGEuZGlycztcbiAgICAgICAgICAgICAgICBjYihkaXJzKTtcbiAgICAgICAgICAgIH0pXG4gICAgfVxuXG4gICAgaW5pdFRhYihwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy50YWJzLnB1c2godGhpcy5jdXJyZW50VGFiID0ge1xuICAgICAgICAgICAgaWQ6IHVsaWQoKSxcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLmdldFRhYkxhYmVsKHBhdGgpLFxuICAgICAgICAgICAgYnJlYWRjcnVtYjogdGhpcy5jYWxjQnJlYWRjcnVtYihwYXRoKSxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBzZWxlY3Rpb246IFtdLFxuICAgICAgICAgICAgdmlld01vZGU6IHRoaXMubW9kZSB8fCAnZ3JpZCcsXG4gICAgICAgICAgICBoaXN0b3J5SW5kZXg6IDAsXG4gICAgICAgICAgICBoaXN0b3J5OiBbXSxcbiAgICAgICAgICAgIHNpZGViYXJJdGVtczogW10sXG4gICAgICAgICAgICBzb3J0T3JkZXI6ICdhLXonXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRhYkluZGV4ID0gdGhpcy50YWJzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjbG9zZVRhYih0YWI6IEZpbGVWaWV3VGFiKSB7XG4gICAgICAgIHRoaXMudGFicy5zcGxpY2UodGhpcy50YWJzLmZpbmRJbmRleCh0ID0+IHQuaWQgPT0gdGFiLmlkKSwgMSk7XG4gICAgfVxuXG4gICAgY2FsY0JyZWFkY3J1bWIocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghcGF0aCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZShcIiMvXCIsICcvJyk7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgYWN0aW5nIGxpa2Ugd2UncmUgaW4gYSBjaGFuZ2VkIHJvb3QsIHdlIHdpcGUgb3V0XG4gICAgICAgIC8vIGJyZWFkY3J1bWJzIGJlbG93IHRoZSByb290XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5jaHJvb3RQYXRoKSB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKHRoaXMuY29uZmlnLmNocm9vdFBhdGgsICcnKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLycpO1xuXG4gICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgdGhpcy5jb25maWcuY2hyb290UGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gcGFydHMubWFwKChwLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IHBhcnRzLnNsaWNlKDAsIGkgKyAxKS5qb2luKCcvJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogKHRoaXMuY29uZmlnLmNocm9vdFBhdGggKyAocGF0aCB8fCAnLycpKS5yZXBsYWNlKC9cXC8rL2csICcvJyksXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBwIHx8IFwiXCJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy8nKTtcblxuICAgICAgICAgICAgcmV0dXJuIHBhcnRzLm1hcCgocCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBwYXJ0cy5zbGljZSgwLCBpICsgMSkuam9pbignLycpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBhdGggfHwgJy8nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogcCB8fCBcIlwiXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25CcmVhZGNydW1iQ2xpY2soY3J1bWIpIHtcbiAgICAgICAgaWYgKGNydW1iLmlkKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIucGF0aCA9IGNydW1iLmlkO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFiLmJyZWFkY3J1bWIgPSB0aGlzLmNhbGNCcmVhZGNydW1iKGNydW1iLmlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uVGFiUGF0aENoYW5nZSh0YWI6IEZpbGVWaWV3VGFiKSB7XG4gICAgICAgIHRhYi5sYWJlbCA9IHRoaXMuZ2V0VGFiTGFiZWwodGFiLnBhdGgpO1xuICAgICAgICB0YWIuYnJlYWRjcnVtYiA9IHRoaXMuY2FsY0JyZWFkY3J1bWIodGFiLnBhdGgpO1xuXG4gICAgICAgIHRhYi5oaXN0b3J5SW5kZXgrKztcbiAgICAgICAgdGFiLmhpc3RvcnkucHVzaCh0YWIucGF0aCk7XG4gICAgICAgIHRhYi5oaXN0b3J5LnNwbGljZSh0eXBlb2YgdGhpcy5jb25maWcubWF4SGlzdG9yeUxlbmd0aCA9PSAnbnVtYmVyJyA/IHRoaXMuY29uZmlnLm1heEhpc3RvcnlMZW5ndGggOiA1MCk7XG4gICAgfVxuXG4gICAgb25UcmVlVmlld1NlbGVjdChpdGVtOiBGU0Rlc2NyaXB0b3IpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VGFiLnBhdGggPSBpdGVtLnBhdGggKyBpdGVtLm5hbWU7XG4gICAgfVxuXG4gICAgb25UYWJMb2FkRmlsZXModGFiOiBGaWxlVmlld1RhYiwgZmlsZXM6IEZTRGVzY3JpcHRvcltdKSB7XG4gICAgICAgIGlmICh0YWIuc2lkZWJhckl0ZW1zLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICB0YWIuc2lkZWJhckl0ZW1zID0gZmlsZXMuZmlsdGVyKGYgPT4gZi5raW5kID09IFwiZGlyZWN0b3J5XCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudEl0ZW1zID0gdGFiLnNpZGViYXJJdGVtcztcbiAgICAgICAgY29uc3QgZGlySXRlbXMgPSBmaWxlcy5maWx0ZXIoZiA9PiBmLmtpbmQgPT0gXCJkaXJlY3RvcnlcIik7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVjdXJzZShpdGVtcykge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbmQoaSA9PiB0YWIucGF0aD8uc3RhcnRzV2l0aChpLnBhdGgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSByZWN1cnNlKGN1cnJlbnRJdGVtcyk7XG5cbiAgICAgICAgaWYgKHRhcmdldClcbiAgICAgICAgICAgIHRhcmdldFsnX2NoaWxkcmVuJ10gPSBkaXJJdGVtcztcblxuICAgICAgICB0YWIuc2lkZWJhckl0ZW1zID0gY3VycmVudEl0ZW1zO1xuICAgIH1cblxuICAgIG9uR3JpZFZhbHVlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5ncmlkVmFsdWVzLmZsYXQoMSk7XG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKVxuICAgIH1cblxuICAgIGdldFRhYkxhYmVsKHBhdGg6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gcGF0aD8uc3BsaXQoJy8nKS5maWx0ZXIocCA9PiBwKS5wb3AoKTtcbiAgICB9XG5cbiAgICBhc3luYyBvblJlc2l6ZSgpIHtcbiAgICAgICAgLy8gVHJpZ2dlciByZS1jYWxjdWxhdGlvbiBvZiB0aGUgdmlld1xuICAgICAgICB0aGlzLmZpbGVHcmlkcy5mb3JFYWNoKGcgPT4gZy5yZXNpemUoKSk7XG5cbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLnZpZXdDb250YWluZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBib3VuZHMgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IGJvdW5kcy53aWR0aDtcblxuICAgICAgICAvLyBJZiB0aGUgdmlldyBhcmVhIGlzIGxlc3MgdGhhbiA2NTBweCB3aWRlLCB1c2Ugb3ZlcmxheSB0aGUgc2lkZWJhciBwYW5lbFxuICAgICAgICB0aGlzLnNpZGViYXJPdmVybGF5ID0gYm91bmRzLndpZHRoIDwgNjUwO1xuICAgICAgICBpZiAodGhpcy5zaWRlYmFyT3ZlcmxheSA9PSBmYWxzZSAmJiBbLi4udGhpcy5kcmF3ZXIuX2RyYXdlcnNdWzBdLm9wZW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kcmF3ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIG9uUmVzaXplRW5kKCkge1xuICAgICAgICB0aGlzLm9uUmVzaXplKCk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm9uUmVzaXplKCksIDI1MCk7XG4gICAgfVxuXG4gICAgZ2V0U2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50VGFiLnZpZXdNb2RlID09IFwiZ3JpZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50VGFiLnNlbGVjdGlvblxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy5maWxlR3JpZHMuZm9yRWFjaChnID0+IGcuY2xlYXJTZWxlY3Rpb24oKSk7XG4gICAgfVxuXG4gICAgLy8gVGVsbCB0aGUgY2hpbGQgZ3JpZCB0byByZWZyZXNoIGl0J3Mgc29ydGluZ1xuICAgIHJlZnJlc2hTb3J0aW5nKCkge1xuICAgICAgICB0aGlzLmZpbGVHcmlkcy5mb3JFYWNoKGcgPT4gZy5zb3J0KCkpO1xuICAgIH1cblxuICAgIHJlZnJlc2hEYXRhKCkge1xuICAgICAgICB0aGlzLmZpbGVHcmlkcy5mb3JFYWNoKGcgPT4gZy5sb2FkRm9sZGVyKCkpO1xuICAgIH1cblxuICAgIGdldEZpbGVEYXRhKGZpbGU6IEZpbGVEZXNjcmlwdG9yKSB7XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLmNvbmZpZy5hcGlTZXR0aW5ncy5yZW5hbWVFbnRyeVVybFRlbXBsYXRlXG4gICAgICAgICAgICA/IHRoaXMuY29uZmlnLmFwaVNldHRpbmdzLnJlbmFtZUVudHJ5VXJsVGVtcGxhdGUoZmlsZS5wYXRoICsgZmlsZS5uYW1lKVxuICAgICAgICAgICAgOiB0aGlzLmNvbmZpZy5hcGlTZXR0aW5ncy5yZW5hbWVFbnRyeVVybDtcblxuICAgICAgICB1cmwgPSAodXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPycpICsgYGRpcj0ke2ZpbGUucGF0aH0mZmlsZT0ke2ZpbGUubmFtZX1gO1xuXG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufVxuIiwiPGFwcC10b29sYmFyXG4gICAgW2N1cnJlbnRUYWJdPVwiY3VycmVudFRhYlwiXG4gICAgWyhzaG93SGlkZGVuRmlsZXMpXT1cInNob3dIaWRkZW5GaWxlc1wiXG4gICAgWyhzaG93U2lkZWJhcildPVwic2hvd1NpZGViYXJcIlxuICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICBbc2hvd0JhcmVNaW5pbXVtXT1cIndpZHRoIDwgNTAwICYmIGNvbmZpZy5zaG93QnJlYWRjcnVtYiAhPSBmYWxzZVwiXG4gICAgKG9uQnJlYWRjcnVtYkNsaWNrKT1cIm9uQnJlYWRjcnVtYkNsaWNrKCRldmVudClcIlxuLz5cblxuPG1hdC1kcmF3ZXItY29udGFpbmVyPlxuICAgIDxtYXQtZHJhd2VyICNkcmF3ZXIgbW9kZT1cIm92ZXJcIj5cbiAgICAgICAgPGFwcC10b29sYmFyXG4gICAgICAgICAgICAqbmdJZj1cIndpZHRoIDwgNTAwICYmIGNvbmZpZy5zaG93QnJlYWRjcnVtYiAhPSBmYWxzZVwiXG4gICAgICAgICAgICBbY3VycmVudFRhYl09XCJjdXJyZW50VGFiXCJcbiAgICAgICAgICAgIFsoc2hvd0hpZGRlbkZpbGVzKV09XCJzaG93SGlkZGVuRmlsZXNcIlxuICAgICAgICAgICAgWyhzaG93U2lkZWJhcildPVwic2hvd1NpZGViYXJcIlxuICAgICAgICAgICAgW2NvbmZpZ109XCJjb25maWdcIlxuICAgICAgICAgICAgW2RyYXdlck1vZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAob25CcmVhZGNydW1iQ2xpY2spPVwib25CcmVhZGNydW1iQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgIC8+XG4gICAgICAgIDxhcHAtdHJlZS12aWV3XG4gICAgICAgICAgICBbZGF0YV09XCJjdXJyZW50VGFiLnNpZGViYXJJdGVtc1wiXG4gICAgICAgICAgICAobG9hZENoaWxkcmVuKT1cIm9uVHJlZVZpZXdMb2FkQ2hpbGRyZW4oJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25UcmVlVmlld1NlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICA8L21hdC1kcmF3ZXI+XG4gICAgPG1hdC1kcmF3ZXItY29udGVudD5cbiAgICAgICAgPGFzLXNwbGl0IGRpcmVjdGlvbj1cImhvcml6b250YWxcIiBbZ3V0dGVyU2l6ZV09XCJzaWRlYmFyT3ZlcmxheSA/IDAgOiAyXCIgW3VuaXRdPVwiJ3BpeGVsJ1wiIChkcmFnRW5kKT1cIm9uUmVzaXplRW5kKClcIj5cbiAgICAgICAgICAgIDxhcy1zcGxpdC1hcmVhXG4gICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1maWxlbWFuYWdlci1zaWRlYmFyLWJhY2tncm91bmQtY29sb3IsICMyYzJjMmMpXCJcbiAgICAgICAgICAgICAgICBbc2l6ZV09XCIyMTVcIlxuICAgICAgICAgICAgICAgIFttaW5TaXplXT1cIjIxNVwiXG4gICAgICAgICAgICAgICAgW21heFNpemVdPVwid2lkdGgvNFwiXG4gICAgICAgICAgICAgICAgW3Zpc2libGVdPVwiIXNpZGViYXJPdmVybGF5ICYmIGNvbmZpZy5zaG93VHJlZXZpZXcgIT0gZmFsc2VcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaWRlYmFyXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhc2lkZWJhck92ZXJsYXkgJiYgY29uZmlnLnNob3dUcmVldmlldyAhPSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjdXJyZW50VGFiLnNlbGVjdGlvbiA9IFtdXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtdHJlZS12aWV3XG4gICAgICAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJjdXJyZW50VGFiLnNpZGViYXJJdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAobG9hZENoaWxkcmVuKT1cIm9uVHJlZVZpZXdMb2FkQ2hpbGRyZW4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25UcmVlVmlld1NlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYXMtc3BsaXQtYXJlYT5cbiAgICAgICAgICAgIDxhcy1zcGxpdC1hcmVhIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZmlsZW1hbmFnZXItYmFja2dyb3VuZC1jb2xvciwgIzI3MjcyNyk7XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuLS10YWItaGVpZ2h0XT1cInRhYnMubGVuZ3RoID4gMSA/ICczNnB4JyA6ICcwJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYi1ncm91cCAjdGFiR3JvdXAgKHNlbGVjdGVkVGFiQ2hhbmdlKT1cImN1cnJlbnRUYWIgPSB0YWJzWyRldmVudC5pbmRleF1cIiBbKHNlbGVjdGVkSW5kZXgpXT1cInRhYkluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXRhYiAqbmdGb3I9XCJsZXQgdGFiIG9mIHRhYnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t0YWIubGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsb3NlVGFiKHRhYilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWZpbGUtZ3JpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZpZXdNb2RlXT1cInRhYi52aWV3TW9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGFiXT1cInRhYlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZmlnXT1cImNvbmZpZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JpZFNpemVdPVwiZ3JpZFNpemVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnRPcmRlcl09XCJ0YWIuc29ydE9yZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0aW9uKV09XCJ0YWIuc2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsocGF0aCldPVwidGFiLnBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGhDaGFuZ2UpPVwib25UYWJQYXRoQ2hhbmdlKHRhYilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyh2YWx1ZSldPVwiZ3JpZFZhbHVlc1tpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25HcmlkVmFsdWVDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZEZpbGVzKT1cIm9uVGFiTG9hZEZpbGVzKHRhYiwgJGV2ZW50KVwiXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlU2VsZWN0KT1cImZpbGVTZWxlY3QubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlRGJsQ2xpY2spPVwiZmlsZURibENsaWNrLm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9sZGVyU2VsZWN0KT1cImZvbGRlclNlbGVjdC5uZXh0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvbGRlckRibENsaWNrKT1cImZvbGRlckRibENsaWNrLm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9hcy1zcGxpdC1hcmVhPlxuICAgICAgICA8L2FzLXNwbGl0PlxuICAgIDwvbWF0LWRyYXdlci1jb250ZW50PlxuPC9tYXQtZHJhd2VyLWNvbnRhaW5lcj5cblxuIl19