@bi8/am-dyn-form
Version:
ng update @angular/cli yarn add @angular/cli
379 lines • 51.6 kB
JavaScript
import { Subject, Observable, ReplaySubject, BehaviorSubject } from 'rxjs';
import { filter, map, takeWhile, tap } from 'rxjs/operators';
import { of } from 'rxjs/internal/observable/of';
import { pipeFromArray } from 'rxjs/internal/util/pipe';
export var NotificationType;
(function (NotificationType) {
NotificationType["init"] = "init";
NotificationType["busy"] = "busy";
NotificationType["idle"] = "idle";
NotificationType["paramFunc"] = "paramFunc";
NotificationType["inputNext"] = "inputNext";
NotificationType["inputComplete"] = "inputComplete";
NotificationType["inputError"] = "inputError";
NotificationType["outputFuncError"] = "outputFuncError";
NotificationType["outputNext"] = "outputNext";
NotificationType["outputError"] = "outputError";
NotificationType["outputComplete"] = "outputComplete";
NotificationType["close"] = "close";
NotificationType["enable"] = "enable";
NotificationType["disable"] = "disable";
})(NotificationType || (NotificationType = {}));
export class Channel {
constructor(fn, options) {
this.fn = fn;
this.closed = false;
this.enabled = true;
if (options) {
this.input = options.input || new Subject();
this.output = options.output || new ReplaySubject(1);
this.enabled = options.enabled || true;
this.name = options.name || 'channel';
this.debug = options.debug || false;
this.paramFn = options.paramFn;
this.notificationFn = options.notificationFn;
}
else {
this.input = new Subject();
this.output = new ReplaySubject(1);
this.enabled = true;
this.name = 'channel';
this.debug = false;
}
this.notifications = new BehaviorSubject({ type: NotificationType.init });
//this.observeNotifications().subscribe();
if (this.notificationFn) {
this.observeNotifications().subscribe(this.notificationFn);
}
this.input.pipe(takeWhile((value) => !this.closed), filter((value) => this.enabled), map((input) => {
this.emitNotification({ type: NotificationType.busy });
if (this.paramFn) {
let result = this.paramFn(input);
this.emitNotification({ type: NotificationType.paramFunc, data: { before: input, after: result } });
return result;
}
else {
return input;
}
}), tap((data) => {
this.inputBusy = true;
this.emitNotification({ type: NotificationType.inputNext, data: data });
})).subscribe({
next: (value) => {
try {
this.outputBusy = true;
let observable = this.fn(value);
observable.pipe(tap((data) => {
this.emitNotification({ type: NotificationType.outputNext, data: data });
})).subscribe({
next: (response) => this.output.next(response),
error: (err) => {
this.emitNotification({ type: NotificationType.outputError, error: err });
this.output.error(err);
},
complete: () => {
this.outputBusy = false;
this.emitNotification({ type: NotificationType.outputComplete });
this.emitNotification({ type: NotificationType.idle });
}
});
}
catch (err) {
this.emitNotification({ type: NotificationType.outputFuncError, error: err });
this.outputBusy = false;
}
},
error: (err) => {
this.emitNotification({ type: NotificationType.outputFuncError, error: err });
},
complete: () => {
this.inputBusy = false;
}
});
}
isBusy() {
return this.inputBusy || this.outputBusy;
}
isInputBusy() {
return this.inputBusy;
}
isOutputBusy() {
return this.outputBusy;
}
next(value) {
this.input.next(value);
return this;
}
emit(value) {
this.output.next(value);
}
observe(value, ...ops) {
setInterval(() => {
this.next(value);
});
return this.output.pipe(pipeFromArray([...ops]));
}
link(observer, ...ops) {
observer.pipe(pipeFromArray([...ops])).subscribe((value) => this.next(value));
}
pipe(observer, ...ops) {
observer.pipe(pipeFromArray([...ops])).subscribe((value) => this.emit(value));
}
asObservable() {
return this.output.asObservable();
}
observeNotifications() {
return this.notifications.asObservable();
}
emitNotification(notification) {
notification.name = this.name;
if (this.debug) {
switch (notification.type) {
case NotificationType.inputError:
case NotificationType.outputError:
case NotificationType.outputFuncError:
console.error(`[${notification.name}:${notification.type}] `, notification.error || '');
break;
default:
console.debug(`[${notification.name}:${notification.type}] `, notification.data || '');
break;
}
}
this.notifications.next(notification);
}
enable() {
this.enabled = false;
return this;
}
disable() {
this.enabled = true;
return this;
}
close() {
this.closed = true;
this.input.unsubscribe();
this.output.unsubscribe();
}
}
export class ChannelSwitch {
constructor(...channels) {
this.channels = new Map();
channels.forEach((config) => {
this.channels.set(config.key, config.channel);
});
}
set(key, channel) {
this.channels.set(key, channel);
return channel;
}
get(key) {
return this.channels.get(key);
}
isBusy(key) {
let channel = this.channels.get(key);
return channel ? channel.isBusy() : false;
}
isInputBusy(key) {
let channel = this.channels.get(key);
return channel ? channel.isInputBusy() : false;
}
isOutputBusy(key) {
let channel = this.channels.get(key);
return channel ? channel.isOutputBusy() : false;
}
next(key, value) {
let channel = this.channels.get(key);
return channel ? channel.next(value) : null;
}
emit(key, value) {
let channel = this.channels.get(key);
return channel ? channel.emit(value) : false;
}
observe(key, value, ...ops) {
let channel = this.channels.get(key);
return channel ? channel.observe(value, ...ops) : null;
}
link(key, observer, ...ops) {
let channel = this.channels.get(key);
if (channel) {
channel.link(observer, ...ops);
}
}
pipe(key, observer, ...ops) {
let channel = this.channels.get(key);
if (channel) {
channel.pipe(observer, ...ops);
}
}
asObservable(key) {
let channel = this.channels.get(key);
return channel ? channel.asObservable() : null;
}
observeNotifications(key) {
let channel = this.channels.get(key);
return channel ? channel.observeNotifications() : null;
}
enable(key) {
let channel = this.channels.get(key);
return channel ? channel.enable() : null;
}
disable(key) {
let channel = this.channels.get(key);
return channel ? channel.disable() : null;
}
close(key) {
let channel = this.channels.get(key);
return channel ? channel.close() : null;
}
}
export class DSPipe {
constructor(ds, key, obs, ops, enabled = true) {
this.ds = ds;
this.key = key;
this.obs = obs;
this.ops = ops;
this.enabled = enabled;
this.connect();
}
isConnected() {
return !(!this.sub);
}
connect() {
if (this.isConnected()) {
return;
}
this.sub = this.obs.pipe(pipeFromArray([...this.ops])).subscribe((value) => {
console.log(`----> pipe (${this.key})`, value);
this.ds.next(this.key, value);
});
}
disconnect() {
if (!this.isConnected()) {
return;
}
this.sub.unsubscribe();
}
setOperators(...ops) {
this.disconnect();
this.ops = ops;
this.connect();
}
enable() {
this.enabled = true;
}
disable() {
this.enabled = false;
}
}
export class ObservableDS {
constructor(options) {
this.connected = false;
this.fnMap = new Map();
this.subjectMap = new Map();
this.input$ = new Subject();
this.inputSub = null;
this.events$ = new Subject();
this.pipes = [];
if (options) {
if (options.autoconnect) {
this.connect();
}
if (options.key && options.obs) {
this.addObservable(options.key, options.obs);
}
}
else {
// we connect by default
this.connect();
}
}
isConnected() {
return !(!this.inputSub);
}
connect() {
if (this.isConnected()) {
return;
}
this.inputSub = this.input$.pipe(filter((input) => {
if (this.fnMap.has(input.id)) {
return true;
}
console.error(`[obs] observable with id '${input.id}' not found`);
return false;
}), map((input) => {
let obsFn = this.fnMap.get(input.id);
return { event: input, fn: obsFn(input.value), sub: this.subjectMap.get(input.id) };
}))
.subscribe((input) => this.relay(input.event, input.fn, input.sub));
this.connected = true;
}
relay(event, obs, subject) {
//console.log(`-----> relay (${subject}: `, event);
obs.pipe(takeWhile(() => this.connected),
//tap((response) => { console.log(`-----> tap relay: `, response); subject.next(response) }),
tap((response) => this.emit({ input: event, output: response }))).subscribe();
}
emit(event) {
this.events$.next(event);
}
asObservable() {
return this.events$.asObservable();
}
disconnect() {
if (!this.isConnected()) {
return;
}
this.inputSub.unsubscribe();
let bla = of([1, 2, 3]);
let blaf = bla.subscribe();
blaf.add(blaf);
let duff = new Subject();
blaf.add(duff.asObservable().subscribe());
}
next(key, value, options) {
if (!this.connected) {
return;
}
let event = { id: key, options: options, value: value };
//console.log(`-----> next (${event})`, event);
this.input$.next(event);
}
addPipe(obs, key, ...operators) {
let pipe = new DSPipe(this, key, obs, operators);
this.pipes.push(pipe);
return pipe;
}
clearPipes(...pipes) {
pipes.forEach((pipe, index) => {
pipe.disconnect();
pipes = pipes.splice(index, 1);
});
}
clearAllPipes() {
this.clearPipes(...this.pipes);
}
getPipes() {
return this.pipes;
}
addObservable(key, obs, options) {
if (!options) {
options = { behave: true };
}
this.fnMap.set(key, obs instanceof Observable ? () => obs : obs);
this.subjectMap.set(key, options.behave ? new BehaviorSubject([]) : new Subject());
}
observe(key, value, options) {
let subject = this.subjectMap.get(key);
try {
return subject.asObservable();
}
finally {
if (value) {
this.next(key, value);
}
}
}
destroy() {
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluLWRhdGFzb3VyY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYmk4L2FtLWR5bi1mb3JtLyIsInNvdXJjZXMiOlsiYXBwL21vZHVsZXMvYW0tZHluLWZvcm0vZHluLWRhdGFzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFrQyxlQUFlLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDekcsT0FBTyxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUUvQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFNdEQsTUFBTSxDQUFOLElBQVksZ0JBZVg7QUFmRCxXQUFZLGdCQUFnQjtJQUMxQixpQ0FBYSxDQUFBO0lBQ2IsaUNBQWEsQ0FBQTtJQUNiLGlDQUFhLENBQUE7SUFDYiwyQ0FBdUIsQ0FBQTtJQUN2QiwyQ0FBdUIsQ0FBQTtJQUN2QixtREFBK0IsQ0FBQTtJQUMvQiw2Q0FBeUIsQ0FBQTtJQUN6Qix1REFBbUMsQ0FBQTtJQUNuQyw2Q0FBeUIsQ0FBQTtJQUN6QiwrQ0FBMkIsQ0FBQTtJQUMzQixxREFBaUMsQ0FBQTtJQUNqQyxtQ0FBZSxDQUFBO0lBQ2YscUNBQWlCLENBQUE7SUFDakIsdUNBQW1CLENBQUE7QUFDckIsQ0FBQyxFQWZXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFlM0I7QUFpQkQsTUFBTSxPQUFPLE9BQU87SUFhbEIsWUFBb0IsRUFBc0IsRUFBRSxPQVEzQztRQVJtQixPQUFFLEdBQUYsRUFBRSxDQUFvQjtRQVpsQyxXQUFNLEdBQVksS0FBSyxDQUFDO1FBR3hCLFlBQU8sR0FBWSxJQUFJLENBQUM7UUFrQjlCLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENB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Q0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELGFBQWEsQ0FBQyxHQUFRLEVBQUUsR0FBcUMsRUFBRSxPQUF5QjtRQUN0RixJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osT0FBTyxHQUFHLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDO1NBQzFCO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsWUFBWSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sRUFBTyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFRLEVBQUUsS0FBVyxFQUFFLE9BQXlCO1FBQ3RELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUk7WUFDRixPQUFPLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUMvQjtnQkFBUztZQUNSLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3ZCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsT0FBTztJQUNQLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U3ViamVjdCwgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3Vic2NyaXB0aW9uLCBPcGVyYXRvckZ1bmN0aW9uLCBCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge2ZpbHRlciwgbWFwLCB0YWtlV2hpbGUsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge29mfSBmcm9tICdyeGpzL2ludGVybmFsL29ic2VydmFibGUvb2YnO1xyXG5pbXBvcnQge3BpcGV9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge3BpcGVGcm9tQXJyYXl9IGZyb20gJ3J4anMvaW50ZXJuYWwvdXRpbC9waXBlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgT2JzZXJ2YWJsZUZuPEEsIFQ+IHtcclxuICAocGFyYW0/OiBBKTogT2JzZXJ2YWJsZTxUPjtcclxufVxyXG5cclxuZXhwb3J0IGVudW0gTm90aWZpY2F0aW9uVHlwZSB7XHJcbiAgaW5pdCA9ICdpbml0JyxcclxuICBidXN5ID0gJ2J1c3knLFxyXG4gIGlkbGUgPSAnaWRsZScsXHJcbiAgcGFyYW1GdW5jID0gJ3BhcmFtRnVuYycsXHJcbiAgaW5wdXROZXh0ID0gJ2lucHV0TmV4dCcsXHJcbiAgaW5wdXRDb21wbGV0ZSA9ICdpbnB1dENvbXBsZXRlJyxcclxuICBpbnB1dEVycm9yID0gJ2lucHV0RXJyb3InLFxyXG4gIG91dHB1dEZ1bmNFcnJvciA9ICdvdXRwdXRGdW5jRXJyb3InLFxyXG4gIG91dHB1dE5leHQgPSAnb3V0cHV0TmV4dCcsXHJcbiAgb3V0cHV0RXJyb3IgPSAnb3V0cHV0RXJyb3InLFxyXG4gIG91dHB1dENvbXBsZXRlID0gJ291dHB1dENvbXBsZXRlJyxcclxuICBjbG9zZSA9ICdjbG9zZScsXHJcbiAgZW5hYmxlID0gJ2VuYWJsZScsXHJcbiAgZGlzYWJsZSA9ICdkaXNhYmxlJ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENoYW5uZWxOb3RpZmljYXRpb24ge1xyXG4gIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUsXHJcbiAgbmFtZT86IHN0cmluZyxcclxuICBkYXRhPzogYW55LFxyXG4gIGVycm9yPzogYW55LFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbkZuIHtcclxuICAoaW5wdXQ6IENoYW5uZWxOb3RpZmljYXRpb24pXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyRm48QSwgVD4ge1xyXG4gIChpbnB1dDogQSk6IFRcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENoYW5uZWw8QSBleHRlbmRzIGFueSwgVCBleHRlbmRzIGFueT4ge1xyXG4gIHByaXZhdGUgY2xvc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBpbnB1dDogU3ViamVjdDxBPjtcclxuICBwcml2YXRlIG91dHB1dDogU3ViamVjdDxUPjtcclxuICBwcml2YXRlIGVuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgaW5wdXRCdXN5OiBib29sZWFuO1xyXG4gIHByaXZhdGUgb3V0cHV0QnVzeTogYm9vbGVhbjtcclxuICBwcml2YXRlIG5hbWU6IHN0cmluZztcclxuICBwcml2YXRlIG5vdGlmaWNhdGlvbnM7XHJcbiAgcHJpdmF0ZSBkZWJ1ZzogYm9vbGVhbjtcclxuICBwcml2YXRlIHBhcmFtRm46IFBhcmFtZXRlckZuPGFueSwgYW55PjtcclxuICBwcml2YXRlIG5vdGlmaWNhdGlvbkZuOiBOb3RpZmljYXRpb25GbjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmbjogT2JzZXJ2YWJsZUZuPEEsIFQ+LCBvcHRpb25zPzoge1xyXG4gICAgaW5wdXQ/OiBTdWJqZWN0PEE+LFxyXG4gICAgb3V0cHV0PzogU3ViamVjdDxUPixcclxuICAgIGVuYWJsZWQ/OiBib29sZWFuLFxyXG4gICAgbmFtZT86IHN0cmluZyxcclxuICAgIGRlYnVnPzogYm9vbGVhbixcclxuICAgIHBhcmFtRm4/OiBQYXJhbWV0ZXJGbjxhbnksIGFueT4sXHJcbiAgICBub3RpZmljYXRpb25Gbj86IE5vdGlmaWNhdGlvbkZuXHJcbiAgfSkge1xyXG4gICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5pbnB1dCA9IG9wdGlvbnMuaW5wdXQgfHwgbmV3IFN1YmplY3Q8QT4oKTtcclxuICAgICAgdGhpcy5vdXRwdXQgPSBvcHRpb25zLm91dHB1dCB8fCBuZXcgUmVwbGF5U3ViamVjdDxUPigxKTtcclxuICAgICAgdGhpcy5lbmFibGVkID0gb3B0aW9ucy5lbmFibGVkIHx8IHRydWU7XHJcbiAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZSB8fCAnY2hhbm5lbCc7XHJcbiAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnIHx8IGZhbHNlO1xyXG4gICAgICB0aGlzLnBhcmFtRm4gPSBvcHRpb25zLnBhcmFtRm47XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uRm4gPSBvcHRpb25zLm5vdGlmaWNhdGlvbkZuO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5wdXQgPSBuZXcgU3ViamVjdDxBPigpO1xyXG4gICAgICB0aGlzLm91dHB1dCA9IG5ldyBSZXBsYXlTdWJqZWN0PFQ+KDEpO1xyXG4gICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLm5hbWUgPSAnY2hhbm5lbCc7XHJcbiAgICAgIHRoaXMuZGVidWcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENoYW5uZWxOb3RpZmljYXRpb24+KHt0eXBlOiBOb3RpZmljYXRpb25UeXBlLmluaXR9KTtcclxuICAgIC8vdGhpcy5vYnNlcnZlTm90aWZpY2F0aW9ucygpLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGlmICh0aGlzLm5vdGlmaWNhdGlvbkZuKSB7XHJcbiAgICAgIHRoaXMub2JzZXJ2ZU5vdGlmaWNhdGlvbnMoKS5zdWJzY3JpYmUodGhpcy5ub3RpZmljYXRpb25Gbik7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbnB1dC5waXBlKFxyXG4gICAgICB0YWtlV2hpbGUoKHZhbHVlOiBBKSA9PiAhdGhpcy5jbG9zZWQpLFxyXG4gICAgICBmaWx0ZXIoKHZhbHVlOiBBKSA9PiB0aGlzLmVuYWJsZWQpLFxyXG4gICAgICBtYXAoKGlucHV0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5lbWl0Tm90aWZpY2F0aW9uKHt0eXBlOiBOb3RpZmljYXRpb25UeXBlLmJ1c3l9KTtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbUZuKSB7XHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5wYXJhbUZuKGlucHV0KTtcclxuICAgICAgICAgIHRoaXMuZW1pdE5vdGlmaWNhdGlvbih7dHlwZTogTm90aWZpY2F0aW9uVHlwZS5wYXJhbUZ1bmMsIGRhdGE6IHtiZWZvcmU6IGlucHV0LCBhZnRlcjogcmVzdWx0fX0pO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoZGF0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5wdXRCdXN5ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVtaXROb3RpZmljYXRpb24oe3R5cGU6IE5vdGlmaWNhdGlvblR5cGUuaW5wdXROZXh0LCBkYXRhOiBkYXRhfSk7XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6ICh2YWx1ZTogQSkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLm91dHB1dEJ1c3kgPSB0cnVlO1xyXG4gICAgICAgICAgbGV0IG9ic2VydmFibGUgPSB0aGlzLmZuKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICBvYnNlcnZhYmxlLnBpcGUodGFwKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdE5vdGlmaWNhdGlvbih7dHlwZTogTm90aWZpY2F0aW9uVHlwZS5vdXRwdXROZXh0LCBkYXRhOiBkYXRhfSk7XHJcblxyXG4gICAgICAgICAgfSkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4gdGhpcy5vdXRwdXQubmV4dChyZXNwb25zZSksXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5lbWl0Tm90aWZpY2F0aW9uKHt0eXBlOiBOb3RpZmljYXRpb25UeXBlLm91dHB1dEVycm9yLCBlcnJvcjogZXJyfSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5vdXRwdXQuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLm91dHB1dEJ1c3kgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmVtaXROb3RpZmljYXRpb24oe3R5cGU6IE5vdGlmaWNhdGlvblR5cGUub3V0cHV0Q29tcGxldGV9KTtcclxuICAgICAgICAgICAgICB0aGlzLmVtaXROb3RpZmljYXRpb24oe3R5cGU6IE5vdGlmaWNhdGlvblR5cGUuaWRsZX0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgIHRoaXMuZW1pdE5vdGlmaWNhdGlvbih7dHlwZTogTm90aWZpY2F0aW9uVHlwZS5vdXRwdXRGdW5jRXJyb3IsIGVycm9yOiBlcnJ9KTtcclxuICAgICAgICAgIHRoaXMub3V0cHV0QnVzeSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZW1pdE5vdGlmaWNhdGlvbih7dHlwZTogTm90aWZpY2F0aW9uVHlwZS5vdXRwdXRGdW5jRXJyb3IsIGVycm9yOiBlcnJ9KTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICB0aGlzLmlucHV0QnVzeSA9IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaXNCdXN5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5wdXRCdXN5IHx8IHRoaXMub3V0cHV0QnVzeTtcclxuICB9XHJcblxyXG4gIGlzSW5wdXRCdXN5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5wdXRCdXN5O1xyXG4gIH1cclxuXHJcbiAgaXNPdXRwdXRCdXN5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMub3V0cHV0QnVzeTtcclxuICB9XHJcblxyXG4gIG5leHQodmFsdWU/OiBBKTogQ2hhbm5lbDxBLCBUPiB7XHJcbiAgICB0aGlzLmlucHV0Lm5leHQodmFsdWUpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBlbWl0KHZhbHVlOiBUKSB7XHJcbiAgICB0aGlzLm91dHB1dC5uZXh0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIG9ic2VydmUodmFsdWU/OiBBLCAuLi5vcHM6IE9wZXJhdG9yRnVuY3Rpb248YW55LCBhbnk+W10pOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgdGhpcy5uZXh0KHZhbHVlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLm91dHB1dC5waXBlKHBpcGVGcm9tQXJyYXkoWy4uLm9wc10pKTtcclxuICB9XHJcblxyXG4gIGxpbmsob2JzZXJ2ZXI6IE9ic2VydmFibGU8QT4sIC4uLm9wczogT3BlcmF0b3JGdW5jdGlvbjxhbnksIGFueT5bXSkge1xyXG4gICAgb2JzZXJ2ZXIucGlwZShwaXBlRnJvbUFycmF5KFsuLi5vcHNdKSkuc3Vic2NyaWJlKCh2YWx1ZTogQSkgPT4gdGhpcy5uZXh0KHZhbHVlKSk7XHJcbiAgfVxyXG5cclxuICBwaXBlKG9ic2VydmVyOiBPYnNlcnZhYmxlPFQ+LCAuLi5vcHM6IE9wZXJhdG9yRnVuY3Rpb248YW55LCBhbnk+W10pIHtcclxuICAgIG9ic2VydmVyLnBpcGUocGlwZUZyb21BcnJheShbLi4ub3BzXSkpLnN1YnNjcmliZSgodmFsdWU6IFQpID0+IHRoaXMuZW1pdCh2YWx1ZSkpO1xyXG4gIH1cclxuXHJcbiAgYXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMub3V0cHV0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgb2JzZXJ2ZU5vdGlmaWNhdGlvbnMoKTogT2JzZXJ2YWJsZTxDaGFubmVsTm90aWZpY2F0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25zLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXROb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBDaGFubmVsTm90aWZpY2F0aW9uKSB7XHJcbiAgICBub3RpZmljYXRpb24ubmFtZSA9IHRoaXMubmFtZTtcclxuICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgIHN3aXRjaCAobm90aWZpY2F0aW9uLnR5cGUpIHtcclxuICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUuaW5wdXRFcnJvcjpcclxuICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUub3V0cHV0RXJyb3I6XHJcbiAgICAgICAgY2FzZSBOb3RpZmljYXRpb25UeXBlLm91dHB1dEZ1bmNFcnJvcjpcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFske25vdGlmaWNhdGlvbi5uYW1lfToke25vdGlmaWNhdGlvbi50eXBlfV0gYCwgbm90aWZpY2F0aW9uLmVycm9yIHx8ICcnKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbJHtub3RpZmljYXRpb24ubmFtZX06JHtub3RpZmljYXRpb24udHlwZX1dIGAsIG5vdGlmaWNhdGlvbi5kYXRhIHx8ICcnKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMubmV4dChub3RpZmljYXRpb24pO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlKCk6IENoYW5uZWw8QSwgVD4ge1xyXG4gICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGRpc2FibGUoKTogQ2hhbm5lbDxBLCBUPiB7XHJcbiAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuaW5wdXQudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMub3V0cHV0LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFN3aXRjaCB7XHJcbiAgcHJpdmF0ZSBjaGFubmVscyA9IG5ldyBNYXA8YW55LCBDaGFubmVsPGFueSwgYW55Pj4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoLi4uY2hhbm5lbHM6IHsga2V5OiBhbnksIGNoYW5uZWw6IENoYW5uZWw8YW55LCBhbnk+IH1bXSkge1xyXG4gICAgY2hhbm5lbHMuZm9yRWFjaCgoY29uZmlnKSA9PiB7XHJcbiAgICAgIHRoaXMuY2hhbm5lbHMuc2V0KGNvbmZpZy5rZXksIGNvbmZpZy5jaGFubmVsKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBzZXQoa2V5OiBhbnksIGNoYW5uZWw6IENoYW5uZWw8YW55LCBhbnk+KTogQ2hhbm5lbDxhbnksIGFueT4ge1xyXG4gICAgdGhpcy5jaGFubmVscy5zZXQoa2V5LCBjaGFubmVsKTtcclxuICAgIHJldHVybiBjaGFubmVsO1xyXG4gIH1cclxuXHJcbiAgZ2V0KGtleTogYW55KTogQ2hhbm5lbDxhbnksIGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hhbm5lbHMuZ2V0KGtleSk7XHJcbiAgfVxyXG5cclxuICBpc0J1c3koa2V5OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIHJldHVybiBjaGFubmVsID8gY2hhbm5lbC5pc0J1c3koKSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaXNJbnB1dEJ1c3koa2V5OiBhbnkpIHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIHJldHVybiBjaGFubmVsID8gY2hhbm5lbC5pc0lucHV0QnVzeSgpIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpc091dHB1dEJ1c3koa2V5OiBhbnkpIHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIHJldHVybiBjaGFubmVsID8gY2hhbm5lbC5pc091dHB1dEJ1c3koKSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbmV4dChrZXk6IGFueSwgdmFsdWU/OiBhbnkpOiBDaGFubmVsPGFueSwgYW55PiB7XHJcbiAgICBsZXQgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZ2V0KGtleSk7XHJcbiAgICByZXR1cm4gY2hhbm5lbCA/IGNoYW5uZWwubmV4dCh2YWx1ZSkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZW1pdChrZXk6IGFueSwgdmFsdWU6IGFueSkge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLmVtaXQodmFsdWUpIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvYnNlcnZlKGtleTogYW55LCB2YWx1ZT86IGFueSwgLi4ub3BzOiBPcGVyYXRvckZ1bmN0aW9uPGFueSwgYW55PltdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIHJldHVybiBjaGFubmVsID8gY2hhbm5lbC5vYnNlcnZlKHZhbHVlLCAuLi5vcHMpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGxpbmsoa2V5OiBhbnksIG9ic2VydmVyOiBPYnNlcnZhYmxlPGFueT4sIC4uLm9wczogT3BlcmF0b3JGdW5jdGlvbjxhbnksIGFueT5bXSkge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgaWYgKGNoYW5uZWwpIHtcclxuICAgICAgY2hhbm5lbC5saW5rKG9ic2VydmVyLCAuLi5vcHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcGlwZShrZXk6IGFueSwgb2JzZXJ2ZXI6IE9ic2VydmFibGU8YW55PiwgLi4ub3BzOiBPcGVyYXRvckZ1bmN0aW9uPGFueSwgYW55PltdKSB7XHJcbiAgICBsZXQgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZ2V0KGtleSk7XHJcbiAgICBpZiAoY2hhbm5lbCkge1xyXG4gICAgICBjaGFubmVsLnBpcGUob2JzZXJ2ZXIsIC4uLm9wcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc09ic2VydmFibGUoa2V5OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLmFzT2JzZXJ2YWJsZSgpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIG9ic2VydmVOb3RpZmljYXRpb25zKGtleTogYW55KTogT2JzZXJ2YWJsZTxDaGFubmVsTm90aWZpY2F0aW9uPiB7XHJcbiAgICBsZXQgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZ2V0KGtleSk7XHJcbiAgICByZXR1cm4gY2hhbm5lbCA/IGNoYW5uZWwub2JzZXJ2ZU5vdGlmaWNhdGlvbnMoKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBlbmFibGUoa2V5OiBhbnkpOiBDaGFubmVsPGFueSwgYW55PiB7XHJcbiAgICBsZXQgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZ2V0KGtleSk7XHJcbiAgICByZXR1cm4gY2hhbm5lbCA/IGNoYW5uZWwuZW5hYmxlKCkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZGlzYWJsZShrZXk6IGFueSk6IENoYW5uZWw8YW55LCBhbnk+IHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIHJldHVybiBjaGFubmVsID8gY2hhbm5lbC5kaXNhYmxlKCkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgY2xvc2Uoa2V5OiBhbnkpIHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIHJldHVybiBjaGFubmVsID8gY2hhbm5lbC5jbG9zZSgpIDogbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRFNPYnNlcnZhYmxlRm4ge1xyXG4gICh2YWx1ZT86IGFueSk6IE9ic2VydmFibGU8YW55PjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEU09wZXJhdG9yIHtcclxuICBvcGVyYXRvcjogT3BlcmF0b3JGdW5jdGlvbjxhbnksIGFueT4sXHJcbiAgaWQ6IGFueVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElPYnNlcnZlT3B0aW9ucyB7XHJcbiAgYmVoYXZlOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERTSW5wdXRPcHRpb25zIHtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEU091dHB1dE9wdGlvbnMge1xyXG4gIGJlaGF2ZTogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEU0lucHV0RXZlbnQge1xyXG4gIGlkOiBhbnk7XHJcbiAgb3B0aW9ucz86IERTSW5wdXRPcHRpb25zLFxyXG4gIHZhbHVlPzogYW55XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRFNFdmVudCB7XHJcbiAgaW5wdXQ6IERTSW5wdXRFdmVudCxcclxuICBvdXRwdXQ6IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERTUGlwZSB7XHJcblxyXG4gIHByaXZhdGUgc3ViOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZHM6IElPYnNlcnZhYmxlRFMsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBrZXk6IGFueSxcclxuICAgICAgICAgICAgICBwcml2YXRlIG9iczogT2JzZXJ2YWJsZTxhbnk+LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgb3BzOiBPcGVyYXRvckZ1bmN0aW9uPGFueSwgYW55PltdLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgZW5hYmxlZDogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gIH1cclxuXHJcbiAgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISghdGhpcy5zdWIpO1xyXG4gIH1cclxuXHJcbiAgY29ubmVjdCgpIHtcclxuICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3ViID0gdGhpcy5vYnMucGlwZShwaXBlRnJvbUFycmF5KFsuLi50aGlzLm9wc10pKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGAtLS0tPiBwaXBlICgke3RoaXMua2V5fSlgLCB2YWx1ZSk7XHJcbiAgICAgIHRoaXMuZHMubmV4dCh0aGlzLmtleSwgdmFsdWUpO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGRpc2Nvbm5lY3QoKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnN1Yi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0T3BlcmF0b3JzKC4uLm9wczogT3BlcmF0b3JGdW5jdGlvbjxhbnksIGFueT5bXSkge1xyXG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICB0aGlzLm9wcyA9IG9wcztcclxuICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlKCkge1xyXG4gICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGRpc2FibGUoKSB7XHJcbiAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU9ic2VydmFibGVEUyB7XHJcbiAgY29ubmVjdCgpOiB2b2lkO1xyXG5cclxuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuO1xyXG5cclxuICBhZGRPYnNlcnZhYmxlKGtleTogYW55LCBvczogRFNPYnNlcnZhYmxlRm4gfCBPYnNlcnZhYmxlPGFueT4sIG9wdGlvbnM/OiBJT2JzZXJ2ZU9wdGlvbnMpOiB2b2lkO1xyXG5cclxuICBuZXh0KGtleTogYW55LCB2YWx1ZTogYW55LCBvcHRpb25zPzogRFNJbnB1dE9wdGlvbnMpOiB2b2lkO1xyXG5cclxuICBvYnNlcnZlKGtleTogYW55LCB2YWx1ZT86IGFueSwgb3B0aW9ucz86IERTT3V0cHV0T3B0aW9ucyk6IE9ic2VydmFibGU8YW55PjtcclxuXHJcbiAgZGlzY29ubmVjdCgpOiB2b2lkO1xyXG5cclxuICAvL3NldE9wZXJhdG9ycyhvcGVyYXRvcnM6IERTT3BlcmF0b3JbXSwga2V5PzogYW55KSA6IHZvaWQ7XHJcbiAgLy9jbGVhck9wZXJhdG9ycyguLi5pZCkgOiB2b2lkO1xyXG4gIC8vY2xlYXJBbGxPcGVyYXRvcnMoKSA6IHZvaWQ7XHJcbiAgYWRkUGlwZShvYnM6IE9ic2VydmFibGU8YW55Piwga2V5OiBhbnksIC4uLm9wZXJhdG9yczogT3BlcmF0b3JGdW5jdGlvbjxhbnksIGFueT5bXSk6IERTUGlwZTtcclxuXHJcbiAgYXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8YW55PjtcclxuXHJcbiAgZGVzdHJveSgpO1xyXG5cclxuICBjbGVhclBpcGVzKC4uLnBpcGVzOiBEU1BpcGVbXSk7XHJcblxyXG4gIGNsZWFyQWxsUGlwZXMoKTtcclxuXHJcbiAgZ2V0UGlwZXMoKTogRFNQaXBlW107XHJcblxyXG4gIC8vY2xvbmUoKSA6IElPYnNlcnZhYmxlRFM7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBPYnNlcnZhYmxlRFMgaW1wbGVtZW50cyBJT2JzZXJ2YWJsZURTIHtcclxuICBwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgZm5NYXAgPSBuZXcgTWFwPGFueSwgRFNPYnNlcnZhYmxlRm4+KCk7XHJcbiAgcHJpdmF0ZSBzdWJqZWN0TWFwID0gbmV3IE1hcDxhbnksIFN1YmplY3Q8YW55Pj4oKTtcclxuICBwcml2YXRlIGlucHV0JCA9IG5ldyBTdWJqZWN0PERTSW5wdXRFdmVudD4oKTtcclxuICBwcml2YXRlIGlucHV0U3ViOiBTdWJzY3JpcHRpb24gPSBudWxsO1xyXG4gIHByaXZhdGUgZXZlbnRzJCA9IG5ldyBTdWJqZWN0PERTRXZlbnQ+KCk7XHJcbiAgcHJpdmF0ZSBwaXBlczogRFNQaXBlW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IHtcclxuICAgIGF1dG9jb25uZWN0PzogYm9vbGVhbjtcclxuICAgIGtleT86IGFueTtcclxuICAgIG9icz86IERTT2JzZXJ2YWJsZUZuIHwgT2JzZXJ2YWJsZTxhbnk+O1xyXG4gIH0pIHtcclxuICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgIGlmIChvcHRpb25zLmF1dG9jb25uZWN0KSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG9wdGlvbnMua2V5ICYmIG9wdGlvbnMub2JzKSB7XHJcbiAgICAgICAgdGhpcy5hZGRPYnNlcnZhYmxlKG9wdGlvbnMua2V5LCBvcHRpb25zLm9icyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHdlIGNvbm5lY3QgYnkgZGVmYXVsdFxyXG4gICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzQ29ubmVjdGVkKCkge1xyXG4gICAgcmV0dXJuICEoIXRoaXMuaW5wdXRTdWIpO1xyXG4gIH1cclxuXHJcbiAgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5wdXRTdWIgPSB0aGlzLmlucHV0JC5waXBlKFxyXG4gICAgICBmaWx0ZXIoKGlucHV0OiBEU0lucHV0RXZlbnQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5mbk1hcC5oYXMoaW5wdXQuaWQpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgW29ic10gb2JzZXJ2YWJsZSB3aXRoIGlkICcke2lucHV0LmlkfScgbm90IGZvdW5kYCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9KSxcclxuICAgICAgbWFwKChpbnB1dDogRFNJbnB1dEV2ZW50KSA9PiB7XHJcbiAgICAgICAgbGV0IG9ic0ZuID0gdGhpcy5mbk1hcC5nZXQoaW5wdXQuaWQpO1xyXG4gICAgICAgIHJldHVybiB7ZXZlbnQ6IGlucHV0LCBmbjogb2JzRm4oaW5wdXQudmFsdWUpLCBzdWI6IHRoaXMuc3ViamVjdE1hcC5nZXQoaW5wdXQuaWQpfVxyXG4gICAgICB9KSlcclxuICAgICAgLnN1YnNjcmliZSgoaW5wdXQpID0+IHRoaXMucmVsYXkoaW5wdXQuZXZlbnQsIGlucHV0LmZuLCBpbnB1dC5zdWIpKTtcclxuICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZWxheShldmVudDogRFNJbnB1dEV2ZW50LCBvYnM6IE9ic2VydmFibGU8YW55Piwgc3ViamVjdDogU3ViamVjdDxhbnk+KSB7XHJcbiAgICAvL2NvbnNvbGUubG9nKGAtLS0tLT4gcmVsYXkgKCR7c3ViamVjdH06IGAsIGV2ZW50KTtcclxuICAgIG9icy5waXBlKFxyXG4gICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5jb25uZWN0ZWQpLFxyXG4gICAgICAvL3RhcCgocmVzcG9uc2UpID0+IHsgY29uc29sZS5sb2coYC0tLS0tPiB0YXAgcmVsYXk6IGAsIHJlc3BvbnNlKTsgc3ViamVjdC5uZXh0KHJlc3BvbnNlKSB9KSxcclxuICAgICAgdGFwKChyZXNwb25zZSkgPT4gdGhpcy5lbWl0KHtpbnB1dDogZXZlbnQsIG91dHB1dDogcmVzcG9uc2V9KSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdChldmVudDogRFNFdmVudCkge1xyXG4gICAgdGhpcy5ldmVudHMkLm5leHQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgYXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5ldmVudHMkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgZGlzY29ubmVjdCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaW5wdXRTdWIudW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBsZXQgYmxhID0gb2YoWzEsIDIsIDNdKTtcclxuICAgIGxldCBibGFmID0gYmxhLnN1YnNjcmliZSgpO1xyXG4gICAgYmxhZi5hZGQoYmxhZik7XHJcblxyXG4gICAgbGV0IGR1ZmYgPSBuZXcgU3ViamVjdCgpO1xyXG4gICAgYmxhZi5hZGQoZHVmZi5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKSk7XHJcbiAgfVxyXG5cclxuICBuZXh0KGtleTogYW55LCB2YWx1ZTogYW55LCBvcHRpb25zPzogRFNJbnB1dE9wdGlvbnMpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jb25uZWN0ZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGV2ZW50ID0ge2lkOiBrZXksIG9wdGlvbnM6IG9wdGlvbnMsIHZhbHVlOiB2YWx1ZX07XHJcbiAgICAvL2NvbnNvbGUubG9nKGAtLS0tLT4gbmV4dCAoJHtldmVudH0pYCwgZXZlbnQpO1xyXG4gICAgdGhpcy5pbnB1dCQubmV4dChldmVudCk7XHJcbiAgfVxyXG5cclxuICBhZGRQaXBlKG9iczogT2JzZXJ2YWJsZ