@tehw0lf/wordlist-generator 0.20.4 → 0.20.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import { moveItemInArray, CdkDropList, CdkDrag } from '@angular/cdk/drag-drop';
2
- import { NgStyle, AsyncPipe } from '@angular/common';
2
+ import { NgStyle } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
- import { Injectable, inject, input, ViewEncapsulation, Component } from '@angular/core';
4
+ import { Injectable, inject, input, signal, computed, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
5
5
  import * as i3 from '@angular/forms';
6
6
  import { UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';
7
7
  import * as i1 from '@angular/material/button';
@@ -14,8 +14,10 @@ import * as i5 from '@angular/material/input';
14
14
  import { MatInputModule } from '@angular/material/input';
15
15
  import * as i2 from '@angular/material/menu';
16
16
  import { MatMenuModule } from '@angular/material/menu';
17
+ import * as i7 from '@angular/material/progress-bar';
18
+ import { MatProgressBarModule } from '@angular/material/progress-bar';
17
19
  import { from, Subject } from 'rxjs';
18
- import { map, tap, reduce, takeUntil } from 'rxjs/operators';
20
+ import { map, takeUntil, shareReplay, reduce, finalize } from 'rxjs/operators';
19
21
  import { product } from 'cartesian-product-generator';
20
22
 
21
23
  var FileType;
@@ -47,10 +49,63 @@ const toCSV = (wordlist) => {
47
49
  };
48
50
 
49
51
  class WordlistGeneratorService {
52
+ constructor() {
53
+ this.LARGE_DATASET_THRESHOLD = 50000;
54
+ }
50
55
  generateWordlist(...charsets) {
51
- return from(product(...charsets)).pipe(map((word) => {
52
- return word.join('');
53
- }));
56
+ const estimatedSize = this.estimateWordlistSize(charsets);
57
+ if (estimatedSize > this.LARGE_DATASET_THRESHOLD) {
58
+ return this.generateWithWebWorker(charsets);
59
+ }
60
+ return this.generateSynchronously(charsets);
61
+ }
62
+ generateSynchronously(charsets) {
63
+ return from(product(...charsets)).pipe(map((word) => word.join('')));
64
+ }
65
+ generateWithWebWorker(charsets) {
66
+ const subject = new Subject();
67
+ if (typeof Worker !== 'undefined') {
68
+ const worker = new Worker(new URL('./wordlist.worker', import.meta.url));
69
+ worker.onmessage = ({ data }) => {
70
+ switch (data.type) {
71
+ case 'batch':
72
+ if (data.words) {
73
+ data.words.forEach((word) => subject.next(word));
74
+ }
75
+ break;
76
+ case 'complete':
77
+ subject.complete();
78
+ worker.terminate();
79
+ break;
80
+ case 'error':
81
+ subject.error(new Error(data.error || 'Worker error'));
82
+ worker.terminate();
83
+ break;
84
+ }
85
+ };
86
+ worker.onerror = (error) => {
87
+ subject.error(error);
88
+ worker.terminate();
89
+ };
90
+ const message = {
91
+ type: 'generate',
92
+ charsets,
93
+ batchSize: 1000
94
+ };
95
+ worker.postMessage(message);
96
+ }
97
+ else {
98
+ // Fallback for environments without Worker support
99
+ this.generateSynchronously(charsets).subscribe({
100
+ next: (word) => subject.next(word),
101
+ error: (err) => subject.error(err),
102
+ complete: () => subject.complete()
103
+ });
104
+ }
105
+ return subject.asObservable();
106
+ }
107
+ estimateWordlistSize(charsets) {
108
+ return charsets.reduce((total, charset) => total * charset.length, 1);
54
109
  }
55
110
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
56
111
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' }); }
@@ -73,16 +128,20 @@ class WordlistGeneratorComponent {
73
128
  });
74
129
  this.dragStyle = input({ color: '#cc7832' });
75
130
  this.textStyle = input({ color: '#cc7832' });
76
- this.displayWordlist = false;
77
- this.fileType = FileType.plaintext;
131
+ this.wordlist = signal('');
132
+ this.displayWordlist = signal(false);
133
+ this.fileType = signal(FileType.plaintext);
78
134
  this.fileTypes = Object.values(FileType);
79
- this.filteredCharset = [];
80
- this.prefix = '';
81
- this.suffix = '';
135
+ this.filteredCharset = signal([]);
136
+ this.prefix = signal('');
137
+ this.suffix = signal('');
138
+ this.isGenerating = signal(false);
139
+ this.isLargeDataset = signal(false);
140
+ this.wordsGenerated = signal(undefined);
141
+ this.canGenerate = computed(() => this.charsetForm?.valid && this.filteredCharset().length > 0);
142
+ this.hasWordlist = computed(() => this.wordlist().length > 0);
82
143
  this.unsubscribe$ = new Subject();
83
144
  this.removeDuplicates = (unfiltered) => [...new Set(unfiltered)].join('');
84
- }
85
- ngOnInit() {
86
145
  this.generateForm();
87
146
  }
88
147
  ngOnDestroy() {
@@ -108,37 +167,39 @@ class WordlistGeneratorComponent {
108
167
  }
109
168
  downloadWordlist() {
110
169
  if (this.charsets) {
111
- if (this.filteredCharset !== this.filterCharset(this.charsets.value)) {
170
+ const currentCharset = this.filterCharset(this.charsets.value);
171
+ if (JSON.stringify(this.filteredCharset()) !==
172
+ JSON.stringify(currentCharset)) {
112
173
  this.generateWordlist();
113
174
  }
114
- const filename = `wordlist_${this.wordsGenerated}_words_${this.charsets.length}_positions.${this.fileType}`;
115
- this.getWordlist()
116
- .pipe(tap((wordlist) => {
117
- if (wordlist.length > 0) {
118
- const parsed = this.parseWordlist(wordlist);
119
- const file = new Blob([parsed.wordlist], {
120
- type: parsed.contentType
121
- });
122
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
123
- if (window.navigator.msSaveOrOpenBlob) {
124
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
125
- window.navigator.msSaveOrOpenBlob(file, filename);
126
- }
127
- else {
128
- const a = document.createElement('a');
129
- const url = URL.createObjectURL(file);
130
- a.href = url;
131
- a.download = filename;
132
- document.body.appendChild(a);
133
- a.click();
134
- setTimeout(() => {
135
- document.body.removeChild(a);
136
- window.URL.revokeObjectURL(url);
137
- }, 0);
138
- }
139
- }
140
- }))
141
- .subscribe();
175
+ const filename = `wordlist_${this.wordsGenerated()}_words_${this.charsets.length}_positions.${this.fileType()}`;
176
+ const wordlistContent = this.wordlist();
177
+ if (wordlistContent && wordlistContent.length > 0) {
178
+ this.performDownload(wordlistContent, filename);
179
+ }
180
+ }
181
+ }
182
+ performDownload(wordlistContent, filename) {
183
+ const parsed = this.parseWordlist(wordlistContent);
184
+ const file = new Blob([parsed.wordlist], {
185
+ type: parsed.contentType
186
+ });
187
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
188
+ if (window.navigator.msSaveOrOpenBlob) {
189
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
190
+ window.navigator.msSaveOrOpenBlob(file, filename);
191
+ }
192
+ else {
193
+ const a = document.createElement('a');
194
+ const url = URL.createObjectURL(file);
195
+ a.href = url;
196
+ a.download = filename;
197
+ document.body.appendChild(a);
198
+ a.click();
199
+ setTimeout(() => {
200
+ document.body.removeChild(a);
201
+ window.URL.revokeObjectURL(url);
202
+ }, 0);
142
203
  }
143
204
  }
144
205
  drop(event) {
@@ -158,30 +219,40 @@ class WordlistGeneratorComponent {
158
219
  }
159
220
  generateWordlist() {
160
221
  if (this.charsetForm && this.charsets && this.charsets.valid) {
161
- this.filteredCharset = this.filterCharset(this.charsets.value);
162
- this.prefix = this.charsetForm.get('prefix')?.value
163
- ? this.charsetForm.get('prefix')?.value
164
- : '';
165
- this.suffix = this.charsetForm.get('suffix')?.value
166
- ? this.charsetForm.get('suffix')?.value
167
- : '';
168
- this.wordsGenerated = this.filteredCharset
222
+ this.filteredCharset.set(this.filterCharset(this.charsets.value));
223
+ this.prefix.set(this.charsetForm.get('prefix')?.value || '');
224
+ this.suffix.set(this.charsetForm.get('suffix')?.value || '');
225
+ const wordsCount = this.filteredCharset()
169
226
  .map((charset) => charset.length)
170
227
  .reduce((previousLength, currentLength) => previousLength * currentLength);
171
- this.displayWordlist = this.wordsGenerated <= 100;
172
- this.wordlist$ = this.getWordlist();
228
+ this.wordsGenerated.set(wordsCount);
229
+ this.isLargeDataset.set(wordsCount > 50000);
230
+ this.displayWordlist.set(wordsCount <= 100);
231
+ this.isGenerating.set(true);
232
+ // Generate wordlist and update signal
233
+ this.getWordlist()
234
+ .pipe(takeUntil(this.unsubscribe$))
235
+ .subscribe({
236
+ next: (wordlist) => this.wordlist.set(wordlist),
237
+ error: (error) => {
238
+ console.error('Error generating wordlist:', error);
239
+ this.isGenerating.set(false);
240
+ }
241
+ });
173
242
  }
174
243
  }
175
244
  getWordlist() {
176
245
  return this.wordlistGenerator
177
- .generateWordlist(...this.filteredCharset)
178
- .pipe(reduce((wordlist, word) => `${wordlist}${this.prefix}${word}${this.suffix}\n`, ''), takeUntil(this.unsubscribe$));
246
+ .generateWordlist(...this.filteredCharset())
247
+ .pipe(shareReplay({ bufferSize: 1, refCount: true }), reduce((wordlist, word) => `${wordlist}${this.prefix()}${word}${this.suffix()}\n`, ''), finalize(() => {
248
+ this.isGenerating.set(false);
249
+ }), takeUntil(this.unsubscribe$));
179
250
  }
180
251
  filterCharset(charsets) {
181
252
  return charsets.map((charset) => this.removeDuplicates(charset));
182
253
  }
183
254
  parseWordlist(wordlist) {
184
- switch (this.fileType) {
255
+ switch (this.fileType()) {
185
256
  case FileType.plaintext:
186
257
  return toPlaintext(wordlist);
187
258
  case FileType.xml:
@@ -196,7 +267,7 @@ class WordlistGeneratorComponent {
196
267
  }
197
268
  }
198
269
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: WordlistGeneratorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
199
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.3", type: WordlistGeneratorComponent, isStandalone: true, selector: "wordlist-generator", inputs: { buttonStyle: { classPropertyName: "buttonStyle", publicName: "buttonStyle", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: "dragStyle", publicName: "dragStyle", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: "textStyle", publicName: "textStyle", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n >\n Generate wordlist\n </button>\n @if (wordlist$) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType = type\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (wordlist$) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType) {\n {{ this.fileType }}\n }\n </button>\n }\n </div>\n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (wordlist$) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist$ | async }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None }); }
270
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.3", type: WordlistGeneratorComponent, isStandalone: true, selector: "wordlist-generator", inputs: { buttonStyle: { classPropertyName: "buttonStyle", publicName: "buttonStyle", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: "dragStyle", publicName: "dragStyle", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: "textStyle", publicName: "textStyle", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n [disabled]=\"isGenerating()\"\n >\n @if (isGenerating()) {\n Generating...\n } @else {\n Generate wordlist\n }\n </button>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType.set(type)\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType()) {\n {{ this.fileType() }}\n }\n </button>\n }\n </div>\n\n @if (isGenerating() && isLargeDataset()) {\n <div class=\"progress-container\">\n <mat-progress-bar\n mode=\"indeterminate\"\n role=\"progressbar\"\n aria-label=\"Generating wordlist\"\n ></mat-progress-bar>\n <p [ngStyle]=\"textStyle()\">\n Processing large dataset using Web Worker...\n </p>\n </div>\n }\n\n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (hasWordlist()) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist()) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist() }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n <!-- Wordlist is already loaded in the signal for large datasets -->\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i7.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
200
271
  }
201
272
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{
202
273
  type: Component,
@@ -210,9 +281,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImpor
210
281
  CdkDropList,
211
282
  CdkDrag,
212
283
  MatIconModule,
213
- AsyncPipe
214
- ], template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n >\n Generate wordlist\n </button>\n @if (wordlist$) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType = type\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (wordlist$) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType) {\n {{ this.fileType }}\n }\n </button>\n }\n </div>\n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (wordlist$) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist$ | async }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"] }]
215
- }] });
284
+ MatProgressBarModule
285
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n [disabled]=\"isGenerating()\"\n >\n @if (isGenerating()) {\n Generating...\n } @else {\n Generate wordlist\n }\n </button>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType.set(type)\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (hasWordlist() && !isGenerating()) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType()) {\n {{ this.fileType() }}\n }\n </button>\n }\n </div>\n\n @if (isGenerating() && isLargeDataset()) {\n <div class=\"progress-container\">\n <mat-progress-bar\n mode=\"indeterminate\"\n role=\"progressbar\"\n aria-label=\"Generating wordlist\"\n ></mat-progress-bar>\n <p [ngStyle]=\"textStyle()\">\n Processing large dataset using Web Worker...\n </p>\n </div>\n }\n\n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (hasWordlist()) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist()) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist() }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n <!-- Wordlist is already loaded in the signal for large datasets -->\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"] }]
286
+ }], ctorParameters: () => [] });
216
287
 
217
288
  /**
218
289
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"tehw0lf-wordlist-generator.mjs","sources":["../tmp-esm2022/lib/filetypes.js","../tmp-esm2022/lib/parsers.js","../tmp-esm2022/lib/wordlist-generator.service.js","../tmp-esm2022/lib/wordlist-generator.component.js","../tmp-esm2022/tehw0lf-wordlist-generator.js"],"sourcesContent":["export var FileType;\n(function (FileType) {\n FileType[\"plaintext\"] = \"txt\";\n FileType[\"xml\"] = \"xml\";\n FileType[\"csv\"] = \"csv\";\n})(FileType || (FileType = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy93b3JkbGlzdC1nZW5lcmF0b3Ivc3JjL2xpYi9maWxldHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksUUFJWDtBQUpELFdBQVksUUFBUTtJQUNsQiw2QkFBaUIsQ0FBQTtJQUNqQix1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtBQUNiLENBQUMsRUFKVyxRQUFRLEtBQVIsUUFBUSxRQUluQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIEZpbGVUeXBlIHtcbiAgcGxhaW50ZXh0ID0gJ3R4dCcsXG4gIHhtbCA9ICd4bWwnLFxuICBjc3YgPSAnY3N2J1xufVxuIl19","export const toPlaintext = (wordlist) => ({\n wordlist,\n contentType: 'text/plain'\n});\nexport const toXML = (wordlist) => {\n const head = '<wordlist><word>';\n const glue = '</word><word>';\n const tail = '</word></wordlist>';\n return {\n wordlist: head + wordlist.replace(/\\n/g, glue) + tail,\n contentType: 'text/xml'\n };\n};\nexport const toCSV = (wordlist) => {\n const glue = ',';\n return {\n wordlist: wordlist.replace(/\\n/g, glue),\n contentType: 'text/csv'\n };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2Vycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvcGFyc2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FDekIsUUFBZ0IsRUFDMkIsRUFBRSxDQUFDLENBQUM7SUFDL0MsUUFBUTtJQUNSLFdBQVcsRUFBRSxZQUFZO0NBQzFCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUNuQixRQUFnQixFQUMyQixFQUFFO0lBQzdDLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNsQyxPQUFPO1FBQ0wsUUFBUSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJO1FBQ3JELFdBQVcsRUFBRSxVQUFVO0tBQ3hCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FDbkIsUUFBZ0IsRUFDMkIsRUFBRTtJQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7SUFDakIsT0FBTztRQUNMLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7UUFDdkMsV0FBVyxFQUFFLFVBQVU7S0FDeEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0b1BsYWludGV4dCA9IChcbiAgd29yZGxpc3Q6IHN0cmluZ1xuKTogeyB3b3JkbGlzdDogc3RyaW5nOyBjb250ZW50VHlwZTogc3RyaW5nIH0gPT4gKHtcbiAgd29yZGxpc3QsXG4gIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbidcbn0pO1xuXG5leHBvcnQgY29uc3QgdG9YTUwgPSAoXG4gIHdvcmRsaXN0OiBzdHJpbmdcbik6IHsgd29yZGxpc3Q6IHN0cmluZzsgY29udGVudFR5cGU6IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgaGVhZCA9ICc8d29yZGxpc3Q+PHdvcmQ+JztcbiAgY29uc3QgZ2x1ZSA9ICc8L3dvcmQ+PHdvcmQ+JztcbiAgY29uc3QgdGFpbCA9ICc8L3dvcmQ+PC93b3JkbGlzdD4nO1xuICByZXR1cm4ge1xuICAgIHdvcmRsaXN0OiBoZWFkICsgd29yZGxpc3QucmVwbGFjZSgvXFxuL2csIGdsdWUpICsgdGFpbCxcbiAgICBjb250ZW50VHlwZTogJ3RleHQveG1sJ1xuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHRvQ1NWID0gKFxuICB3b3JkbGlzdDogc3RyaW5nXG4pOiB7IHdvcmRsaXN0OiBzdHJpbmc7IGNvbnRlbnRUeXBlOiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGdsdWUgPSAnLCc7XG4gIHJldHVybiB7XG4gICAgd29yZGxpc3Q6IHdvcmRsaXN0LnJlcGxhY2UoL1xcbi9nLCBnbHVlKSxcbiAgICBjb250ZW50VHlwZTogJ3RleHQvY3N2J1xuICB9O1xufTtcbiJdfQ==","import { Injectable } from '@angular/core';\nimport { product } from 'cartesian-product-generator';\nimport { from } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport * as i0 from \"@angular/core\";\nexport class WordlistGeneratorService {\n generateWordlist(...charsets) {\n return from(product(...charsets)).pipe(map((word) => {\n return word.join('');\n }));\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root'\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvbGliL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUtyQyxNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLGdCQUFnQixDQUFDLEdBQUcsUUFBa0I7UUFDcEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3BDLEdBQUcsQ0FBQyxDQUFDLElBQWMsRUFBRSxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzs4R0FSVSx3QkFBd0I7a0hBQXhCLHdCQUF3QixjQUZ2QixNQUFNOzsyRkFFUCx3QkFBd0I7a0JBSHBDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcHJvZHVjdCB9IGZyb20gJ2NhcnRlc2lhbi1wcm9kdWN0LWdlbmVyYXRvcic7XG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFdvcmRsaXN0R2VuZXJhdG9yU2VydmljZSB7XG5cbiAgZ2VuZXJhdGVXb3JkbGlzdCguLi5jaGFyc2V0czogc3RyaW5nW10pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tKHByb2R1Y3QoLi4uY2hhcnNldHMpKS5waXBlKFxuICAgICAgbWFwKCh3b3JkOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICByZXR1cm4gd29yZC5qb2luKCcnKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19","import { CdkDrag, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { AsyncPipe, NgStyle } from '@angular/common';\nimport { Component, input, ViewEncapsulation, inject } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { Subject } from 'rxjs';\nimport { reduce, takeUntil, tap } from 'rxjs/operators';\nimport { FileType } from './filetypes';\nimport { toCSV, toPlaintext, toXML } from './parsers';\nimport { WordlistGeneratorService } from './wordlist-generator.service';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/material/button\";\nimport * as i2 from \"@angular/material/menu\";\nimport * as i3 from \"@angular/forms\";\nimport * as i4 from \"@angular/material/form-field\";\nimport * as i5 from \"@angular/material/input\";\nimport * as i6 from \"@angular/material/icon\";\n/* eslint-disable @angular-eslint/component-selector */\nexport class WordlistGeneratorComponent {\n constructor() {\n this.formBuilder = inject(UntypedFormBuilder);\n this.wordlistGenerator = inject(WordlistGeneratorService);\n this.buttonStyle = input({\n 'background-color': '#333333',\n color: '#cc7832'\n });\n this.dragStyle = input({ color: '#cc7832' });\n this.textStyle = input({ color: '#cc7832' });\n this.displayWordlist = false;\n this.fileType = FileType.plaintext;\n this.fileTypes = Object.values(FileType);\n this.filteredCharset = [];\n this.prefix = '';\n this.suffix = '';\n this.unsubscribe$ = new Subject();\n this.removeDuplicates = (unfiltered) => [...new Set(unfiltered)].join('');\n }\n ngOnInit() {\n this.generateForm();\n }\n ngOnDestroy() {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n get charsets() {\n if (this.charsetForm) {\n return this.charsetForm.get('charsets');\n }\n return undefined;\n }\n addCharset() {\n if (this.charsets) {\n this.charsets.push(this.formBuilder.control('', Validators.required));\n }\n }\n cloneCharset(index) {\n if (this.charsets) {\n const charset = this.charsets.value[index];\n this.charsets.insert(index, this.formBuilder.control(charset, Validators.required));\n }\n }\n downloadWordlist() {\n if (this.charsets) {\n if (this.filteredCharset !== this.filterCharset(this.charsets.value)) {\n this.generateWordlist();\n }\n const filename = `wordlist_${this.wordsGenerated}_words_${this.charsets.length}_positions.${this.fileType}`;\n this.getWordlist()\n .pipe(tap((wordlist) => {\n if (wordlist.length > 0) {\n const parsed = this.parseWordlist(wordlist);\n const file = new Blob([parsed.wordlist], {\n type: parsed.contentType\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (window.navigator.msSaveOrOpenBlob) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n window.navigator.msSaveOrOpenBlob(file, filename);\n }\n else {\n const a = document.createElement('a');\n const url = URL.createObjectURL(file);\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n }, 0);\n }\n }\n }))\n .subscribe();\n }\n }\n drop(event) {\n if (this.charsets) {\n moveItemInArray(this.charsets.controls, event.previousIndex, event.currentIndex);\n this.charsets.updateValueAndValidity();\n }\n }\n generateForm() {\n this.charsetForm = this.formBuilder.group({\n charsets: this.formBuilder.array([\n this.formBuilder.control('', Validators.required)\n ]),\n prefix: this.formBuilder.control(''),\n suffix: this.formBuilder.control('')\n });\n }\n generateWordlist() {\n if (this.charsetForm && this.charsets && this.charsets.valid) {\n this.filteredCharset = this.filterCharset(this.charsets.value);\n this.prefix = this.charsetForm.get('prefix')?.value\n ? this.charsetForm.get('prefix')?.value\n : '';\n this.suffix = this.charsetForm.get('suffix')?.value\n ? this.charsetForm.get('suffix')?.value\n : '';\n this.wordsGenerated = this.filteredCharset\n .map((charset) => charset.length)\n .reduce((previousLength, currentLength) => previousLength * currentLength);\n this.displayWordlist = this.wordsGenerated <= 100;\n this.wordlist$ = this.getWordlist();\n }\n }\n getWordlist() {\n return this.wordlistGenerator\n .generateWordlist(...this.filteredCharset)\n .pipe(reduce((wordlist, word) => `${wordlist}${this.prefix}${word}${this.suffix}\\n`, ''), takeUntil(this.unsubscribe$));\n }\n filterCharset(charsets) {\n return charsets.map((charset) => this.removeDuplicates(charset));\n }\n parseWordlist(wordlist) {\n switch (this.fileType) {\n case FileType.plaintext:\n return toPlaintext(wordlist);\n case FileType.xml:\n return toXML(wordlist);\n case FileType.csv:\n return toCSV(wordlist);\n }\n }\n removeCharset(i) {\n if (this.charsets && this.charsets.length > 1) {\n this.charsets.removeAt(i);\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.0.3\", type: WordlistGeneratorComponent, isStandalone: true, selector: \"wordlist-generator\", inputs: { buttonStyle: { classPropertyName: \"buttonStyle\", publicName: \"buttonStyle\", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: \"dragStyle\", publicName: \"dragStyle\", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: \"textStyle\", publicName: \"textStyle\", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: \"<div class=\\\"meta-container flex-row-wrap\\\">\\n <div class=\\\"form-container flex-column flex-fxflex\\\">\\n <div class=\\\"flex-row-wrap bottom-10\\\">\\n <button\\n class=\\\"generate-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"generateWordlist()\\\"\\n >\\n Generate wordlist\\n </button>\\n @if (wordlist$) {\\n <button\\n class=\\\"choose-format\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n [matMenuTriggerFor]=\\\"menu\\\"\\n >\\n Choose format\\n </button>\\n }\\n <mat-menu #menu=\\\"matMenu\\\">\\n @for (type of fileTypes; track type) {\\n <button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-menu-item\\n (click)=\\\"fileType = type\\\"\\n >\\n {{ type }}\\n </button>\\n }\\n </mat-menu>\\n @if (wordlist$) {\\n <button\\n class=\\\"download-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"downloadWordlist()\\\"\\n >\\n Download as\\n @if (this.fileType) {\\n {{ this.fileType }}\\n }\\n </button>\\n }\\n </div>\\n @if (charsetForm) {\\n <form [formGroup]=\\\"charsetForm\\\">\\n <mat-form-field class=\\\"fixed-width bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">prefix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"prefix\\\"\\n formControlName=\\\"prefix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n <div formArrayName=\\\"charsets\\\">\\n <div cdkDropList (cdkDropListDropped)=\\\"drop($event)\\\">\\n @for (\\n charset of charsets?.controls;\\n track charset;\\n let i = $index\\n ) {\\n <div class=\\\"charset-container\\\" cdkDrag>\\n <mat-icon class=\\\"drag-indicator\\\" [ngStyle]=\\\"dragStyle()\\\"\\n >drag_indicator</mat-icon\\n >\\n <mat-form-field class=\\\"charset bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">\\n character set for string position {{ i }}\\n </mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"position-{{ i }}\\\"\\n [formControlName]=\\\"i\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n required\\n />\\n </mat-form-field>\\n <button\\n mat-raised-button\\n class=\\\"clone-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"cloneCharset(i)\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">content_copy</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n class=\\\"remove-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"removeCharset(i)\\\"\\n [disabled]=\\\"this.charsets?.value.length === 1\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">remove</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"addCharset()\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">add</mat-icon>\\n </button>\\n </div>\\n }\\n </div>\\n </div>\\n <mat-form-field class=\\\"fixed-width\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">suffix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"suffix\\\"\\n formControlName=\\\"suffix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n </form>\\n }\\n </div>\\n @if (wordlist$) {\\n <div class=\\\"wordlist-container flex-column flex-fxflex\\\">\\n @if (displayWordlist) {\\n <h3 class=\\\"wordlist-header\\\">Generated wordlist:</h3>\\n <code class=\\\"wordlist\\\">\\n {{ wordlist$ | async }}\\n </code>\\n } @else {\\n The generated wordlist is too large to be displayed. You can still\\n download it.\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\\n\"], dependencies: [{ kind: \"ngmodule\", type: MatButtonModule }, { kind: \"component\", type: i1.MatButton, selector: \" button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] \", inputs: [\"matButton\"], exportAs: [\"matButton\", \"matAnchor\"] }, { kind: \"directive\", type: NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }, { kind: \"ngmodule\", type: MatMenuModule }, { kind: \"component\", type: i2.MatMenu, selector: \"mat-menu\", inputs: [\"backdropClass\", \"aria-label\", \"aria-labelledby\", \"aria-describedby\", \"xPosition\", \"yPosition\", \"overlapTrigger\", \"hasBackdrop\", \"class\", \"classList\"], outputs: [\"closed\", \"close\"], exportAs: [\"matMenu\"] }, { kind: \"component\", type: i2.MatMenuItem, selector: \"[mat-menu-item]\", inputs: [\"role\", \"disabled\", \"disableRipple\"], exportAs: [\"matMenuItem\"] }, { kind: \"directive\", type: i2.MatMenuTrigger, selector: \"[mat-menu-trigger-for], [matMenuTriggerFor]\", inputs: [\"mat-menu-trigger-for\", \"matMenuTriggerFor\", \"matMenuTriggerData\", \"matMenuTriggerRestoreFocus\"], outputs: [\"menuOpened\", \"onMenuOpen\", \"menuClosed\", \"onMenuClose\"], exportAs: [\"matMenuTrigger\"] }, { kind: \"ngmodule\", type: ReactiveFormsModule }, { kind: \"directive\", type: i3.ɵNgNoValidate, selector: \"form:not([ngNoForm]):not([ngNativeValidate])\" }, { kind: \"directive\", type: i3.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: i3.NgControlStatus, selector: \"[formControlName],[ngModel],[formControl]\" }, { kind: \"directive\", type: i3.NgControlStatusGroup, selector: \"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]\" }, { kind: \"directive\", type: i3.RequiredValidator, selector: \":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]\", inputs: [\"required\"] }, { kind: \"directive\", type: i3.FormGroupDirective, selector: \"[formGroup]\", inputs: [\"formGroup\"], outputs: [\"ngSubmit\"], exportAs: [\"ngForm\"] }, { kind: \"directive\", type: i3.FormControlName, selector: \"[formControlName]\", inputs: [\"formControlName\", \"disabled\", \"ngModel\"], outputs: [\"ngModelChange\"] }, { kind: \"directive\", type: i3.FormArrayName, selector: \"[formArrayName]\", inputs: [\"formArrayName\"] }, { kind: \"ngmodule\", type: MatFormFieldModule }, { kind: \"component\", type: i4.MatFormField, selector: \"mat-form-field\", inputs: [\"hideRequiredMarker\", \"color\", \"floatLabel\", \"appearance\", \"subscriptSizing\", \"hintLabel\"], exportAs: [\"matFormField\"] }, { kind: \"directive\", type: i4.MatLabel, selector: \"mat-label\" }, { kind: \"ngmodule\", type: MatInputModule }, { kind: \"directive\", type: i5.MatInput, selector: \"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]\", inputs: [\"disabled\", \"id\", \"placeholder\", \"name\", \"required\", \"type\", \"errorStateMatcher\", \"aria-describedby\", \"value\", \"readonly\", \"disabledInteractive\"], exportAs: [\"matInput\"] }, { kind: \"directive\", type: CdkDropList, selector: \"[cdkDropList], cdk-drop-list\", inputs: [\"cdkDropListConnectedTo\", \"cdkDropListData\", \"cdkDropListOrientation\", \"id\", \"cdkDropListLockAxis\", \"cdkDropListDisabled\", \"cdkDropListSortingDisabled\", \"cdkDropListEnterPredicate\", \"cdkDropListSortPredicate\", \"cdkDropListAutoScrollDisabled\", \"cdkDropListAutoScrollStep\", \"cdkDropListElementContainer\"], outputs: [\"cdkDropListDropped\", \"cdkDropListEntered\", \"cdkDropListExited\", \"cdkDropListSorted\"], exportAs: [\"cdkDropList\"] }, { kind: \"directive\", type: CdkDrag, selector: \"[cdkDrag]\", inputs: [\"cdkDragData\", \"cdkDragLockAxis\", \"cdkDragRootElement\", \"cdkDragBoundary\", \"cdkDragStartDelay\", \"cdkDragFreeDragPosition\", \"cdkDragDisabled\", \"cdkDragConstrainPosition\", \"cdkDragPreviewClass\", \"cdkDragPreviewContainer\", \"cdkDragScale\"], outputs: [\"cdkDragStarted\", \"cdkDragReleased\", \"cdkDragEnded\", \"cdkDragEntered\", \"cdkDragExited\", \"cdkDragDropped\", \"cdkDragMoved\"], exportAs: [\"cdkDrag\"] }, { kind: \"ngmodule\", type: MatIconModule }, { kind: \"component\", type: i6.MatIcon, selector: \"mat-icon\", inputs: [\"color\", \"inline\", \"svgIcon\", \"fontSet\", \"fontIcon\"], exportAs: [\"matIcon\"] }, { kind: \"pipe\", type: AsyncPipe, name: \"async\" }], encapsulation: i0.ViewEncapsulation.None }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{\n type: Component,\n args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, imports: [\n MatButtonModule,\n NgStyle,\n MatMenuModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n CdkDropList,\n CdkDrag,\n MatIconModule,\n AsyncPipe\n ], template: \"<div class=\\\"meta-container flex-row-wrap\\\">\\n <div class=\\\"form-container flex-column flex-fxflex\\\">\\n <div class=\\\"flex-row-wrap bottom-10\\\">\\n <button\\n class=\\\"generate-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"generateWordlist()\\\"\\n >\\n Generate wordlist\\n </button>\\n @if (wordlist$) {\\n <button\\n class=\\\"choose-format\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n [matMenuTriggerFor]=\\\"menu\\\"\\n >\\n Choose format\\n </button>\\n }\\n <mat-menu #menu=\\\"matMenu\\\">\\n @for (type of fileTypes; track type) {\\n <button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-menu-item\\n (click)=\\\"fileType = type\\\"\\n >\\n {{ type }}\\n </button>\\n }\\n </mat-menu>\\n @if (wordlist$) {\\n <button\\n class=\\\"download-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"downloadWordlist()\\\"\\n >\\n Download as\\n @if (this.fileType) {\\n {{ this.fileType }}\\n }\\n </button>\\n }\\n </div>\\n @if (charsetForm) {\\n <form [formGroup]=\\\"charsetForm\\\">\\n <mat-form-field class=\\\"fixed-width bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">prefix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"prefix\\\"\\n formControlName=\\\"prefix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n <div formArrayName=\\\"charsets\\\">\\n <div cdkDropList (cdkDropListDropped)=\\\"drop($event)\\\">\\n @for (\\n charset of charsets?.controls;\\n track charset;\\n let i = $index\\n ) {\\n <div class=\\\"charset-container\\\" cdkDrag>\\n <mat-icon class=\\\"drag-indicator\\\" [ngStyle]=\\\"dragStyle()\\\"\\n >drag_indicator</mat-icon\\n >\\n <mat-form-field class=\\\"charset bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">\\n character set for string position {{ i }}\\n </mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"position-{{ i }}\\\"\\n [formControlName]=\\\"i\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n required\\n />\\n </mat-form-field>\\n <button\\n mat-raised-button\\n class=\\\"clone-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"cloneCharset(i)\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">content_copy</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n class=\\\"remove-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"removeCharset(i)\\\"\\n [disabled]=\\\"this.charsets?.value.length === 1\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">remove</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"addCharset()\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">add</mat-icon>\\n </button>\\n </div>\\n }\\n </div>\\n </div>\\n <mat-form-field class=\\\"fixed-width\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">suffix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"suffix\\\"\\n formControlName=\\\"suffix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n </form>\\n }\\n </div>\\n @if (wordlist$) {\\n <div class=\\\"wordlist-container flex-column flex-fxflex\\\">\\n @if (displayWordlist) {\\n <h3 class=\\\"wordlist-header\\\">Generated wordlist:</h3>\\n <code class=\\\"wordlist\\\">\\n {{ wordlist$ | async }}\\n </code>\\n } @else {\\n The generated wordlist is too large to be displayed. You can still\\n download it.\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\\n\"] }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAsV0FBVyxFQUNYLGVBQWUsRUFDaEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUNMLG1CQUFtQixFQUVuQixrQkFBa0IsRUFFbEIsVUFBVSxFQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFP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Z0Ryb3AsXG4gIENka0Ryb3BMaXN0LFxuICBtb3ZlSXRlbUluQXJyYXlcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFVudHlwZWRGb3JtQXJyYXksXG4gIFVudHlwZWRGb3JtQnVpbGRlcixcbiAgVW50eXBlZEZvcm1Hcm91cCxcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHJlZHVjZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEZpbGVUeXBlIH0gZnJvbSAnLi9maWxldHlwZXMnO1xuaW1wb3J0IHsgdG9DU1YsIHRvUGxhaW50ZXh0LCB0b1hNTCB9IGZyb20gJy4vcGFyc2Vycyc7XG5pbXBvcnQgeyBXb3JkbGlzdEdlbmVyYXRvclNlcnZpY2UgfSBmcm9tICcuL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlJztcblxuLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd3b3JkbGlzdC1nZW5lcmF0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi93b3JkbGlzdC1nZW5lcmF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3dvcmRsaXN0LWdlbmVyYXRvci5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIE5nU3R5bGUsXG4gICAgICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICAgICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgICAgIENka0Ryb3BMaXN0LFxuICAgICAgICBDZGtEcmFnLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBBc3luY1BpcGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFdvcmRsaXN0R2VuZXJhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGZvcm1CdWlsZGVyID0gaW5qZWN0KFVudHlwZWRGb3JtQnVpbGRlcik7XG4gIHByaXZhdGUgd29yZGxpc3RHZW5lcmF0b3IgPSBpbmplY3QoV29yZGxpc3RHZW5lcmF0b3JTZXJ2aWNlKTtcblxuICBidXR0b25TdHlsZSA9IGlucHV0KHtcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjMzMzMzMzJyxcbiAgICBjb2xvcjogJyNjYzc4MzInXG4gIH0pO1xuXG4gIGRyYWdTdHlsZSA9IGlucHV0KHsgY29sb3I6ICcjY2M3ODMyJyB9KTtcbiAgdGV4dFN0eWxlID0gaW5wdXQoeyBjb2xvcjogJyNjYzc4MzInIH0pO1xuXG4gIGNoYXJzZXRGb3JtOiBVbnR5cGVkRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xuICB3b3Jkc0dlbmVyYXRlZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICB3b3JkbGlzdCQ6IE9ic2VydmFibGU8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICBkaXNwbGF5V29yZGxpc3QgPSBmYWxzZTtcbiAgZmlsZVR5cGUgPSBGaWxlVHlwZS5wbGFpbnRleHQ7XG4gIGZpbGVUeXBlcyA9IE9iamVjdC52YWx1ZXMoRmlsZVR5cGUpO1xuICBmaWx0ZXJlZENoYXJzZXQ6IHN0cmluZ1tdID0gW107XG4gIHByZWZpeCA9ICcnO1xuICBzdWZmaXggPSAnJztcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZW5lcmF0ZUZvcm0oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZ2V0IGNoYXJzZXRzKCk6IFVudHlwZWRGb3JtQXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRGb3JtKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGFyc2V0Rm9ybS5nZXQoJ2NoYXJzZXRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFkZENoYXJzZXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIHRoaXMuY2hhcnNldHMucHVzaCh0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpKTtcbiAgICB9XG4gIH1cblxuICBjbG9uZUNoYXJzZXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzKSB7XG4gICAgICBjb25zdCBjaGFyc2V0ID0gdGhpcy5jaGFyc2V0cy52YWx1ZVtpbmRleF07XG4gICAgICB0aGlzLmNoYXJzZXRzLmluc2VydChcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChjaGFyc2V0LCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBkb3dubG9hZFdvcmRsaXN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzKSB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJlZENoYXJzZXQgIT09IHRoaXMuZmlsdGVyQ2hhcnNldCh0aGlzLmNoYXJzZXRzLnZhbHVlKSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRlV29yZGxpc3QoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gYHdvcmRsaXN0XyR7dGhpcy53b3Jkc0dlbmVyYXRlZH1fd29yZHNfJHt0aGlzLmNoYXJzZXRzLmxlbmd0aH1fcG9zaXRpb25zLiR7dGhpcy5maWxlVHlwZX1gO1xuICAgICAgdGhpcy5nZXRXb3JkbGlzdCgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgod29yZGxpc3Q6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHdvcmRsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVdvcmRsaXN0KHdvcmRsaXN0KTtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBCbG9iKFtwYXJzZWQud29yZGxpc3RdLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcGFyc2VkLmNvbnRlbnRUeXBlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICBpZiAoKHdpbmRvdy5uYXZpZ2F0b3IgYXMgYW55KS5tc1NhdmVPck9wZW5CbG9iKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAod2luZG93Lm5hdmlnYXRvciBhcyBhbnkpLm1zU2F2ZU9yT3BlbkJsb2IoZmlsZSwgZmlsZW5hbWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcbiAgICAgICAgICAgICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICAgICAgICAgICAgYS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0cykge1xuICAgICAgbW92ZUl0ZW1JbkFycmF5KFxuICAgICAgICB0aGlzLmNoYXJzZXRzLmNvbnRyb2xzLFxuICAgICAgICBldmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICBldmVudC5jdXJyZW50SW5kZXhcbiAgICAgICk7XG4gICAgICB0aGlzLmNoYXJzZXRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZUZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5jaGFyc2V0Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgY2hhcnNldHM6IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW1xuICAgICAgICB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICBdKSxcbiAgICAgIHByZWZpeDogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnKSxcbiAgICAgIHN1ZmZpeDogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnKVxuICAgIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVXb3JkbGlzdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0Rm9ybSAmJiB0aGlzLmNoYXJzZXRzICYmIHRoaXMuY2hhcnNldHMudmFsaWQpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRDaGFyc2V0ID0gdGhpcy5maWx0ZXJDaGFyc2V0KHRoaXMuY2hhcnNldHMudmFsdWUpO1xuICAgICAgdGhpcy5wcmVmaXggPSB0aGlzLmNoYXJzZXRGb3JtLmdldCgncHJlZml4Jyk/LnZhbHVlXG4gICAgICAgID8gdGhpcy5jaGFyc2V0Rm9ybS5nZXQoJ3ByZWZpeCcpPy52YWx1ZVxuICAgICAgICA6ICcnO1xuICAgICAgdGhpcy5zdWZmaXggPSB0aGlzLmNoYXJzZXRGb3JtLmdldCgnc3VmZml4Jyk/LnZhbHVlXG4gICAgICAgID8gdGhpcy5jaGFyc2V0Rm9ybS5nZXQoJ3N1ZmZpeCcpPy52YWx1ZVxuICAgICAgICA6ICcnO1xuXG4gICAgICB0aGlzLndvcmRzR2VuZXJhdGVkID0gdGhpcy5maWx0ZXJlZENoYXJzZXRcbiAgICAgICAgLm1hcCgoY2hhcnNldDogc3RyaW5nKSA9PiBjaGFyc2V0Lmxlbmd0aClcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAocHJldmlvdXNMZW5ndGg6IG51bWJlciwgY3VycmVudExlbmd0aDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgcHJldmlvdXNMZW5ndGggKiBjdXJyZW50TGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB0aGlzLmRpc3BsYXlXb3JkbGlzdCA9IHRoaXMud29yZHNHZW5lcmF0ZWQgPD0gMTAwO1xuICAgICAgdGhpcy53b3JkbGlzdCQgPSB0aGlzLmdldFdvcmRsaXN0KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0V29yZGxpc3QoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53b3JkbGlzdEdlbmVyYXRvclxuICAgICAgLmdlbmVyYXRlV29yZGxpc3QoLi4udGhpcy5maWx0ZXJlZENoYXJzZXQpXG4gICAgICAucGlwZShcbiAgICAgICAgcmVkdWNlKFxuICAgICAgICAgICh3b3JkbGlzdDogc3RyaW5nLCB3b3JkOiBzdHJpbmcpID0+XG4gICAgICAgICAgICBgJHt3b3JkbGlzdH0ke3RoaXMucHJlZml4fSR7d29yZH0ke3RoaXMuc3VmZml4fVxcbmAsXG4gICAgICAgICAgJydcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKVxuICAgICAgKTtcbiAgfVxuXG4gIGZpbHRlckNoYXJzZXQoY2hhcnNldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBjaGFyc2V0cy5tYXAoKGNoYXJzZXQ6IHN0cmluZykgPT4gdGhpcy5yZW1vdmVEdXBsaWNhdGVzKGNoYXJzZXQpKTtcbiAgfVxuXG4gIHBhcnNlV29yZGxpc3Qod29yZGxpc3Q6IHN0cmluZyk6IHsgd29yZGxpc3Q6IHN0cmluZzsgY29udGVudFR5cGU6IHN0cmluZyB9IHtcbiAgICBzd2l0Y2ggKHRoaXMuZmlsZVR5cGUpIHtcbiAgICAgIGNhc2UgRmlsZVR5cGUucGxhaW50ZXh0OlxuICAgICAgICByZXR1cm4gdG9QbGFpbnRleHQod29yZGxpc3QpO1xuICAgICAgY2FzZSBGaWxlVHlwZS54bWw6XG4gICAgICAgIHJldHVybiB0b1hNTCh3b3JkbGlzdCk7XG4gICAgICBjYXNlIEZpbGVUeXBlLmNzdjpcbiAgICAgICAgcmV0dXJuIHRvQ1NWKHdvcmRsaXN0KTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGFyc2V0KGk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzICYmIHRoaXMuY2hhcnNldHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5jaGFyc2V0cy5yZW1vdmVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVEdXBsaWNhdGVzID0gKHVuZmlsdGVyZWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIFsuLi5uZXcgU2V0KHVuZmlsdGVyZWQpXS5qb2luKCcnKTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJtZXRhLWNvbnRhaW5lciBmbGV4LXJvdy13cmFwXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBmbGV4LWNvbHVtbiBmbGV4LWZ4ZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy13cmFwIGJvdHRvbS0xMFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImdlbmVyYXRlLXdvcmRsaXN0XCJcbiAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJnZW5lcmF0ZVdvcmRsaXN0KClcIlxuICAgICAgPlxuICAgICAgICBHZW5lcmF0ZSB3b3JkbGlzdFxuICAgICAgPC9idXR0b24+XG4gICAgICBAaWYgKHdvcmRsaXN0JCkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJjaG9vc2UtZm9ybWF0XCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJidXR0b25TdHlsZSgpXCJcbiAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcbiAgICAgICAgPlxuICAgICAgICAgIENob29zZSBmb3JtYXRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgIEBmb3IgKHR5cGUgb2YgZmlsZVR5cGVzOyB0cmFjayB0eXBlKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZmlsZVR5cGUgPSB0eXBlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0eXBlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvbWF0LW1lbnU+XG4gICAgICBAaWYgKHdvcmRsaXN0JCkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJkb3dubG9hZC13b3JkbGlzdFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRXb3JkbGlzdCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIERvd25sb2FkIGFzXG4gICAgICAgICAgQGlmICh0aGlzLmZpbGVUeXBlKSB7XG4gICAgICAgICAgICB7eyB0aGlzLmZpbGVUeXBlIH19XG4gICAgICAgICAgfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGNoYXJzZXRGb3JtKSB7XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNoYXJzZXRGb3JtXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZpeGVkLXdpZHRoIGJvdHRvbS0xMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiPnByZWZpeCAob3B0aW9uYWwpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgaWQ9XCJwcmVmaXhcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJlZml4XCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJjaGFyc2V0c1wiPlxuICAgICAgICAgIDxkaXYgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIj5cbiAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICBjaGFyc2V0IG9mIGNoYXJzZXRzPy5jb250cm9scztcbiAgICAgICAgICAgICAgdHJhY2sgY2hhcnNldDtcbiAgICAgICAgICAgICAgbGV0IGkgPSAkaW5kZXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhcnNldC1jb250YWluZXJcIiBjZGtEcmFnPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImRyYWctaW5kaWNhdG9yXCIgW25nU3R5bGVdPVwiZHJhZ1N0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJjaGFyc2V0IGJvdHRvbS0xMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIFtuZ1N0eWxlXT1cInRleHRTdHlsZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciBzZXQgZm9yIHN0cmluZyBwb3NpdGlvbiB7eyBpIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwb3NpdGlvbi17eyBpIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNsb25lLWNoYXJzZXRcIlxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvbmVDaGFyc2V0KGkpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJyb3ctYnV0dG9uLWljb25cIj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbW92ZS1jaGFyc2V0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImJ1dHRvblN0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNoYXJzZXQoaSlcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuY2hhcnNldHM/LnZhbHVlLmxlbmd0aCA9PT0gMVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicm93LWJ1dHRvbi1pY29uXCI+cmVtb3ZlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQ2hhcnNldCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJyb3ctYnV0dG9uLWljb25cIj5hZGQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZpeGVkLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsIFtuZ1N0eWxlXT1cInRleHRTdHlsZSgpXCI+c3VmZml4IChvcHRpb25hbCk8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInRleHRTdHlsZSgpXCJcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBpZD1cInN1ZmZpeFwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdWZmaXhcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Zvcm0+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmICh3b3JkbGlzdCQpIHtcbiAgICA8ZGl2IGNsYXNzPVwid29yZGxpc3QtY29udGFpbmVyIGZsZXgtY29sdW1uIGZsZXgtZnhmbGV4XCI+XG4gICAgICBAaWYgKGRpc3BsYXlXb3JkbGlzdCkge1xuICAgICAgICA8aDMgY2xhc3M9XCJ3b3JkbGlzdC1oZWFkZXJcIj5HZW5lcmF0ZWQgd29yZGxpc3Q6PC9oMz5cbiAgICAgICAgPGNvZGUgY2xhc3M9XCJ3b3JkbGlzdFwiPlxuICAgICAgICAgIHt7IHdvcmRsaXN0JCB8IGFzeW5jIH19XG4gICAgICAgIDwvY29kZT5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICBUaGUgZ2VuZXJhdGVkIHdvcmRsaXN0IGlzIHRvbyBsYXJnZSB0byBiZSBkaXNwbGF5ZWQuIFlvdSBjYW4gc3RpbGxcbiAgICAgICAgZG93bmxvYWQgaXQuXG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVodzBsZi13b3JkbGlzdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvdGVodzBsZi13b3JkbGlzdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0="],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tehw0lf-wordlist-generator.mjs","sources":["../tmp-esm2022/lib/filetypes.js","../tmp-esm2022/lib/parsers.js","../tmp-esm2022/lib/wordlist-generator.service.js","../tmp-esm2022/lib/wordlist-generator.component.js","../tmp-esm2022/tehw0lf-wordlist-generator.js"],"sourcesContent":["export var FileType;\n(function (FileType) {\n FileType[\"plaintext\"] = \"txt\";\n FileType[\"xml\"] = \"xml\";\n FileType[\"csv\"] = \"csv\";\n})(FileType || (FileType = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy93b3JkbGlzdC1nZW5lcmF0b3Ivc3JjL2xpYi9maWxldHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksUUFJWDtBQUpELFdBQVksUUFBUTtJQUNsQiw2QkFBaUIsQ0FBQTtJQUNqQix1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtBQUNiLENBQUMsRUFKVyxRQUFRLEtBQVIsUUFBUSxRQUluQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIEZpbGVUeXBlIHtcbiAgcGxhaW50ZXh0ID0gJ3R4dCcsXG4gIHhtbCA9ICd4bWwnLFxuICBjc3YgPSAnY3N2J1xufVxuIl19","export const toPlaintext = (wordlist) => ({\n wordlist,\n contentType: 'text/plain'\n});\nexport const toXML = (wordlist) => {\n const head = '<wordlist><word>';\n const glue = '</word><word>';\n const tail = '</word></wordlist>';\n return {\n wordlist: head + wordlist.replace(/\\n/g, glue) + tail,\n contentType: 'text/xml'\n };\n};\nexport const toCSV = (wordlist) => {\n const glue = ',';\n return {\n wordlist: wordlist.replace(/\\n/g, glue),\n contentType: 'text/csv'\n };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2Vycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvcGFyc2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FDekIsUUFBZ0IsRUFDMkIsRUFBRSxDQUFDLENBQUM7SUFDL0MsUUFBUTtJQUNSLFdBQVcsRUFBRSxZQUFZO0NBQzFCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUNuQixRQUFnQixFQUMyQixFQUFFO0lBQzdDLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNsQyxPQUFPO1FBQ0wsUUFBUSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJO1FBQ3JELFdBQVcsRUFBRSxVQUFVO0tBQ3hCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FDbkIsUUFBZ0IsRUFDMkIsRUFBRTtJQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7SUFDakIsT0FBTztRQUNMLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7UUFDdkMsV0FBVyxFQUFFLFVBQVU7S0FDeEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0b1BsYWludGV4dCA9IChcbiAgd29yZGxpc3Q6IHN0cmluZ1xuKTogeyB3b3JkbGlzdDogc3RyaW5nOyBjb250ZW50VHlwZTogc3RyaW5nIH0gPT4gKHtcbiAgd29yZGxpc3QsXG4gIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbidcbn0pO1xuXG5leHBvcnQgY29uc3QgdG9YTUwgPSAoXG4gIHdvcmRsaXN0OiBzdHJpbmdcbik6IHsgd29yZGxpc3Q6IHN0cmluZzsgY29udGVudFR5cGU6IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgaGVhZCA9ICc8d29yZGxpc3Q+PHdvcmQ+JztcbiAgY29uc3QgZ2x1ZSA9ICc8L3dvcmQ+PHdvcmQ+JztcbiAgY29uc3QgdGFpbCA9ICc8L3dvcmQ+PC93b3JkbGlzdD4nO1xuICByZXR1cm4ge1xuICAgIHdvcmRsaXN0OiBoZWFkICsgd29yZGxpc3QucmVwbGFjZSgvXFxuL2csIGdsdWUpICsgdGFpbCxcbiAgICBjb250ZW50VHlwZTogJ3RleHQveG1sJ1xuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHRvQ1NWID0gKFxuICB3b3JkbGlzdDogc3RyaW5nXG4pOiB7IHdvcmRsaXN0OiBzdHJpbmc7IGNvbnRlbnRUeXBlOiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGdsdWUgPSAnLCc7XG4gIHJldHVybiB7XG4gICAgd29yZGxpc3Q6IHdvcmRsaXN0LnJlcGxhY2UoL1xcbi9nLCBnbHVlKSxcbiAgICBjb250ZW50VHlwZTogJ3RleHQvY3N2J1xuICB9O1xufTtcbiJdfQ==","import { Injectable } from '@angular/core';\nimport { product } from 'cartesian-product-generator';\nimport { from, Subject } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport * as i0 from \"@angular/core\";\nexport class WordlistGeneratorService {\n constructor() {\n this.LARGE_DATASET_THRESHOLD = 50000;\n }\n generateWordlist(...charsets) {\n const estimatedSize = this.estimateWordlistSize(charsets);\n if (estimatedSize > this.LARGE_DATASET_THRESHOLD) {\n return this.generateWithWebWorker(charsets);\n }\n return this.generateSynchronously(charsets);\n }\n generateSynchronously(charsets) {\n return from(product(...charsets)).pipe(map((word) => word.join('')));\n }\n generateWithWebWorker(charsets) {\n const subject = new Subject();\n if (typeof Worker !== 'undefined') {\n const worker = new Worker(new URL('./wordlist.worker', import.meta.url));\n worker.onmessage = ({ data }) => {\n switch (data.type) {\n case 'batch':\n if (data.words) {\n data.words.forEach((word) => subject.next(word));\n }\n break;\n case 'complete':\n subject.complete();\n worker.terminate();\n break;\n case 'error':\n subject.error(new Error(data.error || 'Worker error'));\n worker.terminate();\n break;\n }\n };\n worker.onerror = (error) => {\n subject.error(error);\n worker.terminate();\n };\n const message = {\n type: 'generate',\n charsets,\n batchSize: 1000\n };\n worker.postMessage(message);\n }\n else {\n // Fallback for environments without Worker support\n this.generateSynchronously(charsets).subscribe({\n next: (word) => subject.next(word),\n error: (err) => subject.error(err),\n complete: () => subject.complete()\n });\n }\n return subject.asObservable();\n }\n estimateWordlistSize(charsets) {\n return charsets.reduce((total, charset) => total * charset.length, 1);\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root'\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvbGliL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFpQnJDLE1BQU0sT0FBTyx3QkFBd0I7SUFIckM7UUFJbUIsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO0tBcUVsRDtJQW5FQyxnQkFBZ0IsQ0FBQyxHQUFHLFFBQWtCO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUxRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVPLHFCQUFxQixDQUFDLFFBQWtCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxRQUFrQjtRQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRXRDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXpFLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBd0MsRUFBRSxFQUFFO2dCQUNwRSxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDbEIsS0FBSyxPQUFPO3dCQUNWLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOzRCQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ25ELENBQUM7d0JBQ0QsTUFBTTtvQkFDUixLQUFLLFVBQVU7d0JBQ2IsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNuQixNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ25CLE1BQU07b0JBQ1IsS0FBSyxPQUFPO3dCQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDO3dCQUN2RCxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ25CLE1BQU07Z0JBQ1YsQ0FBQztZQUNILENBQUMsQ0FBQztZQUVGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckIsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JCLENBQUMsQ0FBQztZQUVGLE1BQU0sT0FBTyxHQUEwQjtnQkFDckMsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFFBQVE7Z0JBQ1IsU0FBUyxFQUFFLElBQUk7YUFDaEIsQ0FBQztZQUVGLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsQ0FBQzthQUFNLENBQUM7WUFDTixtREFBbUQ7WUFDbkQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDN0MsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDbEMsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztnQkFDbEMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7YUFDbkMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxRQUFrQjtRQUM3QyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDOzhHQXJFVSx3QkFBd0I7a0hBQXhCLHdCQUF3QixjQUZ2QixNQUFNOzsyRkFFUCx3QkFBd0I7a0JBSHBDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcHJvZHVjdCB9IGZyb20gJ2NhcnRlc2lhbi1wcm9kdWN0LWdlbmVyYXRvcic7XG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmludGVyZmFjZSBXb3JkbGlzdFdvcmtlck1lc3NhZ2Uge1xuICB0eXBlOiAnZ2VuZXJhdGUnO1xuICBjaGFyc2V0czogc3RyaW5nW107XG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFdvcmRsaXN0V29ya2VyUmVzcG9uc2Uge1xuICB0eXBlOiAnYmF0Y2gnIHwgJ2NvbXBsZXRlJyB8ICdlcnJvcic7XG4gIHdvcmRzPzogc3RyaW5nW107XG4gIGVycm9yPzogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBXb3JkbGlzdEdlbmVyYXRvclNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IExBUkdFX0RBVEFTRVRfVEhSRVNIT0xEID0gNTAwMDA7XG5cbiAgZ2VuZXJhdGVXb3JkbGlzdCguLi5jaGFyc2V0czogc3RyaW5nW10pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IGVzdGltYXRlZFNpemUgPSB0aGlzLmVzdGltYXRlV29yZGxpc3RTaXplKGNoYXJzZXRzKTtcblxuICAgIGlmIChlc3RpbWF0ZWRTaXplID4gdGhpcy5MQVJHRV9EQVRBU0VUX1RIUkVTSE9MRCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVXaXRoV2ViV29ya2VyKGNoYXJzZXRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVN5bmNocm9ub3VzbHkoY2hhcnNldHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVN5bmNocm9ub3VzbHkoY2hhcnNldHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gZnJvbShwcm9kdWN0KC4uLmNoYXJzZXRzKSkucGlwZShcbiAgICAgIG1hcCgod29yZDogc3RyaW5nW10pID0+IHdvcmQuam9pbignJykpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVXaXRoV2ViV29ya2VyKGNoYXJzZXRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAgIGlmICh0eXBlb2YgV29ya2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3dvcmRsaXN0LndvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpO1xuXG4gICAgICB3b3JrZXIub25tZXNzYWdlID0gKHsgZGF0YSB9OiBNZXNzYWdlRXZlbnQ8V29yZGxpc3RXb3JrZXJSZXNwb25zZT4pID0+IHtcbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdiYXRjaCc6XG4gICAgICAgICAgICBpZiAoZGF0YS53b3Jkcykge1xuICAgICAgICAgICAgICBkYXRhLndvcmRzLmZvckVhY2goKHdvcmQpID0+IHN1YmplY3QubmV4dCh3b3JkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdjb21wbGV0ZSc6XG4gICAgICAgICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICBzdWJqZWN0LmVycm9yKG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdXb3JrZXIgZXJyb3InKSk7XG4gICAgICAgICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgd29ya2VyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgc3ViamVjdC5lcnJvcihlcnJvcik7XG4gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2U6IFdvcmRsaXN0V29ya2VyTWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogJ2dlbmVyYXRlJyxcbiAgICAgICAgY2hhcnNldHMsXG4gICAgICAgIGJhdGNoU2l6ZTogMTAwMFxuICAgICAgfTtcblxuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGYWxsYmFjayBmb3IgZW52aXJvbm1lbnRzIHdpdGhvdXQgV29ya2VyIHN1cHBvcnRcbiAgICAgIHRoaXMuZ2VuZXJhdGVTeW5jaHJvbm91c2x5KGNoYXJzZXRzKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAod29yZCkgPT4gc3ViamVjdC5uZXh0KHdvcmQpLFxuICAgICAgICBlcnJvcjogKGVycikgPT4gc3ViamVjdC5lcnJvcihlcnIpLFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4gc3ViamVjdC5jb21wbGV0ZSgpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXN0aW1hdGVXb3JkbGlzdFNpemUoY2hhcnNldHM6IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY2hhcnNldHMucmVkdWNlKCh0b3RhbCwgY2hhcnNldCkgPT4gdG90YWwgKiBjaGFyc2V0Lmxlbmd0aCwgMSk7XG4gIH1cbn1cbiJdfQ==","import { CdkDrag, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, signal, ViewEncapsulation } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { Subject } from 'rxjs';\nimport { finalize, reduce, shareReplay, takeUntil } from 'rxjs/operators';\nimport { FileType } from './filetypes';\nimport { toCSV, toPlaintext, toXML } from './parsers';\nimport { WordlistGeneratorService } from './wordlist-generator.service';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/material/button\";\nimport * as i2 from \"@angular/material/menu\";\nimport * as i3 from \"@angular/forms\";\nimport * as i4 from \"@angular/material/form-field\";\nimport * as i5 from \"@angular/material/input\";\nimport * as i6 from \"@angular/material/icon\";\nimport * as i7 from \"@angular/material/progress-bar\";\n/* eslint-disable @angular-eslint/component-selector */\nexport class WordlistGeneratorComponent {\n constructor() {\n this.formBuilder = inject(UntypedFormBuilder);\n this.wordlistGenerator = inject(WordlistGeneratorService);\n this.buttonStyle = input({\n 'background-color': '#333333',\n color: '#cc7832'\n });\n this.dragStyle = input({ color: '#cc7832' });\n this.textStyle = input({ color: '#cc7832' });\n this.wordlist = signal('');\n this.displayWordlist = signal(false);\n this.fileType = signal(FileType.plaintext);\n this.fileTypes = Object.values(FileType);\n this.filteredCharset = signal([]);\n this.prefix = signal('');\n this.suffix = signal('');\n this.isGenerating = signal(false);\n this.isLargeDataset = signal(false);\n this.wordsGenerated = signal(undefined);\n this.canGenerate = computed(() => this.charsetForm?.valid && this.filteredCharset().length > 0);\n this.hasWordlist = computed(() => this.wordlist().length > 0);\n this.unsubscribe$ = new Subject();\n this.removeDuplicates = (unfiltered) => [...new Set(unfiltered)].join('');\n this.generateForm();\n }\n ngOnDestroy() {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n get charsets() {\n if (this.charsetForm) {\n return this.charsetForm.get('charsets');\n }\n return undefined;\n }\n addCharset() {\n if (this.charsets) {\n this.charsets.push(this.formBuilder.control('', Validators.required));\n }\n }\n cloneCharset(index) {\n if (this.charsets) {\n const charset = this.charsets.value[index];\n this.charsets.insert(index, this.formBuilder.control(charset, Validators.required));\n }\n }\n downloadWordlist() {\n if (this.charsets) {\n const currentCharset = this.filterCharset(this.charsets.value);\n if (JSON.stringify(this.filteredCharset()) !==\n JSON.stringify(currentCharset)) {\n this.generateWordlist();\n }\n const filename = `wordlist_${this.wordsGenerated()}_words_${this.charsets.length}_positions.${this.fileType()}`;\n const wordlistContent = this.wordlist();\n if (wordlistContent && wordlistContent.length > 0) {\n this.performDownload(wordlistContent, filename);\n }\n }\n }\n performDownload(wordlistContent, filename) {\n const parsed = this.parseWordlist(wordlistContent);\n const file = new Blob([parsed.wordlist], {\n type: parsed.contentType\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (window.navigator.msSaveOrOpenBlob) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n window.navigator.msSaveOrOpenBlob(file, filename);\n }\n else {\n const a = document.createElement('a');\n const url = URL.createObjectURL(file);\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n }, 0);\n }\n }\n drop(event) {\n if (this.charsets) {\n moveItemInArray(this.charsets.controls, event.previousIndex, event.currentIndex);\n this.charsets.updateValueAndValidity();\n }\n }\n generateForm() {\n this.charsetForm = this.formBuilder.group({\n charsets: this.formBuilder.array([\n this.formBuilder.control('', Validators.required)\n ]),\n prefix: this.formBuilder.control(''),\n suffix: this.formBuilder.control('')\n });\n }\n generateWordlist() {\n if (this.charsetForm && this.charsets && this.charsets.valid) {\n this.filteredCharset.set(this.filterCharset(this.charsets.value));\n this.prefix.set(this.charsetForm.get('prefix')?.value || '');\n this.suffix.set(this.charsetForm.get('suffix')?.value || '');\n const wordsCount = this.filteredCharset()\n .map((charset) => charset.length)\n .reduce((previousLength, currentLength) => previousLength * currentLength);\n this.wordsGenerated.set(wordsCount);\n this.isLargeDataset.set(wordsCount > 50000);\n this.displayWordlist.set(wordsCount <= 100);\n this.isGenerating.set(true);\n // Generate wordlist and update signal\n this.getWordlist()\n .pipe(takeUntil(this.unsubscribe$))\n .subscribe({\n next: (wordlist) => this.wordlist.set(wordlist),\n error: (error) => {\n console.error('Error generating wordlist:', error);\n this.isGenerating.set(false);\n }\n });\n }\n }\n getWordlist() {\n return this.wordlistGenerator\n .generateWordlist(...this.filteredCharset())\n .pipe(shareReplay({ bufferSize: 1, refCount: true }), reduce((wordlist, word) => `${wordlist}${this.prefix()}${word}${this.suffix()}\\n`, ''), finalize(() => {\n this.isGenerating.set(false);\n }), takeUntil(this.unsubscribe$));\n }\n filterCharset(charsets) {\n return charsets.map((charset) => this.removeDuplicates(charset));\n }\n parseWordlist(wordlist) {\n switch (this.fileType()) {\n case FileType.plaintext:\n return toPlaintext(wordlist);\n case FileType.xml:\n return toXML(wordlist);\n case FileType.csv:\n return toCSV(wordlist);\n }\n }\n removeCharset(i) {\n if (this.charsets && this.charsets.length > 1) {\n this.charsets.removeAt(i);\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.0.3\", type: WordlistGeneratorComponent, isStandalone: true, selector: \"wordlist-generator\", inputs: { buttonStyle: { classPropertyName: \"buttonStyle\", publicName: \"buttonStyle\", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: \"dragStyle\", publicName: \"dragStyle\", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: \"textStyle\", publicName: \"textStyle\", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: \"<div class=\\\"meta-container flex-row-wrap\\\">\\n <div class=\\\"form-container flex-column flex-fxflex\\\">\\n <div class=\\\"flex-row-wrap bottom-10\\\">\\n <button\\n class=\\\"generate-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"generateWordlist()\\\"\\n [disabled]=\\\"isGenerating()\\\"\\n >\\n @if (isGenerating()) {\\n Generating...\\n } @else {\\n Generate wordlist\\n }\\n </button>\\n @if (hasWordlist() && !isGenerating()) {\\n <button\\n class=\\\"choose-format\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n [matMenuTriggerFor]=\\\"menu\\\"\\n >\\n Choose format\\n </button>\\n }\\n <mat-menu #menu=\\\"matMenu\\\">\\n @for (type of fileTypes; track type) {\\n <button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-menu-item\\n (click)=\\\"fileType.set(type)\\\"\\n >\\n {{ type }}\\n </button>\\n }\\n </mat-menu>\\n @if (hasWordlist() && !isGenerating()) {\\n <button\\n class=\\\"download-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"downloadWordlist()\\\"\\n >\\n Download as\\n @if (this.fileType()) {\\n {{ this.fileType() }}\\n }\\n </button>\\n }\\n </div>\\n\\n @if (isGenerating() && isLargeDataset()) {\\n <div class=\\\"progress-container\\\">\\n <mat-progress-bar\\n mode=\\\"indeterminate\\\"\\n role=\\\"progressbar\\\"\\n aria-label=\\\"Generating wordlist\\\"\\n ></mat-progress-bar>\\n <p [ngStyle]=\\\"textStyle()\\\">\\n Processing large dataset using Web Worker...\\n </p>\\n </div>\\n }\\n\\n @if (charsetForm) {\\n <form [formGroup]=\\\"charsetForm\\\">\\n <mat-form-field class=\\\"fixed-width bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">prefix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"prefix\\\"\\n formControlName=\\\"prefix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n <div formArrayName=\\\"charsets\\\">\\n <div cdkDropList (cdkDropListDropped)=\\\"drop($event)\\\">\\n @for (\\n charset of charsets?.controls;\\n track charset;\\n let i = $index\\n ) {\\n <div class=\\\"charset-container\\\" cdkDrag>\\n <mat-icon class=\\\"drag-indicator\\\" [ngStyle]=\\\"dragStyle()\\\"\\n >drag_indicator</mat-icon\\n >\\n <mat-form-field class=\\\"charset bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">\\n character set for string position {{ i }}\\n </mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"position-{{ i }}\\\"\\n [formControlName]=\\\"i\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n required\\n />\\n </mat-form-field>\\n <button\\n mat-raised-button\\n class=\\\"clone-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"cloneCharset(i)\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">content_copy</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n class=\\\"remove-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"removeCharset(i)\\\"\\n [disabled]=\\\"this.charsets?.value.length === 1\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">remove</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"addCharset()\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">add</mat-icon>\\n </button>\\n </div>\\n }\\n </div>\\n </div>\\n <mat-form-field class=\\\"fixed-width\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">suffix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"suffix\\\"\\n formControlName=\\\"suffix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n </form>\\n }\\n </div>\\n @if (hasWordlist()) {\\n <div class=\\\"wordlist-container flex-column flex-fxflex\\\">\\n @if (displayWordlist()) {\\n <h3 class=\\\"wordlist-header\\\">Generated wordlist:</h3>\\n <code class=\\\"wordlist\\\">\\n {{ wordlist() }}\\n </code>\\n } @else {\\n The generated wordlist is too large to be displayed. You can still\\n download it.\\n <!-- Wordlist is already loaded in the signal for large datasets -->\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\\n\"], dependencies: [{ kind: \"ngmodule\", type: MatButtonModule }, { kind: \"component\", type: i1.MatButton, selector: \" button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] \", inputs: [\"matButton\"], exportAs: [\"matButton\", \"matAnchor\"] }, { kind: \"directive\", type: NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }, { kind: \"ngmodule\", type: MatMenuModule }, { kind: \"component\", type: i2.MatMenu, selector: \"mat-menu\", inputs: [\"backdropClass\", \"aria-label\", \"aria-labelledby\", \"aria-describedby\", \"xPosition\", \"yPosition\", \"overlapTrigger\", \"hasBackdrop\", \"class\", \"classList\"], outputs: [\"closed\", \"close\"], exportAs: [\"matMenu\"] }, { kind: \"component\", type: i2.MatMenuItem, selector: \"[mat-menu-item]\", inputs: [\"role\", \"disabled\", \"disableRipple\"], exportAs: [\"matMenuItem\"] }, { kind: \"directive\", type: i2.MatMenuTrigger, selector: \"[mat-menu-trigger-for], [matMenuTriggerFor]\", inputs: [\"mat-menu-trigger-for\", \"matMenuTriggerFor\", \"matMenuTriggerData\", \"matMenuTriggerRestoreFocus\"], outputs: [\"menuOpened\", \"onMenuOpen\", \"menuClosed\", \"onMenuClose\"], exportAs: [\"matMenuTrigger\"] }, { kind: \"ngmodule\", type: ReactiveFormsModule }, { kind: \"directive\", type: i3.ɵNgNoValidate, selector: \"form:not([ngNoForm]):not([ngNativeValidate])\" }, { kind: \"directive\", type: i3.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: i3.NgControlStatus, selector: \"[formControlName],[ngModel],[formControl]\" }, { kind: \"directive\", type: i3.NgControlStatusGroup, selector: \"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]\" }, { kind: \"directive\", type: i3.RequiredValidator, selector: \":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]\", inputs: [\"required\"] }, { kind: \"directive\", type: i3.FormGroupDirective, selector: \"[formGroup]\", inputs: [\"formGroup\"], outputs: [\"ngSubmit\"], exportAs: [\"ngForm\"] }, { kind: \"directive\", type: i3.FormControlName, selector: \"[formControlName]\", inputs: [\"formControlName\", \"disabled\", \"ngModel\"], outputs: [\"ngModelChange\"] }, { kind: \"directive\", type: i3.FormArrayName, selector: \"[formArrayName]\", inputs: [\"formArrayName\"] }, { kind: \"ngmodule\", type: MatFormFieldModule }, { kind: \"component\", type: i4.MatFormField, selector: \"mat-form-field\", inputs: [\"hideRequiredMarker\", \"color\", \"floatLabel\", \"appearance\", \"subscriptSizing\", \"hintLabel\"], exportAs: [\"matFormField\"] }, { kind: \"directive\", type: i4.MatLabel, selector: \"mat-label\" }, { kind: \"ngmodule\", type: MatInputModule }, { kind: \"directive\", type: i5.MatInput, selector: \"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]\", inputs: [\"disabled\", \"id\", \"placeholder\", \"name\", \"required\", \"type\", \"errorStateMatcher\", \"aria-describedby\", \"value\", \"readonly\", \"disabledInteractive\"], exportAs: [\"matInput\"] }, { kind: \"directive\", type: CdkDropList, selector: \"[cdkDropList], cdk-drop-list\", inputs: [\"cdkDropListConnectedTo\", \"cdkDropListData\", \"cdkDropListOrientation\", \"id\", \"cdkDropListLockAxis\", \"cdkDropListDisabled\", \"cdkDropListSortingDisabled\", \"cdkDropListEnterPredicate\", \"cdkDropListSortPredicate\", \"cdkDropListAutoScrollDisabled\", \"cdkDropListAutoScrollStep\", \"cdkDropListElementContainer\"], outputs: [\"cdkDropListDropped\", \"cdkDropListEntered\", \"cdkDropListExited\", \"cdkDropListSorted\"], exportAs: [\"cdkDropList\"] }, { kind: \"directive\", type: CdkDrag, selector: \"[cdkDrag]\", inputs: [\"cdkDragData\", \"cdkDragLockAxis\", \"cdkDragRootElement\", \"cdkDragBoundary\", \"cdkDragStartDelay\", \"cdkDragFreeDragPosition\", \"cdkDragDisabled\", \"cdkDragConstrainPosition\", \"cdkDragPreviewClass\", \"cdkDragPreviewContainer\", \"cdkDragScale\"], outputs: [\"cdkDragStarted\", \"cdkDragReleased\", \"cdkDragEnded\", \"cdkDragEntered\", \"cdkDragExited\", \"cdkDragDropped\", \"cdkDragMoved\"], exportAs: [\"cdkDrag\"] }, { kind: \"ngmodule\", type: MatIconModule }, { kind: \"component\", type: i6.MatIcon, selector: \"mat-icon\", inputs: [\"color\", \"inline\", \"svgIcon\", \"fontSet\", \"fontIcon\"], exportAs: [\"matIcon\"] }, { kind: \"ngmodule\", type: MatProgressBarModule }, { kind: \"component\", type: i7.MatProgressBar, selector: \"mat-progress-bar\", inputs: [\"color\", \"value\", \"bufferValue\", \"mode\"], outputs: [\"animationEnd\"], exportAs: [\"matProgressBar\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{\n type: Component,\n args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, imports: [\n MatButtonModule,\n NgStyle,\n MatMenuModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n CdkDropList,\n CdkDrag,\n MatIconModule,\n MatProgressBarModule\n ], changeDetection: ChangeDetectionStrategy.OnPush, template: \"<div class=\\\"meta-container flex-row-wrap\\\">\\n <div class=\\\"form-container flex-column flex-fxflex\\\">\\n <div class=\\\"flex-row-wrap bottom-10\\\">\\n <button\\n class=\\\"generate-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"generateWordlist()\\\"\\n [disabled]=\\\"isGenerating()\\\"\\n >\\n @if (isGenerating()) {\\n Generating...\\n } @else {\\n Generate wordlist\\n }\\n </button>\\n @if (hasWordlist() && !isGenerating()) {\\n <button\\n class=\\\"choose-format\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n [matMenuTriggerFor]=\\\"menu\\\"\\n >\\n Choose format\\n </button>\\n }\\n <mat-menu #menu=\\\"matMenu\\\">\\n @for (type of fileTypes; track type) {\\n <button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-menu-item\\n (click)=\\\"fileType.set(type)\\\"\\n >\\n {{ type }}\\n </button>\\n }\\n </mat-menu>\\n @if (hasWordlist() && !isGenerating()) {\\n <button\\n class=\\\"download-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"downloadWordlist()\\\"\\n >\\n Download as\\n @if (this.fileType()) {\\n {{ this.fileType() }}\\n }\\n </button>\\n }\\n </div>\\n\\n @if (isGenerating() && isLargeDataset()) {\\n <div class=\\\"progress-container\\\">\\n <mat-progress-bar\\n mode=\\\"indeterminate\\\"\\n role=\\\"progressbar\\\"\\n aria-label=\\\"Generating wordlist\\\"\\n ></mat-progress-bar>\\n <p [ngStyle]=\\\"textStyle()\\\">\\n Processing large dataset using Web Worker...\\n </p>\\n </div>\\n }\\n\\n @if (charsetForm) {\\n <form [formGroup]=\\\"charsetForm\\\">\\n <mat-form-field class=\\\"fixed-width bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">prefix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"prefix\\\"\\n formControlName=\\\"prefix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n <div formArrayName=\\\"charsets\\\">\\n <div cdkDropList (cdkDropListDropped)=\\\"drop($event)\\\">\\n @for (\\n charset of charsets?.controls;\\n track charset;\\n let i = $index\\n ) {\\n <div class=\\\"charset-container\\\" cdkDrag>\\n <mat-icon class=\\\"drag-indicator\\\" [ngStyle]=\\\"dragStyle()\\\"\\n >drag_indicator</mat-icon\\n >\\n <mat-form-field class=\\\"charset bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">\\n character set for string position {{ i }}\\n </mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"position-{{ i }}\\\"\\n [formControlName]=\\\"i\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n required\\n />\\n </mat-form-field>\\n <button\\n mat-raised-button\\n class=\\\"clone-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"cloneCharset(i)\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">content_copy</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n class=\\\"remove-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"removeCharset(i)\\\"\\n [disabled]=\\\"this.charsets?.value.length === 1\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">remove</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"addCharset()\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">add</mat-icon>\\n </button>\\n </div>\\n }\\n </div>\\n </div>\\n <mat-form-field class=\\\"fixed-width\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">suffix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"suffix\\\"\\n formControlName=\\\"suffix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n </form>\\n }\\n </div>\\n @if (hasWordlist()) {\\n <div class=\\\"wordlist-container flex-column flex-fxflex\\\">\\n @if (displayWordlist()) {\\n <h3 class=\\\"wordlist-header\\\">Generated wordlist:</h3>\\n <code class=\\\"wordlist\\\">\\n {{ wordlist() }}\\n </code>\\n } @else {\\n The generated wordlist is too large to be displayed. You can still\\n download it.\\n <!-- Wordlist is already loaded in the signal for large datasets -->\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\\n\"] }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAsV0FBVyxFQUNYLGVBQWUsRUFDaEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBRW5CLGtCQUFrQixFQUVsQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUs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QVcsOGZBQ1gsT0FBTyx1Y0FDUCxhQUFhLG1MQUNiLG9CQUFvQjs7MkZBSVgsMEJBQTBCO2tCQW5CdEMsU0FBUzsrQkFDRSxvQkFBb0IsaUJBR2YsaUJBQWlCLENBQUMsSUFBSSxXQUM1Qjt3QkFDUCxlQUFlO3dCQUNmLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxXQUFXO3dCQUNYLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixvQkFBb0I7cUJBQ3JCLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2RrRHJhZyxcbiAgQ2RrRHJhZ0Ryb3AsXG4gIENka0Ryb3BMaXN0LFxuICBtb3ZlSXRlbUluQXJyYXlcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPbkRlc3Ryb3ksXG4gIHNpZ25hbCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBVbnR5cGVkRm9ybUFycmF5LFxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gIFVudHlwZWRGb3JtR3JvdXAsXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgcmVkdWNlLCBzaGFyZVJlcGxheSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBGaWxlVHlwZSB9IGZyb20gJy4vZmlsZXR5cGVzJztcbmltcG9ydCB7IHRvQ1NWLCB0b1BsYWludGV4dCwgdG9YTUwgfSBmcm9tICcuL3BhcnNlcnMnO1xuaW1wb3J0IHsgV29yZGxpc3RHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi93b3JkbGlzdC1nZW5lcmF0b3Iuc2VydmljZSc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3IgKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dvcmRsaXN0LWdlbmVyYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi93b3JkbGlzdC1nZW5lcmF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi93b3JkbGlzdC1nZW5lcmF0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBOZ1N0eWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgQ2RrRHJvcExpc3QsXG4gICAgQ2RrRHJhZyxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIE1hdFByb2dyZXNzQmFyTW9kdWxlXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFdvcmRsaXN0R2VuZXJhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBmb3JtQnVpbGRlciA9IGluamVjdChVbnR5cGVkRm9ybUJ1aWxkZXIpO1xuICBwcml2YXRlIHdvcmRsaXN0R2VuZXJhdG9yID0gaW5qZWN0KFdvcmRsaXN0R2VuZXJhdG9yU2VydmljZSk7XG5cbiAgYnV0dG9uU3R5bGUgPSBpbnB1dCh7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzMzMzMzMycsXG4gICAgY29sb3I6ICcjY2M3ODMyJ1xuICB9KTtcblxuICBkcmFnU3R5bGUgPSBpbnB1dCh7IGNvbG9yOiAnI2NjNzgzMicgfSk7XG4gIHRleHRTdHlsZSA9IGlucHV0KHsgY29sb3I6ICcjY2M3ODMyJyB9KTtcblxuICBjaGFyc2V0Rm9ybTogVW50eXBlZEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcbiAgd29yZGxpc3QgPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgZGlzcGxheVdvcmRsaXN0ID0gc2lnbmFsKGZhbHNlKTtcbiAgZmlsZVR5cGUgPSBzaWduYWwoRmlsZVR5cGUucGxhaW50ZXh0KTtcbiAgZmlsZVR5cGVzID0gT2JqZWN0LnZhbHVlcyhGaWxlVHlwZSk7XG4gIGZpbHRlcmVkQ2hhcnNldCA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuICBwcmVmaXggPSBzaWduYWwoJycpO1xuICBzdWZmaXggPSBzaWduYWwoJycpO1xuICBpc0dlbmVyYXRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBpc0xhcmdlRGF0YXNldCA9IHNpZ25hbChmYWxzZSk7XG4gIHdvcmRzR2VuZXJhdGVkID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBjYW5HZW5lcmF0ZSA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuY2hhcnNldEZvcm0/LnZhbGlkICYmIHRoaXMuZmlsdGVyZWRDaGFyc2V0KCkubGVuZ3RoID4gMFxuICApO1xuXG4gIGhhc1dvcmRsaXN0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy53b3JkbGlzdCgpLmxlbmd0aCA+IDApO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmdlbmVyYXRlRm9ybSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBnZXQgY2hhcnNldHMoKTogVW50eXBlZEZvcm1BcnJheSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldEZvcm0pIHtcbiAgICAgIHJldHVybiB0aGlzLmNoYXJzZXRGb3JtLmdldCgnY2hhcnNldHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgYWRkQ2hhcnNldCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0cykge1xuICAgICAgdGhpcy5jaGFyc2V0cy5wdXNoKHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCkpO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lQ2hhcnNldChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIGNvbnN0IGNoYXJzZXQgPSB0aGlzLmNoYXJzZXRzLnZhbHVlW2luZGV4XTtcbiAgICAgIHRoaXMuY2hhcnNldHMuaW5zZXJ0KFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKGNoYXJzZXQsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkV29yZGxpc3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRDaGFyc2V0ID0gdGhpcy5maWx0ZXJDaGFyc2V0KHRoaXMuY2hhcnNldHMudmFsdWUpO1xuICAgICAgaWYgKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlcmVkQ2hhcnNldCgpKSAhPT1cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoY3VycmVudENoYXJzZXQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVdvcmRsaXN0KCk7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IGB3b3JkbGlzdF8ke3RoaXMud29yZHNHZW5lcmF0ZWQoKX1fd29yZHNfJHt0aGlzLmNoYXJzZXRzLmxlbmd0aH1fcG9zaXRpb25zLiR7dGhpcy5maWxlVHlwZSgpfWA7XG4gICAgICBjb25zdCB3b3JkbGlzdENvbnRlbnQgPSB0aGlzLndvcmRsaXN0KCk7XG5cbiAgICAgIGlmICh3b3JkbGlzdENvbnRlbnQgJiYgd29yZGxpc3RDb250ZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5wZXJmb3JtRG93bmxvYWQod29yZGxpc3RDb250ZW50LCBmaWxlbmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwZXJmb3JtRG93bmxvYWQod29yZGxpc3RDb250ZW50OiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlV29yZGxpc3Qod29yZGxpc3RDb250ZW50KTtcbiAgICBjb25zdCBmaWxlID0gbmV3IEJsb2IoW3BhcnNlZC53b3JkbGlzdF0sIHtcbiAgICAgIHR5cGU6IHBhcnNlZC5jb250ZW50VHlwZVxuICAgIH0pO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKCh3aW5kb3cubmF2aWdhdG9yIGFzIGFueSkubXNTYXZlT3JPcGVuQmxvYikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICh3aW5kb3cubmF2aWdhdG9yIGFzIGFueSkubXNTYXZlT3JPcGVuQmxvYihmaWxlLCBmaWxlbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgIGEuY2xpY2soKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIG1vdmVJdGVtSW5BcnJheShcbiAgICAgICAgdGhpcy5jaGFyc2V0cy5jb250cm9scyxcbiAgICAgICAgZXZlbnQucHJldmlvdXNJbmRleCxcbiAgICAgICAgZXZlbnQuY3VycmVudEluZGV4XG4gICAgICApO1xuICAgICAgdGhpcy5jaGFyc2V0cy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnNldEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGNoYXJzZXRzOiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgICAgXSksXG4gICAgICBwcmVmaXg6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCgnJyksXG4gICAgICBzdWZmaXg6IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCgnJylcbiAgICB9KTtcbiAgfVxuXG4gIGdlbmVyYXRlV29yZGxpc3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldEZvcm0gJiYgdGhpcy5jaGFyc2V0cyAmJiB0aGlzLmNoYXJzZXRzLnZhbGlkKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQ2hhcnNldC5zZXQodGhpcy5maWx0ZXJDaGFyc2V0KHRoaXMuY2hhcnNldHMudmFsdWUpKTtcbiAgICAgIHRoaXMucHJlZml4LnNldCh0aGlzLmNoYXJzZXRGb3JtLmdldCgncHJlZml4Jyk/LnZhbHVlIHx8ICcnKTtcbiAgICAgIHRoaXMuc3VmZml4LnNldCh0aGlzLmNoYXJzZXRGb3JtLmdldCgnc3VmZml4Jyk/LnZhbHVlIHx8ICcnKTtcblxuICAgICAgY29uc3Qgd29yZHNDb3VudCA9IHRoaXMuZmlsdGVyZWRDaGFyc2V0KClcbiAgICAgICAgLm1hcCgoY2hhcnNldDogc3RyaW5nKSA9PiBjaGFyc2V0Lmxlbmd0aClcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAocHJldmlvdXNMZW5ndGg6IG51bWJlciwgY3VycmVudExlbmd0aDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgcHJldmlvdXNMZW5ndGggKiBjdXJyZW50TGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgIHRoaXMud29yZHNHZW5lcmF0ZWQuc2V0KHdvcmRzQ291bnQpO1xuICAgICAgdGhpcy5pc0xhcmdlRGF0YXNldC5zZXQod29yZHNDb3VudCA+IDUwMDAwKTtcbiAgICAgIHRoaXMuZGlzcGxheVdvcmRsaXN0LnNldCh3b3Jkc0NvdW50IDw9IDEwMCk7XG4gICAgICB0aGlzLmlzR2VuZXJhdGluZy5zZXQodHJ1ZSk7XG5cbiAgICAgIC8vIEdlbmVyYXRlIHdvcmRsaXN0IGFuZCB1cGRhdGUgc2lnbmFsXG4gICAgICB0aGlzLmdldFdvcmRsaXN0KClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHdvcmRsaXN0KSA9PiB0aGlzLndvcmRsaXN0LnNldCh3b3JkbGlzdCksXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyB3b3JkbGlzdDonLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLmlzR2VuZXJhdGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXb3JkbGlzdCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLndvcmRsaXN0R2VuZXJhdG9yXG4gICAgICAuZ2VuZXJhdGVXb3JkbGlzdCguLi50aGlzLmZpbHRlcmVkQ2hhcnNldCgpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSksXG4gICAgICAgIHJlZHVjZShcbiAgICAgICAgICAod29yZGxpc3Q6IHN0cmluZywgd29yZDogc3RyaW5nKSA9PlxuICAgICAgICAgICAgYCR7d29yZGxpc3R9JHt0aGlzLnByZWZpeCgpfSR7d29yZH0ke3RoaXMuc3VmZml4KCl9XFxuYCxcbiAgICAgICAgICAnJ1xuICAgICAgICApLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc0dlbmVyYXRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgICk7XG4gIH1cblxuICBmaWx0ZXJDaGFyc2V0KGNoYXJzZXRzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gY2hhcnNldHMubWFwKChjaGFyc2V0OiBzdHJpbmcpID0+IHRoaXMucmVtb3ZlRHVwbGljYXRlcyhjaGFyc2V0KSk7XG4gIH1cblxuICBwYXJzZVdvcmRsaXN0KHdvcmRsaXN0OiBzdHJpbmcpOiB7IHdvcmRsaXN0OiBzdHJpbmc7IGNvbnRlbnRUeXBlOiBzdHJpbmcgfSB7XG4gICAgc3dpdGNoICh0aGlzLmZpbGVUeXBlKCkpIHtcbiAgICAgIGNhc2UgRmlsZVR5cGUucGxhaW50ZXh0OlxuICAgICAgICByZXR1cm4gdG9QbGFpbnRleHQod29yZGxpc3QpO1xuICAgICAgY2FzZSBGaWxlVHlwZS54bWw6XG4gICAgICAgIHJldHVybiB0b1hNTCh3b3JkbGlzdCk7XG4gICAgICBjYXNlIEZpbGVUeXBlLmNzdjpcbiAgICAgICAgcmV0dXJuIHRvQ1NWKHdvcmRsaXN0KTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGFyc2V0KGk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzICYmIHRoaXMuY2hhcnNldHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5jaGFyc2V0cy5yZW1vdmVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVEdXBsaWNhdGVzID0gKHVuZmlsdGVyZWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIFsuLi5uZXcgU2V0KHVuZmlsdGVyZWQpXS5qb2luKCcnKTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJtZXRhLWNvbnRhaW5lciBmbGV4LXJvdy13cmFwXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBmbGV4LWNvbHVtbiBmbGV4LWZ4ZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy13cmFwIGJvdHRvbS0xMFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImdlbmVyYXRlLXdvcmRsaXN0XCJcbiAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJnZW5lcmF0ZVdvcmRsaXN0KClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNHZW5lcmF0aW5nKClcIlxuICAgICAgPlxuICAgICAgICBAaWYgKGlzR2VuZXJhdGluZygpKSB7XG4gICAgICAgICAgR2VuZXJhdGluZy4uLlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICBHZW5lcmF0ZSB3b3JkbGlzdFxuICAgICAgICB9XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIEBpZiAoaGFzV29yZGxpc3QoKSAmJiAhaXNHZW5lcmF0aW5nKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiY2hvb3NlLWZvcm1hdFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiXG4gICAgICAgID5cbiAgICAgICAgICBDaG9vc2UgZm9ybWF0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICBAZm9yICh0eXBlIG9mIGZpbGVUeXBlczsgdHJhY2sgdHlwZSkge1xuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImJ1dHRvblN0eWxlKClcIlxuICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgKGNsaWNrKT1cImZpbGVUeXBlLnNldCh0eXBlKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdHlwZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L21hdC1tZW51PlxuICAgICAgQGlmIChoYXNXb3JkbGlzdCgpICYmICFpc0dlbmVyYXRpbmcoKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJkb3dubG9hZC13b3JkbGlzdFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRXb3JkbGlzdCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIERvd25sb2FkIGFzXG4gICAgICAgICAgQGlmICh0aGlzLmZpbGVUeXBlKCkpIHtcbiAgICAgICAgICAgIHt7IHRoaXMuZmlsZVR5cGUoKSB9fVxuICAgICAgICAgIH1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKGlzR2VuZXJhdGluZygpICYmIGlzTGFyZ2VEYXRhc2V0KCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1jb250YWluZXJcIj5cbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXJcbiAgICAgICAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXG4gICAgICAgICAgcm9sZT1cInByb2dyZXNzYmFyXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiR2VuZXJhdGluZyB3b3JkbGlzdFwiXG4gICAgICAgID48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgICAgIDxwIFtuZ1N0eWxlXT1cInRleHRTdHlsZSgpXCI+XG4gICAgICAgICAgUHJvY2Vzc2luZyBsYXJnZSBkYXRhc2V0IHVzaW5nIFdlYiBXb3JrZXIuLi5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmIChjaGFyc2V0Rm9ybSkge1xuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJjaGFyc2V0Rm9ybVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmaXhlZC13aWR0aCBib3R0b20tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgIDxtYXQtbGFiZWwgW25nU3R5bGVdPVwidGV4dFN0eWxlKClcIj5wcmVmaXggKG9wdGlvbmFsKTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgW25nU3R5bGVdPVwidGV4dFN0eWxlKClcIlxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGlkPVwicHJlZml4XCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInByZWZpeFwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiY2hhcnNldHNcIj5cbiAgICAgICAgICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG4gICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgY2hhcnNldCBvZiBjaGFyc2V0cz8uY29udHJvbHM7XG4gICAgICAgICAgICAgIHRyYWNrIGNoYXJzZXQ7XG4gICAgICAgICAgICAgIGxldCBpID0gJGluZGV4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJzZXQtY29udGFpbmVyXCIgY2RrRHJhZz5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJkcmFnLWluZGljYXRvclwiIFtuZ1N0eWxlXT1cImRyYWdTdHlsZSgpXCJcbiAgICAgICAgICAgICAgICAgID5kcmFnX2luZGljYXRvcjwvbWF0LWljb25cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiY2hhcnNldCBib3R0b20tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiPlxuICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc2V0IGZvciBzdHJpbmcgcG9zaXRpb24ge3sgaSB9fVxuICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwidGV4dFN0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwicG9zaXRpb24te3sgaSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbG9uZS1jaGFyc2V0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImJ1dHRvblN0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsb25lQ2hhcnNldChpKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicm93LWJ1dHRvbi1pY29uXCI+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZW1vdmUtY2hhcnNldFwiXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJidXR0b25TdHlsZSgpXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDaGFyc2V0KGkpXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzLmNoYXJzZXRzPy52YWx1ZS5sZW5ndGggPT09IDFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInJvdy1idXR0b24taWNvblwiPnJlbW92ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImJ1dHRvblN0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZENoYXJzZXQoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicm93LWJ1dHRvbi1pY29uXCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmaXhlZC13aWR0aFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiPnN1ZmZpeCAob3B0aW9uYWwpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgaWQ9XCJzdWZmaXhcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic3VmZml4XCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9mb3JtPlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAoaGFzV29yZGxpc3QoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJ3b3JkbGlzdC1jb250YWluZXIgZmxleC1jb2x1bW4gZmxleC1meGZsZXhcIj5cbiAgICAgIEBpZiAoZGlzcGxheVdvcmRsaXN0KCkpIHtcbiAgICAgICAgPGgzIGNsYXNzPVwid29yZGxpc3QtaGVhZGVyXCI+R2VuZXJhdGVkIHdvcmRsaXN0OjwvaDM+XG4gICAgICAgIDxjb2RlIGNsYXNzPVwid29yZGxpc3RcIj5cbiAgICAgICAgICB7eyB3b3JkbGlzdCgpIH19XG4gICAgICAgIDwvY29kZT5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICBUaGUgZ2VuZXJhdGVkIHdvcmRsaXN0IGlzIHRvbyBsYXJnZSB0byBiZSBkaXNwbGF5ZWQuIFlvdSBjYW4gc3RpbGxcbiAgICAgICAgZG93bmxvYWQgaXQuXG4gICAgICAgIDwhLS0gV29yZGxpc3QgaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHNpZ25hbCBmb3IgbGFyZ2UgZGF0YXNldHMgLS0+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVodzBsZi13b3JkbGlzdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvdGVodzBsZi13b3JkbGlzdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0="],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,8 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnInit, OnDestroy } from '@angular/core';
2
+ import { OnDestroy } from '@angular/core';
3
3
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
4
4
  import { UntypedFormGroup, UntypedFormArray } from '@angular/forms';
5
- import { Observable } from 'rxjs';
6
5
 
7
6
  declare enum FileType {
8
7
  plaintext = "txt",
@@ -10,7 +9,7 @@ declare enum FileType {
10
9
  csv = "csv"
11
10
  }
12
11
 
13
- declare class WordlistGeneratorComponent implements OnInit, OnDestroy {
12
+ declare class WordlistGeneratorComponent implements OnDestroy {
14
13
  private formBuilder;
15
14
  private wordlistGenerator;
16
15
  buttonStyle: _angular_core.InputSignal<{
@@ -24,25 +23,30 @@ declare class WordlistGeneratorComponent implements OnInit, OnDestroy {
24
23
  color: string;
25
24
  }>;
26
25
  charsetForm: UntypedFormGroup | undefined;
27
- wordsGenerated: number | undefined;
28
- wordlist$: Observable<string> | undefined;
29
- displayWordlist: boolean;
30
- fileType: FileType;
26
+ wordlist: _angular_core.WritableSignal<string>;
27
+ displayWordlist: _angular_core.WritableSignal<boolean>;
28
+ fileType: _angular_core.WritableSignal<FileType>;
31
29
  fileTypes: FileType[];
32
- filteredCharset: string[];
33
- prefix: string;
34
- suffix: string;
30
+ filteredCharset: _angular_core.WritableSignal<string[]>;
31
+ prefix: _angular_core.WritableSignal<string>;
32
+ suffix: _angular_core.WritableSignal<string>;
33
+ isGenerating: _angular_core.WritableSignal<boolean>;
34
+ isLargeDataset: _angular_core.WritableSignal<boolean>;
35
+ wordsGenerated: _angular_core.WritableSignal<number | undefined>;
36
+ canGenerate: _angular_core.Signal<boolean | undefined>;
37
+ hasWordlist: _angular_core.Signal<boolean>;
35
38
  private unsubscribe$;
36
- ngOnInit(): void;
39
+ constructor();
37
40
  ngOnDestroy(): void;
38
41
  get charsets(): UntypedFormArray | undefined;
39
42
  addCharset(): void;
40
43
  cloneCharset(index: number): void;
41
44
  downloadWordlist(): void;
45
+ private performDownload;
42
46
  drop(event: CdkDragDrop<string[]>): void;
43
47
  generateForm(): void;
44
48
  generateWordlist(): void;
45
- getWordlist(): Observable<string>;
49
+ private getWordlist;
46
50
  filterCharset(charsets: string[]): string[];
47
51
  parseWordlist(wordlist: string): {
48
52
  wordlist: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tehw0lf/wordlist-generator",
3
- "version": "0.20.4",
3
+ "version": "0.20.5",
4
4
  "license": "MIT",
5
5
  "homepage": "https://github.com/tehw0lf/tehwolf.de.git",
6
6
  "repository": {