@fdot/angular-dotcodes
Version:
`npm install @fdot/angular-dotcodes --save`
413 lines (402 loc) • 38.8 kB
JavaScript
import { Inject, Injectable, Pipe, Component, Input, defineInjectable, inject, NgModule, EventEmitter, Output } from '@angular/core';
import { HttpClient, HttpHeaders, HttpParams, HttpClientModule } from '@angular/common/http';
import { Observable, BehaviorSubject } from 'rxjs';
import { map } from 'rxjs/operators';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class Config {
/**
* @param {?} host
* @param {?} apiKey
* @param {?} useDefaultSelect
* @param {?} defaultSelectText
*/
constructor(host, apiKey, useDefaultSelect, defaultSelectText) {
this.host = host;
this.apiKey = apiKey;
this.useDefaultSelect = useDefaultSelect;
this.defaultSelectText = defaultSelectText;
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class AngularDotcodesService {
/**
* @param {?} http
* @param {?} config
*/
constructor(http, config) {
this.http = http;
this.config = config;
this.codesCache = new Map();
this.codeCache = new Map();
if (!config) {
throw Error('Call AngularDotcodesService with for root passing in the config object');
}
}
/**
* Method GetCode
* @param {?} column Column name to get Dotcode from
* @param {?} codeValue The code value to retrieve
* @return {?} Full HTTP response as Observable
*/
GetCode(column, codeValue) {
const /** @type {?} */ key = `${column}-${codeValue}`;
if (this.codeCache.get(key)) {
this.codeCache.get(`${column}-${codeValue}`);
}
else if (this.codesCache.get(column)) {
const /** @type {?} */ codes = this.codesCache.get(column).value;
if (codes) {
const /** @type {?} */ code = codes.filter(c => c.value === codeValue);
if (code && code.length === 1) {
if (!this.codeCache.get(key)) {
this.codeCache.set(key, new BehaviorSubject(null));
}
this.codeCache.get(key).next(code[0]);
}
else {
this.loadCodes(key, column, codeValue);
}
}
else {
this.loadCodes(key, column, codeValue);
}
}
else {
this.loadCodes(key, column, codeValue);
}
return this.codeCache.get(key);
}
/**
* @param {?} key
* @param {?} column
* @param {?} codeValue
* @return {?}
*/
loadCodes(key, column, codeValue) {
this.codeCache.set(key, new BehaviorSubject(null));
const /** @type {?} */ uri = `/GetCode`;
const /** @type {?} */ headers = new HttpHeaders();
let /** @type {?} */ params = new HttpParams();
if (column !== undefined && column !== null) {
params = params.set('column', column + '');
}
if (codeValue !== undefined && codeValue !== null) {
params = params.set('codeValue', codeValue + '');
}
this.sendRequest('get', uri, headers, params, null).toPromise().then(b => {
if (b && b.body) {
this.codeCache.get(key).next(b.body);
}
});
}
/**
* Method GetCodes
* @param {?} column Column name to get Dotcode from
* @return {?} Full HTTP response as Observable
*/
GetCodes(column) {
if (this.codesCache.get(column)) {
this.codesCache.get(column);
}
else {
this.codesCache.set(column, new BehaviorSubject(null));
const /** @type {?} */ uri = `/GetCodes`;
const /** @type {?} */ headers = new HttpHeaders();
let /** @type {?} */ params = new HttpParams();
if (column !== undefined && column !== null) {
params = params.set('column', column + '');
}
this.sendRequest('get', uri, headers, params, null).toPromise().then(b => {
if (b && b.body) {
this.codesCache.get(column).next(b.body);
}
});
}
return this.codesCache.get(column);
}
/**
* Method GetRelatedCodes
* @param {?} column Column name for dotcode
* @param {?} codeValue DotCode value to get related codes for
* @param {?} relatedCode Related Column name to get Related Codes from
* @return {?} Full HTTP response as Observable
*/
GetRelatedCodes(column, codeValue, relatedCode) {
const /** @type {?} */ uri = `/GetRelatedCodes`;
const /** @type {?} */ headers = new HttpHeaders();
let /** @type {?} */ params = new HttpParams();
if (column !== undefined && column !== null) {
params = params.set('column', column + '');
}
if (codeValue !== undefined && codeValue !== null) {
params = params.set('codeValue', codeValue + '');
}
if (relatedCode !== undefined && relatedCode !== null) {
params = params.set('relatedCode', relatedCode + '');
}
return this.sendRequest('get', uri, headers, params, null).pipe(map(b => {
if (b && b.body) {
return b.body;
}
}));
}
/**
* @template T
* @param {?} method
* @param {?} uri
* @param {?} headers
* @param {?} params
* @param {?} body
* @return {?}
*/
sendRequest(method, uri, headers, params, body) {
headers = headers.set('Ocp-Apim-Subscription-Key', this.config.apiKey);
if (method === 'get') {
return this.http.get(this.config.host + uri, { headers: headers.set('Accept', 'application/json'), params: params, observe: 'response' });
}
else if (method === 'put') {
return this.http.put(this.config.host + uri, body, { headers: headers.set('Content-Type', 'application/json'), params: params, observe: 'response' });
}
else if (method === 'post') {
return this.http.post(this.config.host + uri, body, { headers: headers.set('Content-Type', 'application/json'), params: params, observe: 'response' });
}
else if (method === 'delete') {
return this.http.delete(this.config.host + uri, { headers: headers, params: params, observe: 'response' });
}
else {
console.error('Unsupported request: ' + method);
return Observable.throw('Unsupported request: ' + method);
}
}
}
AngularDotcodesService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] },
];
/** @nocollapse */
AngularDotcodesService.ctorParameters = () => [
{ type: HttpClient, },
{ type: Config, decorators: [{ type: Inject, args: ['config',] },] },
];
/** @nocollapse */ AngularDotcodesService.ngInjectableDef = defineInjectable({ factory: function AngularDotcodesService_Factory() { return new AngularDotcodesService(inject(HttpClient), inject("config")); }, token: AngularDotcodesService, providedIn: "root" });
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class AngularDotcodesComponent {
/**
* @param {?} dotcodeService
*/
constructor(dotcodeService) {
this.dotcodeService = dotcodeService;
}
/**
* @return {?}
*/
ngOnInit() {
console.log('init');
this.dotcodeService.GetCode(this.column, this.value).subscribe(code => {
console.log(code);
this.code = code;
});
}
}
AngularDotcodesComponent.decorators = [
{ type: Component, args: [{
selector: 'fdot-angular-dotcodes',
template: `
<span *ngIf="code">
{{code.description}}
</span>
`,
styles: []
},] },
];
/** @nocollapse */
AngularDotcodesComponent.ctorParameters = () => [
{ type: AngularDotcodesService, },
];
AngularDotcodesComponent.propDecorators = {
"column": [{ type: Input },],
"value": [{ type: Input },],
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class DotcodesSelectComponent {
/**
* @param {?} dotCodeService
* @param {?} config
*/
constructor(dotCodeService, config) {
this.dotCodeService = dotCodeService;
this.config = config;
this.selectedDotcode = new EventEmitter();
}
/**
* @param {?} value
* @return {?}
*/
set value(value) {
this._value = value;
this.setSelectedCode();
}
/**
* @return {?}
*/
get value() {
return this._value;
}
/**
* @return {?}
*/
ngOnInit() {
// tslint:disable-next-line:triple-equals
if (!(this.useDefaultSelect === false || /** @type {?} */ (this.useDefaultSelect) === 'false')
&& this.config != null && this.config.useDefaultSelect) {
this.useDefaultSelect = true;
}
else {
this.useDefaultSelect = false;
}
if (!this.defaultSelectText && this.config != null && this.config.defaultSelectText) {
this.defaultSelectText = this.config.defaultSelectText;
}
this.dotCodeService.GetCodes(this.column).subscribe(codes => {
this.codes = codes;
this.setSelectedCode();
});
}
/**
* @return {?}
*/
setSelectedCode() {
if (!this.codes) {
return;
}
if (this.value) {
const /** @type {?} */ code = this.codes.find(c => c.value === this.value);
if (code) {
this.selectedCode = code;
this.codeChanged();
}
}
}
/**
* @return {?}
*/
codeChanged() {
this.selectedDotcode.emit(this.selectedCode);
}
}
DotcodesSelectComponent.decorators = [
{ type: Component, args: [{
selector: 'fdot-dotcodes-select',
template: `<select [(ngModel)]="selectedCode" (change)="codeChanged()" class="form-control" [disabled]="disabled">
<option *ngIf="useDefaultSelect" value="">
{{defaultSelectText}}
</option>
<option *ngFor="let code of codes" [ngValue]="code">
{{code.description}}
</option>
</select>
`,
styles: [``]
},] },
];
/** @nocollapse */
DotcodesSelectComponent.ctorParameters = () => [
{ type: AngularDotcodesService, },
{ type: Config, decorators: [{ type: Inject, args: ['config',] },] },
];
DotcodesSelectComponent.propDecorators = {
"column": [{ type: Input },],
"value": [{ type: Input },],
"disabled": [{ type: Input },],
"selectedDotcode": [{ type: Output },],
"useDefaultSelect": [{ type: Input },],
"defaultSelectText": [{ type: Input },],
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class DotcodePipe {
/**
* @param {?} dotcodeService
*/
constructor(dotcodeService) {
this.dotcodeService = dotcodeService;
}
/**
* @param {?} value
* @param {?} column
* @return {?}
*/
transform(value, column) {
return this.dotcodeService.GetCode(column, value).pipe(map(c => {
if (c) {
return c.description;
}
}));
}
}
DotcodePipe.decorators = [
{ type: Pipe, args: [{
name: 'dotcode',
},] },
];
/** @nocollapse */
DotcodePipe.ctorParameters = () => [
{ type: AngularDotcodesService, },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class AngularDotcodesModule {
/**
* @param {?} config
* @return {?}
*/
static forRoot(config) {
return {
ngModule: AngularDotcodesModule,
providers: [AngularDotcodesService,
{ provide: 'config', useValue: config }
]
};
}
}
AngularDotcodesModule.decorators = [
{ type: NgModule, args: [{
imports: [HttpClientModule, CommonModule, FormsModule
],
declarations: [AngularDotcodesComponent, DotcodesSelectComponent, DotcodePipe],
exports: [AngularDotcodesComponent, DotcodesSelectComponent, DotcodePipe]
},] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { AngularDotcodesService, AngularDotcodesComponent, Config, DotcodesSelectComponent, AngularDotcodesModule, DotcodePipe as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmRvdC1hbmd1bGFyLWRvdGNvZGVzLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9AZmRvdC9hbmd1bGFyLWRvdGNvZGVzL2xpYi9tb2RlbHMvY29uZmlnLnRzIiwibmc6Ly9AZmRvdC9hbmd1bGFyLWRvdGNvZGVzL2xpYi9hbmd1bGFyLWRvdGNvZGVzLnNlcnZpY2UudHMiLCJuZzovL0BmZG90L2FuZ3VsYXItZG90Y29kZXMvbGliL2FuZ3VsYXItZG90Y29kZXMuY29tcG9uZW50LnRzIiwibmc6Ly9AZmRvdC9hbmd1bGFyLWRvdGNvZGVzL2xpYi9kb3Rjb2Rlcy1zZWxlY3QvZG90Y29kZXMtc2VsZWN0LmNvbXBvbmVudC50cyIsIm5nOi8vQGZkb3QvYW5ndWxhci1kb3Rjb2Rlcy9saWIvZG90Y29kZS5waXBlLnRzIiwibmc6Ly9AZmRvdC9hbmd1bGFyLWRvdGNvZGVzL2xpYi9hbmd1bGFyLWRvdGNvZGVzLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQ29uZmlnIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBob3N0OiBzdHJpbmcsIHB1YmxpYyBhcGlLZXk6IHN0cmluZywgcHVibGljIHVzZURlZmF1bHRTZWxlY3Q6IGJvb2xlYW4sXHJcbiAgICAgICAgcHVibGljIGRlZmF1bHRTZWxlY3RUZXh0OiBzdHJpbmcpIHtcclxuXHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBEb3RDb2RlLFxyXG4gIFJlbGF0ZWRDb2RlXHJcbn0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL21vZGVscy9jb25maWcnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhckRvdGNvZGVzU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBjb2Rlc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEJlaGF2aW9yU3ViamVjdDxEb3RDb2RlW10+PigpO1xyXG4gIHByaXZhdGUgY29kZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEJlaGF2aW9yU3ViamVjdDxEb3RDb2RlPj4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBASW5qZWN0KCdjb25maWcnKSBwcml2YXRlIGNvbmZpZzogQ29uZmlnKSB7XHJcbiAgICBpZiAoIWNvbmZpZykge1xyXG4gICAgICB0aHJvdyBFcnJvcignQ2FsbCBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlIHdpdGggZm9yIHJvb3QgcGFzc2luZyBpbiB0aGUgY29uZmlnIG9iamVjdCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBNZXRob2QgR2V0Q29kZVxyXG4gICogQHBhcmFtIGNvbHVtbiBDb2x1bW4gbmFtZSB0byBnZXQgRG90Y29kZSBmcm9tXHJcbiAgKiBAcGFyYW0gY29kZVZhbHVlIFRoZSBjb2RlIHZhbHVlIHRvIHJldHJpZXZlXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0Q29kZShjb2x1bW46IHN0cmluZywgY29kZVZhbHVlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERvdENvZGU+IHtcclxuICAgIGNvbnN0IGtleSA9IGAke2NvbHVtbn0tJHtjb2RlVmFsdWV9YDtcclxuXHJcbiAgICBpZiAodGhpcy5jb2RlQ2FjaGUuZ2V0KGtleSkpIHtcclxuICAgICAgdGhpcy5jb2RlQ2FjaGUuZ2V0KGAke2NvbHVtbn0tJHtjb2RlVmFsdWV9YCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29kZXNDYWNoZS5nZXQoY29sdW1uKSkge1xyXG4gICAgICBjb25zdCBjb2RlcyA9IHRoaXMuY29kZXNDYWNoZS5nZXQoY29sdW1uKS52YWx1ZTtcclxuICAgICAgaWYgKGNvZGVzKSB7XHJcbiAgICAgICAgY29uc3QgY29kZSA9IGNvZGVzLmZpbHRlcihjID0+IGMudmFsdWUgPT09IGNvZGVWYWx1ZSk7XHJcblxyXG4gICAgICAgIGlmIChjb2RlICYmIGNvZGUubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuY29kZUNhY2hlLmdldChrZXkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29kZUNhY2hlLnNldChrZXksIG5ldyBCZWhhdmlvclN1YmplY3Q8RG90Q29kZT4obnVsbCkpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuY29kZUNhY2hlLmdldChrZXkpLm5leHQoY29kZVswXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMubG9hZENvZGVzKGtleSwgY29sdW1uLCBjb2RlVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmxvYWRDb2RlcyhrZXksIGNvbHVtbiwgY29kZVZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5sb2FkQ29kZXMoa2V5LCBjb2x1bW4sIGNvZGVWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY29kZUNhY2hlLmdldChrZXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkQ29kZXMoa2V5OiBzdHJpbmcsIGNvbHVtbjogc3RyaW5nLCBjb2RlVmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5jb2RlQ2FjaGUuc2V0KGtleSwgbmV3IEJlaGF2aW9yU3ViamVjdDxEb3RDb2RlPihudWxsKSk7XHJcblxyXG4gICAgY29uc3QgdXJpID0gYC9HZXRDb2RlYDtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xyXG5cclxuICAgIGlmIChjb2x1bW4gIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4gIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnY29sdW1uJywgY29sdW1uICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvZGVWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGNvZGVWYWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdjb2RlVmFsdWUnLCBjb2RlVmFsdWUgKyAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZW5kUmVxdWVzdDxEb3RDb2RlPignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnRvUHJvbWlzZSgpLnRoZW4oYiA9PiB7XHJcbiAgICAgIGlmIChiICYmIGIuYm9keSkge1xyXG4gICAgICAgIHRoaXMuY29kZUNhY2hlLmdldChrZXkpLm5leHQoYi5ib2R5KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICogTWV0aG9kIEdldENvZGVzXHJcbiAgKiBAcGFyYW0gY29sdW1uIENvbHVtbiBuYW1lIHRvIGdldCBEb3Rjb2RlIGZyb21cclxuICAqIEByZXR1cm4gRnVsbCBIVFRQIHJlc3BvbnNlIGFzIE9ic2VydmFibGVcclxuICAqL1xyXG4gIHB1YmxpYyBHZXRDb2Rlcyhjb2x1bW46IHN0cmluZyk6IE9ic2VydmFibGU8RG90Q29kZVtdPiB7XHJcbiAgICBpZiAodGhpcy5jb2Rlc0NhY2hlLmdldChjb2x1bW4pKSB7XHJcbiAgICAgIHRoaXMuY29kZXNDYWNoZS5nZXQoY29sdW1uKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29kZXNDYWNoZS5zZXQoY29sdW1uLCBuZXcgQmVoYXZpb3JTdWJqZWN0PERvdENvZGVbXT4obnVsbCkpO1xyXG5cclxuICAgICAgY29uc3QgdXJpID0gYC9HZXRDb2Rlc2A7XHJcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAgIGlmIChjb2x1bW4gIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4gIT09IG51bGwpIHtcclxuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCdjb2x1bW4nLCBjb2x1bW4gKyAnJyk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZW5kUmVxdWVzdDxEb3RDb2RlW10+KCdnZXQnLCB1cmksIGhlYWRlcnMsIHBhcmFtcywgbnVsbCkudG9Qcm9taXNlKCkudGhlbihiID0+IHtcclxuICAgICAgICBpZiAoYiAmJiBiLmJvZHkpIHtcclxuICAgICAgICAgIHRoaXMuY29kZXNDYWNoZS5nZXQoY29sdW1uKS5uZXh0KGIuYm9keSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb2Rlc0NhY2hlLmdldChjb2x1bW4pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBNZXRob2QgR2V0UmVsYXRlZENvZGVzXHJcbiAgKiBAcGFyYW0gY29sdW1uIENvbHVtbiBuYW1lIGZvciBkb3Rjb2RlXHJcbiAgKiBAcGFyYW0gY29kZVZhbHVlIERvdENvZGUgdmFsdWUgdG8gZ2V0IHJlbGF0ZWQgY29kZXMgZm9yXHJcbiAgKiBAcGFyYW0gcmVsYXRlZENvZGUgUmVsYXRlZCBDb2x1bW4gbmFtZSB0byBnZXQgUmVsYXRlZCBDb2RlcyBmcm9tXHJcbiAgKiBAcmV0dXJuIEZ1bGwgSFRUUCByZXNwb25zZSBhcyBPYnNlcnZhYmxlXHJcbiAgKi9cclxuICBwdWJsaWMgR2V0UmVsYXRlZENvZGVzKGNvbHVtbjogc3RyaW5nLCBjb2RlVmFsdWU6IHN0cmluZywgcmVsYXRlZENvZGU6IHN0cmluZyk6IE9ic2VydmFibGU8UmVsYXRlZENvZGVbXT4ge1xyXG4gICAgY29uc3QgdXJpID0gYC9HZXRSZWxhdGVkQ29kZXNgO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBpZiAoY29sdW1uICE9PSB1bmRlZmluZWQgJiYgY29sdW1uICE9PSBudWxsKSB7XHJcbiAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQoJ2NvbHVtbicsIGNvbHVtbiArICcnKTtcclxuICAgIH1cclxuICAgIGlmIChjb2RlVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBjb2RlVmFsdWUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgnY29kZVZhbHVlJywgY29kZVZhbHVlICsgJycpO1xyXG4gICAgfVxyXG4gICAgaWYgKHJlbGF0ZWRDb2RlICE9PSB1bmRlZmluZWQgJiYgcmVsYXRlZENvZGUgIT09IG51bGwpIHtcclxuICAgICAgcGFyYW1zID0gcGFyYW1zLnNldCgncmVsYXRlZENvZGUnLCByZWxhdGVkQ29kZSArICcnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5zZW5kUmVxdWVzdDxSZWxhdGVkQ29kZVtdPignZ2V0JywgdXJpLCBoZWFkZXJzLCBwYXJhbXMsIG51bGwpLnBpcGUoXHJcbiAgICAgIG1hcChiID0+IHtcclxuICAgICAgICBpZiAoYiAmJiBiLmJvZHkpIHtcclxuICAgICAgICAgIHJldHVybiBiLmJvZHk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbmRSZXF1ZXN0PFQ+KG1ldGhvZDogc3RyaW5nLCB1cmk6IHN0cmluZywgaGVhZGVyczogSHR0cEhlYWRlcnMsIHBhcmFtczogSHR0cFBhcmFtcywgYm9keTogYW55KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VD4+IHtcclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnT2NwLUFwaW0tU3Vic2NyaXB0aW9uLUtleScsIHRoaXMuY29uZmlnLmFwaUtleSk7XHJcbiAgICBpZiAobWV0aG9kID09PSAnZ2V0Jykge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLFxyXG4gICAgICAgIHsgaGVhZGVyczogaGVhZGVycy5zZXQoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdwdXQnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFQ+KHRoaXMuY29uZmlnLmhvc3QgKyB1cmksIGJvZHksXHJcbiAgICAgICAgeyBoZWFkZXJzOiBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKSwgcGFyYW1zOiBwYXJhbXMsIG9ic2VydmU6ICdyZXNwb25zZScgfSk7XHJcbiAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ3Bvc3QnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxUPih0aGlzLmNvbmZpZy5ob3N0ICsgdXJpLCBib2R5LFxyXG4gICAgICAgIHsgaGVhZGVyczogaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyksIHBhcmFtczogcGFyYW1zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pO1xyXG4gICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdkZWxldGUnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPFQ+KHRoaXMuY29uZmlnLmhvc3QgKyB1cmksIHsgaGVhZGVyczogaGVhZGVycywgcGFyYW1zOiBwYXJhbXMsIG9ic2VydmU6ICdyZXNwb25zZScgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdVbnN1cHBvcnRlZCByZXF1ZXN0OiAnICsgbWV0aG9kKTtcclxuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3coJ1Vuc3VwcG9ydGVkIHJlcXVlc3Q6ICcgKyBtZXRob2QpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBEb3RDb2RlIH0gZnJvbSAnLi9tb2RlbHMvZG90Y29kZS5tb2RlbCc7XHJcbmltcG9ydCB7IEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2UgfSBmcm9tICcuL2FuZ3VsYXItZG90Y29kZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmZG90LWFuZ3VsYXItZG90Y29kZXMnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8c3BhbiAqbmdJZj1cImNvZGVcIj5cclxuICAgIHt7Y29kZS5kZXNjcmlwdGlvbn19XHJcbiAgICA8L3NwYW4+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmd1bGFyRG90Y29kZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBjb2RlOiBEb3RDb2RlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGNvbHVtbjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgdmFsdWU6IHN0cmluZztcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZG90Y29kZVNlcnZpY2U6IEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2UpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdpbml0Jyk7XHJcbiAgICB0aGlzLmRvdGNvZGVTZXJ2aWNlLkdldENvZGUodGhpcy5jb2x1bW4sIHRoaXMudmFsdWUpLnN1YnNjcmliZShjb2RlID0+IHtcclxuICAgICAgY29uc29sZS5sb2coY29kZSk7XHJcbiAgICAgIHRoaXMuY29kZSA9IGNvZGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vLi4vbW9kZWxzL2NvbmZpZyc7XHJcbmltcG9ydCB7IEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2UgfSBmcm9tICcuLy4uL2FuZ3VsYXItZG90Y29kZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IERvdENvZGUgfSBmcm9tICcuLy4uL21vZGVscy9kb3Rjb2RlLm1vZGVsJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgT3B0aW9uYWwsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmZG90LWRvdGNvZGVzLXNlbGVjdCcsXHJcbiAgdGVtcGxhdGU6IGA8c2VsZWN0IFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb2RlXCIgKGNoYW5nZSk9XCJjb2RlQ2hhbmdlZCgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cclxuICA8b3B0aW9uICpuZ0lmPVwidXNlRGVmYXVsdFNlbGVjdFwiIHZhbHVlPVwiXCI+XHJcbiAgICB7e2RlZmF1bHRTZWxlY3RUZXh0fX1cclxuICA8L29wdGlvbj5cclxuICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb2RlIG9mIGNvZGVzXCIgW25nVmFsdWVdPVwiY29kZVwiPlxyXG4gICAge3tjb2RlLmRlc2NyaXB0aW9ufX1cclxuICA8L29wdGlvbj5cclxuPC9zZWxlY3Q+XHJcbmAsXHJcbiAgc3R5bGVzOiBbYGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEb3Rjb2Rlc1NlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmc7XHJcbiAgY29kZXM6IERvdENvZGVbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBjb2x1bW46IHN0cmluZztcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgdmFsdWUodmFsdWUpIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLnNldFNlbGVjdGVkQ29kZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgc2VsZWN0ZWREb3Rjb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxEb3RDb2RlPigpO1xyXG4gIHNlbGVjdGVkQ29kZTogRG90Q29kZTtcclxuXHJcbiAgQElucHV0KClcclxuICB1c2VEZWZhdWx0U2VsZWN0PzogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIGRlZmF1bHRTZWxlY3RUZXh0Pzogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRvdENvZGVTZXJ2aWNlOiBBbmd1bGFyRG90Y29kZXNTZXJ2aWNlLCBASW5qZWN0KCdjb25maWcnKSBwcml2YXRlIGNvbmZpZzogQ29uZmlnKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xyXG4gICAgaWYgKCEodGhpcy51c2VEZWZhdWx0U2VsZWN0ID09PSBmYWxzZSB8fCA8YW55PnRoaXMudXNlRGVmYXVsdFNlbGVjdCA9PT0gJ2ZhbHNlJylcclxuICAgICAgJiYgdGhpcy5jb25maWcgIT0gbnVsbCAmJiB0aGlzLmNvbmZpZy51c2VEZWZhdWx0U2VsZWN0KSB7XHJcbiAgICAgIHRoaXMudXNlRGVmYXVsdFNlbGVjdCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVzZURlZmF1bHRTZWxlY3QgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5kZWZhdWx0U2VsZWN0VGV4dCAmJiB0aGlzLmNvbmZpZyAhPSBudWxsICYmIHRoaXMuY29uZmlnLmRlZmF1bHRTZWxlY3RUZXh0KSB7XHJcbiAgICAgIHRoaXMuZGVmYXVsdFNlbGVjdFRleHQgPSB0aGlzLmNvbmZpZy5kZWZhdWx0U2VsZWN0VGV4dDtcclxuICAgIH1cclxuICAgIHRoaXMuZG90Q29kZVNlcnZpY2UuR2V0Q29kZXModGhpcy5jb2x1bW4pLnN1YnNjcmliZShjb2RlcyA9PiB7XHJcbiAgICAgIHRoaXMuY29kZXMgPSBjb2RlcztcclxuXHJcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRDb2RlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U2VsZWN0ZWRDb2RlKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvZGVzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmNvZGVzLmZpbmQoYyA9PiBjLnZhbHVlID09PSB0aGlzLnZhbHVlKTtcclxuXHJcbiAgICAgIGlmIChjb2RlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvZGUgPSBjb2RlO1xyXG4gICAgICAgIHRoaXMuY29kZUNoYW5nZWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvZGVDaGFuZ2VkKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZERvdGNvZGUuZW1pdCh0aGlzLnNlbGVjdGVkQ29kZSk7XHJcbiAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2UgfSBmcm9tICcuL2FuZ3VsYXItZG90Y29kZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbkBQaXBlKHtcclxuICBuYW1lOiAnZG90Y29kZScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEb3Rjb2RlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZG90Y29kZVNlcnZpY2U6IEFuZ3VsYXJEb3Rjb2Rlc1NlcnZpY2UpIHsgfVxyXG5cclxuICB0cmFuc2Zvcm0odmFsdWU6IHN0cmluZywgY29sdW1uOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuZG90Y29kZVNlcnZpY2UuR2V0Q29kZShjb2x1bW4sIHZhbHVlKS5waXBlKG1hcChjID0+IHtcclxuICAgICAgaWYgKGMpIHtcclxuICAgICAgICByZXR1cm4gYy5kZXNjcmlwdGlvbjtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQW5ndWxhckRvdGNvZGVzU2VydmljZSB9IGZyb20gJy4vYW5ndWxhci1kb3Rjb2Rlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmdNb2R1bGUsIE1vZHVsZVdpdGhQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQW5ndWxhckRvdGNvZGVzQ29tcG9uZW50IH0gZnJvbSAnLi9hbmd1bGFyLWRvdGNvZGVzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUsIEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IERvdGNvZGVzU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9kb3Rjb2Rlcy1zZWxlY3QvZG90Y29kZXMtc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBEb3Rjb2RlUGlwZSB9IGZyb20gJy4vZG90Y29kZS5waXBlJztcclxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvY29uZmlnJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW0h0dHBDbGllbnRNb2R1bGUsIENvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVcclxuICBdLFxyXG4gIGRlY2xhcmF0aW9uczogW0FuZ3VsYXJEb3Rjb2Rlc0NvbXBvbmVudCwgRG90Y29kZXNTZWxlY3RDb21wb25lbnQsIERvdGNvZGVQaXBlXSxcclxuICBleHBvcnRzOiBbQW5ndWxhckRvdGNvZGVzQ29tcG9uZW50LCBEb3Rjb2Rlc1NlbGVjdENvbXBvbmVudCwgRG90Y29kZVBpcGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmd1bGFyRG90Y29kZXNNb2R1bGUge1xyXG4gIHN0YXRpYyBmb3JSb290KGNvbmZpZzogQ29uZmlnKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZ01vZHVsZTogQW5ndWxhckRvdGNvZGVzTW9kdWxlLFxyXG4gICAgICBwcm92aWRlcnM6IFtBbmd1bGFyRG90Y29kZXNTZXJ2aWNlLFxyXG4gICAgICAgIHsgcHJvdmlkZTogJ2NvbmZpZycsIHVzZVZhbHVlOiBjb25maWcgfVxyXG4gICAgICBdXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7OztJQUNJLFlBQW1CLElBQVksRUFBUyxNQUFjLEVBQVMsZ0JBQXlCLEVBQzdFO1FBRFEsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBUyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVM7UUFDN0Usc0JBQWlCLEdBQWpCLGlCQUFpQjtLQUUzQjtDQUNKOzs7Ozs7QUNMRDs7Ozs7SUFrQkUsWUFBb0IsSUFBZ0IsRUFBNEI7UUFBNUMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUE0QixXQUFN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QUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkUsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUM1QyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDaEc7YUFBTSxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUNsRCxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDdEc7YUFBTSxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxFQUNuRCxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDdEc7YUFBTSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDOUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFN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