@tehw0lf/wordlist-generator 0.14.4 → 0.17.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/esm2022/index.mjs +2 -0
- package/{esm2020 → esm2022}/lib/filetypes.mjs +2 -1
- package/esm2022/lib/parsers.mjs +21 -0
- package/esm2022/lib/wordlist-generator.component.mjs +180 -0
- package/{esm2020 → esm2022}/lib/wordlist-generator.service.mjs +5 -5
- package/fesm2022/tehw0lf-wordlist-generator.mjs +232 -0
- package/fesm2022/tehw0lf-wordlist-generator.mjs.map +1 -0
- package/index.d.ts +0 -1
- package/lib/filetypes.d.ts +2 -1
- package/lib/parsers.d.ts +4 -0
- package/lib/wordlist-generator.component.d.ts +1 -1
- package/package.json +15 -25
- package/esm2020/index.mjs +0 -3
- package/esm2020/lib/parsers.mjs +0 -14
- package/esm2020/lib/wordlist-generator.component.mjs +0 -161
- package/esm2020/lib/wordlist-generator.module.mjs +0 -62
- package/fesm2015/tehw0lf-wordlist-generator.mjs +0 -262
- package/fesm2015/tehw0lf-wordlist-generator.mjs.map +0 -1
- package/fesm2020/tehw0lf-wordlist-generator.mjs +0 -261
- package/fesm2020/tehw0lf-wordlist-generator.mjs.map +0 -1
- package/lib/wordlist-generator.module.d.ts +0 -18
- package/schematics/collection.json +0 -16
- package/schematics/ng-add/index.d.ts +0 -3
- package/schematics/ng-add/index.js +0 -46
- package/schematics/ng-add/index.js.map +0 -1
- package/schematics/ng-add/index.spec.d.ts +0 -1
- package/schematics/ng-add/index.spec.js +0 -102
- package/schematics/ng-add/index.spec.js.map +0 -1
- package/schematics/ng-add/package-config.d.ts +0 -12
- package/schematics/ng-add/package-config.js +0 -48
- package/schematics/ng-add/package-config.js.map +0 -1
- package/schematics/ng-add/schema.d.ts +0 -3
- package/schematics/ng-add/schema.js +0 -3
- package/schematics/ng-add/schema.js.map +0 -1
- package/schematics/ng-add/schema.json +0 -16
- package/schematics/ng-add/setup.d.ts +0 -3
- package/schematics/ng-add/setup.js +0 -50
- package/schematics/ng-add/setup.js.map +0 -1
- package/schematics/testing/file-content.d.ts +0 -10
- package/schematics/testing/file-content.js +0 -13
- package/schematics/testing/file-content.js.map +0 -1
- package/schematics/testing/test-app.d.ts +0 -12
- package/schematics/testing/test-app.js +0 -44
- package/schematics/testing/test-app.js.map +0 -1
- package/schematics/testing/test-library.d.ts +0 -11
- package/schematics/testing/test-library.js +0 -21
- package/schematics/testing/test-library.js.map +0 -1
- package/schematics/testing/test-project.d.ts +0 -11
- package/schematics/testing/test-project.js +0 -36
- package/schematics/testing/test-project.js.map +0 -1
- /package/{esm2020 → esm2022}/tehw0lf-wordlist-generator.mjs +0 -0
package/README.md
CHANGED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './lib/wordlist-generator.component';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQ0FBb0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL3dvcmRsaXN0LWdlbmVyYXRvci5jb21wb25lbnQnO1xuIl19
|
|
@@ -3,5 +3,6 @@ export var FileType;
|
|
|
3
3
|
(function (FileType) {
|
|
4
4
|
FileType["plaintext"] = "txt";
|
|
5
5
|
FileType["xml"] = "xml";
|
|
6
|
+
FileType["csv"] = "csv";
|
|
6
7
|
})(FileType || (FileType = {}));
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy93b3JkbGlzdC1nZW5lcmF0b3Ivc3JjL2xpYi9maWxldHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOEJBQThCO0FBQzlCLE1BQU0sQ0FBTixJQUFZLFFBSVg7QUFKRCxXQUFZLFFBQVE7SUFDbEIsNkJBQWlCLENBQUE7SUFDakIsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7QUFDYixDQUFDLEVBSlcsUUFBUSxLQUFSLFFBQVEsUUFJbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1zaGFkb3cgKi9cbmV4cG9ydCBlbnVtIEZpbGVUeXBlIHtcbiAgcGxhaW50ZXh0ID0gJ3R4dCcsXG4gIHhtbCA9ICd4bWwnLFxuICBjc3YgPSAnY3N2J1xufVxuIl19
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const toPlaintext = (wordlist) => ({
|
|
2
|
+
wordlist,
|
|
3
|
+
contentType: 'text/plain'
|
|
4
|
+
});
|
|
5
|
+
export const toXML = (wordlist) => {
|
|
6
|
+
const head = '<wordlist><word>';
|
|
7
|
+
const glue = '</word><word>';
|
|
8
|
+
const tail = '</word></wordlist>';
|
|
9
|
+
return {
|
|
10
|
+
wordlist: head + wordlist.replace(/\n/g, glue) + tail,
|
|
11
|
+
contentType: 'text/xml'
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
export const toCSV = (wordlist) => {
|
|
15
|
+
const glue = ',';
|
|
16
|
+
return {
|
|
17
|
+
wordlist: wordlist.replace(/\n/g, glue),
|
|
18
|
+
contentType: 'text/csv'
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2Vycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvcGFyc2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FDekIsUUFBZ0IsRUFDMkIsRUFBRSxDQUFDLENBQUM7SUFDL0MsUUFBUTtJQUNSLFdBQVcsRUFBRSxZQUFZO0NBQzFCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUNuQixRQUFnQixFQUMyQixFQUFFO0lBQzdDLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNsQyxPQUFPO1FBQ0wsUUFBUSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJO1FBQ3JELFdBQVcsRUFBRSxVQUFVO0tBQ3hCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FDbkIsUUFBZ0IsRUFDMkIsRUFBRTtJQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7SUFDakIsT0FBTztRQUNMLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7UUFDdkMsV0FBVyxFQUFFLFVBQVU7S0FDeEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0b1BsYWludGV4dCA9IChcbiAgd29yZGxpc3Q6IHN0cmluZ1xuKTogeyB3b3JkbGlzdDogc3RyaW5nOyBjb250ZW50VHlwZTogc3RyaW5nIH0gPT4gKHtcbiAgd29yZGxpc3QsXG4gIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbidcbn0pO1xuXG5leHBvcnQgY29uc3QgdG9YTUwgPSAoXG4gIHdvcmRsaXN0OiBzdHJpbmdcbik6IHsgd29yZGxpc3Q6IHN0cmluZzsgY29udGVudFR5cGU6IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgaGVhZCA9ICc8d29yZGxpc3Q+PHdvcmQ+JztcbiAgY29uc3QgZ2x1ZSA9ICc8L3dvcmQ+PHdvcmQ+JztcbiAgY29uc3QgdGFpbCA9ICc8L3dvcmQ+PC93b3JkbGlzdD4nO1xuICByZXR1cm4ge1xuICAgIHdvcmRsaXN0OiBoZWFkICsgd29yZGxpc3QucmVwbGFjZSgvXFxuL2csIGdsdWUpICsgdGFpbCxcbiAgICBjb250ZW50VHlwZTogJ3RleHQveG1sJ1xuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHRvQ1NWID0gKFxuICB3b3JkbGlzdDogc3RyaW5nXG4pOiB7IHdvcmRsaXN0OiBzdHJpbmc7IGNvbnRlbnRUeXBlOiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGdsdWUgPSAnLCc7XG4gIHJldHVybiB7XG4gICAgd29yZGxpc3Q6IHdvcmRsaXN0LnJlcGxhY2UoL1xcbi9nLCBnbHVlKSxcbiAgICBjb250ZW50VHlwZTogJ3RleHQvY3N2J1xuICB9O1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { CdkDrag, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';
|
|
2
|
+
import { AsyncPipe, NgStyle } from '@angular/common';
|
|
3
|
+
import { Component, Input, ViewEncapsulation } from '@angular/core';
|
|
4
|
+
import { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';
|
|
5
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
7
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
+
import { MatInputModule } from '@angular/material/input';
|
|
9
|
+
import { MatMenuModule } from '@angular/material/menu';
|
|
10
|
+
import { Subject } from 'rxjs';
|
|
11
|
+
import { reduce, takeUntil, tap } from 'rxjs/operators';
|
|
12
|
+
import { FileType } from './filetypes';
|
|
13
|
+
import { toCSV, toPlaintext, toXML } from './parsers';
|
|
14
|
+
import { WordlistGeneratorService } from './wordlist-generator.service';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "@angular/forms";
|
|
17
|
+
import * as i2 from "./wordlist-generator.service";
|
|
18
|
+
import * as i3 from "@angular/material/button";
|
|
19
|
+
import * as i4 from "@angular/material/menu";
|
|
20
|
+
import * as i5 from "@angular/material/form-field";
|
|
21
|
+
import * as i6 from "@angular/material/input";
|
|
22
|
+
import * as i7 from "@angular/material/icon";
|
|
23
|
+
/* eslint-disable @angular-eslint/component-selector */
|
|
24
|
+
export class WordlistGeneratorComponent {
|
|
25
|
+
constructor(formBuilder, wordlistGenerator) {
|
|
26
|
+
this.formBuilder = formBuilder;
|
|
27
|
+
this.wordlistGenerator = wordlistGenerator;
|
|
28
|
+
this.buttonStyle = {
|
|
29
|
+
'background-color': '#333333',
|
|
30
|
+
color: '#cc7832'
|
|
31
|
+
};
|
|
32
|
+
this.dragStyle = { color: '#cc7832' };
|
|
33
|
+
this.textStyle = { color: '#cc7832' };
|
|
34
|
+
this.displayWordlist = false;
|
|
35
|
+
this.fileType = FileType.plaintext;
|
|
36
|
+
this.fileTypes = Object.values(FileType);
|
|
37
|
+
this.filteredCharset = [];
|
|
38
|
+
this.prefix = '';
|
|
39
|
+
this.suffix = '';
|
|
40
|
+
this.unsubscribe$ = new Subject();
|
|
41
|
+
this.removeDuplicates = (unfiltered) => [...new Set(unfiltered)].join('');
|
|
42
|
+
}
|
|
43
|
+
ngOnInit() {
|
|
44
|
+
this.generateForm();
|
|
45
|
+
}
|
|
46
|
+
ngOnDestroy() {
|
|
47
|
+
this.unsubscribe$.next();
|
|
48
|
+
this.unsubscribe$.complete();
|
|
49
|
+
}
|
|
50
|
+
get charsets() {
|
|
51
|
+
if (this.charsetForm) {
|
|
52
|
+
return this.charsetForm.get('charsets');
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
addCharset() {
|
|
57
|
+
if (this.charsets) {
|
|
58
|
+
this.charsets.push(this.formBuilder.control('', Validators.required));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
cloneCharset(index) {
|
|
62
|
+
if (this.charsets) {
|
|
63
|
+
const charset = this.charsets.value[index];
|
|
64
|
+
this.charsets.insert(index, this.formBuilder.control(charset, Validators.required));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
downloadWordlist() {
|
|
68
|
+
if (this.charsets) {
|
|
69
|
+
if (this.filteredCharset !== this.filterCharset(this.charsets.value)) {
|
|
70
|
+
this.generateWordlist();
|
|
71
|
+
}
|
|
72
|
+
const filename = `wordlist_${this.wordsGenerated}_words_${this.charsets.length}_positions.${this.fileType}`;
|
|
73
|
+
this.getWordlist()
|
|
74
|
+
.pipe(tap((wordlist) => {
|
|
75
|
+
if (wordlist.length > 0) {
|
|
76
|
+
const parsed = this.parseWordlist(wordlist);
|
|
77
|
+
const file = new Blob([parsed.wordlist], {
|
|
78
|
+
type: parsed.contentType
|
|
79
|
+
});
|
|
80
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
81
|
+
if (window.navigator.msSaveOrOpenBlob) {
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
83
|
+
window.navigator.msSaveOrOpenBlob(file, filename);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const a = document.createElement('a');
|
|
87
|
+
const url = URL.createObjectURL(file);
|
|
88
|
+
a.href = url;
|
|
89
|
+
a.download = filename;
|
|
90
|
+
document.body.appendChild(a);
|
|
91
|
+
a.click();
|
|
92
|
+
setTimeout(() => {
|
|
93
|
+
document.body.removeChild(a);
|
|
94
|
+
window.URL.revokeObjectURL(url);
|
|
95
|
+
}, 0);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}))
|
|
99
|
+
.subscribe();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
drop(event) {
|
|
103
|
+
if (this.charsets) {
|
|
104
|
+
moveItemInArray(this.charsets.controls, event.previousIndex, event.currentIndex);
|
|
105
|
+
this.charsets.updateValueAndValidity();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
generateForm() {
|
|
109
|
+
this.charsetForm = this.formBuilder.group({
|
|
110
|
+
charsets: this.formBuilder.array([
|
|
111
|
+
this.formBuilder.control('', Validators.required)
|
|
112
|
+
]),
|
|
113
|
+
prefix: this.formBuilder.control(''),
|
|
114
|
+
suffix: this.formBuilder.control('')
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
generateWordlist() {
|
|
118
|
+
if (this.charsetForm && this.charsets && this.charsets.valid) {
|
|
119
|
+
this.filteredCharset = this.filterCharset(this.charsets.value);
|
|
120
|
+
this.prefix = this.charsetForm.get('prefix')?.value
|
|
121
|
+
? this.charsetForm.get('prefix')?.value
|
|
122
|
+
: '';
|
|
123
|
+
this.suffix = this.charsetForm.get('suffix')?.value
|
|
124
|
+
? this.charsetForm.get('suffix')?.value
|
|
125
|
+
: '';
|
|
126
|
+
this.wordsGenerated = this.filteredCharset
|
|
127
|
+
.map((charset) => charset.length)
|
|
128
|
+
.reduce((previousLength, currentLength) => previousLength * currentLength);
|
|
129
|
+
this.displayWordlist = this.wordsGenerated <= 100;
|
|
130
|
+
this.wordlist$ = this.getWordlist();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
getWordlist() {
|
|
134
|
+
return this.wordlistGenerator
|
|
135
|
+
.generateWordlist(...this.filteredCharset)
|
|
136
|
+
.pipe(reduce((wordlist, word) => `${wordlist}${this.prefix}${word}${this.suffix}\n`, ''), takeUntil(this.unsubscribe$));
|
|
137
|
+
}
|
|
138
|
+
filterCharset(charsets) {
|
|
139
|
+
return charsets.map((charset) => this.removeDuplicates(charset));
|
|
140
|
+
}
|
|
141
|
+
parseWordlist(wordlist) {
|
|
142
|
+
switch (this.fileType) {
|
|
143
|
+
case FileType.plaintext:
|
|
144
|
+
return toPlaintext(wordlist);
|
|
145
|
+
case FileType.xml:
|
|
146
|
+
return toXML(wordlist);
|
|
147
|
+
case FileType.csv:
|
|
148
|
+
return toCSV(wordlist);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
removeCharset(i) {
|
|
152
|
+
if (this.charsets && this.charsets.length > 1) {
|
|
153
|
+
this.charsets.removeAt(i);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WordlistGeneratorComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.WordlistGeneratorService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
157
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: WordlistGeneratorComponent, isStandalone: true, selector: "wordlist-generator", inputs: { buttonStyle: "buttonStyle", dragStyle: "dragStyle", textStyle: "textStyle" }, 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: [".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}.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}.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}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.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: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.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: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
158
|
+
}
|
|
159
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{
|
|
160
|
+
type: Component,
|
|
161
|
+
args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, standalone: true, imports: [
|
|
162
|
+
MatButtonModule,
|
|
163
|
+
NgStyle,
|
|
164
|
+
MatMenuModule,
|
|
165
|
+
ReactiveFormsModule,
|
|
166
|
+
MatFormFieldModule,
|
|
167
|
+
MatInputModule,
|
|
168
|
+
CdkDropList,
|
|
169
|
+
CdkDrag,
|
|
170
|
+
MatIconModule,
|
|
171
|
+
AsyncPipe
|
|
172
|
+
], 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: [".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}.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}.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}\n"] }]
|
|
173
|
+
}], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i2.WordlistGeneratorService }], propDecorators: { buttonStyle: [{
|
|
174
|
+
type: Input
|
|
175
|
+
}], dragStyle: [{
|
|
176
|
+
type: Input
|
|
177
|
+
}], textStyle: [{
|
|
178
|
+
type: Input
|
|
179
|
+
}] } });
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAsV0FBVyxFQUNYLGVBQWUsRUFDaEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUdMLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBRW5CLGtCQUFrQixFQUVsQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxLQUFL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cnQge1xuICBDZGtEcmFnLFxuICBDZGtEcmFnRHJvcCxcbiAgQ2RrRHJvcExpc3QsXG4gIG1vdmVJdGVtSW5BcnJheVxufSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBVbnR5cGVkRm9ybUFycmF5LFxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gIFVudHlwZWRGb3JtR3JvdXAsXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyByZWR1Y2UsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBGaWxlVHlwZSB9IGZyb20gJy4vZmlsZXR5cGVzJztcbmltcG9ydCB7IHRvQ1NWLCB0b1BsYWludGV4dCwgdG9YTUwgfSBmcm9tICcuL3BhcnNlcnMnO1xuaW1wb3J0IHsgV29yZGxpc3RHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi93b3JkbGlzdC1nZW5lcmF0b3Iuc2VydmljZSc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3IgKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dvcmRsaXN0LWdlbmVyYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi93b3JkbGlzdC1nZW5lcmF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi93b3JkbGlzdC1nZW5lcmF0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBOZ1N0eWxlLFxuICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgQ2RrRHJvcExpc3QsXG4gICAgQ2RrRHJhZyxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIEFzeW5jUGlwZVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFdvcmRsaXN0R2VuZXJhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBidXR0b25TdHlsZSA9IHtcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjMzMzMzMzJyxcbiAgICBjb2xvcjogJyNjYzc4MzInXG4gIH07XG5cbiAgQElucHV0KCkgZHJhZ1N0eWxlID0geyBjb2xvcjogJyNjYzc4MzInIH07XG4gIEBJbnB1dCgpIHRleHRTdHlsZSA9IHsgY29sb3I6ICcjY2M3ODMyJyB9O1xuXG4gIGNoYXJzZXRGb3JtOiBVbnR5cGVkRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xuICB3b3Jkc0dlbmVyYXRlZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICB3b3JkbGlzdCQ6IE9ic2VydmFibGU8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICBkaXNwbGF5V29yZGxpc3QgPSBmYWxzZTtcbiAgZmlsZVR5cGUgPSBGaWxlVHlwZS5wbGFpbnRleHQ7XG4gIGZpbGVUeXBlcyA9IE9iamVjdC52YWx1ZXMoRmlsZVR5cGUpO1xuICBmaWx0ZXJlZENoYXJzZXQ6IHN0cmluZ1tdID0gW107XG4gIHByZWZpeCA9ICcnO1xuICBzdWZmaXggPSAnJztcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgd29yZGxpc3RHZW5lcmF0b3I6IFdvcmRsaXN0R2VuZXJhdG9yU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZW5lcmF0ZUZvcm0oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZ2V0IGNoYXJzZXRzKCk6IFVudHlwZWRGb3JtQXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRGb3JtKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGFyc2V0Rm9ybS5nZXQoJ2NoYXJzZXRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFkZENoYXJzZXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIHRoaXMuY2hhcnNldHMucHVzaCh0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpKTtcbiAgICB9XG4gIH1cblxuICBjbG9uZUNoYXJzZXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzKSB7XG4gICAgICBjb25zdCBjaGFyc2V0ID0gdGhpcy5jaGFyc2V0cy52YWx1ZVtpbmRleF07XG4gICAgICB0aGlzLmNoYXJzZXRzLmluc2VydChcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChjaGFyc2V0LCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBkb3dubG9hZFdvcmRsaXN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzKSB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJlZENoYXJzZXQgIT09IHRoaXMuZmlsdGVyQ2hhcnNldCh0aGlzLmNoYXJzZXRzLnZhbHVlKSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRlV29yZGxpc3QoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gYHdvcmRsaXN0XyR7dGhpcy53b3Jkc0dlbmVyYXRlZH1fd29yZHNfJHt0aGlzLmNoYXJzZXRzLmxlbmd0aH1fcG9zaXRpb25zLiR7dGhpcy5maWxlVHlwZX1gO1xuICAgICAgdGhpcy5nZXRXb3JkbGlzdCgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgod29yZGxpc3Q6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHdvcmRsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVdvcmRsaXN0KHdvcmRsaXN0KTtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBCbG9iKFtwYXJzZWQud29yZGxpc3RdLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcGFyc2VkLmNvbnRlbnRUeXBlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICBpZiAoKHdpbmRvdy5uYXZpZ2F0b3IgYXMgYW55KS5tc1NhdmVPck9wZW5CbG9iKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAod2luZG93Lm5hdmlnYXRvciBhcyBhbnkpLm1zU2F2ZU9yT3BlbkJsb2IoZmlsZSwgZmlsZW5hbWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcbiAgICAgICAgICAgICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICAgICAgICAgICAgYS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0cykge1xuICAgICAgbW92ZUl0ZW1JbkFycmF5KFxuICAgICAgICB0aGlzLmNoYXJzZXRzLmNvbnRyb2xzLFxuICAgICAgICBldmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICBldmVudC5jdXJyZW50SW5kZXhcbiAgICAgICk7XG4gICAgICB0aGlzLmNoYXJzZXRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZUZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5jaGFyc2V0Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgY2hhcnNldHM6IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW1xuICAgICAgICB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICBdKSxcbiAgICAgIHByZWZpeDogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnKSxcbiAgICAgIHN1ZmZpeDogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnKVxuICAgIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVXb3JkbGlzdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0Rm9ybSAmJiB0aGlzLmNoYXJzZXRzICYmIHRoaXMuY2hhcnNldHMudmFsaWQpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRDaGFyc2V0ID0gdGhpcy5maWx0ZXJDaGFyc2V0KHRoaXMuY2hhcnNldHMudmFsdWUpO1xuICAgICAgdGhpcy5wcmVmaXggPSB0aGlzLmNoYXJzZXRGb3JtLmdldCgncHJlZml4Jyk/LnZhbHVlXG4gICAgICAgID8gdGhpcy5jaGFyc2V0Rm9ybS5nZXQoJ3ByZWZpeCcpPy52YWx1ZVxuICAgICAgICA6ICcnO1xuICAgICAgdGhpcy5zdWZmaXggPSB0aGlzLmNoYXJzZXRGb3JtLmdldCgnc3VmZml4Jyk/LnZhbHVlXG4gICAgICAgID8gdGhpcy5jaGFyc2V0Rm9ybS5nZXQoJ3N1ZmZpeCcpPy52YWx1ZVxuICAgICAgICA6ICcnO1xuXG4gICAgICB0aGlzLndvcmRzR2VuZXJhdGVkID0gdGhpcy5maWx0ZXJlZENoYXJzZXRcbiAgICAgICAgLm1hcCgoY2hhcnNldDogc3RyaW5nKSA9PiBjaGFyc2V0Lmxlbmd0aClcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAocHJldmlvdXNMZW5ndGg6IG51bWJlciwgY3VycmVudExlbmd0aDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgcHJldmlvdXNMZW5ndGggKiBjdXJyZW50TGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB0aGlzLmRpc3BsYXlXb3JkbGlzdCA9IHRoaXMud29yZHNHZW5lcmF0ZWQgPD0gMTAwO1xuICAgICAgdGhpcy53b3JkbGlzdCQgPSB0aGlzLmdldFdvcmRsaXN0KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0V29yZGxpc3QoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53b3JkbGlzdEdlbmVyYXRvclxuICAgICAgLmdlbmVyYXRlV29yZGxpc3QoLi4udGhpcy5maWx0ZXJlZENoYXJzZXQpXG4gICAgICAucGlwZShcbiAgICAgICAgcmVkdWNlKFxuICAgICAgICAgICh3b3JkbGlzdDogc3RyaW5nLCB3b3JkOiBzdHJpbmcpID0+XG4gICAgICAgICAgICBgJHt3b3JkbGlzdH0ke3RoaXMucHJlZml4fSR7d29yZH0ke3RoaXMuc3VmZml4fVxcbmAsXG4gICAgICAgICAgJydcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKVxuICAgICAgKTtcbiAgfVxuXG4gIGZpbHRlckNoYXJzZXQoY2hhcnNldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBjaGFyc2V0cy5tYXAoKGNoYXJzZXQ6IHN0cmluZykgPT4gdGhpcy5yZW1vdmVEdXBsaWNhdGVzKGNoYXJzZXQpKTtcbiAgfVxuXG4gIHBhcnNlV29yZGxpc3Qod29yZGxpc3Q6IHN0cmluZyk6IHsgd29yZGxpc3Q6IHN0cmluZzsgY29udGVudFR5cGU6IHN0cmluZyB9IHtcbiAgICBzd2l0Y2ggKHRoaXMuZmlsZVR5cGUpIHtcbiAgICAgIGNhc2UgRmlsZVR5cGUucGxhaW50ZXh0OlxuICAgICAgICByZXR1cm4gdG9QbGFpbnRleHQod29yZGxpc3QpO1xuICAgICAgY2FzZSBGaWxlVHlwZS54bWw6XG4gICAgICAgIHJldHVybiB0b1hNTCh3b3JkbGlzdCk7XG4gICAgICBjYXNlIEZpbGVUeXBlLmNzdjpcbiAgICAgICAgcmV0dXJuIHRvQ1NWKHdvcmRsaXN0KTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGFyc2V0KGk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzICYmIHRoaXMuY2hhcnNldHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5jaGFyc2V0cy5yZW1vdmVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVEdXBsaWNhdGVzID0gKHVuZmlsdGVyZWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIFsuLi5uZXcgU2V0KHVuZmlsdGVyZWQpXS5qb2luKCcnKTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJtZXRhLWNvbnRhaW5lciBmbGV4LXJvdy13cmFwXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBmbGV4LWNvbHVtbiBmbGV4LWZ4ZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy13cmFwIGJvdHRvbS0xMFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImdlbmVyYXRlLXdvcmRsaXN0XCJcbiAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGVcIlxuICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAoY2xpY2spPVwiZ2VuZXJhdGVXb3JkbGlzdCgpXCJcbiAgICAgID5cbiAgICAgICAgR2VuZXJhdGUgd29yZGxpc3RcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgQGlmICh3b3JkbGlzdCQpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiY2hvb3NlLWZvcm1hdFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGVcIlxuICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIlxuICAgICAgICA+XG4gICAgICAgICAgQ2hvb3NlIGZvcm1hdFxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgQGZvciAodHlwZSBvZiBmaWxlVHlwZXM7IHRyYWNrIHR5cGUpIHtcbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJidXR0b25TdHlsZVwiXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZmlsZVR5cGUgPSB0eXBlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0eXBlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvbWF0LW1lbnU+XG4gICAgICBAaWYgKHdvcmRsaXN0JCkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJkb3dubG9hZC13b3JkbGlzdFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGVcIlxuICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkV29yZGxpc3QoKVwiXG4gICAgICAgID5cbiAgICAgICAgICBEb3dubG9hZCBhc1xuICAgICAgICAgIEBpZiAodGhpcy5maWxlVHlwZSkge1xuICAgICAgICAgICAge3sgdGhpcy5maWxlVHlwZSB9fVxuICAgICAgICAgIH1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgQGlmIChjaGFyc2V0Rm9ybSkge1xuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJjaGFyc2V0Rm9ybVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmaXhlZC13aWR0aCBib3R0b20tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgIDxtYXQtbGFiZWwgW25nU3R5bGVdPVwidGV4dFN0eWxlXCI+cHJlZml4IChvcHRpb25hbCk8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInRleHRTdHlsZVwiXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgaWQ9XCJwcmVmaXhcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJlZml4XCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJjaGFyc2V0c1wiPlxuICAgICAgICAgIDxkaXYgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIj5cbiAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICBjaGFyc2V0IG9mIGNoYXJzZXRzPy5jb250cm9scztcbiAgICAgICAgICAgICAgdHJhY2sgY2hhcnNldDtcbiAgICAgICAgICAgICAgbGV0IGkgPSAkaW5kZXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhcnNldC1jb250YWluZXJcIiBjZGtEcmFnPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImRyYWctaW5kaWNhdG9yXCIgW25nU3R5bGVdPVwiZHJhZ1N0eWxlXCJcbiAgICAgICAgICAgICAgICAgID5kcmFnX2luZGljYXRvcjwvbWF0LWljb25cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiY2hhcnNldCBib3R0b20tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ0ZXh0U3R5bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIHNldCBmb3Igc3RyaW5nIHBvc2l0aW9uIHt7IGkgfX1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInRleHRTdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwb3NpdGlvbi17eyBpIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNsb25lLWNoYXJzZXRcIlxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsb25lQ2hhcnNldChpKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicm93LWJ1dHRvbi1pY29uXCI+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZW1vdmUtY2hhcnNldFwiXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJidXR0b25TdHlsZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ2hhcnNldChpKVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpcy5jaGFyc2V0cz8udmFsdWUubGVuZ3RoID09PSAxXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJyb3ctYnV0dG9uLWljb25cIj5yZW1vdmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJidXR0b25TdHlsZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQ2hhcnNldCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJyb3ctYnV0dG9uLWljb25cIj5hZGQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZpeGVkLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsIFtuZ1N0eWxlXT1cInRleHRTdHlsZVwiPnN1ZmZpeCAob3B0aW9uYWwpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ0ZXh0U3R5bGVcIlxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGlkPVwic3VmZml4XCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInN1ZmZpeFwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZm9ybT5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKHdvcmRsaXN0JCkge1xuICAgIDxkaXYgY2xhc3M9XCJ3b3JkbGlzdC1jb250YWluZXIgZmxleC1jb2x1bW4gZmxleC1meGZsZXhcIj5cbiAgICAgIEBpZiAoZGlzcGxheVdvcmRsaXN0KSB7XG4gICAgICAgIDxoMyBjbGFzcz1cIndvcmRsaXN0LWhlYWRlclwiPkdlbmVyYXRlZCB3b3JkbGlzdDo8L2gzPlxuICAgICAgICA8Y29kZSBjbGFzcz1cIndvcmRsaXN0XCI+XG4gICAgICAgICAge3sgd29yZGxpc3QkIHwgYXN5bmMgfX1cbiAgICAgICAgPC9jb2RlPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIFRoZSBnZW5lcmF0ZWQgd29yZGxpc3QgaXMgdG9vIGxhcmdlIHRvIGJlIGRpc3BsYXllZC4gWW91IGNhbiBzdGlsbFxuICAgICAgICBkb3dubG9hZCBpdC5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG4iXX0=
|
|
@@ -12,13 +12,13 @@ export class WordlistGeneratorService {
|
|
|
12
12
|
return word.join('');
|
|
13
13
|
}));
|
|
14
14
|
}
|
|
15
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
16
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' }); }
|
|
15
17
|
}
|
|
16
|
-
|
|
17
|
-
WordlistGeneratorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' });
|
|
18
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: WordlistGeneratorService, decorators: [{
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WordlistGeneratorService, decorators: [{
|
|
19
19
|
type: Injectable,
|
|
20
20
|
args: [{
|
|
21
21
|
providedIn: 'root'
|
|
22
22
|
}]
|
|
23
|
-
}], ctorParameters:
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
}], ctorParameters: () => [] });
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvbGliL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUtyQyxNQUFNLE9BQU8sd0JBQXdCO0lBQ25DO1FBQ0UsRUFBRTtJQUNKLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFHLFFBQWtCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFjLEVBQUUsRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7OEdBWFUsd0JBQXdCO2tIQUF4Qix3QkFBd0IsY0FGdkIsTUFBTTs7MkZBRVAsd0JBQXdCO2tCQUhwQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHByb2R1Y3QgfSBmcm9tICdjYXJ0ZXNpYW4tcHJvZHVjdC1nZW5lcmF0b3InO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBXb3JkbGlzdEdlbmVyYXRvclNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvL1xuICB9XG5cbiAgZ2VuZXJhdGVXb3JkbGlzdCguLi5jaGFyc2V0czogc3RyaW5nW10pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tKHByb2R1Y3QoLi4uY2hhcnNldHMpKS5waXBlKFxuICAgICAgbWFwKCh3b3JkOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICByZXR1cm4gd29yZC5qb2luKCcnKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { moveItemInArray, CdkDropList, CdkDrag } from '@angular/cdk/drag-drop';
|
|
2
|
+
import { NgStyle, AsyncPipe } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { Injectable, Component, ViewEncapsulation, Input } from '@angular/core';
|
|
5
|
+
import * as i1 from '@angular/forms';
|
|
6
|
+
import { Validators, ReactiveFormsModule } from '@angular/forms';
|
|
7
|
+
import * as i3 from '@angular/material/button';
|
|
8
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
9
|
+
import * as i5 from '@angular/material/form-field';
|
|
10
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
11
|
+
import * as i7 from '@angular/material/icon';
|
|
12
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
13
|
+
import * as i6 from '@angular/material/input';
|
|
14
|
+
import { MatInputModule } from '@angular/material/input';
|
|
15
|
+
import * as i4 from '@angular/material/menu';
|
|
16
|
+
import { MatMenuModule } from '@angular/material/menu';
|
|
17
|
+
import { from, Subject } from 'rxjs';
|
|
18
|
+
import { map, tap, reduce, takeUntil } from 'rxjs/operators';
|
|
19
|
+
import { product } from 'cartesian-product-generator';
|
|
20
|
+
|
|
21
|
+
/* eslint-disable no-shadow */
|
|
22
|
+
var FileType;
|
|
23
|
+
(function (FileType) {
|
|
24
|
+
FileType["plaintext"] = "txt";
|
|
25
|
+
FileType["xml"] = "xml";
|
|
26
|
+
FileType["csv"] = "csv";
|
|
27
|
+
})(FileType || (FileType = {}));
|
|
28
|
+
|
|
29
|
+
const toPlaintext = (wordlist) => ({
|
|
30
|
+
wordlist,
|
|
31
|
+
contentType: 'text/plain'
|
|
32
|
+
});
|
|
33
|
+
const toXML = (wordlist) => {
|
|
34
|
+
const head = '<wordlist><word>';
|
|
35
|
+
const glue = '</word><word>';
|
|
36
|
+
const tail = '</word></wordlist>';
|
|
37
|
+
return {
|
|
38
|
+
wordlist: head + wordlist.replace(/\n/g, glue) + tail,
|
|
39
|
+
contentType: 'text/xml'
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
const toCSV = (wordlist) => {
|
|
43
|
+
const glue = ',';
|
|
44
|
+
return {
|
|
45
|
+
wordlist: wordlist.replace(/\n/g, glue),
|
|
46
|
+
contentType: 'text/csv'
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
class WordlistGeneratorService {
|
|
51
|
+
constructor() {
|
|
52
|
+
//
|
|
53
|
+
}
|
|
54
|
+
generateWordlist(...charsets) {
|
|
55
|
+
return from(product(...charsets)).pipe(map((word) => {
|
|
56
|
+
return word.join('');
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
60
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' }); }
|
|
61
|
+
}
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WordlistGeneratorService, decorators: [{
|
|
63
|
+
type: Injectable,
|
|
64
|
+
args: [{
|
|
65
|
+
providedIn: 'root'
|
|
66
|
+
}]
|
|
67
|
+
}], ctorParameters: () => [] });
|
|
68
|
+
|
|
69
|
+
/* eslint-disable @angular-eslint/component-selector */
|
|
70
|
+
class WordlistGeneratorComponent {
|
|
71
|
+
constructor(formBuilder, wordlistGenerator) {
|
|
72
|
+
this.formBuilder = formBuilder;
|
|
73
|
+
this.wordlistGenerator = wordlistGenerator;
|
|
74
|
+
this.buttonStyle = {
|
|
75
|
+
'background-color': '#333333',
|
|
76
|
+
color: '#cc7832'
|
|
77
|
+
};
|
|
78
|
+
this.dragStyle = { color: '#cc7832' };
|
|
79
|
+
this.textStyle = { color: '#cc7832' };
|
|
80
|
+
this.displayWordlist = false;
|
|
81
|
+
this.fileType = FileType.plaintext;
|
|
82
|
+
this.fileTypes = Object.values(FileType);
|
|
83
|
+
this.filteredCharset = [];
|
|
84
|
+
this.prefix = '';
|
|
85
|
+
this.suffix = '';
|
|
86
|
+
this.unsubscribe$ = new Subject();
|
|
87
|
+
this.removeDuplicates = (unfiltered) => [...new Set(unfiltered)].join('');
|
|
88
|
+
}
|
|
89
|
+
ngOnInit() {
|
|
90
|
+
this.generateForm();
|
|
91
|
+
}
|
|
92
|
+
ngOnDestroy() {
|
|
93
|
+
this.unsubscribe$.next();
|
|
94
|
+
this.unsubscribe$.complete();
|
|
95
|
+
}
|
|
96
|
+
get charsets() {
|
|
97
|
+
if (this.charsetForm) {
|
|
98
|
+
return this.charsetForm.get('charsets');
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
addCharset() {
|
|
103
|
+
if (this.charsets) {
|
|
104
|
+
this.charsets.push(this.formBuilder.control('', Validators.required));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
cloneCharset(index) {
|
|
108
|
+
if (this.charsets) {
|
|
109
|
+
const charset = this.charsets.value[index];
|
|
110
|
+
this.charsets.insert(index, this.formBuilder.control(charset, Validators.required));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
downloadWordlist() {
|
|
114
|
+
if (this.charsets) {
|
|
115
|
+
if (this.filteredCharset !== this.filterCharset(this.charsets.value)) {
|
|
116
|
+
this.generateWordlist();
|
|
117
|
+
}
|
|
118
|
+
const filename = `wordlist_${this.wordsGenerated}_words_${this.charsets.length}_positions.${this.fileType}`;
|
|
119
|
+
this.getWordlist()
|
|
120
|
+
.pipe(tap((wordlist) => {
|
|
121
|
+
if (wordlist.length > 0) {
|
|
122
|
+
const parsed = this.parseWordlist(wordlist);
|
|
123
|
+
const file = new Blob([parsed.wordlist], {
|
|
124
|
+
type: parsed.contentType
|
|
125
|
+
});
|
|
126
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
127
|
+
if (window.navigator.msSaveOrOpenBlob) {
|
|
128
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
129
|
+
window.navigator.msSaveOrOpenBlob(file, filename);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
const a = document.createElement('a');
|
|
133
|
+
const url = URL.createObjectURL(file);
|
|
134
|
+
a.href = url;
|
|
135
|
+
a.download = filename;
|
|
136
|
+
document.body.appendChild(a);
|
|
137
|
+
a.click();
|
|
138
|
+
setTimeout(() => {
|
|
139
|
+
document.body.removeChild(a);
|
|
140
|
+
window.URL.revokeObjectURL(url);
|
|
141
|
+
}, 0);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}))
|
|
145
|
+
.subscribe();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
drop(event) {
|
|
149
|
+
if (this.charsets) {
|
|
150
|
+
moveItemInArray(this.charsets.controls, event.previousIndex, event.currentIndex);
|
|
151
|
+
this.charsets.updateValueAndValidity();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
generateForm() {
|
|
155
|
+
this.charsetForm = this.formBuilder.group({
|
|
156
|
+
charsets: this.formBuilder.array([
|
|
157
|
+
this.formBuilder.control('', Validators.required)
|
|
158
|
+
]),
|
|
159
|
+
prefix: this.formBuilder.control(''),
|
|
160
|
+
suffix: this.formBuilder.control('')
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
generateWordlist() {
|
|
164
|
+
if (this.charsetForm && this.charsets && this.charsets.valid) {
|
|
165
|
+
this.filteredCharset = this.filterCharset(this.charsets.value);
|
|
166
|
+
this.prefix = this.charsetForm.get('prefix')?.value
|
|
167
|
+
? this.charsetForm.get('prefix')?.value
|
|
168
|
+
: '';
|
|
169
|
+
this.suffix = this.charsetForm.get('suffix')?.value
|
|
170
|
+
? this.charsetForm.get('suffix')?.value
|
|
171
|
+
: '';
|
|
172
|
+
this.wordsGenerated = this.filteredCharset
|
|
173
|
+
.map((charset) => charset.length)
|
|
174
|
+
.reduce((previousLength, currentLength) => previousLength * currentLength);
|
|
175
|
+
this.displayWordlist = this.wordsGenerated <= 100;
|
|
176
|
+
this.wordlist$ = this.getWordlist();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
getWordlist() {
|
|
180
|
+
return this.wordlistGenerator
|
|
181
|
+
.generateWordlist(...this.filteredCharset)
|
|
182
|
+
.pipe(reduce((wordlist, word) => `${wordlist}${this.prefix}${word}${this.suffix}\n`, ''), takeUntil(this.unsubscribe$));
|
|
183
|
+
}
|
|
184
|
+
filterCharset(charsets) {
|
|
185
|
+
return charsets.map((charset) => this.removeDuplicates(charset));
|
|
186
|
+
}
|
|
187
|
+
parseWordlist(wordlist) {
|
|
188
|
+
switch (this.fileType) {
|
|
189
|
+
case FileType.plaintext:
|
|
190
|
+
return toPlaintext(wordlist);
|
|
191
|
+
case FileType.xml:
|
|
192
|
+
return toXML(wordlist);
|
|
193
|
+
case FileType.csv:
|
|
194
|
+
return toCSV(wordlist);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
removeCharset(i) {
|
|
198
|
+
if (this.charsets && this.charsets.length > 1) {
|
|
199
|
+
this.charsets.removeAt(i);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WordlistGeneratorComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: WordlistGeneratorService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
203
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: WordlistGeneratorComponent, isStandalone: true, selector: "wordlist-generator", inputs: { buttonStyle: "buttonStyle", dragStyle: "dragStyle", textStyle: "textStyle" }, 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: [".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}.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}.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}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.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: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.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: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
204
|
+
}
|
|
205
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{
|
|
206
|
+
type: Component,
|
|
207
|
+
args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, standalone: true, imports: [
|
|
208
|
+
MatButtonModule,
|
|
209
|
+
NgStyle,
|
|
210
|
+
MatMenuModule,
|
|
211
|
+
ReactiveFormsModule,
|
|
212
|
+
MatFormFieldModule,
|
|
213
|
+
MatInputModule,
|
|
214
|
+
CdkDropList,
|
|
215
|
+
CdkDrag,
|
|
216
|
+
MatIconModule,
|
|
217
|
+
AsyncPipe
|
|
218
|
+
], 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: [".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}.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}.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}\n"] }]
|
|
219
|
+
}], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: WordlistGeneratorService }], propDecorators: { buttonStyle: [{
|
|
220
|
+
type: Input
|
|
221
|
+
}], dragStyle: [{
|
|
222
|
+
type: Input
|
|
223
|
+
}], textStyle: [{
|
|
224
|
+
type: Input
|
|
225
|
+
}] } });
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Generated bundle index. Do not edit.
|
|
229
|
+
*/
|
|
230
|
+
|
|
231
|
+
export { WordlistGeneratorComponent };
|
|
232
|
+
//# sourceMappingURL=tehw0lf-wordlist-generator.mjs.map
|