mat-table-ext 0.0.7 → 0.0.9

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 (89) hide show
  1. package/.editorconfig +16 -0
  2. package/.vscode/extensions.json +4 -0
  3. package/.vscode/launch.json +20 -0
  4. package/.vscode/tasks.json +42 -0
  5. package/LICENSE +21 -0
  6. package/angular.json +150 -0
  7. package/package.json +46 -58
  8. package/projects/mat-table-ext/.browserslistrc +16 -0
  9. package/projects/mat-table-ext/README.md +57 -0
  10. package/projects/mat-table-ext/karma.conf.js +44 -0
  11. package/projects/mat-table-ext/ng-package.json +9 -0
  12. package/projects/mat-table-ext/package.json +38 -0
  13. package/projects/mat-table-ext/src/lib/components/column-pinning/column-pinning.component.html +7 -0
  14. package/projects/mat-table-ext/src/lib/components/column-pinning/column-pinning.component.scss +9 -0
  15. package/projects/mat-table-ext/src/lib/components/column-pinning/column-pinning.component.spec.ts +23 -0
  16. package/projects/mat-table-ext/src/lib/components/column-pinning/column-pinning.component.ts +48 -0
  17. package/projects/mat-table-ext/src/lib/components/editing/editing.component.html +55 -0
  18. package/projects/mat-table-ext/src/lib/components/editing/editing.component.scss +19 -0
  19. package/projects/mat-table-ext/src/lib/components/editing/editing.component.spec.ts +23 -0
  20. package/projects/mat-table-ext/src/lib/components/editing/editing.component.ts +110 -0
  21. package/projects/mat-table-ext/src/lib/components/filter-columns-component/filter-columns-component.component.html +26 -0
  22. package/projects/mat-table-ext/src/lib/components/filter-columns-component/filter-columns-component.component.scss +0 -0
  23. package/projects/mat-table-ext/src/lib/components/filter-columns-component/filter-columns-component.component.spec.ts +23 -0
  24. package/projects/mat-table-ext/src/lib/components/filter-columns-component/filter-columns-component.component.ts +54 -0
  25. package/projects/mat-table-ext/src/lib/directives/resize-column.directive.ts +103 -0
  26. package/projects/mat-table-ext/src/lib/mat-table-ext.component.html +285 -0
  27. package/projects/mat-table-ext/src/lib/mat-table-ext.component.spec.ts +25 -0
  28. package/projects/mat-table-ext/src/lib/mat-table-ext.component.ts +985 -0
  29. package/projects/mat-table-ext/src/lib/mat-table-ext.module.ts +127 -0
  30. package/projects/mat-table-ext/src/lib/mat-table-ext.scss +181 -0
  31. package/projects/mat-table-ext/src/lib/mat-table-ext.service.spec.ts +16 -0
  32. package/projects/mat-table-ext/src/lib/mat-table-ext.service.ts +12 -0
  33. package/projects/mat-table-ext/src/lib/models/tableExtModels.ts +85 -0
  34. package/{public-api.d.ts → projects/mat-table-ext/src/public-api.ts} +5 -1
  35. package/projects/mat-table-ext/src/test.ts +27 -0
  36. package/projects/mat-table-ext/tsconfig.lib.json +15 -0
  37. package/projects/mat-table-ext/tsconfig.lib.prod.json +10 -0
  38. package/projects/mat-table-ext/tsconfig.spec.json +17 -0
  39. package/projects/mat-table-ext-example/.browserslistrc +16 -0
  40. package/projects/mat-table-ext-example/karma.conf.js +44 -0
  41. package/projects/mat-table-ext-example/src/app/app.component.html +576 -0
  42. package/projects/mat-table-ext-example/src/app/app.component.scss +0 -0
  43. package/projects/mat-table-ext-example/src/app/app.component.spec.ts +31 -0
  44. package/projects/mat-table-ext-example/src/app/app.component.ts +173 -0
  45. package/projects/mat-table-ext-example/src/app/app.module.ts +40 -0
  46. package/projects/mat-table-ext-example/src/app/service/custom-table.service.spec.ts +16 -0
  47. package/projects/mat-table-ext-example/src/app/service/custom-table.service.ts +18 -0
  48. package/projects/mat-table-ext-example/src/assets/.gitkeep +0 -0
  49. package/projects/mat-table-ext-example/src/assets/data.json +100003 -0
  50. package/projects/mat-table-ext-example/src/environments/environment.prod.ts +3 -0
  51. package/projects/mat-table-ext-example/src/environments/environment.ts +16 -0
  52. package/projects/mat-table-ext-example/src/favicon.ico +0 -0
  53. package/projects/mat-table-ext-example/src/index.html +14 -0
  54. package/projects/mat-table-ext-example/src/main.ts +12 -0
  55. package/projects/mat-table-ext-example/src/polyfills.ts +53 -0
  56. package/projects/mat-table-ext-example/src/styles.scss +23 -0
  57. package/projects/mat-table-ext-example/src/test.ts +26 -0
  58. package/projects/mat-table-ext-example/tsconfig.app.json +15 -0
  59. package/projects/mat-table-ext-example/tsconfig.spec.json +18 -0
  60. package/tsconfig.json +38 -0
  61. package/esm2020/lib/components/column-pinning/column-pinning.component.mjs +0 -58
  62. package/esm2020/lib/components/editing/editing.component.mjs +0 -122
  63. package/esm2020/lib/components/filter-columns-component/filter-columns-component.component.mjs +0 -68
  64. package/esm2020/lib/directives/resize-column.directive.mjs +0 -99
  65. package/esm2020/lib/mat-table-ext.component.mjs +0 -1021
  66. package/esm2020/lib/mat-table-ext.module.mjs +0 -237
  67. package/esm2020/lib/mat-table-ext.service.mjs +0 -20
  68. package/esm2020/lib/models/tableExtModels.mjs +0 -2
  69. package/esm2020/mat-table-ext.mjs +0 -5
  70. package/esm2020/public-api.mjs +0 -11
  71. package/fesm2015/mat-table-ext.mjs +0 -1585
  72. package/fesm2015/mat-table-ext.mjs.map +0 -1
  73. package/fesm2020/mat-table-ext.mjs +0 -1582
  74. package/fesm2020/mat-table-ext.mjs.map +0 -1
  75. package/index.d.ts +0 -5
  76. package/lib/components/column-pinning/column-pinning.component.d.ts +0 -27
  77. package/lib/components/editing/editing.component.d.ts +0 -42
  78. package/lib/components/filter-columns-component/filter-columns-component.component.d.ts +0 -26
  79. package/lib/directives/resize-column.directive.d.ts +0 -27
  80. package/lib/mat-table-ext.component.d.ts +0 -348
  81. package/lib/mat-table-ext.module.d.ts +0 -58
  82. package/lib/mat-table-ext.service.d.ts +0 -11
  83. package/lib/models/tableExtModels.d.ts +0 -76
  84. /package/{assets → projects/mat-table-ext/assets}/_theming.scss +0 -0
  85. /package/{assets → projects/mat-table-ext/assets}/pinIcon.svg +0 -0
  86. /package/{assets → projects/mat-table-ext/assets}/pinLeft.svg +0 -0
  87. /package/{assets → projects/mat-table-ext/assets}/pinNone.svg +0 -0
  88. /package/{assets → projects/mat-table-ext/assets}/pinRight.svg +0 -0
  89. /package/{assets → projects/mat-table-ext/assets}/pinned.svg +0 -0
@@ -0,0 +1,3 @@
1
+ export const environment = {
2
+ production: true
3
+ };
@@ -0,0 +1,16 @@
1
+ // This file can be replaced during build by using the `fileReplacements` array.
2
+ // `ng build` replaces `environment.ts` with `environment.prod.ts`.
3
+ // The list of file replacements can be found in `angular.json`.
4
+
5
+ export const environment = {
6
+ production: false
7
+ };
8
+
9
+ /*
10
+ * For easier debugging in development mode, you can import the following file
11
+ * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
12
+ *
13
+ * This import should be commented out in production mode because it will have a negative impact
14
+ * on performance if an error is thrown.
15
+ */
16
+ // import 'zone.js/plugins/zone-error'; // Included with Angular CLI.
@@ -0,0 +1,14 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>MatTableExtExample</title>
6
+ <base href="/">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1">
8
+ <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
9
+ <link rel="icon" type="image/x-icon" href="favicon.ico">
10
+ </head>
11
+ <body>
12
+ <app-root></app-root>
13
+ </body>
14
+ </html>
@@ -0,0 +1,12 @@
1
+ import { enableProdMode } from '@angular/core';
2
+ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
3
+
4
+ import { AppModule } from './app/app.module';
5
+ import { environment } from './environments/environment';
6
+
7
+ if (environment.production) {
8
+ enableProdMode();
9
+ }
10
+
11
+ platformBrowserDynamic().bootstrapModule(AppModule)
12
+ .catch(err => console.error(err));
@@ -0,0 +1,53 @@
1
+ /**
2
+ * This file includes polyfills needed by Angular and is loaded before the app.
3
+ * You can add your own extra polyfills to this file.
4
+ *
5
+ * This file is divided into 2 sections:
6
+ * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
7
+ * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
8
+ * file.
9
+ *
10
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
11
+ * automatically update themselves. This includes recent versions of Safari, Chrome (including
12
+ * Opera), Edge on the desktop, and iOS and Chrome on mobile.
13
+ *
14
+ * Learn more in https://angular.io/guide/browser-support
15
+ */
16
+
17
+ /***************************************************************************************************
18
+ * BROWSER POLYFILLS
19
+ */
20
+
21
+ /**
22
+ * By default, zone.js will patch all possible macroTask and DomEvents
23
+ * user can disable parts of macroTask/DomEvents patch by setting following flags
24
+ * because those flags need to be set before `zone.js` being loaded, and webpack
25
+ * will put import in the top of bundle, so user need to create a separate file
26
+ * in this directory (for example: zone-flags.ts), and put the following flags
27
+ * into that file, and then add the following code before importing zone.js.
28
+ * import './zone-flags';
29
+ *
30
+ * The flags allowed in zone-flags.ts are listed here.
31
+ *
32
+ * The following flags will work for all browsers.
33
+ *
34
+ * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
35
+ * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
36
+ * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
37
+ *
38
+ * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js
39
+ * with the following flag, it will bypass `zone.js` patch for IE/Edge
40
+ *
41
+ * (window as any).__Zone_enable_cross_context_check = true;
42
+ *
43
+ */
44
+
45
+ /***************************************************************************************************
46
+ * Zone JS is required by default for Angular itself.
47
+ */
48
+ import 'zone.js'; // Included with Angular CLI.
49
+
50
+
51
+ /***************************************************************************************************
52
+ * APPLICATION IMPORTS
53
+ */
@@ -0,0 +1,23 @@
1
+ /* You can add global styles to this file, and also import other style files */
2
+ @use '../../../node_modules/mat-table-ext-sammmm/assets/theming' as mtx;
3
+ @use '@angular/material' as mat;
4
+ // Plus imports for other components in your app.
5
+ @include mat.core();
6
+
7
+ // Define the default (light) theme.
8
+ $candy-app-primary: mat.define-palette(mat.$green-palette);
9
+ $candy-app-accent: mat.define-palette(mat.$purple-palette, A200, A100, A400);
10
+ $candy-app-theme: mat.define-light-theme(
11
+ (
12
+ // Define the default colors for our app.
13
+ color: (
14
+ primary: $candy-app-primary,
15
+ accent: $candy-app-accent
16
+ ),
17
+ // Define the default typography for our app.
18
+ typography: mat.define-typography-config(),
19
+ // Define the default density level for our app.
20
+ density: 0,
21
+ )
22
+ );
23
+ @include mtx.mat-table-ext-theme($candy-app-theme);
@@ -0,0 +1,26 @@
1
+ // This file is required by karma.conf.js and loads recursively all the .spec and framework files
2
+
3
+ import 'zone.js/testing';
4
+ import { getTestBed } from '@angular/core/testing';
5
+ import {
6
+ BrowserDynamicTestingModule,
7
+ platformBrowserDynamicTesting
8
+ } from '@angular/platform-browser-dynamic/testing';
9
+
10
+ declare const require: {
11
+ context(path: string, deep?: boolean, filter?: RegExp): {
12
+ <T>(id: string): T;
13
+ keys(): string[];
14
+ };
15
+ };
16
+
17
+ // First, initialize the Angular testing environment.
18
+ getTestBed().initTestEnvironment(
19
+ BrowserDynamicTestingModule,
20
+ platformBrowserDynamicTesting(),
21
+ );
22
+
23
+ // Then we find all the tests.
24
+ const context = require.context('./', true, /\.spec\.ts$/);
25
+ // And load the modules.
26
+ context.keys().map(context);
@@ -0,0 +1,15 @@
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "extends": "../../tsconfig.json",
4
+ "compilerOptions": {
5
+ "outDir": "../../out-tsc/app",
6
+ "types": []
7
+ },
8
+ "files": [
9
+ "src/main.ts",
10
+ "src/polyfills.ts"
11
+ ],
12
+ "include": [
13
+ "src/**/*.d.ts"
14
+ ]
15
+ }
@@ -0,0 +1,18 @@
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "extends": "../../tsconfig.json",
4
+ "compilerOptions": {
5
+ "outDir": "../../out-tsc/spec",
6
+ "types": [
7
+ "jasmine"
8
+ ]
9
+ },
10
+ "files": [
11
+ "src/test.ts",
12
+ "src/polyfills.ts"
13
+ ],
14
+ "include": [
15
+ "src/**/*.spec.ts",
16
+ "src/**/*.d.ts"
17
+ ]
18
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,38 @@
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "compileOnSave": false,
4
+ "compilerOptions": {
5
+ "baseUrl": "./",
6
+ "outDir": "./dist/out-tsc",
7
+ "forceConsistentCasingInFileNames": true,
8
+ "strict": true,
9
+ "noImplicitOverride": true,
10
+ "noPropertyAccessFromIndexSignature": true,
11
+ "noImplicitReturns": true,
12
+ "paths": {
13
+ "mat-table-ext": [
14
+ "dist/mat-table-ext/mat-table-ext",
15
+ "dist/mat-table-ext"
16
+ ]
17
+ },
18
+ "noFallthroughCasesInSwitch": true,
19
+ "sourceMap": true,
20
+ "declaration": false,
21
+ "downlevelIteration": true,
22
+ "resolveJsonModule": true,
23
+ "esModuleInterop": true,
24
+ "allowSyntheticDefaultImports": true,
25
+ "experimentalDecorators": true,
26
+ "moduleResolution": "node",
27
+ "importHelpers": true,
28
+ "target": "es2020",
29
+ "module": "es2020",
30
+ "lib": ["es2020", "dom"]
31
+ },
32
+ "angularCompilerOptions": {
33
+ "enableI18nLegacyMessageIdFormat": false,
34
+ "strictInjectionParameters": true,
35
+ "strictInputAccessModifiers": true,
36
+ "strictTemplates": true
37
+ }
38
+ }
@@ -1,58 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- import * as i2 from "@angular/material/button";
5
- import * as i3 from "@angular/material/icon";
6
- import * as i4 from "@angular/material/tooltip";
7
- export class ColumnPinningComponent {
8
- constructor() {
9
- this.columnsChanged = new EventEmitter();
10
- this.icons = {
11
- left: 'pinLeft',
12
- right: 'pinRight',
13
- none: 'pinNone',
14
- };
15
- }
16
- ngOnInit() { }
17
- /**
18
- * @description This method is called when pin value changes for a column.
19
- * @param column column of which to set the pin value
20
- */
21
- changeValue(column) {
22
- if (column.pinned) {
23
- if (column.pinned == 'left') {
24
- this.setColumnPinValue(column, 'right');
25
- }
26
- else if (column.pinned == 'right') {
27
- this.setColumnPinValue(column, undefined);
28
- }
29
- }
30
- else {
31
- this.setColumnPinValue(column, 'left');
32
- }
33
- this.columnsChanged.emit(this.columns);
34
- }
35
- /**
36
- * @description This method is used to set the column pin value.
37
- * @param column column of which to set the pin value
38
- * @param value pin value to set
39
- */
40
- setColumnPinValue(column, value) {
41
- this.columns.forEach((col) => {
42
- if (column?.header == col.header) {
43
- col.pinned = value;
44
- }
45
- });
46
- }
47
- }
48
- ColumnPinningComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ColumnPinningComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
49
- ColumnPinningComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ColumnPinningComponent, selector: "app-column-pinning", inputs: { columns: "columns" }, outputs: { columnsChanged: "columnsChanged" }, ngImport: i0, template: "<div class=\"pinning-list-item\" *ngFor=\"let column of columns\" style=\"display: flex; \">\r\n <button mat-icon-button >\r\n <mat-icon (click)=\"changeValue(column)\" matTooltip=\"{{column['pinned'] ? (column['pinned'] | titlecase):'None'}}\"\r\n svgIcon=\"{{column['pinned'] =='left'|| column['pinned'] =='right' ? icons[column['pinned']]:'pinNone'}}\" class=\"pinning-icon\"></mat-icon>\r\n </button>\r\n <span class=\"column-headers\">{{column.header}}</span>\r\n</div>", styles: [".pinning-list-item{display:flex;justify-content:flex-start;align-items:baseline;height:3em}.column-headers{font-family:Roboto,Helvetica Neue,sans-serif}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i2.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }] });
50
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ColumnPinningComponent, decorators: [{
51
- type: Component,
52
- args: [{ selector: 'app-column-pinning', template: "<div class=\"pinning-list-item\" *ngFor=\"let column of columns\" style=\"display: flex; \">\r\n <button mat-icon-button >\r\n <mat-icon (click)=\"changeValue(column)\" matTooltip=\"{{column['pinned'] ? (column['pinned'] | titlecase):'None'}}\"\r\n svgIcon=\"{{column['pinned'] =='left'|| column['pinned'] =='right' ? icons[column['pinned']]:'pinNone'}}\" class=\"pinning-icon\"></mat-icon>\r\n </button>\r\n <span class=\"column-headers\">{{column.header}}</span>\r\n</div>", styles: [".pinning-list-item{display:flex;justify-content:flex-start;align-items:baseline;height:3em}.column-headers{font-family:Roboto,Helvetica Neue,sans-serif}\n"] }]
53
- }], ctorParameters: function () { return []; }, propDecorators: { columns: [{
54
- type: Input
55
- }], columnsChanged: [{
56
- type: Output
57
- }] } });
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLXBpbm5pbmcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRhYmxlLWV4dC9zcmMvbGliL2NvbXBvbmVudHMvY29sdW1uLXBpbm5pbmcvY29sdW1uLXBpbm5pbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRhYmxlLWV4dC9zcmMvbGliL2NvbXBvbmVudHMvY29sdW1uLXBpbm5pbmcvY29sdW1uLXBpbm5pbmcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBUS9FLE1BQU0sT0FBTyxzQkFBc0I7SUFTakM7UUFQVSxtQkFBYyxHQUErQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25FLFVBQUssR0FBRztZQUNiLElBQUksRUFBRSxTQUFTO1lBQ2YsS0FBSyxFQUFFLFVBQVU7WUFDakIsSUFBSSxFQUFFLFNBQVM7U0FDaEIsQ0FBQztJQUVhLENBQUM7SUFDaEIsUUFBUSxLQUFVLENBQUM7SUFDbkI7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLE1BQWtCO1FBQzVCLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNqQixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxFQUFFO2dCQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQ3pDO2lCQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxPQUFPLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDM0M7U0FDRjthQUFNO1lBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN4QztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLE1BQWtCLEVBQUUsS0FBbUM7UUFDdkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMzQixJQUFJLE1BQU0sRUFBRSxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDaEMsR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7YUFDcEI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O29IQXRDVSxzQkFBc0I7d0dBQXRCLHNCQUFzQix5SUNSbkMsdWZBTU07NEZERU8sc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLG9CQUFvQjswRUFLckIsT0FBTztzQkFBZixLQUFLO2dCQUNJLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1URXhDb2x1bW4gfSBmcm9tICcuLi8uLi9tb2RlbHMvdGFibGVFeHRNb2RlbHMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtY29sdW1uLXBpbm5pbmcnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb2x1bW4tcGlubmluZy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29sdW1uLXBpbm5pbmcuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENvbHVtblBpbm5pbmdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGNvbHVtbnMhOiBNVEV4Q29sdW1uW107XHJcbiAgQE91dHB1dCgpIGNvbHVtbnNDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8TVRFeENvbHVtbltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBwdWJsaWMgaWNvbnMgPSB7XHJcbiAgICBsZWZ0OiAncGluTGVmdCcsXHJcbiAgICByaWdodDogJ3BpblJpZ2h0JyxcclxuICAgIG5vbmU6ICdwaW5Ob25lJyxcclxuICB9O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHt9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7fVxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBwaW4gdmFsdWUgY2hhbmdlcyBmb3IgYSBjb2x1bW4uXHJcbiAgICogQHBhcmFtIGNvbHVtbiBjb2x1bW4gb2Ygd2hpY2ggdG8gc2V0IHRoZSBwaW4gdmFsdWVcclxuICAgKi9cclxuICBjaGFuZ2VWYWx1ZShjb2x1bW46IE1URXhDb2x1bW4pIHtcclxuICAgIGlmIChjb2x1bW4ucGlubmVkKSB7XHJcbiAgICAgIGlmIChjb2x1bW4ucGlubmVkID09ICdsZWZ0Jykge1xyXG4gICAgICAgIHRoaXMuc2V0Q29sdW1uUGluVmFsdWUoY29sdW1uLCAncmlnaHQnKTtcclxuICAgICAgfSBlbHNlIGlmIChjb2x1bW4ucGlubmVkID09ICdyaWdodCcpIHtcclxuICAgICAgICB0aGlzLnNldENvbHVtblBpblZhbHVlKGNvbHVtbiwgdW5kZWZpbmVkKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXRDb2x1bW5QaW5WYWx1ZShjb2x1bW4sICdsZWZ0Jyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbHVtbnNDaGFuZ2VkLmVtaXQodGhpcy5jb2x1bW5zKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSBjb2x1bW4gcGluIHZhbHVlLlxyXG4gICAqIEBwYXJhbSBjb2x1bW4gY29sdW1uIG9mIHdoaWNoIHRvIHNldCB0aGUgcGluIHZhbHVlXHJcbiAgICogQHBhcmFtIHZhbHVlIHBpbiB2YWx1ZSB0byBzZXRcclxuICAgKi9cclxuICBzZXRDb2x1bW5QaW5WYWx1ZShjb2x1bW46IE1URXhDb2x1bW4sIHZhbHVlOiAnbGVmdCcgfCAncmlnaHQnIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XHJcbiAgICAgIGlmIChjb2x1bW4/LmhlYWRlciA9PSBjb2wuaGVhZGVyKSB7XHJcbiAgICAgICAgY29sLnBpbm5lZCA9IHZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInBpbm5pbmctbGlzdC1pdGVtXCIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBcIj5cclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uID5cclxuICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cImNoYW5nZVZhbHVlKGNvbHVtbilcIiBtYXRUb29sdGlwPVwie3tjb2x1bW5bJ3Bpbm5lZCddID8gKGNvbHVtblsncGlubmVkJ10gfCB0aXRsZWNhc2UpOidOb25lJ319XCJcclxuICAgICAgICAgICAgc3ZnSWNvbj1cInt7Y29sdW1uWydwaW5uZWQnXSA9PSdsZWZ0J3x8IGNvbHVtblsncGlubmVkJ10gPT0ncmlnaHQnID8gaWNvbnNbY29sdW1uWydwaW5uZWQnXV06J3Bpbk5vbmUnfX1cIiBjbGFzcz1cInBpbm5pbmctaWNvblwiPjwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uLWhlYWRlcnNcIj57e2NvbHVtbi5oZWFkZXJ9fTwvc3Bhbj5cclxuPC9kaXY+Il19
@@ -1,122 +0,0 @@
1
- import { Component, Inject } from '@angular/core';
2
- import { MAT_DIALOG_DATA } from '@angular/material/dialog';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/material/dialog";
5
- import * as i2 from "../../mat-table-ext.service";
6
- import * as i3 from "@angular/common";
7
- import * as i4 from "@angular/forms";
8
- import * as i5 from "@angular/material/core";
9
- import * as i6 from "@angular/material/button";
10
- import * as i7 from "@angular/material/checkbox";
11
- import * as i8 from "@angular/material/icon";
12
- import * as i9 from "@angular/material/form-field";
13
- import * as i10 from "@angular/material/input";
14
- import * as i11 from "@angular/material/select";
15
- export class EditingComponent {
16
- constructor(dialogRef, dialogData, service) {
17
- this.dialogRef = dialogRef;
18
- this.dialogData = dialogData;
19
- this.service = service;
20
- this.keys = [];
21
- this.templateKeys = [];
22
- this.types = {};
23
- this.templateTypes = {};
24
- this.columns = [];
25
- this.templateRow = {};
26
- }
27
- ngOnInit() {
28
- this.setData(this.dialogData);
29
- }
30
- /**
31
- * @description This method is used to set data for editing.
32
- * @param value dialog Data
33
- */
34
- setData(value) {
35
- let row = value.row;
36
- let types = {};
37
- this.keys = [];
38
- this.columns = value.columns;
39
- this.columns.forEach((column) => {
40
- this.keys.push(column.field);
41
- if (column.type == 'selection') {
42
- types[column.field] = column.type;
43
- let temp = row[column.field];
44
- row[column.field] = {
45
- value: temp,
46
- options: column.options,
47
- };
48
- }
49
- else {
50
- types[column.field] = column.type;
51
- }
52
- });
53
- this.types = types;
54
- this.setTemplateRef(value);
55
- }
56
- /**
57
- * @description This method is used to set the data when data comes in from cus template.
58
- * @param value template value
59
- */
60
- setTemplateRef(value) {
61
- if (value.templateRef !== undefined) {
62
- this.templateRow = { ...value.row };
63
- let types = {};
64
- this.templateKeys = [];
65
- this.columns.forEach((column) => {
66
- this.templateKeys.push(column.field);
67
- if (column.type == 'selection') {
68
- types[column.field] = column.type;
69
- let temp = this.templateRow[column.field];
70
- this.templateRow[column.field] = {
71
- value: temp,
72
- options: column.options,
73
- };
74
- }
75
- else {
76
- types[column.field] = column.type;
77
- }
78
- });
79
- this.templateTypes = types;
80
- this.templateRef = value.templateRef;
81
- }
82
- }
83
- /**
84
- * @description This method is triggered when dialog is closed and also emits the dialog closed event data.
85
- */
86
- closeDialog() {
87
- let rowData = { ...this.dialogData.row };
88
- this.keys.forEach((key) => {
89
- if (this.types[key] === 'selection') {
90
- let temp = rowData[key].value;
91
- rowData[key] = temp;
92
- }
93
- });
94
- this.dialogRef.close(rowData);
95
- }
96
- /**
97
- * @description This method is called when the dialog is closed custom template action.
98
- * @param row row to be edited.
99
- * @param keys keys of columns
100
- * @param types column types
101
- */
102
- closeTemplateDialog(row, keys, types) {
103
- let rowData = { ...row };
104
- keys.forEach((key) => {
105
- if (types[key] === 'selection') {
106
- let temp = rowData[key].value;
107
- rowData[key] = temp;
108
- }
109
- });
110
- this.dialogRef.close(rowData);
111
- }
112
- }
113
- EditingComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: EditingComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.MatTableExtService }], target: i0.ɵɵFactoryTarget.Component });
114
- EditingComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: EditingComponent, selector: "app-editing", ngImport: i0, template: "<div *ngIf=\"!templateRef\" style=\"height: 100%;\" class=\"main-dialog-container\">\r\n <div mat-dialog-title class=\"dialog-title-container\">\r\n <h2 style=\"margin: 0;\">Edit Row</h2>\r\n <span class=\"example-spacer\"></span>\r\n <button mat-icon-button aria-label=\"Example icon button with a vertical three dot icon\">\r\n <mat-icon mat-dialog-close style=\"cursor: pointer;\" fxFlex=\"5\">close</mat-icon>\r\n </button>\r\n </div>\r\n <mat-dialog-content style=\"margin-right: 20px;\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <ng-container *ngFor=\"let key of keys\">\r\n <!-- Number Type -->\r\n <mat-form-field *ngIf=\"types[key] == 'number'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <mat-label>{{key | titlecase}}</mat-label>\r\n <input matInput type=\"number\" [(ngModel)]=\"dialogData['row'][key]\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n \r\n <!-- String Type -->\r\n \r\n <mat-form-field *ngIf=\"types[key] == 'string'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <mat-label>{{key | titlecase}}</mat-label>\r\n <input matInput type=\"text\" [(ngModel)]=\"dialogData['row'][key]\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n <mat-form-field *ngIf=\"types[key] == 'date'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <mat-label>{{key | titlecase}}</mat-label>\r\n <input matInput type=\"text\" [(ngModel)]=\"dialogData['row'][key]\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n <!-- Selection Type -->\r\n \r\n <mat-form-field *ngIf=\"types[key] == 'selection'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <mat-label>{{key | titlecase}}</mat-label>\r\n <mat-select [value]=\"dialogData['row'][key].value\" [(ngModel)]=\"dialogData['row'][key].value\">\r\n <mat-option *ngFor=\"let option of dialogData['row'][key].options\" [value]=\"option\">\r\n {{option}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!-- Boolean Type -->\r\n <p>\r\n <mat-checkbox *ngIf=\"types[key] == 'boolean'\" color=\"primary\" [(ngModel)]=\"dialogData['row'][key]\">\r\n <mat-label>{{key | titlecase}}</mat-label>\r\n </mat-checkbox>\r\n </p>\r\n </ng-container>\r\n </div>\r\n </mat-dialog-content>\r\n <div class=\"spacer\"></div>\r\n <mat-dialog-actions style=\"margin-top: 20px;\" align=\"end\">\r\n <button mat-raised-button color=\"warn\" mat-dialog-close>\r\n Cancel\r\n </button>\r\n <button mat-raised-button color=\"primary\" (click)=\"closeDialog()\">Save</button>\r\n </mat-dialog-actions>\r\n</div>\r\n<ng-container *ngIf=\"templateRef\" [ngTemplateOutlet]=\"templateRef\" [ngTemplateOutletContext]=\"{data:{row:templateRow,columns:columns,columnKeys:templateKeys,columnTypes:templateTypes,closeDialog:closeTemplateDialog}}\"></ng-container>", styles: [".main-dialog-container{display:flex;flex-direction:column}.main-dialog-container mat-dialog-content{overflow-y:auto;margin:0;padding:0 0 0 20px}.dialog-title-container{display:flex;align-items:center}.spacer{flex-grow:1}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }] });
115
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: EditingComponent, decorators: [{
116
- type: Component,
117
- args: [{ selector: 'app-editing', template: "<div *ngIf=\"!templateRef\" style=\"height: 100%;\" class=\"main-dialog-container\">\r\n <div mat-dialog-title class=\"dialog-title-container\">\r\n <h2 style=\"margin: 0;\">Edit Row</h2>\r\n <span class=\"example-spacer\"></span>\r\n <button mat-icon-button aria-label=\"Example icon button with a vertical three dot icon\">\r\n <mat-icon mat-dialog-close style=\"cursor: pointer;\" fxFlex=\"5\">close</mat-icon>\r\n </button>\r\n </div>\r\n <mat-dialog-content style=\"margin-right: 20px;\">\r\n <div style=\"display: flex; flex-direction: column;\">\r\n <ng-container *ngFor=\"let key of keys\">\r\n <!-- Number Type -->\r\n <mat-form-field *ngIf=\"types[key] == 'number'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <mat-label>{{key | titlecase}}</mat-label>\r\n <input matInput type=\"number\" [(ngModel)]=\"dialogData['row'][key]\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n \r\n <!-- String Type -->\r\n \r\n <mat-form-field *ngIf=\"types[key] == 'string'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <mat-label>{{key | titlecase}}</mat-label>\r\n <input matInput type=\"text\" [(ngModel)]=\"dialogData['row'][key]\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n <mat-form-field *ngIf=\"types[key] == 'date'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <mat-label>{{key | titlecase}}</mat-label>\r\n <input matInput type=\"text\" [(ngModel)]=\"dialogData['row'][key]\" [ngModelOptions]=\"{standalone: true}\">\r\n </mat-form-field>\r\n <!-- Selection Type -->\r\n \r\n <mat-form-field *ngIf=\"types[key] == 'selection'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <mat-label>{{key | titlecase}}</mat-label>\r\n <mat-select [value]=\"dialogData['row'][key].value\" [(ngModel)]=\"dialogData['row'][key].value\">\r\n <mat-option *ngFor=\"let option of dialogData['row'][key].options\" [value]=\"option\">\r\n {{option}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!-- Boolean Type -->\r\n <p>\r\n <mat-checkbox *ngIf=\"types[key] == 'boolean'\" color=\"primary\" [(ngModel)]=\"dialogData['row'][key]\">\r\n <mat-label>{{key | titlecase}}</mat-label>\r\n </mat-checkbox>\r\n </p>\r\n </ng-container>\r\n </div>\r\n </mat-dialog-content>\r\n <div class=\"spacer\"></div>\r\n <mat-dialog-actions style=\"margin-top: 20px;\" align=\"end\">\r\n <button mat-raised-button color=\"warn\" mat-dialog-close>\r\n Cancel\r\n </button>\r\n <button mat-raised-button color=\"primary\" (click)=\"closeDialog()\">Save</button>\r\n </mat-dialog-actions>\r\n</div>\r\n<ng-container *ngIf=\"templateRef\" [ngTemplateOutlet]=\"templateRef\" [ngTemplateOutletContext]=\"{data:{row:templateRow,columns:columns,columnKeys:templateKeys,columnTypes:templateTypes,closeDialog:closeTemplateDialog}}\"></ng-container>", styles: [".main-dialog-container{display:flex;flex-direction:column}.main-dialog-container mat-dialog-content{overflow-y:auto;margin:0;padding:0 0 0 20px}.dialog-title-container{display:flex;align-items:center}.spacer{flex-grow:1}\n"] }]
118
- }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
119
- type: Inject,
120
- args: [MAT_DIALOG_DATA]
121
- }] }, { type: i2.MatTableExtService }]; } });
122
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXQtdGFibGUtZXh0L3NyYy9saWIvY29tcG9uZW50cy9lZGl0aW5nL2VkaXRpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRhYmxlLWV4dC9zcmMvbGliL2NvbXBvbmVudHMvZWRpdGluZy9lZGl0aW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBU3pFLE1BQU0sT0FBTyxnQkFBZ0I7SUFTM0IsWUFDUyxTQUF5QyxFQUNoQixVQUFlLEVBQ3hDLE9BQTJCO1FBRjNCLGNBQVMsR0FBVCxTQUFTLENBQWdDO1FBQ2hCLGVBQVUsR0FBVixVQUFVLENBQUs7UUFDeEMsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFWN0IsU0FBSSxHQUFhLEVBQUUsQ0FBQztRQUNwQixpQkFBWSxHQUFhLEVBQUUsQ0FBQztRQUM1QixVQUFLLEdBQVEsRUFBRSxDQUFDO1FBQ2hCLGtCQUFhLEdBQVEsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBaUIsRUFBRSxDQUFDO1FBQzNCLGdCQUFXLEdBQVEsRUFBRSxDQUFDO0lBTXpCLENBQUM7SUFFTCxRQUFRO1FBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNIOzs7T0FHRztJQUNELE9BQU8sQ0FBQyxLQUFVO1FBQ2hCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDcEIsSUFBSSxLQUFLLEdBQVEsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUU7Z0JBQzlCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDbEMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRztvQkFDbEIsS0FBSyxFQUFFLElBQUk7b0JBQ1gsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2lCQUN4QixDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDSDs7O09BR0c7SUFDRCxjQUFjLENBQUMsS0FBVTtRQUN2QixJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNwQyxJQUFJLEtBQUssR0FBUSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksV0FBVyxFQUFFO29CQUM5QixLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ2xDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRzt3QkFDL0IsS0FBSyxFQUFFLElBQUk7d0JBQ1gsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO3FCQUN4QixDQUFDO2lCQUNIO3FCQUFNO29CQUNMLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztpQkFDbkM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztTQUN0QztJQUNILENBQUM7SUFDSDs7T0FFRztJQUNELFdBQVc7UUFDVCxJQUFJLE9BQU8sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQzdCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxXQUFXLEVBQUU7Z0JBQ25DLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDckI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILG1CQUFtQixDQUFDLEdBQVEsRUFBRSxJQUFjLEVBQUUsS0FBZTtRQUMzRCxJQUFJLE9BQU8sR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3hCLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFdBQVcsRUFBRTtnQkFDOUIsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUNyQjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQzs7OEdBbEdVLGdCQUFnQiw4Q0FXakIsZUFBZTtrR0FYZCxnQkFBZ0IsbURDVjdCLGc2R0FzRHlPOzRGRDVDNU4sZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNFLGFBQWE7OzBCQWVwQixNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IE1URXhDb2x1bW4gfSBmcm9tICcuLi8uLi9tb2RlbHMvdGFibGVFeHRNb2RlbHMnO1xyXG5pbXBvcnQgeyBNYXRUYWJsZUV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9tYXQtdGFibGUtZXh0LnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZWRpdGluZycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2VkaXRpbmcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2VkaXRpbmcuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEVkaXRpbmdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHB1YmxpYyB0ZW1wbGF0ZVJlZiE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgcHVibGljIGtleXM6IHN0cmluZ1tdID0gW107XHJcbiAgcHVibGljIHRlbXBsYXRlS2V5czogc3RyaW5nW10gPSBbXTtcclxuICBwdWJsaWMgdHlwZXM6IGFueSA9IHt9O1xyXG4gIHB1YmxpYyB0ZW1wbGF0ZVR5cGVzOiBhbnkgPSB7fTtcclxuICBwdWJsaWMgY29sdW1uczogTVRFeENvbHVtbltdID0gW107XHJcbiAgcHVibGljIHRlbXBsYXRlUm93OiBhbnkgPSB7fTtcclxuICBcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxFZGl0aW5nQ29tcG9uZW50PixcclxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGlhbG9nRGF0YTogYW55LFxyXG4gICAgcHVibGljIHNlcnZpY2U6IE1hdFRhYmxlRXh0U2VydmljZVxyXG4gICkgeyB9XHJcbiAgXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldERhdGEodGhpcy5kaWFsb2dEYXRhKTtcclxuICB9XHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgZGF0YSBmb3IgZWRpdGluZy5cclxuICogQHBhcmFtIHZhbHVlIGRpYWxvZyBEYXRhXHJcbiAqL1xyXG4gIHNldERhdGEodmFsdWU6IGFueSkge1xyXG4gICAgbGV0IHJvdyA9IHZhbHVlLnJvdztcclxuICAgIGxldCB0eXBlczogYW55ID0ge307XHJcbiAgICB0aGlzLmtleXMgPSBbXTtcclxuICAgIHRoaXMuY29sdW1ucyA9IHZhbHVlLmNvbHVtbnM7XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgIHRoaXMua2V5cy5wdXNoKGNvbHVtbi5maWVsZCk7XHJcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PSAnc2VsZWN0aW9uJykge1xyXG4gICAgICAgIHR5cGVzW2NvbHVtbi5maWVsZF0gPSBjb2x1bW4udHlwZTtcclxuICAgICAgICBsZXQgdGVtcCA9IHJvd1tjb2x1bW4uZmllbGRdO1xyXG4gICAgICAgIHJvd1tjb2x1bW4uZmllbGRdID0ge1xyXG4gICAgICAgICAgdmFsdWU6IHRlbXAsXHJcbiAgICAgICAgICBvcHRpb25zOiBjb2x1bW4ub3B0aW9ucyxcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHR5cGVzW2NvbHVtbi5maWVsZF0gPSBjb2x1bW4udHlwZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnR5cGVzID0gdHlwZXM7XHJcbiAgICB0aGlzLnNldFRlbXBsYXRlUmVmKHZhbHVlKTtcclxuICB9XHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlIGRhdGEgd2hlbiBkYXRhIGNvbWVzIGluIGZyb20gY3VzIHRlbXBsYXRlLlxyXG4gKiBAcGFyYW0gdmFsdWUgdGVtcGxhdGUgdmFsdWVcclxuICovXHJcbiAgc2V0VGVtcGxhdGVSZWYodmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHZhbHVlLnRlbXBsYXRlUmVmICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy50ZW1wbGF0ZVJvdyA9IHsgLi4udmFsdWUucm93IH07XHJcbiAgICAgIGxldCB0eXBlczogYW55ID0ge307XHJcbiAgICAgIHRoaXMudGVtcGxhdGVLZXlzID0gW107XHJcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlS2V5cy5wdXNoKGNvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09ICdzZWxlY3Rpb24nKSB7XHJcbiAgICAgICAgICB0eXBlc1tjb2x1bW4uZmllbGRdID0gY29sdW1uLnR5cGU7XHJcbiAgICAgICAgICBsZXQgdGVtcCA9IHRoaXMudGVtcGxhdGVSb3dbY29sdW1uLmZpZWxkXTtcclxuICAgICAgICAgIHRoaXMudGVtcGxhdGVSb3dbY29sdW1uLmZpZWxkXSA9IHtcclxuICAgICAgICAgICAgdmFsdWU6IHRlbXAsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IGNvbHVtbi5vcHRpb25zLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdHlwZXNbY29sdW1uLmZpZWxkXSA9IGNvbHVtbi50eXBlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudGVtcGxhdGVUeXBlcyA9IHR5cGVzO1xyXG4gICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdmFsdWUudGVtcGxhdGVSZWY7XHJcbiAgICB9XHJcbiAgfVxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kIGlzIHRyaWdnZXJlZCB3aGVuIGRpYWxvZyBpcyBjbG9zZWQgYW5kIGFsc28gZW1pdHMgdGhlIGRpYWxvZyBjbG9zZWQgZXZlbnQgZGF0YS5cclxuICovXHJcbiAgY2xvc2VEaWFsb2coKSB7XHJcbiAgICBsZXQgcm93RGF0YSA9IHsgLi4udGhpcy5kaWFsb2dEYXRhLnJvdyB9O1xyXG4gICAgdGhpcy5rZXlzLmZvckVhY2goKGtleTogYW55KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnR5cGVzW2tleV0gPT09ICdzZWxlY3Rpb24nKSB7XHJcbiAgICAgICAgbGV0IHRlbXAgPSByb3dEYXRhW2tleV0udmFsdWU7XHJcbiAgICAgICAgcm93RGF0YVtrZXldID0gdGVtcDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShyb3dEYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgZGlhbG9nIGlzIGNsb3NlZCBjdXN0b20gdGVtcGxhdGUgYWN0aW9uLlxyXG4gICAqIEBwYXJhbSByb3cgcm93IHRvIGJlIGVkaXRlZC5cclxuICAgKiBAcGFyYW0ga2V5cyBrZXlzIG9mIGNvbHVtbnNcclxuICAgKiBAcGFyYW0gdHlwZXMgY29sdW1uIHR5cGVzXHJcbiAgICovXHJcbiAgY2xvc2VUZW1wbGF0ZURpYWxvZyhyb3c6IGFueSwga2V5czogc3RyaW5nW10sIHR5cGVzOiBzdHJpbmdbXSkge1xyXG4gICAgbGV0IHJvd0RhdGEgPSB7IC4uLnJvdyB9O1xyXG4gICAga2V5cy5mb3JFYWNoKChrZXk6IGFueSkgPT4ge1xyXG4gICAgICBpZiAodHlwZXNba2V5XSA9PT0gJ3NlbGVjdGlvbicpIHtcclxuICAgICAgICBsZXQgdGVtcCA9IHJvd0RhdGFba2V5XS52YWx1ZTtcclxuICAgICAgICByb3dEYXRhW2tleV0gPSB0ZW1wO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHJvd0RhdGEpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICpuZ0lmPVwiIXRlbXBsYXRlUmVmXCIgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7XCIgY2xhc3M9XCJtYWluLWRpYWxvZy1jb250YWluZXJcIj5cclxuICAgIDxkaXYgbWF0LWRpYWxvZy10aXRsZSBjbGFzcz1cImRpYWxvZy10aXRsZS1jb250YWluZXJcIj5cclxuICAgICAgICA8aDIgc3R5bGU9XCJtYXJnaW46IDA7XCI+RWRpdCBSb3c8L2gyPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZXhhbXBsZS1zcGFjZXJcIj48L3NwYW4+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIkV4YW1wbGUgaWNvbiBidXR0b24gd2l0aCBhIHZlcnRpY2FsIHRocmVlIGRvdCBpY29uXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbiBtYXQtZGlhbG9nLWNsb3NlIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIGZ4RmxleD1cIjVcIj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxtYXQtZGlhbG9nLWNvbnRlbnQgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDIwcHg7XCI+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiBrZXlzXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIE51bWJlciBUeXBlIC0tPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwidHlwZXNba2V5XSA9PSAnbnVtYmVyJ1wiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJpbmxpbmUtZWRpdGluZy1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3trZXkgfCB0aXRsZWNhc2V9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwibnVtYmVyXCIgWyhuZ01vZGVsKV09XCJkaWFsb2dEYXRhWydyb3cnXVtrZXldXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgIDwhLS0gU3RyaW5nIFR5cGUgLS0+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJ0eXBlc1trZXldID09ICdzdHJpbmcnXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImlubGluZS1lZGl0aW5nLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2tleSB8IHRpdGxlY2FzZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJkaWFsb2dEYXRhWydyb3cnXVtrZXldXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cInR5cGVzW2tleV0gPT0gJ2RhdGUnXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImlubGluZS1lZGl0aW5nLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2tleSB8IHRpdGxlY2FzZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJkaWFsb2dEYXRhWydyb3cnXVtrZXldXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwhLS0gU2VsZWN0aW9uIFR5cGUgLS0+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJ0eXBlc1trZXldID09ICdzZWxlY3Rpb24nXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImlubGluZS1lZGl0aW5nLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2tleSB8IHRpdGxlY2FzZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgW3ZhbHVlXT1cImRpYWxvZ0RhdGFbJ3JvdyddW2tleV0udmFsdWVcIiBbKG5nTW9kZWwpXT1cImRpYWxvZ0RhdGFbJ3JvdyddW2tleV0udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBkaWFsb2dEYXRhWydyb3cnXVtrZXldLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBCb29sZWFuIFR5cGUgLS0+XHJcbiAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwidHlwZXNba2V5XSA9PSAnYm9vbGVhbidcIiBjb2xvcj1cInByaW1hcnlcIiBbKG5nTW9kZWwpXT1cImRpYWxvZ0RhdGFbJ3JvdyddW2tleV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e2tleSB8IHRpdGxlY2FzZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XHJcbiAgICA8ZGl2IGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XHJcbiAgICA8bWF0LWRpYWxvZy1hY3Rpb25zIHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDtcIiBhbGlnbj1cImVuZFwiPlxyXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJ3YXJuXCIgbWF0LWRpYWxvZy1jbG9zZT5cclxuICAgICAgICAgICAgQ2FuY2VsXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY2xvc2VEaWFsb2coKVwiPlNhdmU8L2J1dHRvbj5cclxuICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG48L2Rpdj5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2RhdGE6e3Jvdzp0ZW1wbGF0ZVJvdyxjb2x1bW5zOmNvbHVtbnMsY29sdW1uS2V5czp0ZW1wbGF0ZUtleXMsY29sdW1uVHlwZXM6dGVtcGxhdGVUeXBlcyxjbG9zZURpYWxvZzpjbG9zZVRlbXBsYXRlRGlhbG9nfX1cIj48L25nLWNvbnRhaW5lcj4iXX0=
@@ -1,68 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { FormControl } from '@angular/forms';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "@angular/forms";
6
- import * as i3 from "@angular/material/core";
7
- import * as i4 from "@angular/material/checkbox";
8
- import * as i5 from "@angular/material/form-field";
9
- import * as i6 from "@angular/material/input";
10
- import * as i7 from "@angular/material/select";
11
- export class FilterColumnsComponentComponent {
12
- constructor() {
13
- this.filterOutput = new EventEmitter();
14
- this.stringCtrl = new FormControl();
15
- this.numberCtrl = new FormControl();
16
- this.dateCtrl = new FormControl();
17
- this.booleanCtrl = new FormControl();
18
- this.selectionCtrl = new FormControl();
19
- }
20
- ngOnInit() {
21
- this.stringCtrl.valueChanges.subscribe((value) => {
22
- this.checkValue(value);
23
- });
24
- this.dateCtrl.valueChanges.subscribe((value) => {
25
- this.checkValue(value);
26
- });
27
- this.numberCtrl.valueChanges.subscribe((value) => {
28
- this.checkValue(value);
29
- });
30
- this.booleanCtrl.valueChanges.subscribe((value) => {
31
- this.checkValue(value);
32
- });
33
- this.selectionCtrl.valueChanges.subscribe((value) => {
34
- this.checkValue(value);
35
- });
36
- }
37
- /**
38
- * @description This method is make value is valid and not null.
39
- * @param value value to check its type.
40
- */
41
- checkValue(value) {
42
- if (value || value == '') {
43
- this.emitOutput(value);
44
- }
45
- else if (value == null) {
46
- this.emitOutput('');
47
- }
48
- }
49
- /**
50
- * @description This method will emit seach value to parent component.
51
- * @param value value on which base table rows are filtered.
52
- */
53
- emitOutput(value) {
54
- let obj = { [this.obj.field]: value };
55
- this.filterOutput.emit(obj);
56
- }
57
- }
58
- FilterColumnsComponentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: FilterColumnsComponentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
- FilterColumnsComponentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: FilterColumnsComponentComponent, selector: "app-filter-columns-component", inputs: { obj: "obj" }, outputs: { filterOutput: "filterOutput" }, ngImport: i0, template: "\r\n <ng-container *ngIf=\"obj\">\r\n <!-- Number Type -->\r\n <mat-form-field *ngIf=\"obj.type == 'number'\" appearance=\"outline\" class=\"inline-editing-field\" >\r\n <input matInput type=\"number\" [formControl]=\"numberCtrl\">\r\n </mat-form-field>\r\n \r\n <!-- String Type -->\r\n <mat-form-field *ngIf=\"obj.type == 'string'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <input matInput type=\"text\" [formControl]=\"stringCtrl\">\r\n </mat-form-field>\r\n <mat-form-field *ngIf=\"obj.type == 'date'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <input matInput type=\"date\" [formControl]=\"dateCtrl\">\r\n </mat-form-field>\r\n <!-- Selection Type -->\r\n <mat-form-field *ngIf=\"obj.type == 'selection'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <mat-select [value]=\"\" [formControl]=\"selectionCtrl\">\r\n <mat-option *ngFor=\"let option of obj.options\" [value]=\"option\">\r\n {{option}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!-- Boolean Type -->\r\n <mat-checkbox (click)=\"$event.stopPropagation()\" *ngIf=\"obj.type == 'boolean'\" color=\"primary\" [formControl]=\"booleanCtrl\"></mat-checkbox>\r\n\r\n </ng-container>", styles: [""], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }] });
60
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: FilterColumnsComponentComponent, decorators: [{
61
- type: Component,
62
- args: [{ selector: 'app-filter-columns-component', template: "\r\n <ng-container *ngIf=\"obj\">\r\n <!-- Number Type -->\r\n <mat-form-field *ngIf=\"obj.type == 'number'\" appearance=\"outline\" class=\"inline-editing-field\" >\r\n <input matInput type=\"number\" [formControl]=\"numberCtrl\">\r\n </mat-form-field>\r\n \r\n <!-- String Type -->\r\n <mat-form-field *ngIf=\"obj.type == 'string'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <input matInput type=\"text\" [formControl]=\"stringCtrl\">\r\n </mat-form-field>\r\n <mat-form-field *ngIf=\"obj.type == 'date'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <input matInput type=\"date\" [formControl]=\"dateCtrl\">\r\n </mat-form-field>\r\n <!-- Selection Type -->\r\n <mat-form-field *ngIf=\"obj.type == 'selection'\" appearance=\"outline\" class=\"inline-editing-field\">\r\n <mat-select [value]=\"\" [formControl]=\"selectionCtrl\">\r\n <mat-option *ngFor=\"let option of obj.options\" [value]=\"option\">\r\n {{option}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <!-- Boolean Type -->\r\n <mat-checkbox (click)=\"$event.stopPropagation()\" *ngIf=\"obj.type == 'boolean'\" color=\"primary\" [formControl]=\"booleanCtrl\"></mat-checkbox>\r\n\r\n </ng-container>" }]
63
- }], ctorParameters: function () { return []; }, propDecorators: { obj: [{
64
- type: Input
65
- }], filterOutput: [{
66
- type: Output
67
- }] } });
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWNvbHVtbnMtY29tcG9uZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21hdC10YWJsZS1leHQvc3JjL2xpYi9jb21wb25lbnRzL2ZpbHRlci1jb2x1bW5zLWNvbXBvbmVudC9maWx0ZXItY29sdW1ucy1jb21wb25lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0LXRhYmxlLWV4dC9zcmMvbGliL2NvbXBvbmVudHMvZmlsdGVyLWNvbHVtbnMtY29tcG9uZW50L2ZpbHRlci1jb2x1bW5zLWNvbXBvbmVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7O0FBTzdDLE1BQU0sT0FBTywrQkFBK0I7SUFRMUM7UUFOVSxpQkFBWSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3BFLGVBQVUsR0FBZ0IsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUM1QyxlQUFVLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFDNUMsYUFBUSxHQUFnQixJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzFDLGdCQUFXLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFDN0Msa0JBQWEsR0FBZ0IsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQ2hCLFFBQVE7UUFDTixJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMvQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsS0FBVTtRQUNuQixJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksRUFBRSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDeEI7YUFBTSxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFDSDs7O09BR0c7SUFDRCxVQUFVLENBQUMsS0FBVTtRQUNuQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDOzs2SEE1Q1UsK0JBQStCO2lIQUEvQiwrQkFBK0IsdUlDUjVDLDI0Q0F5Qm1COzRGRGpCTiwrQkFBK0I7a0JBTDNDLFNBQVM7K0JBQ0UsOEJBQThCOzBFQUsvQixHQUFHO3NCQUFYLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1maWx0ZXItY29sdW1ucy1jb21wb25lbnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXItY29sdW1ucy1jb21wb25lbnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlci1jb2x1bW5zLWNvbXBvbmVudC5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsdGVyQ29sdW1uc0NvbXBvbmVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgb2JqITogYW55O1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJPdXRwdXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgc3RyaW5nQ3RybDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcclxuICBudW1iZXJDdHJsOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gIGRhdGVDdHJsOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gIGJvb2xlYW5DdHJsOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xyXG4gIHNlbGVjdGlvbkN0cmw6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XHJcbiAgY29uc3RydWN0b3IoKSB7fVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdHJpbmdDdHJsLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuY2hlY2tWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGF0ZUN0cmwudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5jaGVja1ZhbHVlKHZhbHVlKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5udW1iZXJDdHJsLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuY2hlY2tWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYm9vbGVhbkN0cmwudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5jaGVja1ZhbHVlKHZhbHVlKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25DdHJsLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuY2hlY2tWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kIGlzIG1ha2UgdmFsdWUgaXMgdmFsaWQgYW5kIG5vdCBudWxsLlxyXG4gICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBjaGVjayBpdHMgdHlwZS5cclxuICAgKi9cclxuICBjaGVja1ZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PSAnJykge1xyXG4gICAgICB0aGlzLmVtaXRPdXRwdXQodmFsdWUpO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZW1pdE91dHB1dCgnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kIHdpbGwgZW1pdCBzZWFjaCB2YWx1ZSB0byBwYXJlbnQgY29tcG9uZW50LlxyXG4gKiBAcGFyYW0gdmFsdWUgdmFsdWUgb24gd2hpY2ggYmFzZSB0YWJsZSByb3dzIGFyZSBmaWx0ZXJlZC4gXHJcbiAqL1xyXG4gIGVtaXRPdXRwdXQodmFsdWU6IGFueSkge1xyXG4gICAgbGV0IG9iaiA9IHsgW3RoaXMub2JqLmZpZWxkXTogdmFsdWUgfTtcclxuICAgIHRoaXMuZmlsdGVyT3V0cHV0LmVtaXQob2JqKTtcclxuICB9XHJcbn1cclxuIiwiXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib2JqXCI+XHJcbiAgICAgICAgPCEtLSBOdW1iZXIgVHlwZSAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJvYmoudHlwZSA9PSAnbnVtYmVyJ1wiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJpbmxpbmUtZWRpdGluZy1maWVsZFwiID5cclxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJudW1iZXJcIiBbZm9ybUNvbnRyb2xdPVwibnVtYmVyQ3RybFwiPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPCEtLSBTdHJpbmcgVHlwZSAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJvYmoudHlwZSA9PSAnc3RyaW5nJ1wiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJpbmxpbmUtZWRpdGluZy1maWVsZFwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBbZm9ybUNvbnRyb2xdPVwic3RyaW5nQ3RybFwiPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwib2JqLnR5cGUgPT0gJ2RhdGUnXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImlubGluZS1lZGl0aW5nLWZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwiZGF0ZVwiIFtmb3JtQ29udHJvbF09XCJkYXRlQ3RybFwiPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPCEtLSBTZWxlY3Rpb24gVHlwZSAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJvYmoudHlwZSA9PSAnc2VsZWN0aW9uJ1wiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJpbmxpbmUtZWRpdGluZy1maWVsZFwiPlxyXG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBbdmFsdWVdPVwiXCIgW2Zvcm1Db250cm9sXT1cInNlbGVjdGlvbkN0cmxcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb2JqLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tvcHRpb259fVxyXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8IS0tIEJvb2xlYW4gVHlwZSAtLT5cclxuICAgICAgICA8bWF0LWNoZWNrYm94IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAqbmdJZj1cIm9iai50eXBlID09ICdib29sZWFuJ1wiIGNvbG9yPVwicHJpbWFyeVwiIFtmb3JtQ29udHJvbF09XCJib29sZWFuQ3RybFwiPjwvbWF0LWNoZWNrYm94PlxyXG5cclxuICAgIDwvbmctY29udGFpbmVyPiJdfQ==