UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

120 lines 21.6 kB
import { Component, Input } from '@angular/core'; import { TapInfoDAOService, } from '@iotize/ionic'; import { TranslateService } from '@ngx-translate/core'; import { defaultInfoResolverConfig } from '../config'; import { tapResourceTranslateKey } from '../utility'; import { TapResourceMetaData } from '@iotize/tap/service/all'; import { Validators } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "@ngx-translate/core"; import * as i2 from "@iotize/ionic"; import * as i3 from "@angular/common"; import * as i4 from "@ionic/angular"; import * as i5 from "../tap-config-item/tap-config-item.component"; import * as i6 from "./tap-config-item-displayed.pipe"; export class TapConfigListComponent { set items(items) { if (!items) { items = []; } this._items = items.reduce((prev, item) => { if (typeof item === 'string') { item = { key: item, }; } let result = item; let defaultOption = defaultInfoResolverConfig.find((d) => item.key === d.key); if (defaultOption) { result = { ...result, ...defaultOption }; } result.title = this.translate.instant(tapResourceTranslateKey(result.key, 'title')); result.description = this.translate.instant(tapResourceTranslateKey(result.key, 'description')); if (result.editable === undefined) { result.editable = this.tapInfoDAOService.hasPut(result); } if (!result.input) { result.input = {}; } const schema = TapResourceMetaData[item.key]?.put.schema; if (schema) { fillFromSchema(result.input, schema); } prev.push(result); return prev; }, []); } constructor(translate, tapInfoDAOService) { this.translate = translate; this.tapInfoDAOService = tapInfoDAOService; this.itemRefresh = false; this.editMode = false; this.globalSubmit = false; this.lines = 'full'; this._items = []; } } /** @nocollapse */ TapConfigListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapConfigListComponent, deps: [{ token: i1.TranslateService }, { token: i2.TapInfoDAOService }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TapConfigListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TapConfigListComponent, selector: "tap-config-list", inputs: { itemRefresh: "itemRefresh", editMode: "editMode", globalSubmit: "globalSubmit", lines: "lines", items: "items" }, ngImport: i0, template: "<ion-grid *ngIf=\"_items && _items.length > 0\">\n <ion-row *ngFor=\"let item of _items\" class=\"tap-config-row-{{ item.key }}\">\n <ng-container *ngIf=\"item | tapConfigItemDisplayed | async\">\n <ion-col size-xs=\"12\" size-sm=\"6\">\n <ion-label>\n <span class=\"item-title\"\n ><ion-icon\n slot=\"start\"\n *ngIf=\"item.icon\"\n [name]=\"item.icon\"\n ></ion-icon>\n {{ item.title }}</span\n >\n <br *ngIf=\"item.description\" />\n <span class=\"item-description\">{{ item.description }}</span>\n </ion-label>\n </ion-col>\n <ion-col size-xs=\"12\" size-sm=\"6\">\n <tap-config-item\n [info]=\"item\"\n [refresh]=\"itemRefresh\"\n [editable]=\"editMode\"\n [editMode]=\"editMode\"\n [globalSubmit]=\"globalSubmit\"\n ></tap-config-item>\n </ion-col>\n </ng-container>\n </ion-row>\n</ion-grid>\n", styles: [".item-title{display:inline-block;vertical-align:middle}.item-description{font-size:.8em;color:#777}@media (prefers-color-scheme: dark){:root .item-title{color:#eee}}@media (max-width: 575px){ion-row{border-bottom:1px solid var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, .13))))}ion-grid{padding:0}}ion-col{padding-top:0;padding-bottom:0}\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: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i5.TapConfigItemComponent, selector: "tap-config-item", inputs: ["editable", "info", "refresh", "editMode", "globalSubmit"], outputs: ["focusOut", "onSubmit"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.TapConfigItemDisplayedPipe, name: "tapConfigItemDisplayed" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapConfigListComponent, decorators: [{ type: Component, args: [{ selector: 'tap-config-list', template: "<ion-grid *ngIf=\"_items && _items.length > 0\">\n <ion-row *ngFor=\"let item of _items\" class=\"tap-config-row-{{ item.key }}\">\n <ng-container *ngIf=\"item | tapConfigItemDisplayed | async\">\n <ion-col size-xs=\"12\" size-sm=\"6\">\n <ion-label>\n <span class=\"item-title\"\n ><ion-icon\n slot=\"start\"\n *ngIf=\"item.icon\"\n [name]=\"item.icon\"\n ></ion-icon>\n {{ item.title }}</span\n >\n <br *ngIf=\"item.description\" />\n <span class=\"item-description\">{{ item.description }}</span>\n </ion-label>\n </ion-col>\n <ion-col size-xs=\"12\" size-sm=\"6\">\n <tap-config-item\n [info]=\"item\"\n [refresh]=\"itemRefresh\"\n [editable]=\"editMode\"\n [editMode]=\"editMode\"\n [globalSubmit]=\"globalSubmit\"\n ></tap-config-item>\n </ion-col>\n </ng-container>\n </ion-row>\n</ion-grid>\n", styles: [".item-title{display:inline-block;vertical-align:middle}.item-description{font-size:.8em;color:#777}@media (prefers-color-scheme: dark){:root .item-title{color:#eee}}@media (max-width: 575px){ion-row{border-bottom:1px solid var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, .13))))}ion-grid{padding:0}}ion-col{padding-top:0;padding-bottom:0}\n"] }] }], ctorParameters: function () { return [{ type: i1.TranslateService }, { type: i2.TapInfoDAOService }]; }, propDecorators: { itemRefresh: [{ type: Input }], editMode: [{ type: Input }], globalSubmit: [{ type: Input }], lines: [{ type: Input }], items: [{ type: Input }] } }); function fillFromSchema(input, schema) { if (!input.type) { if (schema.type == 'string') { input.type = 'text'; } else if (schema.type === 'number' || schema.type === 'integer') { input.type = 'number'; } } if (!input.formValidators) { input.formValidators = []; if (schema.minLength) { input.formValidators.push(Validators.minLength(schema.minLength)); } if (schema.maxLength) { input.formValidators.push(Validators.maxLength(schema.maxLength)); } if (schema.minimum) { input.formValidators.push(Validators.min(schema.minimum)); input.min = schema.minimum; } if (schema.maximum) { input.formValidators.push(Validators.max(schema.maximum)); input.max = schema.maximum; } if (schema.pattern) { input.formValidators.push(Validators.pattern(schema.pattern)); } if (schema.type === 'integer') { if (schema.format?.startsWith('uint')) { input.formValidators.push(unsignedIntegerValidator); } else { input.formValidators.push(signedIntegerValidator); } } } } const unsignedIntegerValidator = customValidatorPattern(/^[0-9]*$/, 'unsignedInteger'); const signedIntegerValidator = customValidatorPattern(/^-?[0-9]*$/, 'signedInteger'); function customValidatorPattern(pattern, keyName) { return (control) => { const value = control.value; const valueMatchPattern = pattern.test(value); return !valueMatchPattern ? { [keyName]: { value: control.value } } : null; }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLWNvbmZpZy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9jb25maWcvc3JjL2xpYi90YXAtY29uZmlnLWxpc3QvdGFwLWNvbmZpZy1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9jb25maWcvc3JjL2xpYi90YXAtY29uZmlnLWxpc3QvdGFwLWNvbmZpZy1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFFTCxpQkFBaUIsR0FHbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxPQUFPLEVBQWdDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQU8xRSxNQUFNLE9BQU8sc0JBQXNCO0lBTWpDLElBQWEsS0FBSyxDQUNoQixLQUErRDtRQUUvRCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsS0FBSyxHQUFHLEVBQUUsQ0FBQztTQUNaO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBbUIsRUFBRTtZQUN6RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDNUIsSUFBSSxHQUFHO29CQUNMLEdBQUcsRUFBRSxJQUFzQjtpQkFDWCxD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Q0FBQztBQUVGLE1BQU0sc0JBQXNCLEdBQUcsc0JBQXNCLENBQ25ELFlBQVksRUFDWixlQUFlLENBQ2hCLENBQUM7QUFFRixTQUFTLHNCQUFzQixDQUFDLE9BQWUsRUFBRSxPQUFlO0lBQzlELE9BQU8sQ0FBQyxPQUF3QixFQUFpQyxFQUFFO1FBQ2pFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDNUIsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0UsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgVGFwQ29uZmlnSXRlbSxcbiAgVGFwSW5mb0RBT1NlcnZpY2UsXG4gIFRhcEluZm9LZXlPYmplY3RPclN0cmluZyxcbiAgVGFwUmVzb3VyY2VLZXksXG59IGZyb20gJ0Bpb3RpemUvaW9uaWMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZGVmYXVsdEluZm9SZXNvbHZlckNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyB0YXBSZXNvdXJjZVRyYW5zbGF0ZUtleSB9IGZyb20gJy4uL3V0aWxpdHknO1xuXG5pbXBvcnQgeyBUYXBSZXNvdXJjZU1ldGFEYXRhIH0gZnJvbSAnQGlvdGl6ZS90YXAvc2VydmljZS9hbGwnO1xuaW1wb3J0IHsgSlNPTlNjaGVtYTcgfSBmcm9tICdqc29uLXNjaGVtYSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YXAtY29uZmlnLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFwLWNvbmZpZy1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFwLWNvbmZpZy1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhcENvbmZpZ0xpc3RDb21wb25lbnQge1xuICBASW5wdXQoKSBpdGVtUmVmcmVzaCA9IGZhbHNlO1xuICBASW5wdXQoKSBlZGl0TW9kZSA9IGZhbHNlO1xuICBASW5wdXQoKSBnbG9iYWxTdWJtaXQgPSBmYWxzZTtcbiAgQElucHV0KCkgbGluZXMgPSAnZnVsbCc7XG5cbiAgQElucHV0KCkgc2V0IGl0ZW1zKFxuICAgIGl0ZW1zOiAoVGFwQ29uZmlnSXRlbSB8IFRhcEluZm9LZXlPYmplY3RPclN0cmluZylbXSB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAoIWl0ZW1zKSB7XG4gICAgICBpdGVtcyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLl9pdGVtcyA9IGl0ZW1zLnJlZHVjZSgocHJldiwgaXRlbSk6IFRhcENvbmZpZ0l0ZW1bXSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGl0ZW0gPSB7XG4gICAgICAgICAga2V5OiBpdGVtIGFzIFRhcFJlc291cmNlS2V5LFxuICAgICAgICB9IGFzIFRhcENvbmZpZ0l0ZW07XG4gICAgICB9XG4gICAgICBsZXQgcmVzdWx0OiBUYXBDb25maWdJdGVtID0gaXRlbTtcbiAgICAgIGxldCBkZWZhdWx0T3B0aW9uID0gZGVmYXVsdEluZm9SZXNvbHZlckNvbmZpZy5maW5kKFxuICAgICAgICAoZDogVGFwQ29uZmlnSXRlbSkgPT4gKGl0ZW0gYXMgVGFwQ29uZmlnSXRlbSkua2V5ID09PSBkLmtleVxuICAgICAgKTtcbiAgICAgIGlmIChkZWZhdWx0T3B0aW9uKSB7XG4gICAgICAgIHJlc3VsdCA9IHsgLi4ucmVzdWx0LCAuLi5kZWZhdWx0T3B0aW9uIH07XG4gICAgICB9XG4gICAgICByZXN1bHQudGl0bGUgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICB0YXBSZXNvdXJjZVRyYW5zbGF0ZUtleShyZXN1bHQua2V5LCAndGl0bGUnKVxuICAgICAgKTtcbiAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXG4gICAgICAgIHRhcFJlc291cmNlVHJhbnNsYXRlS2V5KHJlc3VsdC5rZXksICdkZXNjcmlwdGlvbicpXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0LmVkaXRhYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0LmVkaXRhYmxlID0gdGhpcy50YXBJbmZvREFPU2VydmljZS5oYXNQdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzdWx0LmlucHV0KSB7XG4gICAgICAgIHJlc3VsdC5pbnB1dCA9IHt9O1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NoZW1hID0gVGFwUmVzb3VyY2VNZXRhRGF0YVtcbiAgICAgICAgaXRlbS5rZXkgYXMga2V5b2YgdHlwZW9mIFRhcFJlc291cmNlTWV0YURhdGFcbiAgICAgIF0/LnB1dC5zY2hlbWEgYXMgSlNPTlNjaGVtYTcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoc2NoZW1hKSB7XG4gICAgICAgIGZpbGxGcm9tU2NoZW1hKHJlc3VsdC5pbnB1dCwgc2NoZW1hKTtcbiAgICAgIH1cblxuICAgICAgcHJldi5wdXNoKHJlc3VsdCk7XG4gICAgICByZXR1cm4gcHJldjtcbiAgICB9LCBbXSBhcyBUYXBDb25maWdJdGVtW10pO1xuICB9XG5cbiAgX2l0ZW1zOiBUYXBDb25maWdJdGVtW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRhcEluZm9EQU9TZXJ2aWNlOiBUYXBJbmZvREFPU2VydmljZVxuICApIHt9XG59XG5cbmZ1bmN0aW9uIGZpbGxGcm9tU2NoZW1hKFxuICBpbnB1dDogUmVxdWlyZWQ8VGFwQ29uZmlnSXRlbT5bJ2lucHV0J10sXG4gIHNjaGVtYTogSlNPTlNjaGVtYTdcbikge1xuICBpZiAoIWlucHV0LnR5cGUpIHtcbiAgICBpZiAoc2NoZW1hLnR5cGUgPT0gJ3N0cmluZycpIHtcbiAgICAgIGlucHV0LnR5cGUgPSAndGV4dCc7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEudHlwZSA9PT0gJ251bWJlcicgfHwgc2NoZW1hLnR5cGUgPT09ICdpbnRlZ2VyJykge1xuICAgICAgaW5wdXQudHlwZSA9ICdudW1iZXInO1xuICAgIH1cbiAgfVxuICBpZiAoIWlucHV0LmZvcm1WYWxpZGF0b3JzKSB7XG4gICAgaW5wdXQuZm9ybVZhbGlkYXRvcnMgPSBbXTtcbiAgICBpZiAoc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgaW5wdXQuZm9ybVZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aChzY2hlbWEubWluTGVuZ3RoKSk7XG4gICAgfVxuICAgIGlmIChzY2hlbWEubWF4TGVuZ3RoKSB7XG4gICAgICBpbnB1dC5mb3JtVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHNjaGVtYS5tYXhMZW5ndGgpKTtcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5taW5pbXVtKSB7XG4gICAgICBpbnB1dC5mb3JtVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluKHNjaGVtYS5taW5pbXVtKSk7XG4gICAgICBpbnB1dC5taW4gPSBzY2hlbWEubWluaW11bTtcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5tYXhpbXVtKSB7XG4gICAgICBpbnB1dC5mb3JtVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4KHNjaGVtYS5tYXhpbXVtKSk7XG4gICAgICBpbnB1dC5tYXggPSBzY2hlbWEubWF4aW11bTtcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5wYXR0ZXJuKSB7XG4gICAgICBpbnB1dC5mb3JtVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybihzY2hlbWEucGF0dGVybikpO1xuICAgIH1cbiAgICBpZiAoc2NoZW1hLnR5cGUgPT09ICdpbnRlZ2VyJykge1xuICAgICAgaWYgKHNjaGVtYS5mb3JtYXQ/LnN0YXJ0c1dpdGgoJ3VpbnQnKSkge1xuICAgICAgICBpbnB1dC5mb3JtVmFsaWRhdG9ycy5wdXNoKHVuc2lnbmVkSW50ZWdlclZhbGlkYXRvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dC5mb3JtVmFsaWRhdG9ycy5wdXNoKHNpZ25lZEludGVnZXJWYWxpZGF0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCB1bnNpZ25lZEludGVnZXJWYWxpZGF0b3IgPSBjdXN0b21WYWxpZGF0b3JQYXR0ZXJuKFxuICAvXlswLTldKiQvLFxuICAndW5zaWduZWRJbnRlZ2VyJ1xuKTtcblxuY29uc3Qgc2lnbmVkSW50ZWdlclZhbGlkYXRvciA9IGN1c3RvbVZhbGlkYXRvclBhdHRlcm4oXG4gIC9eLT9bMC05XSokLyxcbiAgJ3NpZ25lZEludGVnZXInXG4pO1xuXG5mdW5jdGlvbiBjdXN0b21WYWxpZGF0b3JQYXR0ZXJuKHBhdHRlcm46IFJlZ0V4cCwga2V5TmFtZTogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xuICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgY29uc3QgdmFsdWVNYXRjaFBhdHRlcm4gPSBwYXR0ZXJuLnRlc3QodmFsdWUpO1xuICAgIHJldHVybiAhdmFsdWVNYXRjaFBhdHRlcm4gPyB7IFtrZXlOYW1lXTogeyB2YWx1ZTogY29udHJvbC52YWx1ZSB9IH0gOiBudWxsO1xuICB9O1xufVxuIiwiPGlvbi1ncmlkICpuZ0lmPVwiX2l0ZW1zICYmIF9pdGVtcy5sZW5ndGggPiAwXCI+XG4gIDxpb24tcm93ICpuZ0Zvcj1cImxldCBpdGVtIG9mIF9pdGVtc1wiIGNsYXNzPVwidGFwLWNvbmZpZy1yb3cte3sgaXRlbS5rZXkgfX1cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbSB8IHRhcENvbmZpZ0l0ZW1EaXNwbGF5ZWQgfCBhc3luY1wiPlxuICAgICAgPGlvbi1jb2wgc2l6ZS14cz1cIjEyXCIgc2l6ZS1zbT1cIjZcIj5cbiAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIml0ZW0tdGl0bGVcIlxuICAgICAgICAgICAgPjxpb24taWNvblxuICAgICAgICAgICAgICBzbG90PVwic3RhcnRcIlxuICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgIFtuYW1lXT1cIml0ZW0uaWNvblwiXG4gICAgICAgICAgICA+PC9pb24taWNvbj5cbiAgICAgICAgICAgIHt7IGl0ZW0udGl0bGUgfX08L3NwYW5cbiAgICAgICAgICA+XG4gICAgICAgICAgPGJyICpuZ0lmPVwiaXRlbS5kZXNjcmlwdGlvblwiIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpdGVtLWRlc2NyaXB0aW9uXCI+e3sgaXRlbS5kZXNjcmlwdGlvbiB9fTwvc3Bhbj5cbiAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgICA8aW9uLWNvbCBzaXplLXhzPVwiMTJcIiBzaXplLXNtPVwiNlwiPlxuICAgICAgICA8dGFwLWNvbmZpZy1pdGVtXG4gICAgICAgICAgW2luZm9dPVwiaXRlbVwiXG4gICAgICAgICAgW3JlZnJlc2hdPVwiaXRlbVJlZnJlc2hcIlxuICAgICAgICAgIFtlZGl0YWJsZV09XCJlZGl0TW9kZVwiXG4gICAgICAgICAgW2VkaXRNb2RlXT1cImVkaXRNb2RlXCJcbiAgICAgICAgICBbZ2xvYmFsU3VibWl0XT1cImdsb2JhbFN1Ym1pdFwiXG4gICAgICAgID48L3RhcC1jb25maWctaXRlbT5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9pb24tcm93PlxuPC9pb24tZ3JpZD5cbiJdfQ==