@myrmidon/cadmus-refs-asserted-ids 1.0.3 → 1.0.4
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 +30 -11
- package/esm2020/lib/asserted-id/asserted-id.component.mjs +44 -18
- package/esm2020/lib/asserted-ids/asserted-ids.component.mjs +91 -156
- package/esm2020/lib/cadmus-refs-asserted-ids.module.mjs +30 -9
- package/esm2020/lib/scoped-pin-lookup/scoped-pin-lookup.component.mjs +125 -0
- package/esm2020/lib/services/pin-ref-lookup.service.mjs +71 -0
- package/esm2020/public-api.mjs +3 -1
- package/fesm2015/myrmidon-cadmus-refs-asserted-ids.mjs +340 -175
- package/fesm2015/myrmidon-cadmus-refs-asserted-ids.mjs.map +1 -1
- package/fesm2020/myrmidon-cadmus-refs-asserted-ids.mjs +334 -174
- package/fesm2020/myrmidon-cadmus-refs-asserted-ids.mjs.map +1 -1
- package/lib/asserted-id/asserted-id.component.d.ts +14 -3
- package/lib/asserted-ids/asserted-ids.component.d.ts +20 -30
- package/lib/cadmus-refs-asserted-ids.module.d.ts +15 -12
- package/lib/scoped-pin-lookup/scoped-pin-lookup.component.d.ts +39 -0
- package/lib/services/pin-ref-lookup.service.d.ts +18 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
package/README.md
CHANGED
|
@@ -2,23 +2,42 @@
|
|
|
2
2
|
|
|
3
3
|
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.1.0.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Model
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
> Note: Don't forget to add `--project cadmus-refs-asserted-ids` or else it will be added to the default project in your `angular.json` file.
|
|
7
|
+
The asserted ID and asserted IDs bricks provide a way to include external or internal references to resource identifiers, whatever their type and origin.
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
The asserted ID brick allows editing a simple model representing such IDs, having:
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
- a value, the ID itself.
|
|
12
|
+
- a scope, representing the context the ID originates from (e.g. an ontology, a repository, a website, etc.).
|
|
13
|
+
- an optional tag, eventually used to group or classify the ID.
|
|
14
|
+
- an optional assertion, eventually used to define the uncertainty level of the assignment of this ID to the context it applies to.
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
The asserted IDs brick is just a collection of such IDs.
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
## Behavior
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
In both cases, the component provides a special mechanism for internal, pin-based lookup. In most cases, human users prefer to adopt friendly IDs, which are unique only in the context of their editing environment. Such identifiers are typically named EIDs (entity IDs), and may be found scattered among parts, or linked to items via a metadata part.
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
For instance, a decorations part in a manuscript collects a number of decorations; for each one, it might define an arbitrary EID (like e.g. `angel1`) used to identify it among the others, in the context of that part.
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
When filling the decorations part with data, users just ensure that this EID is unique in the context of the list they are editing. Yet, should we be in need of a non-scoped, unique ID, it would be easy to build it by assembling together the EID with its part/item IDs, which by definition are globally unique (being GUIDs). For instance, this is what can be done when mapping entities from parts into a semantic graph (via mapping rules).
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
Also, sometimes we might also want to assign a human-friendly ID to the item itself, rather than referring to it by its GUID. In this case, the conventional method relies on the generic metadata part, which allows users entering any number of arbitrarily defined name=value pairs. So, a user might enter a pair like e.g. `eid=vat_lat_123`, and use it as the human friendly identifier for a manuscript item corresponding to Vat. Lat. 123.
|
|
27
|
+
|
|
28
|
+
The asserted ID library provides a number of components which can be used to easily refer to the entities identified in this way. According to the scenario illustrated above, the basic requirements for building non-scoped, unique IDs from scoped, human-friendly identifiers are:
|
|
29
|
+
|
|
30
|
+
- we must be able to draw EIDs _from parts or from items_, assuming the convention by which an item can be assigned an EID via its generic _metadata_ part.
|
|
31
|
+
- we must let users pick _the preferred combination_ of components which once assembled build a unique, yet human-friendly identifier.
|
|
32
|
+
|
|
33
|
+
To this end, the asserted ID component provides an internal lookup mechanism based on data pins and metadata conventions. When users want to add an ID referring to some internal entity, either found in a part or corresponding to an item, he just has to pick the type of desired lookup (when more than a single lookup search definition is present), and type some characters to get the first N pins starting with these characters; he can then pick one from the list. Once a pin value is picked, the lookup control shows all the relevant data which can be used as components for the ID to build:
|
|
34
|
+
|
|
35
|
+
- the item GUID.
|
|
36
|
+
- the item title.
|
|
37
|
+
- the part GUID.
|
|
38
|
+
- the part type ID.
|
|
39
|
+
- the item's metadata part entries.
|
|
40
|
+
|
|
41
|
+
The user can then use buttons to append each of these components to the ID being built, and/or variously edit it. When he's ok with the ID, he can then use it as the reference ID being edited.
|
|
42
|
+
|
|
43
|
+
>👉 The demo found in this workspace uses a [mock data service](../../../src/app/services/mock-item.service.ts) instead of the real one, which provides a minimal set of data and functions, just required for the components to function.
|
|
@@ -1,19 +1,23 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
1
|
+
import { Component, EventEmitter, Inject, Input, Output, } from '@angular/core';
|
|
2
2
|
import { Validators, } from '@angular/forms';
|
|
3
3
|
import { debounceTime } from 'rxjs/operators';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import * as i1 from "@angular/forms";
|
|
6
|
-
import * as i2 from "
|
|
7
|
-
import * as i3 from "@angular/
|
|
8
|
-
import * as i4 from "@angular/material/
|
|
9
|
-
import * as i5 from "@angular/material/
|
|
10
|
-
import * as i6 from "@angular/material/
|
|
11
|
-
import * as i7 from "@angular/material/
|
|
12
|
-
import * as i8 from "@
|
|
6
|
+
import * as i2 from "../services/pin-ref-lookup.service";
|
|
7
|
+
import * as i3 from "@angular/common";
|
|
8
|
+
import * as i4 from "@angular/material/button";
|
|
9
|
+
import * as i5 from "@angular/material/expansion";
|
|
10
|
+
import * as i6 from "@angular/material/form-field";
|
|
11
|
+
import * as i7 from "@angular/material/icon";
|
|
12
|
+
import * as i8 from "@angular/material/input";
|
|
13
|
+
import * as i9 from "@angular/material/select";
|
|
14
|
+
import * as i10 from "@angular/material/core";
|
|
15
|
+
import * as i11 from "@myrmidon/cadmus-refs-assertion";
|
|
16
|
+
import * as i12 from "../scoped-pin-lookup/scoped-pin-lookup.component";
|
|
13
17
|
export class AssertedIdComponent {
|
|
14
|
-
constructor(formBuilder) {
|
|
15
|
-
this.
|
|
16
|
-
|
|
18
|
+
constructor(formBuilder, lookupService, lookupDefs) {
|
|
19
|
+
this.lookupService = lookupService;
|
|
20
|
+
this.lookupDefs = lookupDefs;
|
|
17
21
|
this.tag = formBuilder.control(null, Validators.maxLength(50));
|
|
18
22
|
this.value = formBuilder.control(null, [
|
|
19
23
|
Validators.required,
|
|
@@ -25,6 +29,8 @@ export class AssertedIdComponent {
|
|
|
25
29
|
value: this.value,
|
|
26
30
|
scope: this.scope,
|
|
27
31
|
});
|
|
32
|
+
this.lookupExpanded = false;
|
|
33
|
+
this.idChange = new EventEmitter();
|
|
28
34
|
}
|
|
29
35
|
get id() {
|
|
30
36
|
return this._id;
|
|
@@ -46,6 +52,12 @@ export class AssertedIdComponent {
|
|
|
46
52
|
this.assertion = assertion;
|
|
47
53
|
setTimeout(() => this.emitIdChange(), 0);
|
|
48
54
|
}
|
|
55
|
+
onIdPick(id) {
|
|
56
|
+
this.value.setValue(id);
|
|
57
|
+
this.value.markAsDirty();
|
|
58
|
+
this.value.updateValueAndValidity();
|
|
59
|
+
this.lookupExpanded = false;
|
|
60
|
+
}
|
|
49
61
|
updateForm(value) {
|
|
50
62
|
this._updatingForm = true;
|
|
51
63
|
if (!value) {
|
|
@@ -71,15 +83,25 @@ export class AssertedIdComponent {
|
|
|
71
83
|
};
|
|
72
84
|
}
|
|
73
85
|
emitIdChange() {
|
|
74
|
-
|
|
86
|
+
if (!this.hasSubmit) {
|
|
87
|
+
this.idChange.emit(this.getId());
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
save() {
|
|
91
|
+
if (this.form.valid) {
|
|
92
|
+
this.idChange.emit(this.getId());
|
|
93
|
+
}
|
|
75
94
|
}
|
|
76
95
|
}
|
|
77
|
-
AssertedIdComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.
|
|
78
|
-
AssertedIdComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.
|
|
79
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.
|
|
96
|
+
AssertedIdComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: AssertedIdComponent, deps: [{ token: i1.FormBuilder }, { token: i2.PinRefLookupService }, { token: 'indexLookupDefinitions' }], target: i0.ɵɵFactoryTarget.Component });
|
|
97
|
+
AssertedIdComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.1", type: AssertedIdComponent, selector: "cadmus-refs-asserted-id", inputs: { scopeEntries: "scopeEntries", idTagEntries: "idTagEntries", assTagEntries: "assTagEntries", refTypeEntries: "refTypeEntries", refTagEntries: "refTagEntries", id: "id", noEidLookup: "noEidLookup", hasSubmit: "hasSubmit" }, outputs: { idChange: "idChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div>\n <div class=\"form-row\">\n <!-- tag (bound) -->\n <mat-form-field *ngIf=\"idTagEntries?.length\" style=\"width: 8em\">\n <mat-label>tag</mat-label>\n <mat-select [formControl]=\"tag\">\n <mat-option *ngFor=\"let e of idTagEntries\" [value]=\"e.id\">{{\n e.value\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n <!-- tag (free) -->\n <mat-form-field *ngIf=\"!idTagEntries?.length\" style=\"width: 8em\">\n <mat-label>tag</mat-label>\n <input matInput [formControl]=\"tag\" />\n <mat-error *ngIf=\"tag.errors?.maxLength && (tag.dirty || tag.touched)\"\n >tag too long</mat-error\n >\n </mat-form-field>\n\n <!-- scope (bound) -->\n <mat-form-field *ngIf=\"scopeEntries?.length\" style=\"width: 8em\">\n <mat-label>scope</mat-label>\n <mat-select [formControl]=\"scope\">\n <mat-option *ngFor=\"let e of scopeEntries\" [value]=\"e.id\">{{\n e.value\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n <!-- scope (free) -->\n <mat-form-field *ngIf=\"!scopeEntries?.length\" style=\"width: 8em\">\n <mat-label>scope</mat-label>\n <input matInput [formControl]=\"scope\" />\n <mat-error\n *ngIf=\"scope.errors?.maxLength && (scope.dirty || scope.touched)\"\n >scope too long</mat-error\n >\n </mat-form-field>\n\n <!-- value -->\n <mat-form-field>\n <mat-label>value</mat-label>\n <input matInput [formControl]=\"value\" />\n <mat-error\n *ngIf=\"value.errors?.required && (value.dirty || value.touched)\"\n >value required</mat-error\n >\n <mat-error\n *ngIf=\"value.errors?.maxLength && (value.dirty || value.touched)\"\n >value too long</mat-error\n >\n </mat-form-field>\n\n <!-- lookup -->\n <div *ngIf=\"!noEidLookup\" style=\"margin-top: 4px\">\n <mat-expansion-panel [(expanded)]=\"lookupExpanded\">\n <mat-expansion-panel-header>lookup</mat-expansion-panel-header>\n <cadmus-scoped-pin-lookup\n (idPick)=\"onIdPick($event)\"\n ></cadmus-scoped-pin-lookup>\n </mat-expansion-panel>\n </div>\n </div>\n\n <!-- assertion -->\n <mat-expansion-panel>\n <mat-expansion-panel-header>assertion</mat-expansion-panel-header>\n <cadmus-refs-assertion\n [assTagEntries]=\"assTagEntries\"\n [refTypeEntries]=\"refTypeEntries\"\n [refTagEntries]=\"refTagEntries\"\n [assertion]=\"initialAssertion\"\n (assertionChange)=\"onAssertionChange($event)\"\n >\n </cadmus-refs-assertion>\n </mat-expansion-panel>\n </div>\n\n <!-- buttons -->\n <div *ngIf=\"hasSubmit\">\n <button mat-icon-button color=\"warn\" type=\"button\">\n <mat-icon>close</mat-icon>\n </button>\n <button\n mat-icon-button\n color=\"primary\"\n type=\"submit\"\n [disabled]=\"form.invalid\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:flex-start;flex-wrap:wrap}.form-row *{flex:0 0 auto}.pin-info{font-size:90%;color:silver}fieldset{border:1px solid silver;border-radius:6px;padding:6px}@media only screen and (max-width: 959px){div#container{grid-template-rows:1fr auto;grid-template-columns:1fr;grid-template-areas:\"editor\" \"lookup\"}}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: 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: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i11.AssertionComponent, selector: "cadmus-refs-assertion", inputs: ["assTagEntries", "refTypeEntries", "refTagEntries", "assertion"], outputs: ["assertionChange"] }, { kind: "component", type: i12.ScopedPinLookupComponent, selector: "cadmus-scoped-pin-lookup", outputs: ["idPick"] }] });
|
|
98
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: AssertedIdComponent, decorators: [{
|
|
80
99
|
type: Component,
|
|
81
|
-
args: [{ selector: 'cadmus-refs-asserted-id', template: "<form [formGroup]=\"form\">\n <div>\n <!-- tag (bound) -->\n
|
|
82
|
-
}], ctorParameters: function () { return [{ type: i1.FormBuilder }
|
|
100
|
+
args: [{ selector: 'cadmus-refs-asserted-id', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div>\n <div class=\"form-row\">\n <!-- tag (bound) -->\n <mat-form-field *ngIf=\"idTagEntries?.length\" style=\"width: 8em\">\n <mat-label>tag</mat-label>\n <mat-select [formControl]=\"tag\">\n <mat-option *ngFor=\"let e of idTagEntries\" [value]=\"e.id\">{{\n e.value\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n <!-- tag (free) -->\n <mat-form-field *ngIf=\"!idTagEntries?.length\" style=\"width: 8em\">\n <mat-label>tag</mat-label>\n <input matInput [formControl]=\"tag\" />\n <mat-error *ngIf=\"tag.errors?.maxLength && (tag.dirty || tag.touched)\"\n >tag too long</mat-error\n >\n </mat-form-field>\n\n <!-- scope (bound) -->\n <mat-form-field *ngIf=\"scopeEntries?.length\" style=\"width: 8em\">\n <mat-label>scope</mat-label>\n <mat-select [formControl]=\"scope\">\n <mat-option *ngFor=\"let e of scopeEntries\" [value]=\"e.id\">{{\n e.value\n }}</mat-option>\n </mat-select>\n </mat-form-field>\n <!-- scope (free) -->\n <mat-form-field *ngIf=\"!scopeEntries?.length\" style=\"width: 8em\">\n <mat-label>scope</mat-label>\n <input matInput [formControl]=\"scope\" />\n <mat-error\n *ngIf=\"scope.errors?.maxLength && (scope.dirty || scope.touched)\"\n >scope too long</mat-error\n >\n </mat-form-field>\n\n <!-- value -->\n <mat-form-field>\n <mat-label>value</mat-label>\n <input matInput [formControl]=\"value\" />\n <mat-error\n *ngIf=\"value.errors?.required && (value.dirty || value.touched)\"\n >value required</mat-error\n >\n <mat-error\n *ngIf=\"value.errors?.maxLength && (value.dirty || value.touched)\"\n >value too long</mat-error\n >\n </mat-form-field>\n\n <!-- lookup -->\n <div *ngIf=\"!noEidLookup\" style=\"margin-top: 4px\">\n <mat-expansion-panel [(expanded)]=\"lookupExpanded\">\n <mat-expansion-panel-header>lookup</mat-expansion-panel-header>\n <cadmus-scoped-pin-lookup\n (idPick)=\"onIdPick($event)\"\n ></cadmus-scoped-pin-lookup>\n </mat-expansion-panel>\n </div>\n </div>\n\n <!-- assertion -->\n <mat-expansion-panel>\n <mat-expansion-panel-header>assertion</mat-expansion-panel-header>\n <cadmus-refs-assertion\n [assTagEntries]=\"assTagEntries\"\n [refTypeEntries]=\"refTypeEntries\"\n [refTagEntries]=\"refTagEntries\"\n [assertion]=\"initialAssertion\"\n (assertionChange)=\"onAssertionChange($event)\"\n >\n </cadmus-refs-assertion>\n </mat-expansion-panel>\n </div>\n\n <!-- buttons -->\n <div *ngIf=\"hasSubmit\">\n <button mat-icon-button color=\"warn\" type=\"button\">\n <mat-icon>close</mat-icon>\n </button>\n <button\n mat-icon-button\n color=\"primary\"\n type=\"submit\"\n [disabled]=\"form.invalid\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:flex-start;flex-wrap:wrap}.form-row *{flex:0 0 auto}.pin-info{font-size:90%;color:silver}fieldset{border:1px solid silver;border-radius:6px;padding:6px}@media only screen and (max-width: 959px){div#container{grid-template-rows:1fr auto;grid-template-columns:1fr;grid-template-areas:\"editor\" \"lookup\"}}\n"] }]
|
|
101
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.PinRefLookupService }, { type: undefined, decorators: [{
|
|
102
|
+
type: Inject,
|
|
103
|
+
args: ['indexLookupDefinitions']
|
|
104
|
+
}] }]; }, propDecorators: { scopeEntries: [{
|
|
83
105
|
type: Input
|
|
84
106
|
}], idTagEntries: [{
|
|
85
107
|
type: Input
|
|
@@ -91,7 +113,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
|
|
|
91
113
|
type: Input
|
|
92
114
|
}], id: [{
|
|
93
115
|
type: Input
|
|
116
|
+
}], noEidLookup: [{
|
|
117
|
+
type: Input
|
|
118
|
+
}], hasSubmit: [{
|
|
119
|
+
type: Input
|
|
94
120
|
}], idChange: [{
|
|
95
121
|
type: Output
|
|
96
122
|
}] } });
|
|
97
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0ZWQtaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvYXNzZXJ0ZWQtaWQvYXNzZXJ0ZWQtaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvYXNzZXJ0ZWQtaWQvYXNzZXJ0ZWQtaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBSUwsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7O0FBYzlDLE1BQU0sT0FBTyxtQkFBbUI7SUF5QzlCLFlBQVksV0FBd0I7UUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBQy9DLE9BQU87UUFDUCxJQUFJLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ3JDLFVBQVUsQ0FBQyxRQUFRO1lBQ25CLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1NBQzFCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FB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QUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUssRUFBRTtzQkFEWixLQUFLO2dCQVlDLFFBQVE7c0JBRGQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFRoZXNhdXJ1c0VudHJ5IH0gZnJvbSAnQG15cm1pZG9uL2NhZG11cy1jb3JlJztcclxuaW1wb3J0IHsgQXNzZXJ0aW9uIH0gZnJvbSAnQG15cm1pZG9uL2NhZG11cy1yZWZzLWFzc2VydGlvbic7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXJ0ZWRJZCB7XHJcbiAgdGFnPzogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgc2NvcGU6IHN0cmluZztcclxuICBhc3NlcnRpb24/OiBBc3NlcnRpb247XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hc3NlcnRlZC1pZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYXNzZXJ0ZWQtaWQuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXNzZXJ0ZWRJZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcHJpdmF0ZSBfdXBkYXRpbmdGb3JtOiBib29sZWFuIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2lkOiBBc3NlcnRlZElkIHwgdW5kZWZpbmVkO1xyXG5cclxuICBwdWJsaWMgdGFnOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgdmFsdWU6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBzY29wZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgcHVibGljIGluaXRpYWxBc3NlcnRpb24/OiBBc3NlcnRpb247XHJcbiAgcHVibGljIGFzc2VydGlvbj86IEFzc2VydGlvbjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2NvcGVFbnRyaWVzPzogVGhlc2F1cnVzRW50cnlbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaWRUYWdFbnRyaWVzPzogVGhlc2F1cnVzRW50cnlbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYXNzVGFnRW50cmllcz86IFRoZXNhdXJ1c0VudHJ5W107XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHJlZlR5cGVFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyByZWZUYWdFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgaWQoKTogQXNzZXJ0ZWRJZCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5faWQ7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgaWQodmFsdWU6IEFzc2VydGVkSWQgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLl9pZCAhPT0gdmFsdWUpIHtcclxuICAgICAgdGhpcy5faWQgPSB2YWx1ZTtcclxuICAgICAgdGhpcy51cGRhdGVGb3JtKHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyBpZENoYW5nZTogRXZlbnRFbWl0dGVyPEFzc2VydGVkSWQ+O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIpIHtcclxuICAgIHRoaXMuaWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEFzc2VydGVkSWQ+KCk7XHJcbiAgICAvLyBmb3JtXHJcbiAgICB0aGlzLnRhZyA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApKTtcclxuICAgIHRoaXMudmFsdWUgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFtcclxuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTAwKSxcclxuICAgIF0pO1xyXG4gICAgdGhpcy5zY29wZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTAwKSk7XHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHRhZzogdGhpcy50YWcsXHJcbiAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxyXG4gICAgICBzY29wZTogdGhpcy5zY29wZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpLnN1YnNjcmliZSgoXykgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuX3VwZGF0aW5nRm9ybSkge1xyXG4gICAgICAgIHRoaXMuZW1pdElkQ2hhbmdlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQXNzZXJ0aW9uQ2hhbmdlKGFzc2VydGlvbjogQXNzZXJ0aW9uIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICB0aGlzLmFzc2VydGlvbiA9IGFzc2VydGlvbjtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5lbWl0SWRDaGFuZ2UoKSwgMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZvcm0odmFsdWU6IEFzc2VydGVkSWQgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIHRoaXMuX3VwZGF0aW5nRm9ybSA9IHRydWU7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xyXG4gICAgICB0aGlzLmFzc2VydGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudGFnLnNldFZhbHVlKHZhbHVlLnRhZyB8fCBudWxsKTtcclxuICAgICAgdGhpcy52YWx1ZS5zZXRWYWx1ZSh2YWx1ZS52YWx1ZSk7XHJcbiAgICAgIHRoaXMuc2NvcGUuc2V0VmFsdWUodmFsdWUuc2NvcGUpO1xyXG4gICAgICB0aGlzLmluaXRpYWxBc3NlcnRpb24gPSB2YWx1ZS5hc3NlcnRpb247XHJcbiAgICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdXBkYXRpbmdGb3JtID0gZmFsc2U7XHJcbiAgICB0aGlzLmVtaXRJZENoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJZCgpOiBBc3NlcnRlZElkIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRhZzogdGhpcy50YWcudmFsdWU/LnRyaW0oKSxcclxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUudmFsdWU/LnRyaW0oKSB8fCAnJyxcclxuICAgICAgc2NvcGU6IHRoaXMuc2NvcGUudmFsdWU/LnRyaW0oKSB8fCAnJyxcclxuICAgICAgYXNzZXJ0aW9uOiB0aGlzLmFzc2VydGlvbixcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW1pdElkQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pZENoYW5nZS5lbWl0KHRoaXMuZ2V0SWQoKSk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICA8ZGl2PlxuICAgIDwhLS0gdGFnIChib3VuZCkgLS0+XG4gICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiaWRUYWdFbnRyaWVzPy5sZW5ndGhcIiBzdHlsZT1cIndpZHRoOiA4ZW1cIj5cbiAgICAgIDxtYXQtbGFiZWw+dGFnPC9tYXQtbGFiZWw+XG4gICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwidGFnXCI+XG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBlIG9mIGlkVGFnRW50cmllc1wiIFt2YWx1ZV09XCJlLmlkXCI+e3tcbiAgICAgICAgICBlLnZhbHVlXG4gICAgICAgIH19PC9tYXQtb3B0aW9uPlxuICAgICAgPC9tYXQtc2VsZWN0PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPCEtLSB0YWcgKGZyZWUpIC0tPlxuICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIiFpZFRhZ0VudHJpZXM/Lmxlbmd0aFwiIHN0eWxlPVwid2lkdGg6IDhlbVwiPlxuICAgICAgPG1hdC1sYWJlbD50YWc8L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidGFnXCIgLz5cbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJ0YWcuZXJyb3JzPy5tYXhMZW5ndGggJiYgKHRhZy5kaXJ0eSB8fCB0YWcudG91Y2hlZClcIlxuICAgICAgICA+dGFnIHRvbyBsb25nPC9tYXQtZXJyb3JcbiAgICAgID5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICZuYnNwO1xuXG4gICAgPCEtLSBzY29wZSAoYm91bmQpIC0tPlxuICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cInNjb3BlRW50cmllcz8ubGVuZ3RoXCIgc3R5bGU9XCJ3aWR0aDogOGVtXCI+XG4gICAgICA8bWF0LWxhYmVsPnNjb3BlPC9tYXQtbGFiZWw+XG4gICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwic2NvcGVcIj5cbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGUgb2Ygc2NvcGVFbnRyaWVzXCIgW3ZhbHVlXT1cImUuaWRcIj57e1xuICAgICAgICAgIGUudmFsdWVcbiAgICAgICAgfX08L21hdC1vcHRpb24+XG4gICAgICA8L21hdC1zZWxlY3Q+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8IS0tIHNjb3BlIChmcmVlKSAtLT5cbiAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhc2NvcGVFbnRyaWVzPy5sZW5ndGhcIiBzdHlsZT1cIndpZHRoOiA4ZW1cIj5cbiAgICAgIDxtYXQtbGFiZWw+c2NvcGU8L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwic2NvcGVcIiAvPlxuICAgICAgPG1hdC1lcnJvclxuICAgICAgICAqbmdJZj1cInNjb3BlLmVycm9ycz8ubWF4TGVuZ3RoICYmIChzY29wZS5kaXJ0eSB8fCBzY29wZS50b3VjaGVkKVwiXG4gICAgICAgID5zY29wZSB0b28gbG9uZzwvbWF0LWVycm9yXG4gICAgICA+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8IS0tIHZhbHVlIC0tPlxuICAgICZuYnNwO1xuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtbGFiZWw+dmFsdWU8L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidmFsdWVcIiAvPlxuICAgICAgPG1hdC1lcnJvclxuICAgICAgICAqbmdJZj1cInZhbHVlLmVycm9ycz8ucmVxdWlyZWQgJiYgKHZhbHVlLmRpcnR5IHx8IHZhbHVlLnRvdWNoZWQpXCJcbiAgICAgICAgPnZhbHVlIHJlcXVpcmVkPC9tYXQtZXJyb3JcbiAgICAgID5cbiAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgKm5nSWY9XCJ2YWx1ZS5lcnJvcnM/Lm1heExlbmd0aCAmJiAodmFsdWUuZGlydHkgfHwgdmFsdWUudG91Y2hlZClcIlxuICAgICAgICA+dmFsdWUgdG9vIGxvbmc8L21hdC1lcnJvclxuICAgICAgPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvZGl2PlxuXG4gIDwhLS0gYXNzZXJ0aW9uIC0tPlxuICA8bWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+YXNzZXJ0aW9uPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICA8Y2FkbXVzLXJlZnMtYXNzZXJ0aW9uXG4gICAgICBbYXNzVGFnRW50cmllc109XCJhc3NUYWdFbnRyaWVzXCJcbiAgICAgIFtyZWZUeXBlRW50cmllc109XCJyZWZUeXBlRW50cmllc1wiXG4gICAgICBbcmVmVGFnRW50cmllc109XCJyZWZUYWdFbnRyaWVzXCJcbiAgICAgIFthc3NlcnRpb25dPVwiaW5pdGlhbEFzc2VydGlvblwiXG4gICAgICAoYXNzZXJ0aW9uQ2hhbmdlKT1cIm9uQXNzZXJ0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgID5cbiAgICA8L2NhZG11cy1yZWZzLWFzc2VydGlvbj5cbiAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuPC9mb3JtPlxuIl19
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0ZWQtaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvYXNzZXJ0ZWQtaWQvYXNzZXJ0ZWQtaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vY2FkbXVzLXJlZnMtYXNzZXJ0ZWQtaWRzL3NyYy9saWIvYXNzZXJ0ZWQtaWQvYXNzZXJ0ZWQtaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFtQjlDLE1BQU0sT0FBTyxtQkFBbUI7SUFtRDlCLFlBQ0UsV0FBd0IsRUFDakIsYUFBa0MsRUFFbEMsVUFBa0M7UUFGbEMsa0JBQWEsR0FBYixhQUFhLENBQXFCO1FBRWxDLGVBQVUsR0FBVixVQUFVLENBQXdCO1FBRXpDLElBQUksQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDckMsVUFBVSxDQUFDLFFBQVE7WUFDbkIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFV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QUU7WUFDckMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCLENBQUM7SUFDSixDQUFDO0lBRU0sWUFBWTtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUM7O2dIQS9IVSxtQkFBbUIsZ0ZBc0RwQix3QkFBd0I7b0dBdER2QixtQkFBbUIsMFVDakNoQyw0b0dBOEZBOzJGRDdEYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0UseUJBQXlCOzswQkEwRGhDLE1BQU07MkJBQUMsd0JBQXdCOzRDQXhDM0IsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxZQUFZO3NCQURsQixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsY0FBYztzQkFEcEIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlLLEVBQUU7c0JBRFosS0FBSztnQkFlQyxXQUFXO3NCQURqQixLQUFLO2dCQUlDLFNBQVM7c0JBRGYsS0FBSztnQkFJQyxRQUFRO3NCQURkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybUNvbnRyb2wsXHJcbiAgRm9ybUdyb3VwLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBJbmRleExvb2t1cERlZmluaXRpb25zLCBUaGVzYXVydXNFbnRyeSB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtY29yZSc7XHJcbmltcG9ydCB7IEFzc2VydGlvbiB9IGZyb20gJ0BteXJtaWRvbi9jYWRtdXMtcmVmcy1hc3NlcnRpb24nO1xyXG5cclxuaW1wb3J0IHsgUGluUmVmTG9va3VwU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3Bpbi1yZWYtbG9va3VwLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBc3NlcnRlZElkIHtcclxuICB0YWc/OiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICBzY29wZTogc3RyaW5nO1xyXG4gIGFzc2VydGlvbj86IEFzc2VydGlvbjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjYWRtdXMtcmVmcy1hc3NlcnRlZC1pZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Fzc2VydGVkLWlkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hc3NlcnRlZC1pZC5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3NlcnRlZElkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBwcml2YXRlIF91cGRhdGluZ0Zvcm06IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfaWQ6IEFzc2VydGVkSWQgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHB1YmxpYyB0YWc6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyB2YWx1ZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIHNjb3BlOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBwdWJsaWMgaW5pdGlhbEFzc2VydGlvbj86IEFzc2VydGlvbjtcclxuICBwdWJsaWMgYXNzZXJ0aW9uPzogQXNzZXJ0aW9uO1xyXG4gIHB1YmxpYyBsb29rdXBFeHBhbmRlZDogYm9vbGVhbjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2NvcGVFbnRyaWVzPzogVGhlc2F1cnVzRW50cnlbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaWRUYWdFbnRyaWVzPzogVGhlc2F1cnVzRW50cnlbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgYXNzVGFnRW50cmllcz86IFRoZXNhdXJ1c0VudHJ5W107XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHJlZlR5cGVFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyByZWZUYWdFbnRyaWVzOiBUaGVzYXVydXNFbnRyeVtdIHwgdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgaWQoKTogQXNzZXJ0ZWRJZCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5faWQ7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgaWQodmFsdWU6IEFzc2VydGVkSWQgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLl9pZCAhPT0gdmFsdWUpIHtcclxuICAgICAgdGhpcy5faWQgPSB2YWx1ZTtcclxuICAgICAgdGhpcy51cGRhdGVGb3JtKHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRydWUgdG8gaGlkZSB0aGUgcGluLWJhc2VkIEVJRCBsb29rdXAgVUkuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgbm9FaWRMb29rdXA6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGhhc1N1Ym1pdDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIGlkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QXNzZXJ0ZWRJZD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHVibGljIGxvb2t1cFNlcnZpY2U6IFBpblJlZkxvb2t1cFNlcnZpY2UsXHJcbiAgICBASW5qZWN0KCdpbmRleExvb2t1cERlZmluaXRpb25zJylcclxuICAgIHB1YmxpYyBsb29rdXBEZWZzOiBJbmRleExvb2t1cERlZmluaXRpb25zXHJcbiAgKSB7XHJcbiAgICB0aGlzLnRhZyA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApKTtcclxuICAgIHRoaXMudmFsdWUgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFtcclxuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTAwKSxcclxuICAgIF0pO1xyXG4gICAgdGhpcy5zY29wZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTAwKSk7XHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHRhZzogdGhpcy50YWcsXHJcbiAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxyXG4gICAgICBzY29wZTogdGhpcy5zY29wZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5sb29rdXBFeHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXNzZXJ0ZWRJZD4oKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSgzMDApKS5zdWJzY3JpYmUoKF8pID0+IHtcclxuICAgICAgaWYgKCF0aGlzLl91cGRhdGluZ0Zvcm0pIHtcclxuICAgICAgICB0aGlzLmVtaXRJZENoYW5nZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkFzc2VydGlvbkNoYW5nZShhc3NlcnRpb246IEFzc2VydGlvbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgdGhpcy5hc3NlcnRpb24gPSBhc3NlcnRpb247XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZW1pdElkQ2hhbmdlKCksIDApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uSWRQaWNrKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWUuc2V0VmFsdWUoaWQpO1xyXG4gICAgdGhpcy52YWx1ZS5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy52YWx1ZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmxvb2t1cEV4cGFuZGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZvcm0odmFsdWU6IEFzc2VydGVkSWQgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIHRoaXMuX3VwZGF0aW5nRm9ybSA9IHRydWU7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xyXG4gICAgICB0aGlzLmFzc2VydGlvbiA9IHVuZGVmaW5lZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudGFnLnNldFZhbHVlKHZhbHVlLnRhZyB8fCBudWxsKTtcclxuICAgICAgdGhpcy52YWx1ZS5zZXRWYWx1ZSh2YWx1ZS52YWx1ZSk7XHJcbiAgICAgIHRoaXMuc2NvcGUuc2V0VmFsdWUodmFsdWUuc2NvcGUpO1xyXG4gICAgICB0aGlzLmluaXRpYWxBc3NlcnRpb24gPSB2YWx1ZS5hc3NlcnRpb247XHJcbiAgICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdXBkYXRpbmdGb3JtID0gZmFsc2U7XHJcbiAgICB0aGlzLmVtaXRJZENoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJZCgpOiBBc3NlcnRlZElkIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRhZzogdGhpcy50YWcudmFsdWU/LnRyaW0oKSxcclxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUudmFsdWU/LnRyaW0oKSB8fCAnJyxcclxuICAgICAgc2NvcGU6IHRoaXMuc2NvcGUudmFsdWU/LnRyaW0oKSB8fCAnJyxcclxuICAgICAgYXNzZXJ0aW9uOiB0aGlzLmFzc2VydGlvbixcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW1pdElkQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmhhc1N1Ym1pdCkge1xyXG4gICAgICB0aGlzLmlkQ2hhbmdlLmVtaXQodGhpcy5nZXRJZCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybS52YWxpZCkge1xyXG4gICAgICB0aGlzLmlkQ2hhbmdlLmVtaXQodGhpcy5nZXRJZCgpKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKHN1Ym1pdCk9XCJzYXZlKClcIj5cbiAgPGRpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICAgIDwhLS0gdGFnIChib3VuZCkgLS0+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJpZFRhZ0VudHJpZXM/Lmxlbmd0aFwiIHN0eWxlPVwid2lkdGg6IDhlbVwiPlxuICAgICAgICA8bWF0LWxhYmVsPnRhZzwvbWF0LWxhYmVsPlxuICAgICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwidGFnXCI+XG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGUgb2YgaWRUYWdFbnRyaWVzXCIgW3ZhbHVlXT1cImUuaWRcIj57e1xuICAgICAgICAgICAgZS52YWx1ZVxuICAgICAgICAgIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPCEtLSB0YWcgKGZyZWUpIC0tPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiIWlkVGFnRW50cmllcz8ubGVuZ3RoXCIgc3R5bGU9XCJ3aWR0aDogOGVtXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+dGFnPC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidGFnXCIgLz5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInRhZy5lcnJvcnM/Lm1heExlbmd0aCAmJiAodGFnLmRpcnR5IHx8IHRhZy50b3VjaGVkKVwiXG4gICAgICAgICAgPnRhZyB0b28gbG9uZzwvbWF0LWVycm9yXG4gICAgICAgID5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgIDwhLS0gc2NvcGUgKGJvdW5kKSAtLT5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cInNjb3BlRW50cmllcz8ubGVuZ3RoXCIgc3R5bGU9XCJ3aWR0aDogOGVtXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+c2NvcGU8L21hdC1sYWJlbD5cbiAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cInNjb3BlXCI+XG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGUgb2Ygc2NvcGVFbnRyaWVzXCIgW3ZhbHVlXT1cImUuaWRcIj57e1xuICAgICAgICAgICAgZS52YWx1ZVxuICAgICAgICAgIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPCEtLSBzY29wZSAoZnJlZSkgLS0+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhc2NvcGVFbnRyaWVzPy5sZW5ndGhcIiBzdHlsZT1cIndpZHRoOiA4ZW1cIj5cbiAgICAgICAgPG1hdC1sYWJlbD5zY29wZTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInNjb3BlXCIgLz5cbiAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICpuZ0lmPVwic2NvcGUuZXJyb3JzPy5tYXhMZW5ndGggJiYgKHNjb3BlLmRpcnR5IHx8IHNjb3BlLnRvdWNoZWQpXCJcbiAgICAgICAgICA+c2NvcGUgdG9vIGxvbmc8L21hdC1lcnJvclxuICAgICAgICA+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8IS0tIHZhbHVlIC0tPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWxhYmVsPnZhbHVlPC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidmFsdWVcIiAvPlxuICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgKm5nSWY9XCJ2YWx1ZS5lcnJvcnM/LnJlcXVpcmVkICYmICh2YWx1ZS5kaXJ0eSB8fCB2YWx1ZS50b3VjaGVkKVwiXG4gICAgICAgICAgPnZhbHVlIHJlcXVpcmVkPC9tYXQtZXJyb3JcbiAgICAgICAgPlxuICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgKm5nSWY9XCJ2YWx1ZS5lcnJvcnM/Lm1heExlbmd0aCAmJiAodmFsdWUuZGlydHkgfHwgdmFsdWUudG91Y2hlZClcIlxuICAgICAgICAgID52YWx1ZSB0b28gbG9uZzwvbWF0LWVycm9yXG4gICAgICAgID5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgIDwhLS0gbG9va3VwIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFub0VpZExvb2t1cFwiIHN0eWxlPVwibWFyZ2luLXRvcDogNHB4XCI+XG4gICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIFsoZXhwYW5kZWQpXT1cImxvb2t1cEV4cGFuZGVkXCI+XG4gICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPmxvb2t1cDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgPGNhZG11cy1zY29wZWQtcGluLWxvb2t1cFxuICAgICAgICAgICAgKGlkUGljayk9XCJvbklkUGljaygkZXZlbnQpXCJcbiAgICAgICAgICA+PC9jYWRtdXMtc2NvcGVkLXBpbi1sb29rdXA+XG4gICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBhc3NlcnRpb24gLS0+XG4gICAgPG1hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+YXNzZXJ0aW9uPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgIDxjYWRtdXMtcmVmcy1hc3NlcnRpb25cbiAgICAgICAgW2Fzc1RhZ0VudHJpZXNdPVwiYXNzVGFnRW50cmllc1wiXG4gICAgICAgIFtyZWZUeXBlRW50cmllc109XCJyZWZUeXBlRW50cmllc1wiXG4gICAgICAgIFtyZWZUYWdFbnRyaWVzXT1cInJlZlRhZ0VudHJpZXNcIlxuICAgICAgICBbYXNzZXJ0aW9uXT1cImluaXRpYWxBc3NlcnRpb25cIlxuICAgICAgICAoYXNzZXJ0aW9uQ2hhbmdlKT1cIm9uQXNzZXJ0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgPlxuICAgICAgPC9jYWRtdXMtcmVmcy1hc3NlcnRpb24+XG4gICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICA8L2Rpdj5cblxuICA8IS0tIGJ1dHRvbnMgLS0+XG4gIDxkaXYgKm5nSWY9XCJoYXNTdWJtaXRcIj5cbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19
|