@myrmidon/gve-core 0.0.5 → 1.0.0
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 +2 -0
- package/fesm2022/myrmidon-gve-core.mjs +370 -259
- package/fesm2022/myrmidon-gve-core.mjs.map +1 -1
- package/lib/components/batch-operation-editor/batch-operation-editor.component.d.ts +46 -0
- package/lib/components/chain-result-view/chain-result-view.component.d.ts +4 -1
- package/lib/components/feature-editor/feature-editor.component.d.ts +1 -1
- package/lib/components/feature-set-editor/feature-set-editor.component.d.ts +1 -1
- package/lib/components/snapshot-editor/snapshot-editor.component.d.ts +11 -9
- package/lib/components/steps-map/steps-map.component.d.ts +2 -0
- package/lib/models.d.ts +8 -0
- package/lib/services/gve-api.service.d.ts +33 -0
- package/package.json +10 -12
- package/public-api.d.ts +1 -0
- package/esm2022/lib/components/animation-timeline/animation-timeline.component.mjs +0 -207
- package/esm2022/lib/components/animation-timeline-set/animation-timeline-set.component.mjs +0 -154
- package/esm2022/lib/components/animation-tween/animation-tween.component.mjs +0 -184
- package/esm2022/lib/components/base-text-char/base-text-char.component.mjs +0 -46
- package/esm2022/lib/components/base-text-editor/base-text-editor.component.mjs +0 -115
- package/esm2022/lib/components/base-text-view/base-text-view.component.mjs +0 -159
- package/esm2022/lib/components/chain-operation-editor/chain-operation-editor.component.mjs +0 -570
- package/esm2022/lib/components/chain-result-view/chain-result-view.component.mjs +0 -222
- package/esm2022/lib/components/feature-editor/feature-editor.component.mjs +0 -200
- package/esm2022/lib/components/feature-set-editor/feature-set-editor.component.mjs +0 -175
- package/esm2022/lib/components/feature-set-view/feature-set-view.component.mjs +0 -100
- package/esm2022/lib/components/ln-heights-editor/ln-heights-editor.component.mjs +0 -126
- package/esm2022/lib/components/operation-source-editor/operation-source-editor.component.mjs +0 -131
- package/esm2022/lib/components/simple-tree/simple-tree.component.mjs +0 -72
- package/esm2022/lib/components/snapshot-editor/snapshot-editor.component.mjs +0 -863
- package/esm2022/lib/components/steps-map/steps-map.component.mjs +0 -77
- package/esm2022/lib/models.mjs +0 -2
- package/esm2022/lib/services/gve-api.service.mjs +0 -65
- package/esm2022/lib/services/settings.service.mjs +0 -87
- package/esm2022/lib/validators/svg-validators.mjs +0 -34
- package/esm2022/myrmidon-gve-core.mjs +0 -5
- package/esm2022/public-api.mjs +0 -22
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
3
|
-
import { ReactiveFormsModule, Validators, } from '@angular/forms';
|
|
4
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
5
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
6
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
7
|
-
import { MatInputModule } from '@angular/material/input';
|
|
8
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
9
|
-
import { SnapshotViewService, } from '@myrmidon/gve-snapshot-view';
|
|
10
|
-
import { BaseTextViewComponent, } from '../base-text-view/base-text-view.component';
|
|
11
|
-
import { FeatureSetEditorComponent } from '../feature-set-editor/feature-set-editor.component';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@angular/forms";
|
|
14
|
-
import * as i2 from "@myrmidon/ng-mat-tools";
|
|
15
|
-
import * as i3 from "@angular/common";
|
|
16
|
-
import * as i4 from "@angular/material/button";
|
|
17
|
-
import * as i5 from "@angular/material/form-field";
|
|
18
|
-
import * as i6 from "@angular/material/input";
|
|
19
|
-
import * as i7 from "@angular/material/tooltip";
|
|
20
|
-
/**
|
|
21
|
-
* 🔑 `gve-base-text-editor`
|
|
22
|
-
*
|
|
23
|
-
* Editor for snapshot's base text. This can receive a string or an array
|
|
24
|
-
* of `CharNode` objects, and lets the user edit the text, character by
|
|
25
|
-
* character, optionally also setting its features.
|
|
26
|
-
*
|
|
27
|
-
* Used by the `gve-snapshot-editor` component.
|
|
28
|
-
*/
|
|
29
|
-
export class BaseTextEditorComponent {
|
|
30
|
-
/**
|
|
31
|
-
* The text to edit. In input this can be a string, an array of `CharNode`
|
|
32
|
-
* objects. In output this will be an array of `CharNode` objects.
|
|
33
|
-
*/
|
|
34
|
-
get text() {
|
|
35
|
-
return this._text;
|
|
36
|
-
}
|
|
37
|
-
set text(value) {
|
|
38
|
-
this.resetSelectedChar();
|
|
39
|
-
if (this._text === value) {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
if (!value) {
|
|
43
|
-
this._text = [];
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
this._text = Array.isArray(value)
|
|
47
|
-
? value
|
|
48
|
-
: SnapshotViewService.stringToBaseChars(value);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
constructor(formBuilder, _dialogService) {
|
|
52
|
-
this._dialogService = _dialogService;
|
|
53
|
-
this._text = [];
|
|
54
|
-
/**
|
|
55
|
-
* Emitted for the edited text as an array of `CharNode`'s whenever it changes.
|
|
56
|
-
*/
|
|
57
|
-
this.textChange = new EventEmitter();
|
|
58
|
-
this.userText = formBuilder.control('', {
|
|
59
|
-
nonNullable: true,
|
|
60
|
-
validators: [Validators.required, Validators.maxLength(10000)],
|
|
61
|
-
});
|
|
62
|
-
this.form = formBuilder.group({
|
|
63
|
-
userText: this.userText,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
resetSelectedChar() {
|
|
67
|
-
this.selectedChar = undefined;
|
|
68
|
-
this.selectedCharLabel = undefined;
|
|
69
|
-
}
|
|
70
|
-
onSelectedChar(event) {
|
|
71
|
-
this.selectedChar = this._text.find((c) => c.id === event.char.id);
|
|
72
|
-
this.selectedCharLabel = event.char.label;
|
|
73
|
-
}
|
|
74
|
-
onFeaturesChange(features) {
|
|
75
|
-
this.selectedChar.features = features;
|
|
76
|
-
this.textChange.emit(this._text);
|
|
77
|
-
}
|
|
78
|
-
onRangePick(range) {
|
|
79
|
-
this.textRange = range;
|
|
80
|
-
}
|
|
81
|
-
patchTextFromUser() {
|
|
82
|
-
// TODO
|
|
83
|
-
}
|
|
84
|
-
setTextFromUser() {
|
|
85
|
-
this._dialogService
|
|
86
|
-
.confirm('Confirm', 'Reset text?')
|
|
87
|
-
.subscribe((yes) => {
|
|
88
|
-
if (yes) {
|
|
89
|
-
this.text = this.userText.value;
|
|
90
|
-
this.textChange.emit(this._text);
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BaseTextEditorComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DialogService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
95
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: BaseTextEditorComponent, isStandalone: true, selector: "gve-base-text-editor", inputs: { text: "text" }, outputs: { textChange: "textChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"setTextFromUser()\">\r\n <!-- text -->\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>text</mat-label>\r\n <textarea matInput [formControl]=\"userText\" rows=\"5\"></textarea>\r\n <mat-error\r\n *ngIf=\"\r\n $any(userText).errors?.required &&\r\n (userText.dirty || userText.touched)\r\n \"\r\n >text required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(userText).errors?.maxLength &&\r\n (userText.dirty || userText.touched)\r\n \"\r\n >text too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <!-- set -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-warn\"\r\n matTooltip=\"Reset characters to newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"setTextFromUser()\"\r\n >\r\n set\r\n </button>\r\n <!-- patch: TODO -->\r\n <!-- <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-primary\"\r\n matTooltip=\"Patch characters with newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"patchTextFromUser()\"\r\n >\r\n patch\r\n </button> -->\r\n </div>\r\n\r\n <!-- base text -->\r\n <div id=\"text-view\">\r\n <gve-base-text-view\r\n [text]=\"text\"\r\n (charPick)=\"onSelectedChar($event)\"\r\n (rangePick)=\"textRange = $event\"\r\n />\r\n\r\n <!-- text range -->\r\n @if (textRange) {\r\n <div id=\"text-range\">{{ textRange.at }} \u00D7 {{ textRange.run }}</div>\r\n }\r\n </div>\r\n\r\n <!-- char features -->\r\n @if (selectedChar) {\r\n <fieldset>\r\n <legend>features</legend>\r\n <gve-feature-set-editor\r\n [features]=\"selectedChar.features || []\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n }\r\n</form>\r\n", styles: [".full-width{width:100%}#text-view{margin:8px 0}fieldset{border:1px solid #ccc;padding:10px;margin:10px 0;border-radius:5px}legend{color:silver}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { 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: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { 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: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: BaseTextViewComponent, selector: "gve-base-text-view", inputs: ["defaultColor", "defaultBorderColor", "selectionColor", "hasLineNumber", "text"], outputs: ["charPick", "rangePick"] }, { kind: "component", type: FeatureSetEditorComponent, selector: "gve-feature-set-editor", inputs: ["isVar", "featNames", "featValues", "filterThreshold", "features"], outputs: ["featuresChange"] }] }); }
|
|
96
|
-
}
|
|
97
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BaseTextEditorComponent, decorators: [{
|
|
98
|
-
type: Component,
|
|
99
|
-
args: [{ selector: 'gve-base-text-editor', standalone: true, imports: [
|
|
100
|
-
CommonModule,
|
|
101
|
-
ReactiveFormsModule,
|
|
102
|
-
MatButtonModule,
|
|
103
|
-
MatFormFieldModule,
|
|
104
|
-
MatIconModule,
|
|
105
|
-
MatInputModule,
|
|
106
|
-
MatTooltipModule,
|
|
107
|
-
BaseTextViewComponent,
|
|
108
|
-
FeatureSetEditorComponent,
|
|
109
|
-
], template: "<form [formGroup]=\"form\" (submit)=\"setTextFromUser()\">\r\n <!-- text -->\r\n <div>\r\n <mat-form-field class=\"full-width\">\r\n <mat-label>text</mat-label>\r\n <textarea matInput [formControl]=\"userText\" rows=\"5\"></textarea>\r\n <mat-error\r\n *ngIf=\"\r\n $any(userText).errors?.required &&\r\n (userText.dirty || userText.touched)\r\n \"\r\n >text required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"\r\n $any(userText).errors?.maxLength &&\r\n (userText.dirty || userText.touched)\r\n \"\r\n >text too long</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <!-- buttons -->\r\n <div class=\"form-row\">\r\n <!-- set -->\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-warn\"\r\n matTooltip=\"Reset characters to newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"setTextFromUser()\"\r\n >\r\n set\r\n </button>\r\n <!-- patch: TODO -->\r\n <!-- <button\r\n type=\"button\"\r\n mat-flat-button\r\n class=\"mat-primary\"\r\n matTooltip=\"Patch characters with newly entered text\"\r\n [disabled]=\"!userText.value\"\r\n (click)=\"patchTextFromUser()\"\r\n >\r\n patch\r\n </button> -->\r\n </div>\r\n\r\n <!-- base text -->\r\n <div id=\"text-view\">\r\n <gve-base-text-view\r\n [text]=\"text\"\r\n (charPick)=\"onSelectedChar($event)\"\r\n (rangePick)=\"textRange = $event\"\r\n />\r\n\r\n <!-- text range -->\r\n @if (textRange) {\r\n <div id=\"text-range\">{{ textRange.at }} \u00D7 {{ textRange.run }}</div>\r\n }\r\n </div>\r\n\r\n <!-- char features -->\r\n @if (selectedChar) {\r\n <fieldset>\r\n <legend>features</legend>\r\n <gve-feature-set-editor\r\n [features]=\"selectedChar.features || []\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n />\r\n </fieldset>\r\n }\r\n</form>\r\n", styles: [".full-width{width:100%}#text-view{margin:8px 0}fieldset{border:1px solid #ccc;padding:10px;margin:10px 0;border-radius:5px}legend{color:silver}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
|
|
110
|
-
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.DialogService }], propDecorators: { text: [{
|
|
111
|
-
type: Input
|
|
112
|
-
}], textChange: [{
|
|
113
|
-
type: Output
|
|
114
|
-
}] } });
|
|
115
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10ZXh0LWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9ndmUtY29yZS9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS10ZXh0LWVkaXRvci9iYXNlLXRleHQtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9iYXNlLXRleHQtZWRpdG9yL2Jhc2UtdGV4dC1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUlMLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU3RCxPQUFPLEVBR0wsbUJBQW1CLEdBQ3BCLE1BQU0sNkJBQTZCLENBQUM7QUFJckMsT0FBTyxFQUNMLHFCQUFxQixHQUV0QixNQUFNLDRDQUE0QyxDQUFDO0FBQ3BELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7Ozs7QUFFL0Y7Ozs7Ozs7O0dBUUc7QUFrQkgsTUFBTSxP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YUFBYSw4QkFDYixjQUFjLDBXQUNkLGdCQUFnQiw2VEFDaEIscUJBQXFCLDhMQUNyQix5QkFBeUI7OzJGQUtoQix1QkFBdUI7a0JBakJuQyxTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixxQkFBcUI7d0JBQ3JCLHlCQUF5QjtxQkFDMUI7NEdBWVUsSUFBSTtzQkFEZCxLQUFLO2dCQXNCVSxVQUFVO3NCQUR6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQ2hhck5vZGUsXHJcbiAgRmVhdHVyZSxcclxuICBTbmFwc2hvdFZpZXdTZXJ2aWNlLFxyXG59IGZyb20gJ0BteXJtaWRvbi9ndmUtc25hcHNob3Qtdmlldyc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAbXlybWlkb24vbmctbWF0LXRvb2xzJztcclxuXHJcbmltcG9ydCB7IEJhc2VUZXh0Q2hhckV2ZW50IH0gZnJvbSAnLi4vYmFzZS10ZXh0LWNoYXIvYmFzZS10ZXh0LWNoYXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBCYXNlVGV4dFZpZXdDb21wb25lbnQsXHJcbiAgVmFyQmFzZVRleHRSYW5nZSxcclxufSBmcm9tICcuLi9iYXNlLXRleHQtdmlldy9iYXNlLXRleHQtdmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGZWF0dXJlU2V0RWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZmVhdHVyZS1zZXQtZWRpdG9yL2ZlYXR1cmUtc2V0LWVkaXRvci5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIPCflJEgYGd2ZS1iYXNlLXRleHQtZWRpdG9yYFxyXG4gKlxyXG4gKiBFZGl0b3IgZm9yIHNuYXBzaG90J3MgYmFzZSB0ZXh0LiBUaGlzIGNhbiByZWNlaXZlIGEgc3RyaW5nIG9yIGFuIGFycmF5XHJcbiAqIG9mIGBDaGFyTm9kZWAgb2JqZWN0cywgYW5kIGxldHMgdGhlIHVzZXIgZWRpdCB0aGUgdGV4dCwgY2hhcmFjdGVyIGJ5XHJcbiAqIGNoYXJhY3Rlciwgb3B0aW9uYWxseSBhbHNvIHNldHRpbmcgaXRzIGZlYXR1cmVzLlxyXG4gKlxyXG4gKiBVc2VkIGJ5IHRoZSBgZ3ZlLXNuYXBzaG90LWVkaXRvcmAgY29tcG9uZW50LlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdndmUtYmFzZS10ZXh0LWVkaXRvcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIEJhc2VUZXh0Vmlld0NvbXBvbmVudCxcclxuICAgIEZlYXR1cmVTZXRFZGl0b3JDb21wb25lbnQsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYmFzZS10ZXh0LWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2Jhc2UtdGV4dC1lZGl0b3IuY29tcG9uZW50LmNzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlVGV4dEVkaXRvckNvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSBfdGV4dDogQ2hhck5vZGVbXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgdGV4dCB0byBlZGl0LiBJbiBpbnB1dCB0aGlzIGNhbiBiZSBhIHN0cmluZywgYW4gYXJyYXkgb2YgYENoYXJOb2RlYFxyXG4gICAqIG9iamVjdHMuIEluIG91dHB1dCB0aGlzIHdpbGwgYmUgYW4gYXJyYXkgb2YgYENoYXJOb2RlYCBvYmplY3RzLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCB0ZXh0KCk6IENoYXJOb2RlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RleHQ7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nIHwgQ2hhck5vZGVbXSB8IHVuZGVmaW5lZCB8IG51bGwpIHtcclxuICAgIHRoaXMucmVzZXRTZWxlY3RlZENoYXIoKTtcclxuICAgIGlmICh0aGlzLl90ZXh0ID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX3RleHQgPSBbXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3RleHQgPSBBcnJheS5pc0FycmF5KHZhbHVlKVxyXG4gICAgICAgID8gdmFsdWVcclxuICAgICAgICA6IFNuYXBzaG90Vmlld1NlcnZpY2Uuc3RyaW5nVG9CYXNlQ2hhcnModmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCBmb3IgdGhlIGVkaXRlZCB0ZXh0IGFzIGFuIGFycmF5IG9mIGBDaGFyTm9kZWAncyB3aGVuZXZlciBpdCBjaGFuZ2VzLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSB0ZXh0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFyTm9kZVtdPigpO1xyXG5cclxuICBwdWJsaWMgdXNlclRleHQ6IEZvcm1Db250cm9sPHN0cmluZz47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgcHVibGljIHNlbGVjdGVkQ2hhcj86IENoYXJOb2RlO1xyXG4gIHB1YmxpYyBzZWxlY3RlZENoYXJMYWJlbD86IHN0cmluZztcclxuICBwdWJsaWMgdGV4dFJhbmdlPzogVmFyQmFzZVRleHRSYW5nZTtcclxuXHJcbiAgY29uc3RydWN0b3IoZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIF9kaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLnVzZXJUZXh0ID0gZm9ybUJ1aWxkZXIuY29udHJvbCgnJywge1xyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMDAwKV0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgdXNlclRleHQ6IHRoaXMudXNlclRleHQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRTZWxlY3RlZENoYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ2hhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDaGFyTGFiZWwgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TZWxlY3RlZENoYXIoZXZlbnQ6IEJhc2VUZXh0Q2hhckV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ2hhciA9IHRoaXMuX3RleHQuZmluZCgoYykgPT4gYy5pZCA9PT0gZXZlbnQuY2hhci5pZCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ2hhckxhYmVsID0gZXZlbnQuY2hhci5sYWJlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkZlYXR1cmVzQ2hhbmdlKGZlYXR1cmVzOiBGZWF0dXJlW10pOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDaGFyIS5mZWF0dXJlcyA9IGZlYXR1cmVzO1xyXG4gICAgdGhpcy50ZXh0Q2hhbmdlLmVtaXQodGhpcy5fdGV4dCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25SYW5nZVBpY2socmFuZ2U6IFZhckJhc2VUZXh0UmFuZ2UpIHtcclxuICAgIHRoaXMudGV4dFJhbmdlID0gcmFuZ2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGF0Y2hUZXh0RnJvbVVzZXIoKTogdm9pZCB7XHJcbiAgICAvLyBUT0RPXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VGV4dEZyb21Vc2VyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGlhbG9nU2VydmljZVxyXG4gICAgICAuY29uZmlybSgnQ29uZmlybScsICdSZXNldCB0ZXh0PycpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHllczogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgIGlmICh5ZXMpIHtcclxuICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMudXNlclRleHQudmFsdWU7XHJcbiAgICAgICAgICB0aGlzLnRleHRDaGFuZ2UuZW1pdCh0aGlzLl90ZXh0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNldFRleHRGcm9tVXNlcigpXCI+XHJcbiAgPCEtLSB0ZXh0IC0tPlxyXG4gIDxkaXY+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmdWxsLXdpZHRoXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+dGV4dDwvbWF0LWxhYmVsPlxyXG4gICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInVzZXJUZXh0XCIgcm93cz1cIjVcIj48L3RleHRhcmVhPlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICRhbnkodXNlclRleHQpLmVycm9ycz8ucmVxdWlyZWQgJiZcclxuICAgICAgICAgICh1c2VyVGV4dC5kaXJ0eSB8fCB1c2VyVGV4dC50b3VjaGVkKVxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgPnRleHQgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICA+XHJcbiAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgJGFueSh1c2VyVGV4dCkuZXJyb3JzPy5tYXhMZW5ndGggJiZcclxuICAgICAgICAgICh1c2VyVGV4dC5kaXJ0eSB8fCB1c2VyVGV4dC50b3VjaGVkKVxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgPnRleHQgdG9vIGxvbmc8L21hdC1lcnJvclxyXG4gICAgICA+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gYnV0dG9ucyAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgIDwhLS0gc2V0IC0tPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgbWF0LWZsYXQtYnV0dG9uXHJcbiAgICAgIGNsYXNzPVwibWF0LXdhcm5cIlxyXG4gICAgICBtYXRUb29sdGlwPVwiUmVzZXQgY2hhcmFjdGVycyB0byBuZXdseSBlbnRlcmVkIHRleHRcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiIXVzZXJUZXh0LnZhbHVlXCJcclxuICAgICAgKGNsaWNrKT1cInNldFRleHRGcm9tVXNlcigpXCJcclxuICAgID5cclxuICAgICAgc2V0XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDwhLS0gcGF0Y2g6IFRPRE8gLS0+XHJcbiAgICA8IS0tIDxidXR0b25cclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvblxyXG4gICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5XCJcclxuICAgICAgbWF0VG9vbHRpcD1cIlBhdGNoIGNoYXJhY3RlcnMgd2l0aCBuZXdseSBlbnRlcmVkIHRleHRcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiIXVzZXJUZXh0LnZhbHVlXCJcclxuICAgICAgKGNsaWNrKT1cInBhdGNoVGV4dEZyb21Vc2VyKClcIlxyXG4gICAgPlxyXG4gICAgICBwYXRjaFxyXG4gICAgPC9idXR0b24+IC0tPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIGJhc2UgdGV4dCAtLT5cclxuICA8ZGl2IGlkPVwidGV4dC12aWV3XCI+XHJcbiAgICA8Z3ZlLWJhc2UtdGV4dC12aWV3XHJcbiAgICAgIFt0ZXh0XT1cInRleHRcIlxyXG4gICAgICAoY2hhclBpY2spPVwib25TZWxlY3RlZENoYXIoJGV2ZW50KVwiXHJcbiAgICAgIChyYW5nZVBpY2spPVwidGV4dFJhbmdlID0gJGV2ZW50XCJcclxuICAgIC8+XHJcblxyXG4gICAgPCEtLSB0ZXh0IHJhbmdlIC0tPlxyXG4gICAgQGlmICh0ZXh0UmFuZ2UpIHtcclxuICAgIDxkaXYgaWQ9XCJ0ZXh0LXJhbmdlXCI+e3sgdGV4dFJhbmdlLmF0IH19IMOXIHt7IHRleHRSYW5nZS5ydW4gfX08L2Rpdj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBjaGFyIGZlYXR1cmVzIC0tPlxyXG4gIEBpZiAoc2VsZWN0ZWRDaGFyKSB7XHJcbiAgPGZpZWxkc2V0PlxyXG4gICAgPGxlZ2VuZD5mZWF0dXJlczwvbGVnZW5kPlxyXG4gICAgPGd2ZS1mZWF0dXJlLXNldC1lZGl0b3JcclxuICAgICAgW2ZlYXR1cmVzXT1cInNlbGVjdGVkQ2hhci5mZWF0dXJlcyB8fCBbXVwiXHJcbiAgICAgIChmZWF0dXJlc0NoYW5nZSk9XCJvbkZlYXR1cmVzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgLz5cclxuICA8L2ZpZWxkc2V0PlxyXG4gIH1cclxuPC9mb3JtPlxyXG4iXX0=
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
3
|
-
import { BaseTextCharComponent, } from '../base-text-char/base-text-char.component';
|
|
4
|
-
import { SnapshotViewService } from '@myrmidon/gve-snapshot-view';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
/**
|
|
7
|
-
* 🔑 `gve-base-text-view`
|
|
8
|
-
*
|
|
9
|
-
* A component to display a selectable base text.
|
|
10
|
-
* Used by the chain result view component and the base text editor component.
|
|
11
|
-
*
|
|
12
|
-
* - ▶️ `defaultColor` (`string`): the default color for the text.
|
|
13
|
-
* - ▶️ `defaultBorderColor` (`string`): the default border color for the text.
|
|
14
|
-
* - ▶️ `selectionColor` (`string`): the color for the selected text.
|
|
15
|
-
* - ▶️ `hasLineNumber` (`boolean`): true if line numbers should be displayed next to each line.
|
|
16
|
-
* - ▶️ `text` (`string` | `CharNode[]`): the text to display.
|
|
17
|
-
* - 🔥 `charPick` (`BaseTextCharEvent`): emitted when a character is picked.
|
|
18
|
-
* - 🔥 `rangePick` (`VarBaseTextRange`): emitted when a range is picked.
|
|
19
|
-
*/
|
|
20
|
-
export class BaseTextViewComponent {
|
|
21
|
-
constructor() {
|
|
22
|
-
/**
|
|
23
|
-
* The default color for the text.
|
|
24
|
-
*/
|
|
25
|
-
this.defaultColor = '#DBDBDB';
|
|
26
|
-
/**
|
|
27
|
-
* The default border color for the text.
|
|
28
|
-
*/
|
|
29
|
-
this.defaultBorderColor = '#DBDBDB';
|
|
30
|
-
/**
|
|
31
|
-
* The color for the selected text.
|
|
32
|
-
*/
|
|
33
|
-
this.selectionColor = '#3E92CC';
|
|
34
|
-
/**
|
|
35
|
-
* True if line numbers should be displayed next to each line.
|
|
36
|
-
*/
|
|
37
|
-
this.hasLineNumber = false;
|
|
38
|
-
/**
|
|
39
|
-
* Emitted when a character is picked.
|
|
40
|
-
*/
|
|
41
|
-
this.charPick = new EventEmitter();
|
|
42
|
-
/**
|
|
43
|
-
* Emitted when a range is picked. This is preceded by a character pick event.
|
|
44
|
-
* The range is defined by the starting character and the number of characters.
|
|
45
|
-
* The range is inclusive.
|
|
46
|
-
*/
|
|
47
|
-
this.rangePick = new EventEmitter();
|
|
48
|
-
this.lines = [];
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* The text to display.
|
|
52
|
-
*/
|
|
53
|
-
get text() {
|
|
54
|
-
return this._text;
|
|
55
|
-
}
|
|
56
|
-
set text(value) {
|
|
57
|
-
this._text = value || undefined;
|
|
58
|
-
this.buildLines();
|
|
59
|
-
}
|
|
60
|
-
buildLines() {
|
|
61
|
-
if (!this._text) {
|
|
62
|
-
this.lines = [];
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
const newLines = [];
|
|
66
|
-
newLines.push([]);
|
|
67
|
-
if (Array.isArray(this._text)) {
|
|
68
|
-
const nodes = this._text;
|
|
69
|
-
for (let i = 0; i < nodes.length; i++) {
|
|
70
|
-
const char = {
|
|
71
|
-
id: nodes[i].id,
|
|
72
|
-
value: nodes[i].data,
|
|
73
|
-
label: nodes[i].label,
|
|
74
|
-
color: this.defaultColor,
|
|
75
|
-
borderColor: this.defaultBorderColor,
|
|
76
|
-
emSize: 1.5,
|
|
77
|
-
};
|
|
78
|
-
newLines[newLines.length - 1].push(char);
|
|
79
|
-
if (char.value === '\n') {
|
|
80
|
-
newLines.push([]);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
for (let i = 0; i < this._text.length; i++) {
|
|
86
|
-
const char = {
|
|
87
|
-
id: i + 1,
|
|
88
|
-
value: this._text[i],
|
|
89
|
-
label: SnapshotViewService.translateSpecialChar(this._text[i]),
|
|
90
|
-
color: this.defaultColor,
|
|
91
|
-
borderColor: this.defaultBorderColor,
|
|
92
|
-
emSize: 1.5,
|
|
93
|
-
};
|
|
94
|
-
newLines[newLines.length - 1].push(char);
|
|
95
|
-
if (char.value === '\n') {
|
|
96
|
-
newLines.push([]);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
this.lines = newLines;
|
|
101
|
-
}
|
|
102
|
-
resetColors() {
|
|
103
|
-
for (const line of this.lines) {
|
|
104
|
-
for (const c of line) {
|
|
105
|
-
c.color = this.defaultColor;
|
|
106
|
-
c.borderColor = this.defaultBorderColor;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
onCharPick(event) {
|
|
111
|
-
this.resetColors();
|
|
112
|
-
if (this._lastSelectedChar &&
|
|
113
|
-
this._lastSelectedChar !== event.char &&
|
|
114
|
-
event.event.ctrlKey) {
|
|
115
|
-
const minId = Math.min(this._lastSelectedChar.id, event.char.id);
|
|
116
|
-
const maxId = Math.max(this._lastSelectedChar.id, event.char.id);
|
|
117
|
-
for (const line of this.lines) {
|
|
118
|
-
for (const c of line) {
|
|
119
|
-
if (c.id >= minId && c.id <= maxId) {
|
|
120
|
-
c.color = this.selectionColor;
|
|
121
|
-
c.borderColor = this.selectionColor;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
this.charPick.emit(event);
|
|
126
|
-
this.rangePick.emit({ at: minId, run: maxId - minId + 1 });
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
// select current char
|
|
131
|
-
event.char.color = this.selectionColor;
|
|
132
|
-
event.char.borderColor = this.selectionColor;
|
|
133
|
-
this.charPick.emit(event);
|
|
134
|
-
this.rangePick.emit({ at: event.char.id, run: 1 });
|
|
135
|
-
}
|
|
136
|
-
this._lastSelectedChar = event.char;
|
|
137
|
-
}
|
|
138
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BaseTextViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
139
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: BaseTextViewComponent, isStandalone: true, selector: "gve-base-text-view", inputs: { defaultColor: "defaultColor", defaultBorderColor: "defaultBorderColor", selectionColor: "selectionColor", hasLineNumber: "hasLineNumber", text: "text" }, outputs: { charPick: "charPick", rangePick: "rangePick" }, ngImport: i0, template: "<div id=\"text\">\r\n @for (line of lines; track $index) {\r\n <div class=\"line\">\r\n @if (hasLineNumber) {\r\n <div class=\"nr\">\r\n {{ lines.indexOf(line) + 1 }}\r\n </div>\r\n } @for (c of line; track c.id) {\r\n <gve-base-text-char [char]=\"c\" (charPick)=\"onCharPick($event)\" />\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: [".line{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.line *{flex:0 0 auto}.nr{font-size:.8em;font-weight:700;color:silver;margin:0 4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: BaseTextCharComponent, selector: "gve-base-text-char", inputs: ["char"], outputs: ["charPick"] }] }); }
|
|
140
|
-
}
|
|
141
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BaseTextViewComponent, decorators: [{
|
|
142
|
-
type: Component,
|
|
143
|
-
args: [{ selector: 'gve-base-text-view', standalone: true, imports: [CommonModule, BaseTextCharComponent], template: "<div id=\"text\">\r\n @for (line of lines; track $index) {\r\n <div class=\"line\">\r\n @if (hasLineNumber) {\r\n <div class=\"nr\">\r\n {{ lines.indexOf(line) + 1 }}\r\n </div>\r\n } @for (c of line; track c.id) {\r\n <gve-base-text-char [char]=\"c\" (charPick)=\"onCharPick($event)\" />\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: [".line{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.line *{flex:0 0 auto}.nr{font-size:.8em;font-weight:700;color:silver;margin:0 4px}\n"] }]
|
|
144
|
-
}], propDecorators: { defaultColor: [{
|
|
145
|
-
type: Input
|
|
146
|
-
}], defaultBorderColor: [{
|
|
147
|
-
type: Input
|
|
148
|
-
}], selectionColor: [{
|
|
149
|
-
type: Input
|
|
150
|
-
}], hasLineNumber: [{
|
|
151
|
-
type: Input
|
|
152
|
-
}], text: [{
|
|
153
|
-
type: Input
|
|
154
|
-
}], charPick: [{
|
|
155
|
-
type: Output
|
|
156
|
-
}], rangePick: [{
|
|
157
|
-
type: Output
|
|
158
|
-
}] } });
|
|
159
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10ZXh0LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vZ3ZlLWNvcmUvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtdGV4dC12aWV3L2Jhc2UtdGV4dC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9iYXNlLXRleHQtdmlldy9iYXNlLXRleHQtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RSxPQUFPLEVBRUwscUJBQXFCLEdBRXRCLE1BQU0sNENBQTRDLENBQUM7QUFDcEQsT0FBTyxFQUFZLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBVTVFOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFRSCxNQUFNLE9BQU8scUJBQXFCO0lBUGxDO1FBV0U7O1dBRUc7UUFFSSxpQkFBWSxHQUFHLFNBQVMsQ0FBQztRQUVoQzs7V0FFRztRQUVJLHVCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUV0Qzs7V0FFRztRQUVJLG1CQUFjLEdBQUcsU0FBUyxDQUFDO1FBRWxDOztXQUVHO1FBRUksa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFjN0I7O1dBRUc7UUFFSSxhQUFRLEdBQ2IsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFFeEM7Ozs7V0FJRztRQUVJLGNBQVMsR0FDZCxJQUFJLFlBQVksRUFBb0IsQ0FBQztRQUVoQyxVQUFLLEdBQXFCLEVBQUUsQ0FBQztLQTJGckM7SUF2SEM7O09BRUc7SUFDSCxJQUNXLElBQUk7UUFDYixP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WUFDTixzQkFBc0I7WUFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUN2QyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztJQUN0QyxDQUFDOzhHQWxKVSxxQkFBcUI7a0dBQXJCLHFCQUFxQiw2U0N2Q2xDLGtXQWFBLDJNRHNCWSxZQUFZLCtCQUFFLHFCQUFxQjs7MkZBSWxDLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDOzhCQVl2QyxZQUFZO3NCQURsQixLQUFLO2dCQU9DLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFPQyxjQUFjO3NCQURwQixLQUFLO2dCQU9DLGFBQWE7c0JBRG5CLEtBQUs7Z0JBT0ssSUFBSTtzQkFEZCxLQUFLO2dCQWFDLFFBQVE7c0JBRGQsTUFBTTtnQkFVQSxTQUFTO3NCQURmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlVGV4dENoYXIsXHJcbiAgQmFzZVRleHRDaGFyQ29tcG9uZW50LFxyXG4gIEJhc2VUZXh0Q2hhckV2ZW50LFxyXG59IGZyb20gJy4uL2Jhc2UtdGV4dC1jaGFyL2Jhc2UtdGV4dC1jaGFyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENoYXJOb2RlLCBTbmFwc2hvdFZpZXdTZXJ2aWNlIH0gZnJvbSAnQG15cm1pZG9uL2d2ZS1zbmFwc2hvdC12aWV3JztcclxuXHJcbi8qKlxyXG4gKiBBIHJhbmdlIGluIHRoZSBiYXNlIHRleHQuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFZhckJhc2VUZXh0UmFuZ2Uge1xyXG4gIGF0OiBudW1iZXI7XHJcbiAgcnVuOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiDwn5SRIGBndmUtYmFzZS10ZXh0LXZpZXdgXHJcbiAqXHJcbiAqIEEgY29tcG9uZW50IHRvIGRpc3BsYXkgYSBzZWxlY3RhYmxlIGJhc2UgdGV4dC5cclxuICogVXNlZCBieSB0aGUgY2hhaW4gcmVzdWx0IHZpZXcgY29tcG9uZW50IGFuZCB0aGUgYmFzZSB0ZXh0IGVkaXRvciBjb21wb25lbnQuXHJcbiAqXHJcbiAqIC0g4pa277iPIGBkZWZhdWx0Q29sb3JgIChgc3RyaW5nYCk6IHRoZSBkZWZhdWx0IGNvbG9yIGZvciB0aGUgdGV4dC5cclxuICogLSDilrbvuI8gYGRlZmF1bHRCb3JkZXJDb2xvcmAgKGBzdHJpbmdgKTogdGhlIGRlZmF1bHQgYm9yZGVyIGNvbG9yIGZvciB0aGUgdGV4dC5cclxuICogLSDilrbvuI8gYHNlbGVjdGlvbkNvbG9yYCAoYHN0cmluZ2ApOiB0aGUgY29sb3IgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LlxyXG4gKiAtIOKWtu+4jyBgaGFzTGluZU51bWJlcmAgKGBib29sZWFuYCk6IHRydWUgaWYgbGluZSBudW1iZXJzIHNob3VsZCBiZSBkaXNwbGF5ZWQgbmV4dCB0byBlYWNoIGxpbmUuXHJcbiAqIC0g4pa277iPIGB0ZXh0YCAoYHN0cmluZ2AgfCBgQ2hhck5vZGVbXWApOiB0aGUgdGV4dCB0byBkaXNwbGF5LlxyXG4gKiAtIPCflKUgYGNoYXJQaWNrYCAoYEJhc2VUZXh0Q2hhckV2ZW50YCk6IGVtaXR0ZWQgd2hlbiBhIGNoYXJhY3RlciBpcyBwaWNrZWQuXHJcbiAqIC0g8J+UpSBgcmFuZ2VQaWNrYCAoYFZhckJhc2VUZXh0UmFuZ2VgKTogZW1pdHRlZCB3aGVuIGEgcmFuZ2UgaXMgcGlja2VkLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdndmUtYmFzZS10ZXh0LXZpZXcnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQmFzZVRleHRDaGFyQ29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYmFzZS10ZXh0LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9iYXNlLXRleHQtdmlldy5jb21wb25lbnQuY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEJhc2VUZXh0Vmlld0NvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSBfdGV4dD86IHN0cmluZyB8IENoYXJOb2RlW107XHJcbiAgcHJpdmF0ZSBfbGFzdFNlbGVjdGVkQ2hhcj86IEJhc2VUZXh0Q2hhcjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRlZmF1bHQgY29sb3IgZm9yIHRoZSB0ZXh0LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlZmF1bHRDb2xvciA9ICcjREJEQkRCJztcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRlZmF1bHQgYm9yZGVyIGNvbG9yIGZvciB0aGUgdGV4dC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBkZWZhdWx0Qm9yZGVyQ29sb3IgPSAnI0RCREJEQic7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBjb2xvciBmb3IgdGhlIHNlbGVjdGVkIHRleHQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2VsZWN0aW9uQ29sb3IgPSAnIzNFOTJDQyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRydWUgaWYgbGluZSBudW1iZXJzIHNob3VsZCBiZSBkaXNwbGF5ZWQgbmV4dCB0byBlYWNoIGxpbmUuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaGFzTGluZU51bWJlciA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB8IENoYXJOb2RlW10gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RleHQ7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nIHwgQ2hhck5vZGVbXSB8IHVuZGVmaW5lZCB8IG51bGwpIHtcclxuICAgIHRoaXMuX3RleHQgPSB2YWx1ZSB8fCB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmJ1aWxkTGluZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGNoYXJhY3RlciBpcyBwaWNrZWQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIGNoYXJQaWNrOiBFdmVudEVtaXR0ZXI8QmFzZVRleHRDaGFyRXZlbnQ+ID1cclxuICAgIG5ldyBFdmVudEVtaXR0ZXI8QmFzZVRleHRDaGFyRXZlbnQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHJhbmdlIGlzIHBpY2tlZC4gVGhpcyBpcyBwcmVjZWRlZCBieSBhIGNoYXJhY3RlciBwaWNrIGV2ZW50LlxyXG4gICAqIFRoZSByYW5nZSBpcyBkZWZpbmVkIGJ5IHRoZSBzdGFydGluZyBjaGFyYWN0ZXIgYW5kIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycy5cclxuICAgKiBUaGUgcmFuZ2UgaXMgaW5jbHVzaXZlLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByYW5nZVBpY2s6IEV2ZW50RW1pdHRlcjxWYXJCYXNlVGV4dFJhbmdlPiA9XHJcbiAgICBuZXcgRXZlbnRFbWl0dGVyPFZhckJhc2VUZXh0UmFuZ2U+KCk7XHJcblxyXG4gIHB1YmxpYyBsaW5lczogQmFzZVRleHRDaGFyW11bXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGJ1aWxkTGluZXMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuX3RleHQpIHtcclxuICAgICAgdGhpcy5saW5lcyA9IFtdO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3TGluZXM6IEJhc2VUZXh0Q2hhcltdW10gPSBbXTtcclxuICAgIG5ld0xpbmVzLnB1c2goW10pO1xyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX3RleHQpKSB7XHJcbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fdGV4dCBhcyBDaGFyTm9kZVtdO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY2hhcjogQmFzZVRleHRDaGFyID0ge1xyXG4gICAgICAgICAgaWQ6IG5vZGVzW2ldLmlkLFxyXG4gICAgICAgICAgdmFsdWU6IG5vZGVzW2ldLmRhdGEsXHJcbiAgICAgICAgICBsYWJlbDogbm9kZXNbaV0ubGFiZWwsXHJcbiAgICAgICAgICBjb2xvcjogdGhpcy5kZWZhdWx0Q29sb3IsXHJcbiAgICAgICAgICBib3JkZXJDb2xvcjogdGhpcy5kZWZhdWx0Qm9yZGVyQ29sb3IsXHJcbiAgICAgICAgICBlbVNpemU6IDEuNSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIG5ld0xpbmVzW25ld0xpbmVzLmxlbmd0aCAtIDFdLnB1c2goY2hhcik7XHJcblxyXG4gICAgICAgIGlmIChjaGFyLnZhbHVlID09PSAnXFxuJykge1xyXG4gICAgICAgICAgbmV3TGluZXMucHVzaChbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RleHQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBjaGFyOiBCYXNlVGV4dENoYXIgPSB7XHJcbiAgICAgICAgICBpZDogaSArIDEsXHJcbiAgICAgICAgICB2YWx1ZTogdGhpcy5fdGV4dFtpXSxcclxuICAgICAgICAgIGxhYmVsOiBTbmFwc2hvdFZpZXdTZXJ2aWNlLnRyYW5zbGF0ZVNwZWNpYWxDaGFyKHRoaXMuX3RleHRbaV0pLFxyXG4gICAgICAgICAgY29sb3I6IHRoaXMuZGVmYXVsdENvbG9yLFxyXG4gICAgICAgICAgYm9yZGVyQ29sb3I6IHRoaXMuZGVmYXVsdEJvcmRlckNvbG9yLFxyXG4gICAgICAgICAgZW1TaXplOiAxLjUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBuZXdMaW5lc1tuZXdMaW5lcy5sZW5ndGggLSAxXS5wdXNoKGNoYXIpO1xyXG5cclxuICAgICAgICBpZiAoY2hhci52YWx1ZSA9PT0gJ1xcbicpIHtcclxuICAgICAgICAgIG5ld0xpbmVzLnB1c2goW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubGluZXMgPSBuZXdMaW5lcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRDb2xvcnMoKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy5saW5lcykge1xyXG4gICAgICBmb3IgKGNvbnN0IGMgb2YgbGluZSkge1xyXG4gICAgICAgIGMuY29sb3IgPSB0aGlzLmRlZmF1bHRDb2xvcjtcclxuICAgICAgICBjLmJvcmRlckNvbG9yID0gdGhpcy5kZWZhdWx0Qm9yZGVyQ29sb3I7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNoYXJQaWNrKGV2ZW50OiBCYXNlVGV4dENoYXJFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXNldENvbG9ycygpO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkQ2hhciAmJlxyXG4gICAgICB0aGlzLl9sYXN0U2VsZWN0ZWRDaGFyICE9PSBldmVudC5jaGFyICYmXHJcbiAgICAgIGV2ZW50LmV2ZW50LmN0cmxLZXlcclxuICAgICkge1xyXG4gICAgICBjb25zdCBtaW5JZCA9IE1hdGgubWluKHRoaXMuX2xhc3RTZWxlY3RlZENoYXIuaWQsIGV2ZW50LmNoYXIuaWQpO1xyXG4gICAgICBjb25zdCBtYXhJZCA9IE1hdGgubWF4KHRoaXMuX2xhc3RTZWxlY3RlZENoYXIuaWQsIGV2ZW50LmNoYXIuaWQpO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMubGluZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgbGluZSkge1xyXG4gICAgICAgICAgaWYgKGMuaWQgPj0gbWluSWQgJiYgYy5pZCA8PSBtYXhJZCkge1xyXG4gICAgICAgICAgICBjLmNvbG9yID0gdGhpcy5zZWxlY3Rpb25Db2xvcjtcclxuICAgICAgICAgICAgYy5ib3JkZXJDb2xvciA9IHRoaXMuc2VsZWN0aW9uQ29sb3I7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNoYXJQaWNrLmVtaXQoZXZlbnQpO1xyXG4gICAgICB0aGlzLnJhbmdlUGljay5lbWl0KHsgYXQ6IG1pbklkLCBydW46IG1heElkIC0gbWluSWQgKyAxIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBzZWxlY3QgY3VycmVudCBjaGFyXHJcbiAgICAgIGV2ZW50LmNoYXIuY29sb3IgPSB0aGlzLnNlbGVjdGlvbkNvbG9yO1xyXG4gICAgICBldmVudC5jaGFyLmJvcmRlckNvbG9yID0gdGhpcy5zZWxlY3Rpb25Db2xvcjtcclxuICAgICAgdGhpcy5jaGFyUGljay5lbWl0KGV2ZW50KTtcclxuICAgICAgdGhpcy5yYW5nZVBpY2suZW1pdCh7IGF0OiBldmVudC5jaGFyLmlkLCBydW46IDEgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fbGFzdFNlbGVjdGVkQ2hhciA9IGV2ZW50LmNoYXI7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgaWQ9XCJ0ZXh0XCI+XHJcbiAgQGZvciAobGluZSBvZiBsaW5lczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgPGRpdiBjbGFzcz1cImxpbmVcIj5cclxuICAgIEBpZiAoaGFzTGluZU51bWJlcikge1xyXG4gICAgPGRpdiBjbGFzcz1cIm5yXCI+XHJcbiAgICAgIHt7IGxpbmVzLmluZGV4T2YobGluZSkgKyAxIH19XHJcbiAgICA8L2Rpdj5cclxuICAgIH0gQGZvciAoYyBvZiBsaW5lOyB0cmFjayBjLmlkKSB7XHJcbiAgICA8Z3ZlLWJhc2UtdGV4dC1jaGFyIFtjaGFyXT1cImNcIiAoY2hhclBpY2spPVwib25DaGFyUGljaygkZXZlbnQpXCIgLz5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuICB9XHJcbjwvZGl2PlxyXG4iXX0=
|