UNPKG

@decaf-ts/fabric-weaver

Version:
537 lines 92.6 kB
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FabricOrdererConfigBuilder = void 0;
const logging_1 = require("@decaf-ts/logging");
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const yaml_1 = require("../../utils/yaml.cjs");
class FabricOrdererConfigBuilder {
    constructor(logger) {
        this.config = (0, yaml_1.readFileYaml)(path_1.default.join(__dirname, "../../../config/orderer.yaml"));
        if (!logger)
            this.log = logging_1.Logging.for(FabricOrdererConfigBuilder);
        else
            this.log = logger.for(FabricOrdererConfigBuilder.name);
    }
    setKafka(kafka) {
        if (kafka !== undefined) {
            if (kafka.Retry !== undefined) {
                if (kafka.Retry.ShortInterval !== undefined) {
                    this.log.debug(`Setting Kafka retry short interval to ${kafka.Retry.ShortInterval}`);
                    this.config.Kafka.Retry.ShortInterval = kafka.Retry.ShortInterval;
                }
                if (kafka.Retry.ShortTotal !== undefined) {
                    this.log.debug(`Setting Kafka retry short total to ${kafka.Retry.ShortTotal}`);
                    this.config.Kafka.Retry.ShortTotal = kafka.Retry.ShortTotal;
                }
                if (kafka.Retry.LongInterval !== undefined) {
                    this.log.debug(`Setting Kafka retry long interval to ${kafka.Retry.LongInterval}`);
                    this.config.Kafka.Retry.LongInterval = kafka.Retry.LongInterval;
                }
                if (kafka.Retry.LongTotal !== undefined) {
                    this.log.debug(`Setting Kafka retry long total to ${kafka.Retry.LongTotal}`);
                    this.config.Kafka.Retry.LongTotal = kafka.Retry.LongTotal;
                }
                if (kafka.Retry.NetworkTimeouts !== undefined) {
                    if (kafka.Retry.NetworkTimeouts.DialTimeout !== undefined) {
                        this.log.debug(`Setting Kafka retry network timeouts dial timeout to ${kafka.Retry.NetworkTimeouts.DialTimeout}`);
                        this.config.Kafka.Retry.NetworkTimeouts.DialTimeout =
                            kafka.Retry.NetworkTimeouts.DialTimeout;
                    }
                    if (kafka.Retry.NetworkTimeouts.ReadTimeout !== undefined) {
                        this.log.debug(`Setting Kafka retry network timeouts read timeout to ${kafka.Retry.NetworkTimeouts.ReadTimeout}`);
                        this.config.Kafka.Retry.NetworkTimeouts.ReadTimeout =
                            kafka.Retry.NetworkTimeouts.ReadTimeout;
                    }
                    if (kafka.Retry.NetworkTimeouts.WriteTimeout !== undefined) {
                        this.log.debug(`Setting Kafka retry network timeouts write timeout to ${kafka.Retry.NetworkTimeouts.WriteTimeout}`);
                        this.config.Kafka.Retry.NetworkTimeouts.WriteTimeout =
                            kafka.Retry.NetworkTimeouts.WriteTimeout;
                    }
                }
                if (kafka.Retry.Metadata !== undefined) {
                    if (kafka.Retry.Metadata.RetryBackoff !== undefined) {
                        this.log.debug(`Setting Kafka retry metadata retry backoff to ${kafka.Retry.Metadata.RetryBackoff}`);
                        this.config.Kafka.Retry.Metadata.RetryBackoff =
                            kafka.Retry.Metadata.RetryBackoff;
                    }
                    if (kafka.Retry.Metadata.RetryMax !== undefined) {
                        this.log.debug(`Setting Kafka retry metadata retry max to ${kafka.Retry.Metadata.RetryMax}`);
                        this.config.Kafka.Retry.Metadata.RetryMax =
                            kafka.Retry.Metadata.RetryMax;
                    }
                }
                if (kafka.Retry.Producer !== undefined) {
                    if (kafka.Retry.Producer.RetryBackoff !== undefined) {
                        this.log.debug(`Setting Kafka retry producer retry backoff to ${kafka.Retry.Producer.RetryBackoff}`);
                        this.config.Kafka.Retry.Producer.RetryBackoff =
                            kafka.Retry.Producer.RetryBackoff;
                    }
                    if (kafka.Retry.Producer.RetryMax !== undefined) {
                        this.log.debug(`Setting Kafka retry producer retry max to ${kafka.Retry.Producer.RetryMax}`);
                        this.config.Kafka.Retry.Producer.RetryMax =
                            kafka.Retry.Producer.RetryMax;
                    }
                }
                if (kafka.Retry.Consumer !== undefined) {
                    if (kafka.Retry.Consumer.RetryBackoff !== undefined) {
                        this.log.debug(`Setting Kafka retry consumer retry backoff to ${kafka.Retry.Consumer.RetryBackoff}`);
                        this.config.Kafka.Retry.Consumer.RetryBackoff =
                            kafka.Retry.Consumer.RetryBackoff;
                    }
                }
            }
            if (kafka.Topic !== undefined) {
                if (kafka.Topic.ReplicationFactor !== undefined) {
                    this.log.debug(`Setting Kafka topic replication factor to ${kafka.Topic.ReplicationFactor}`);
                    this.config.Kafka.Topic.ReplicationFactor =
                        kafka.Topic.ReplicationFactor;
                }
            }
            if (kafka.Verbose !== undefined) {
                this.log.debug(`Setting Kafka verbose to ${kafka.Verbose}`);
                this.config.Kafka.Verbose = kafka.Verbose;
            }
            if (kafka.TLS !== undefined) {
                if (kafka.TLS.Enabled !== undefined) {
                    this.log.debug(`Setting Kafka TLS enabled to ${kafka.TLS.Enabled}`);
                    this.config.Kafka.TLS.Enabled = kafka.TLS.Enabled;
                }
                if (kafka.TLS.Certificate !== undefined) {
                    this.log.debug(`Setting Kafka TLS certificate to ${kafka.TLS.Certificate}`);
                    this.config.Kafka.TLS.Certificate = kafka.TLS.Certificate;
                }
                if (kafka.TLS.PrivateKey !== undefined) {
                    this.log.debug(`Setting Kafka TLS private key to ${kafka.TLS.PrivateKey}`);
                    this.config.Kafka.TLS.PrivateKey = kafka.TLS.PrivateKey;
                }
                if (kafka.TLS.RootCAs !== undefined) {
                    this.log.debug(`Setting Kafka TLS root CAs to ${kafka.TLS.RootCAs}`);
                    this.config.Kafka.TLS.RootCAs = kafka.TLS.RootCAs;
                }
            }
            if (kafka.Version !== undefined) {
                this.log.debug(`Setting Kafka version to ${kafka.Version}`);
                this.config.Kafka.Version = kafka.Version;
            }
            if (kafka.SASLPlain !== undefined) {
                if (kafka.SASLPlain.Enabled !== undefined) {
                    this.log.debug(`Setting Kafka SASL plain enabled to ${kafka.SASLPlain.Enabled}`);
                    this.config.Kafka.SASLPlain.Enabled = kafka.SASLPlain.Enabled;
                }
                if (kafka.SASLPlain.User !== undefined) {
                    this.log.debug(`Setting Kafka SASL plain user to ${kafka.SASLPlain.User}`);
                    this.config.Kafka.SASLPlain.User = kafka.SASLPlain.User;
                }
                if (kafka.SASLPlain.Password !== undefined) {
                    this.log.debug(`Setting Kafka SASL plain password to ${kafka.SASLPlain.Password}`);
                    this.config.Kafka.SASLPlain.Password = kafka.SASLPlain.Password;
                }
            }
        }
        return this;
    }
    setFileLedgerLocation(fileLedgerLocation) {
        if (fileLedgerLocation !== undefined) {
            this.log.debug(`Setting file ledger location to ${fileLedgerLocation}`);
            this.config.FileLedger.Location = fileLedgerLocation;
        }
        return this;
    }
    setAuthWindow(authWindow) {
        if (authWindow !== undefined) {
            this.log.debug(`Setting auth window to ${authWindow}`);
            this.config.General.Authentication.TimeWindow = authWindow;
        }
        return this;
    }
    setBCCSP(bccsp) {
        if (bccsp !== undefined) {
            if (bccsp.Default !== undefined) {
                this.log.debug(`Setting BCCSP default to ${bccsp.Default}`);
                this.config.General.BCCSP.Default = bccsp.Default;
            }
            if (bccsp.SW !== undefined) {
                if (bccsp.SW.Hash !== undefined) {
                    this.log.debug(`Setting BCCSP SW hash to ${bccsp.SW.Hash}`);
                    this.config.General.BCCSP.SW.Hash = bccsp.SW.Hash;
                }
                if (bccsp.SW.Security !== undefined) {
                    this.log.debug(`Setting BCCSP SW security to ${bccsp.SW.Security}`);
                    this.config.General.BCCSP.SW.Security = bccsp.SW.Security;
                }
                if (bccsp.SW.FileKeyStore !== undefined) {
                    if (bccsp.SW.FileKeyStore.KeyStore !== undefined) {
                        this.log.debug(`Setting BCCSP SW FileKeyStore key store to ${bccsp.SW.FileKeyStore.KeyStore}`);
                        this.config.General.BCCSP.SW.FileKeyStore.KeyStore =
                            bccsp.SW.FileKeyStore.KeyStore;
                    }
                }
            }
            if (bccsp.PKCS11 !== undefined) {
                if (bccsp.PKCS11.Library !== undefined) {
                    this.log.debug(`Setting BCCSP PKCS11 library to ${bccsp.PKCS11.Library}`);
                    this.config.General.BCCSP.PKCS11.Library = bccsp.PKCS11.Library;
                }
                if (bccsp.PKCS11.Label !== undefined) {
                    this.log.debug(`Setting BCCSP PKCS11 label to ${bccsp.PKCS11.Label}`);
                    this.config.General.BCCSP.PKCS11.Label = bccsp.PKCS11.Label;
                }
                if (bccsp.PKCS11.Pin !== undefined) {
                    this.log.debug(`Setting BCCSP PKCS11 pin to ${bccsp.PKCS11.Pin}`);
                    this.config.General.BCCSP.PKCS11.Pin = bccsp.PKCS11.Pin;
                }
                if (bccsp.PKCS11.Hash !== undefined) {
                    this.log.debug(`Setting BCCSP PKCS11 hash to ${bccsp.PKCS11.Hash}`);
                    this.config.General.BCCSP.PKCS11.Hash = bccsp.PKCS11.Hash;
                }
                if (bccsp.PKCS11.Security !== undefined) {
                    this.log.debug(`Setting BCCSP PKCS11 security to ${bccsp.PKCS11.Security}`);
                    this.config.General.BCCSP.PKCS11.Security = bccsp.PKCS11.Security;
                }
                if (bccsp.PKCS11.FileKeyStore !== undefined) {
                    if (bccsp.PKCS11.FileKeyStore.KeyStore !== undefined) {
                        this.log.debug(`Setting BCCSP PKCS11 FileKeyStore key store to ${bccsp.PKCS11.FileKeyStore.KeyStore}`);
                        this.config.General.BCCSP.PKCS11.FileKeyStore.KeyStore =
                            bccsp.PKCS11.FileKeyStore.KeyStore;
                    }
                }
            }
        }
        return this;
    }
    setDebug(debug) {
        if (debug !== undefined) {
            if (debug.BroadcastTraceDir !== undefined) {
                this.log.debug(`Setting debug broadcast trace directory to ${debug.BroadcastTraceDir}`);
                this.config.Debug.BroadcastTraceDir = debug.BroadcastTraceDir;
            }
            if (debug.DeliverTraceDir !== undefined) {
                this.log.debug(`Setting debug deliver trace directory to ${debug.DeliverTraceDir}`);
                this.config.Debug.DeliverTraceDir = debug.DeliverTraceDir;
            }
        }
        return this;
    }
    setOperations(operations) {
        if (operations !== undefined) {
            if (operations.ListenAddress !== undefined) {
                this.log.debug(`Setting operations listen address to ${operations.ListenAddress}`);
                this.config.Operations.ListenAddress = operations.ListenAddress;
            }
            if (operations.TLS !== undefined) {
                if (operations.TLS.Enabled !== undefined) {
                    this.log.debug(`Setting TLS enabled to ${operations.TLS.Enabled}`);
                    this.config.Operations.TLS.Enabled = operations.TLS.Enabled;
                }
                if (operations.TLS.Certificate !== undefined) {
                    this.log.debug(`Setting TLS certificate to ${operations.TLS.Certificate}`);
                    this.config.Operations.TLS.Certificate = operations.TLS.Certificate;
                }
                if (operations.TLS.PrivateKey !== undefined) {
                    this.log.debug(`Setting TLS private key to ${operations.TLS.PrivateKey}`);
                    this.config.Operations.TLS.PrivateKey = operations.TLS.PrivateKey;
                }
                if (operations.TLS.ClientAuthRequired !== undefined) {
                    this.log.debug(`Setting TLS client authentication required to ${operations.TLS.ClientAuthRequired}`);
                    this.config.Operations.TLS.ClientAuthRequired =
                        operations.TLS.ClientAuthRequired;
                }
                if (operations.TLS.ClientRootCAs !== undefined) {
                    this.log.debug(`Setting TLS client root CAs to ${operations.TLS.ClientRootCAs}`);
                    this.config.Operations.TLS.ClientRootCAs =
                        operations.TLS.ClientRootCAs;
                }
            }
        }
        return this;
    }
    setMetrics(metrics) {
        if (metrics !== undefined) {
            if (metrics.Provider !== undefined) {
                this.log.debug(`Setting metrics provider to ${metrics.Provider}`);
                this.config.Metrics.Provider = metrics.Provider;
            }
            if (metrics.Statsd !== undefined) {
                if (metrics.Statsd.Network !== undefined) {
                    this.log.debug(`Setting statsd network to ${metrics.Statsd.Network}`);
                    this.config.Metrics.Statsd.Network = metrics.Statsd.Network;
                }
                if (metrics.Statsd.Address !== undefined) {
                    this.log.debug(`Setting statsd address to ${metrics.Statsd.Address}`);
                    this.config.Metrics.Statsd.Address = metrics.Statsd.Address;
                }
                if (metrics.Statsd.WriteInterval !== undefined) {
                    this.log.debug(`Setting statsd write interval to ${metrics.Statsd.WriteInterval}`);
                    this.config.Metrics.Statsd.WriteInterval =
                        metrics.Statsd.WriteInterval;
                }
                if (metrics.Statsd.Prefix !== undefined) {
                    this.log.debug(`Setting statsd prefix to ${metrics.Statsd.Prefix}`);
                    this.config.Metrics.Statsd.Prefix = metrics.Statsd.Prefix;
                }
            }
        }
        return this;
    }
    setProfile(profile) {
        if (profile !== undefined) {
            if (profile.Enabled !== undefined) {
                this.log.debug(`Setting profile to ${profile.Enabled}`);
                this.config.General.Profile = profile;
            }
            if (profile.Address !== undefined) {
                this.log.debug(`Setting profile address to ${profile.Address}`);
                this.config.General.Profile.Address = profile.Address;
            }
        }
        return this;
    }
    setLocalMSP(msp) {
        if (msp !== undefined) {
            if (msp.LocalMSPDir !== undefined) {
                this.log.debug(`Setting local MSP directory to ${msp.LocalMSPDir}`);
                this.config.General.LocalMSPDir = msp.LocalMSPDir;
            }
            if (msp.LocalMSPID !== undefined) {
                this.log.debug(`Setting local MSP ID to ${msp.LocalMSPID}`);
                this.config.General.LocalMSPID = msp.LocalMSPID;
            }
        }
        return this;
    }
    setBootstrap(boot) {
        if (boot !== undefined) {
            if (boot.BootstrapFile !== undefined) {
                this.log.debug(`Setting bootstrap file to ${boot.BootstrapFile}`);
                this.config.General.BootstrapFile = boot.BootstrapFile;
            }
            if (boot.BootstrapMethod) {
                this.log.debug(`Setting bootstrap method to ${boot.BootstrapMethod}`);
                this.config.General.BootstrapMethod = boot.BootstrapMethod;
            }
        }
        return this;
    }
    setCluster(cluster) {
        if (cluster !== undefined) {
            if (cluster.SendBufferSize !== undefined) {
                this.log.debug(`Setting send buffer size to ${cluster.SendBufferSize}`);
                this.config.General.Cluster.SendBufferSize = cluster.SendBufferSize;
            }
            if (cluster.ClientCertificate !== undefined) {
                this.log.debug(`Setting client certificate to ${cluster.ClientCertificate}`);
                this.config.General.Cluster.ClientCertificate =
                    cluster.ClientCertificate;
            }
            if (cluster.ClientPrivateKey !== undefined) {
                this.log.debug(`Setting client private key to ${cluster.ClientPrivateKey}`);
                this.config.General.Cluster.ClientPrivateKey =
                    cluster.ClientPrivateKey;
            }
            if (cluster.ListenAddress !== undefined) {
                this.log.debug(`Setting listen address to ${cluster.ListenAddress}`);
                this.config.General.Cluster.ListenAddress = cluster.ListenAddress;
            }
            if (cluster.ListenPort !== undefined) {
                this.log.debug(`Setting listen port to ${cluster.ListenPort}`);
                this.config.General.Cluster.ListenPort = cluster.ListenPort;
            }
            if (cluster.ServerCertificate !== undefined) {
                this.log.debug(`Setting server certificate to ${cluster.ServerCertificate}`);
                this.config.General.Cluster.ServerCertificate =
                    cluster.ServerCertificate;
            }
            if (cluster.ServerPrivateKey !== undefined) {
                this.log.debug(`Setting server private key to ${cluster.ServerPrivateKey}`);
                this.config.General.Cluster.ServerPrivateKey =
                    cluster.ServerPrivateKey;
            }
        }
        return this;
    }
    setMSGSize(cfg) {
        if (cfg !== undefined) {
            if (cfg.MaxRecvMsgSize !== undefined) {
                this.log.debug(`Setting max receive message size to ${cfg.MaxRecvMsgSize}`);
                this.config.General.MaxRecvMsgSize = cfg.MaxRecvMsgSize;
            }
            if (cfg.MaxSendMsgSize !== undefined) {
                this.log.debug(`Setting max send message size to ${cfg.MaxSendMsgSize}`);
                this.config.General.MaxSendMsgSize = cfg.MaxSendMsgSize;
            }
        }
        return this;
    }
    setKeepAlive(keepAlive) {
        if (keepAlive !== undefined) {
            if (keepAlive.ServerInterval !== undefined) {
                this.log.debug(`Setting server interval to ${keepAlive.ServerInterval}`);
                this.config.General.Keepalive.ServerInterval =
                    keepAlive.ServerInterval;
            }
            if (keepAlive.ServerMinInterval !== undefined) {
                this.log.debug(`Setting server minimum interval to ${keepAlive.ServerMinInterval}`);
                this.config.General.Keepalive.ServerMinInterval =
                    keepAlive.ServerMinInterval;
            }
            if (keepAlive.ServerTimeout !== undefined) {
                this.log.debug(`Setting server timeout to ${keepAlive.ServerTimeout}`);
                this.config.General.Keepalive.ServerTimeout = keepAlive.ServerTimeout;
            }
        }
        return this;
    }
    setListenAddress(address) {
        if (address !== undefined) {
            this.log.debug(`Setting listen address to ${address}`);
            this.config.General.ListenAddress = address;
        }
        return this;
    }
    setPort(port) {
        if (port !== undefined) {
            this.log.debug(`Setting port to ${port}`);
            this.config.General.ListenPort = port;
        }
        return this;
    }
    setTLS(tls) {
        if (tls !== undefined) {
            if (tls.Enabled !== undefined) {
                this.log.debug(`Setting TLS enabled to ${tls.Enabled}`);
                this.config.General.TLS.Enabled = tls.Enabled;
            }
            if (tls.Certificate !== undefined) {
                this.log.debug(`Setting TLS certificate to ${tls.Certificate}`);
                this.config.General.TLS.Certificate = tls.Certificate;
            }
            if (tls.PrivateKey !== undefined) {
                this.log.debug(`Setting TLS private key to ${tls.PrivateKey}`);
                this.config.General.TLS.PrivateKey = tls.PrivateKey;
            }
            if (tls.RootCAs !== undefined) {
                this.log.debug(`Setting TLS root CAs to ${tls.RootCAs.join(", ")}`);
                this.config.General.TLS.RootCAs = tls.RootCAs;
            }
            if (tls.ClientAuthRequired !== undefined) {
                this.log.debug(`Setting TLS client auth required to ${tls.ClientAuthRequired}`);
                this.config.General.TLS.ClientAuthRequired = tls.ClientAuthRequired;
            }
            if (tls.ClientRootCAs !== undefined) {
                this.log.debug(`Setting TLS client root CAs to ${tls.ClientRootCAs.join(", ")}`);
                this.config.General.TLS.ClientRootCAs = tls.ClientRootCAs;
            }
        }
        return this;
    }
    setAdmin(cfg) {
        if (cfg !== undefined) {
            if (cfg.ListenAddress !== undefined) {
                this.log.debug(`Setting admin listen address to ${cfg.ListenAddress}`);
                this.config.Admin.ListenAddress = cfg.ListenAddress;
            }
            if (cfg.TLS !== undefined) {
                if (cfg.TLS.Enabled !== undefined) {
                    this.log.debug(`Setting admin TLS enabled to ${cfg.TLS.Enabled}`);
                    this.config.Admin.TLS.Enabled = cfg.TLS.Enabled;
                }
                if (cfg.TLS.PrivateKey !== undefined) {
                    this.log.debug(`Setting admin TLS private key to ${cfg.TLS.PrivateKey}`);
                    this.config.Admin.TLS.PrivateKey = cfg.TLS.PrivateKey;
                }
                if (cfg.TLS.Certificate !== undefined) {
                    this.log.debug(`Setting admin TLS certificate to ${cfg.TLS.Certificate}`);
                    this.config.Admin.TLS.Certificate = cfg.TLS.Certificate;
                }
                if (cfg.TLS.RootCAs !== undefined) {
                    this.log.debug(`Setting admin TLS root CAs files: ${cfg.TLS.RootCAs.join(", ")}`);
                    this.config.Admin.TLS.RootCAs = cfg.TLS.RootCAs;
                }
                if (cfg.TLS.ClientAuthRequired !== undefined) {
                    this.log.debug(`Setting admin TLS client auth required to ${cfg.TLS.ClientAuthRequired}`);
                    this.config.Admin.TLS.ClientAuthRequired =
                        cfg.TLS.ClientAuthRequired;
                }
                if (cfg.TLS.ClientRootCAs !== undefined) {
                    if (cfg.TLS.ClientRootCAs !== undefined) {
                        this.log.debug(`Setting admin TLS client root CAs files: ${cfg.TLS.ClientRootCAs.join(", ")}`);
                        this.config.Admin.TLS.ClientRootCAs = cfg.TLS.ClientRootCAs;
                    }
                }
            }
        }
        return this;
    }
    setChannelParticipation(channelParticipation) {
        if (channelParticipation !== undefined) {
            if (channelParticipation.Enabled !== undefined) {
                this.log.debug(`Setting channel participation to ${channelParticipation.Enabled}`);
                this.config.ChannelParticipation.Enabled =
                    channelParticipation.Enabled;
            }
            if (channelParticipation.MaxRequestBodySize !== undefined) {
                this.log.debug(`Setting max request body size to ${channelParticipation.MaxRequestBodySize}`);
                this.config.ChannelParticipation.MaxRequestBodySize =
                    channelParticipation.MaxRequestBodySize;
            }
        }
        return this;
    }
    setConsensus(consensus) {
        if (consensus !== undefined) {
            if (consensus.WALDir !== undefined) {
                this.log.debug(`Setting WAL directory to ${consensus.WALDir}`);
                this.config.Consensus.WALDir = consensus.WALDir;
            }
            if (consensus.SnapDir !== undefined) {
                this.log.debug(`Setting snapshot directory to ${consensus.SnapDir}`);
                this.config.Consensus.SnapDir = consensus.SnapDir;
            }
        }
        return this;
    }
    /**
     * @description Saves the current configuration to a file.
     * @summary Writes the current Fabric CA Server configuration to a YAML file at the specified path. If the directory doesn't exist, it will be created.
     * @param {string} cpath - The path where the configuration file should be saved.
     * @return {this} The current instance of the builder for method chaining.
     * @example
     * const builder = new FabricCAServerCommandBuilder();
     * builder.save('/path/to/config/fabric-ca-server.yaml');
     *
     * @mermaid
     * sequenceDiagram
     *   participant Client
     *   participant Builder as FabricCAServerCommandBuilder
     *   participant FileSystem as File System
     *   Client->>Builder: saveConfig('/path/to/config/fabric-ca-server.yaml')
     *   Builder->>Builder: Check if cpath is defined
     *   alt cpath is defined
     *     Builder->>FileSystem: Check if directory exists
     *     alt Directory doesn't exist
     *       Builder->>FileSystem: Create directory
     *     end
     *     Builder->>Builder: Log debug message
     *     Builder->>FileSystem: Write YAML configuration to file
     *   end
     *   Builder-->>Client: Return this
     */
    save(cpath) {
        if (cpath === undefined)
            return this;
        if (!fs_1.default.existsSync(path_1.default.join(cpath)))
            fs_1.default.mkdirSync(path_1.default.join(cpath), { recursive: true });
        if (!cpath.endsWith(".yaml"))
            cpath = path_1.default.join(cpath, "orderer.yaml");
        this.log.debug(`Writing configuration to ${cpath}`);
        this.log.debug(`Config file: ${JSON.stringify(this.config, null, 2)}`);
        (0, yaml_1.writeFileYaml)(cpath, this.config);
        return this;
    }
}
exports.FabricOrdererConfigBuilder = FabricOrdererConfigBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFicmljLW9yZGVyZXItY29uZmlnLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmFicmljL29yZGVyZXIvZmFicmljLW9yZGVyZXItY29uZmlnLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsK0NBQW9EO0FBbUJwRCxnREFBd0I7QUFDeEIsNENBQW9CO0FBQ3BCLDJDQUErRDtBQUUvRCxNQUFhLDBCQUEwQjtJQU9yQyxZQUFZLE1BQWU7UUFKbkIsV0FBTSxHQUFrQixJQUFBLG1CQUFZLEVBQzFDLGNBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLDhCQUE4QixDQUFDLENBQ3BDLENBQUM7UUFHakIsSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLGlCQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7O1lBQzNELElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQW1CO1FBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1oseUNBQXlDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQ3JFLENBQUM7b0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFNLENBQUMsS0FBTSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztnQkFDdEUsQ0FBQztnQkFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixzQ0FBc0MsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FDL0QsQ0FBQztvQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQU0sQ0FBQyxLQUFNLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO2dCQUNoRSxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLHdDQUF3QyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUNuRSxDQUFDO29CQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBTSxDQUFDLEtBQU0sQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7Z0JBQ3BFLENBQUM7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1oscUNBQXFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQzdELENBQUM7b0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFNLENBQUMsS0FBTSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztnQkFDOUQsQ0FBQztnQkFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUM5QyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDMUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osd0RBQXdELEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUNsRyxDQUFDO3dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBTSxDQUFDLEtBQU0sQ0FBQyxlQUFnQixDQUFDLFdBQVc7NEJBQ3BELEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQztvQkFDNUMsQ0FBQztvQkFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDMUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osd0RBQXdELEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUNsRyxDQUFDO3dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBTSxDQUFDLEtBQU0sQ0FBQyxlQUFnQixDQUFDLFdBQVc7NEJBQ3BELEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQztvQkFDNUMsQ0FBQztvQkFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1oseURBQXlELEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUNwRyxDQUFDO3dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBTSxDQUFDLEtBQU0sQ0FBQyxlQUFnQixDQUFDLFlBQVk7NEJBQ3JELEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQztvQkFDN0MsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3ZDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixpREFBaUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQ3JGLENBQUM7d0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFNLENBQUMsS0FBTSxDQUFDLFFBQVMsQ0FBQyxZQUFZOzRCQUM5QyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7b0JBQ3RDLENBQUM7b0JBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ2hELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLDZDQUE2QyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FDN0UsQ0FBQzt3QkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQU0sQ0FBQyxLQUFNLENBQUMsUUFBUyxDQUFDLFFBQVE7NEJBQzFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztvQkFDbEMsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3ZDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixpREFBaUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQ3JGLENBQUM7d0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFNLENBQUMsS0FBTSxDQUFDLFFBQVMsQ0FBQyxZQUFZOzRCQUM5QyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7b0JBQ3RDLENBQUM7b0JBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ2hELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLDZDQUE2QyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FDN0UsQ0FBQzt3QkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQU0sQ0FBQyxLQUFNLENBQUMsUUFBUyxDQUFDLFFBQVE7NEJBQzFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztvQkFDbEMsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3ZDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixpREFBaUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQ3JGLENBQUM7d0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFNLENBQUMsS0FBTSxDQUFDLFFBQVMsQ0FBQyxZQUFZOzRCQUM5QyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7b0JBQ3RDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzlCLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osNkNBQTZDLEtBQUssQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FDN0UsQ0FBQztvQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQU0sQ0FBQyxLQUFNLENBQUMsaUJBQWlCO3dCQUN6QyxLQUFLLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDO2dCQUNsQyxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUM3QyxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM1QixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUNwRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQU0sQ0FBQyxHQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO2dCQUN0RCxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLG9DQUFvQyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUM1RCxDQUFDO29CQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBTSxDQUFDLEdBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7Z0JBQzlELENBQUM7Z0JBRUQsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osb0NBQW9DLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQzNELENBQUM7b0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFNLENBQUMsR0FBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztnQkFDNUQsQ0FBQztnQkFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQU0sQ0FBQyxHQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO2dCQUN0RCxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUM3QyxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWix1Q0FBdUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FDakUsQ0FBQztvQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQU0sQ0FBQyxTQUFVLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUNsRSxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLG9DQUFvQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUMzRCxDQUFDO29CQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBTSxDQUFDLFNBQVUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQzVELENBQUM7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osd0NBQXdDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQ25FLENBQUM7b0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFNLENBQUMsU0FBVSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztnQkFDcEUsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQscUJBQXFCLENBQUMsa0JBQTJCO1FBQy9DLElBQUksa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsbUNBQW1DLGtCQUFrQixFQUFFLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVcsQ0FBQyxRQUFRLEdBQUcsa0JBQWtCLENBQUM7UUFDeEQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFtQjtRQUMvQixJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxjQUFlLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQW1CO1FBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxLQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDdEQsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsS0FBTSxDQUFDLEVBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZELENBQUM7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsS0FBTSxDQUFDLEVBQUcsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQy9ELENBQUM7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDeEMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLDhDQUE4QyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FDL0UsQ0FBQzt3QkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxLQUFNLENBQUMsRUFBRyxDQUFDLFlBQWEsQ0FBQyxRQUFROzRCQUNwRCxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7b0JBQ25DLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQy9CLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLG1DQUFtQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUMxRCxDQUFDO29CQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLEtBQU0sQ0FBQyxNQUFPLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUNyRSxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7b0JBQ3RFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLEtBQU0sQ0FBQyxNQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUNqRSxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLCtCQUErQixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQ2xFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLEtBQU0sQ0FBQyxNQUFPLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2dCQUM3RCxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ3BFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLEtBQU0sQ0FBQyxNQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUMvRCxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLG9DQUFvQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUM1RCxDQUFDO29CQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLEtBQU0sQ0FBQyxNQUFPLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2dCQUN2RSxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzVDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUNyRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixrREFBa0QsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQ3ZGLENBQUM7d0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsS0FBTSxDQUFDLE1BQU8sQ0FBQyxZQUFhLENBQUMsUUFBUTs0QkFDeEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO29CQUN2QyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFtQjtRQUMxQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixJQUFJLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osOENBQThDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUN4RSxDQUFDO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBTSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztZQUNqRSxDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWiw0Q0FBNEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUNwRSxDQUFDO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBTSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1lBQzdELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsYUFBYSxDQUFDLFVBQTZCO1FBQ3pDLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzdCLElBQUksVUFBVSxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osd0NBQXdDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FDbkUsQ0FBQztnQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVcsQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztZQUNuRSxDQUFDO1lBQ0QsSUFBSSxVQUFVLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUNuRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVcsQ0FBQyxHQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO2dCQUNoRSxDQUFDO2dCQUNELElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzdDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLDhCQUE4QixVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUMzRCxDQUFDO29CQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVyxDQUFDLEdBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7Z0JBQ3hFLENBQUM7Z0JBQ0QsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osOEJBQThCLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQzFELENBQUM7b0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFXLENBQUMsR0FBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztnQkFDdEUsQ0FBQztnQkFDRCxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLGlEQUFpRCxVQUFVLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQ3JGLENBQUM7b0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFXLENBQUMsR0FBSSxDQUFDLGtCQUFrQjt3QkFDN0MsVUFBVSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztnQkFDdEMsQ0FBQztnQkFDRCxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUMvQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixrQ0FBa0MsVUFBVSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FDakUsQ0FBQztvQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVcsQ0FBQyxHQUFJLENBQUMsYUFBYTt3QkFDeEMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7Z0JBQ2pDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUF1QjtRQUNoQyxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQixJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLCtCQUErQixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDbkQsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztvQkFDdEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsTUFBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDaEUsQ0FBQztnQkFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUN0RSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxNQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUNoRSxDQUFDO2dCQUNELElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLG9DQUFvQyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUNuRSxDQUFDO29CQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLE1BQU8sQ0FBQyxhQUFhO3dCQUN4QyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztnQkFDakMsQ0FBQztnQkFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO29CQUNwRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxNQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUM5RCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBdUI7UUFDaEMsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUIsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDekMsQ0FBQztZQUVELElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsOEJBQThCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxPQUFRLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBZTtRQUN6QixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QixJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFDckQsQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFzQjtRQUNqQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2QixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDZCQUE2QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDMUQsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzlELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQXVCO1FBQ2hDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFCLElBQUksT0FBTyxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsK0JBQStCLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxPQUFRLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFDeEUsQ0FBQztZQUVELElBQUksT0FBTyxDQUFDLGlCQUFpQixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixpQ0FBaUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQzdELENBQUM7Z0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsT0FBUSxDQUFDLGlCQUFpQjtvQkFDN0MsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1lBQzlCLENBQUM7WUFFRCxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osaUNBQWlDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUM1RCxDQUFDO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLE9BQVEsQ0FBQyxnQkFBZ0I7b0JBQzVDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztZQUM3QixDQUFDO1lBRUQsSUFBSSxPQUFPLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7Z0JBQ3JFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLE9BQVEsQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUN0RSxDQUFDO1lBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLE9BQVEsQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUNoRSxDQUFDO1lBRUQsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLGlDQUFpQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FDN0QsQ0FBQztnQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxPQUFRLENBQUMsaUJBQWlCO29CQUM3QyxPQUFPLENBQUMsaUJBQWlCLENBQUM7WUFDOUIsQ0FBQztZQUVELElBQUksT0FBTyxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixpQ0FBaUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQzVELENBQUM7Z0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsT0FBUSxDQUFDLGdCQUFnQjtvQkFDNUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQW1CO1FBQzVCLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLElBQUksR0FBRyxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osdUNBQXVDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FDNUQsQ0FBQztnQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsSUFBSSxHQUFHLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixvQ0FBb0MsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUN6RCxDQUFDO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQTJCO1FBQ3RDLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLElBQUksU0FBUyxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osOEJBQThCLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FDekQsQ0FBQztnQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxTQUFVLENBQUMsY0FBYztvQkFDNUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUM3QixDQUFDO1lBQ0QsSUFBSSxTQUFTLENBQUMsaUJBQWlCLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLHNDQUFzQyxTQUFTLENBQUMsaUJBQWlCLEVBQUUsQ0FDcEUsQ0FBQztnQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxTQUFVLENBQUMsaUJBQWlCO29CQUMvQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7WUFDaEMsQ0FBQztZQUNELElBQUksU0FBUyxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxTQUFVLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUM7WUFDMUUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxPQUFnQjtRQUMvQixJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1FBQy9DLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBYTtRQUNuQixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBZTtRQUNwQixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QixJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDBCQUEwQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsR0FBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1lBQ2xELENBQUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDhCQUE4QixHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsR0FBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDO1lBQzFELENBQUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDhCQUE4QixHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFRLENBQUMsR0FBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO1lBQ3hELENBQUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDJCQUEyQixHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLEdBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztZQUNsRCxDQUFDO1lBQ0QsSUFBSSxHQUFHLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLHVDQUF1QyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FDaEUsQ0FBQztnQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVEsQ0FBQyxHQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixDQUFDO1lBQ3hFLENBQUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLGtDQUFrQyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNqRSxDQUFDO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBUSxDQUFDLEdBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQztZQUM5RCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFFBQVEsQ0FBQyxHQUFpQjtRQUN4QixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QixJQUFJLEdBQUcsQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFNLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUM7WUFDdkQsQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztvQkFDbEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFNLENBQUMsR0FBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztnQkFDcEQsQ0FBQztnQkFFRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixvQ0FBb0MsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FDekQsQ0FBQztvQkFDRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQU0sQ0FBQyxHQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO2dCQUMxRCxDQUFDO2dCQUVELElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLG9DQUFvQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUMxRCxDQUFDO29CQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBTSxDQUFDLEdBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7Z0JBQzVELENBQUM7Z0JBRUQsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1oscUNBQXFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNsRSxDQUFDO29CQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBTSxDQUFDLEdBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7Z0JBQ3BELENBQUM7Z0JBRUQsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLGtCQUFrQixLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWiw2Q0FBNkMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUMxRSxDQUFDO29CQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBTSxDQUFDLEdBQUksQ0FBQyxrQkFBa0I7d0JBQ3hDLEdBQUcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7Z0JBQy9CLENBQUM7Z0JBRUQsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDeEMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osNENBQTRDLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDcEUsSUFBSSxDQUNMLEVBQUUsQ0FDSixDQUFDO3dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBTSxDQUFDLEdBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7b0JBQ2hFLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsdUJBQXVCLENBQ3JCLG9CQUFpRDtRQUVqRCxJQUFJLG9CQUFvQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksb0JBQW9CLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDWixvQ0FBb0Msb0JBQW9CLENBQUMsT0FBTyxFQUFFLENBQ25FLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBcUIsQ0FBQyxPQUFPO29CQUN2QyxvQkFBb0IsQ0FBQyxPQUFPLENBQUM7WUFDakMsQ0FBQztZQUVELElBQUksb0JBQW9CLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzFELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNaLG9DQUFvQyxvQkFBb0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUM5RSxDQUFDO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQXFCLENBQUMsa0JBQWtCO29CQUNsRCxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQVksQ0FBQyxTQUEyQjtRQUN0QyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDRCQUE0QixTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFVLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDbkQsQ0FBQztZQUVELElBQUksU0FBUyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsaUNBQWlDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVUsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUJHO0lBQ0gsSUFBSSxDQUFDLEtBQWM7UUFDakIsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXJDLElBQUksQ0FBQyxZQUFFLENBQUMsVUFBVSxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsWUFBRSxDQUFDLFNBQVMsQ0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQUUsS0FBSyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRXZFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDRCQUE0QixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RSxJQUFBLG9CQUFhLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQTFxQkQsZ0VBMHFCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgQWRtaW5Db25maWcsXG4gIEJDQ1NQQ29uZmlnLFxuICBCb290c3RyYXBDb25maWcsXG4gIENoYW5uZWxQYXJ0aWNpcGF0aW9uQ29uZmlnLFxuICBDbHVzdGVyQ29uZmlnLFxuICBDb25zZW5zdXNDb25maWcsXG4gIERlYnVnQ29uZmlnLFxuICBLYWZrYUNvbmZpZyxcbiAgS2VlcEFsaXZlQ29uZmlnLFxuICBNZXRyaWNzQ29uZmlnLFxuICBNU0dTaXplQ29uZmlnLFxuICBNU1BDb25maWcsXG4gIE9wZXJhdGlvbnNDb25maWcsXG4gIE9yZGVyZXJDb25maWcsXG4gIFByb2ZpbGVDb25maWcsXG4gIFRMU0NvbmZpZyxcbn0gZnJvbSBcIi4uL2ludGVyZmFjZXMvZmFicmljL29yZGVyZXItY29uZmlnXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVZYW1sLCB3cml0ZUZpbGVZYW1sIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3lhbWxcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY09yZGVyZXJDb25maWdCdWlsZGVyIHtcbiAgcHJpdmF0ZSBsb2c6IExvZ2dlcjtcblxuICBwcml2YXRlIGNvbmZpZzogT3JkZXJlckNvbmZpZyA9IHJlYWRGaWxlWWFtbChcbiAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uLy4uLy4uL2NvbmZpZy9vcmRlcmVyLnlhbWxcIilcbiAgKSBhcyBPcmRlcmVyQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKGxvZ2dlcj86IExvZ2dlcikge1xuICAgIGlmICghbG9nZ2VyKSB0aGlzLmxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY09yZGVyZXJDb25maWdCdWlsZGVyKTtcbiAgICBlbHNlIHRoaXMubG9nID0gbG9nZ2VyLmZvcihGYWJyaWNPcmRlcmVyQ29uZmlnQnVpbGRlci5uYW1lKTtcbiAgfVxuXG4gIHNldEthZmthKGthZmthPzogS2Fma2FDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoa2Fma2EgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGthZmthLlJldHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGthZmthLlJldHJ5LlNob3J0SW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgS2Fma2EgcmV0cnkgc2hvcnQgaW50ZXJ2YWwgdG8gJHtrYWZrYS5SZXRyeS5TaG9ydEludGVydmFsfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLkthZmthIS5SZXRyeSEuU2hvcnRJbnRlcnZhbCA9IGthZmthLlJldHJ5LlNob3J0SW50ZXJ2YWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGthZmthLlJldHJ5LlNob3J0VG90YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgS2Fma2EgcmV0cnkgc2hvcnQgdG90YWwgdG8gJHtrYWZrYS5SZXRyeS5TaG9ydFRvdGFsfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLkthZmthIS5SZXRyeSEuU2hvcnRUb3RhbCA9IGthZmthLlJldHJ5LlNob3J0VG90YWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGthZmthLlJldHJ5LkxvbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBLYWZrYSByZXRyeSBsb25nIGludGVydmFsIHRvICR7a2Fma2EuUmV0cnkuTG9uZ0ludGVydmFsfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLkthZmthIS5SZXRyeSEuTG9uZ0ludGVydmFsID0ga2Fma2EuUmV0cnkuTG9uZ0ludGVydmFsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrYWZrYS5SZXRyeS5Mb25nVG90YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgS2Fma2EgcmV0cnkgbG9uZyB0b3RhbCB0byAke2thZmthLlJldHJ5LkxvbmdUb3RhbH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5LYWZrYSEuUmV0cnkhLkxvbmdUb3RhbCA9IGthZmthLlJldHJ5LkxvbmdUb3RhbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2Fma2EuUmV0cnkuTmV0d29ya1RpbWVvdXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoa2Fma2EuUmV0cnkuTmV0d29ya1RpbWVvdXRzLkRpYWxUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgICBgU2V0dGluZyBLYWZrYSByZXRyeSBuZXR3b3JrIHRpbWVvdXRzIGRpYWwgdGltZW91dCB0byAke2thZmthLlJldHJ5Lk5ldHdvcmtUaW1lb3V0cy5EaWFsVGltZW91dH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5jb25maWcuS2Fma2EhLlJldHJ5IS5OZXR3b3JrVGltZW91dHMhLkRpYWxUaW1lb3V0ID1cbiAgICAgICAgICAgICAga2Fma2EuUmV0cnkuTmV0d29ya1RpbWVvdXRzLkRpYWxUaW1lb3V0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoa2Fma2EuUmV0cnkuTmV0d29ya1RpbWVvdXRzLlJlYWRUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgICBgU2V0dGluZyBLYWZrYSByZXRyeSBuZXR3b3JrIHRpbWVvdXRzIHJlYWQgdGltZW91dCB0byAke2thZmthLlJldHJ5Lk5ldHdvcmtUaW1lb3V0cy5SZWFkVGltZW91dH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5jb25maWcuS2Fma2EhLlJldHJ5IS5OZXR3b3JrVGltZW91dHMhLlJlYWRUaW1lb3V0ID1cbiAgICAgICAgICAgICAga2Fma2EuUmV0cnkuTmV0d29ya1RpbWVvdXRzLlJlYWRUaW1lb3V0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoa2Fma2EuUmV0cnkuTmV0d29ya1RpbWVvdXRzLldyaXRlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFNldHRpbmcgS2Fma2EgcmV0cnkgbmV0d29yayB0aW1lb3V0cyB3cml0ZSB0aW1lb3V0IHRvICR7a2Fma2EuUmV0cnkuTmV0d29ya1RpbWVvdXRzLldyaXRlVGltZW91dH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5jb25maWcuS2Fma2EhLlJldHJ5IS5OZXR3b3JrVGltZW91dHMhLldyaXRlVGltZW91dCA9XG4gICAgICAgICAgICAgIGthZmthLlJldHJ5Lk5ldHdvcmtUaW1lb3V0cy5Xcml0ZVRpbWVvdXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGthZmthLlJldHJ5Lk1ldGFkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoa2Fma2EuUmV0cnkuTWV0YWRhdGEuUmV0cnlCYWNrb2ZmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgICBgU2V0dGluZyBLYWZrYSByZXRyeSBtZXRhZGF0YSByZXRyeSBiYWNrb2ZmIHRvICR7a2Fma2EuUmV0cnkuTWV0YWRhdGEuUmV0cnlCYWNrb2ZmfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5LYWZrYSEuUmV0cnkhLk1ldGFkYXRhIS5SZXRyeUJhY2tvZmYgPVxuICAgICAgICAgICAgICBrYWZrYS5SZXRyeS5NZXRhZGF0YS5SZXRyeUJhY2tvZmY7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChrYWZrYS5SZXRyeS5NZXRhZGF0YS5SZXRyeU1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFNldHRpbmcgS2Fma2EgcmV0cnkgbWV0YWRhdGEgcmV0cnkgbWF4IHRvICR7a2Fma2EuUmV0cnkuTWV0YWRhdGEuUmV0cnlNYXh9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLkthZmthIS5SZXRyeSEuTWV0YWRhdGEhLlJldHJ5TWF4ID1cbiAgICAgICAgICAgICAga2Fma2EuUmV0cnkuTWV0YWRhdGEuUmV0cnlNYXg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGthZmthLlJldHJ5LlByb2R1Y2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoa2Fma2EuUmV0cnkuUHJvZHVjZXIuUmV0cnlCYWNrb2ZmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgICBgU2V0dGluZyBLYWZrYSByZXRyeSBwcm9kdWNlciByZXRyeSBiYWNrb2ZmIHRvICR7a2Fma2EuUmV0cnkuUHJvZHVjZXIuUmV0cnlCYWNrb2ZmfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5LYWZrYSEuUmV0cnkhLlByb2R1Y2VyIS5SZXRyeUJhY2tvZmYgPVxuICAgICAgICAgICAgICBrYWZrYS5SZXRyeS5Qcm9kdWNlci5SZXRyeUJhY2tvZmY7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChrYWZrYS5SZXRyeS5Qcm9kdWNlci5SZXRyeU1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFNldHRpbmcgS2Fma2EgcmV0cnkgcHJvZHVjZXIgcmV0cnkgbWF4IHRvICR7a2Fma2EuUmV0cnkuUHJvZHVjZXIuUmV0cnlNYXh9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLkthZmthIS5SZXRyeSEuUHJvZHVjZXIhLlJldHJ5TWF4ID1cbiAgICAgICAgICAgICAga2Fma2EuUmV0cnkuUHJvZHVjZXIuUmV0cnlNYXg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGthZmthLlJldHJ5LkNvbnN1bWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoa2Fma2EuUmV0cnkuQ29uc3VtZXIuUmV0cnlCYWNrb2ZmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgICBgU2V0dGluZyBLYWZrYSByZXRyeSBjb25zdW1lciByZXRyeSBiYWNrb2ZmIHRvICR7a2Fma2EuUmV0cnkuQ29uc3VtZXIuUmV0cnlCYWNrb2ZmfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5LYWZrYSEuUmV0cnkhLkNvbnN1bWVyIS5SZXRyeUJhY2tvZmYgPVxuICAgICAgICAgICAgICBrYWZrYS5SZXRyeS5Db25zdW1lci5SZXRyeUJhY2tvZmY7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChrYWZrYS5Ub3BpYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChrYWZrYS5Ub3BpYy5SZXBsaWNhdGlvbkZhY3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBLYWZrYSB0b3BpYyByZXBsaWNhdGlvbiBmYWN0b3IgdG8gJHtrYWZrYS5Ub3BpYy5SZXBsaWNhdGlvbkZhY3Rvcn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5LYWZrYSEuVG9waWMhLlJlcGxpY2F0aW9uRmFjdG9yID1cbiAgICAgICAgICAgIGthZmthLlRvcGljLlJlcGxpY2F0aW9uRmFjdG9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChrYWZrYS5WZXJib3NlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgS2Fma2EgdmVyYm9zZSB0byAke2thZmthLlZlcmJvc2V9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLkthZmthIS5WZXJib3NlID0ga2Fma2EuVmVyYm9zZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGthZmthLlRMUyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChrYWZrYS5UTFMuRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgS2Fma2EgVExTIGVuYWJsZWQgdG8gJHtrYWZrYS5UTFMuRW5hYmxlZH1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5LYWZrYSEuVExTIS5FbmFibGVkID0ga2Fma2EuVExTLkVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGthZmthLlRMUy5DZXJ0aWZpY2F0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBLYWZrYSBUTFMgY2VydGlmaWNhdGUgdG8gJHtrYWZrYS5UTFMuQ2VydGlmaWNhdGV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcuS2Fma2EhLlRMUyEuQ2VydGlmaWNhdGUgPSBrYWZrYS5UTFMuQ2VydGlmaWNhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2Fma2EuVExTLlByaXZhdGVLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgS2Fma2EgVExTIHByaXZhdGUga2V5IHRvICR7a2Fma2EuVExTLlByaXZhdGVLZXl9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcuS2Fma2EhLlRMUyEuUHJpdmF0ZUtleSA9IGthZmthLlRMUy5Qcml2YXRlS2V5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGthZmthLlRMUy5Sb290Q0FzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBLYWZrYSBUTFMgcm9vdCBDQXMgdG8gJHtrYWZrYS5UTFMuUm9vdENBc31gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5LYWZrYSEuVExTIS5Sb290Q0FzID0ga2Fma2EuVExTLlJvb3RDQXM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGthZmthLlZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBLYWZrYSB2ZXJzaW9uIHRvICR7a2Fma2EuVmVyc2lvbn1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuS2Fma2EhLlZlcnNpb24gPSBrYWZrYS5WZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2Fma2EuU0FTTFBsYWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGthZmthLlNBU0xQbGFpbi5FbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIEthZmthIFNBU0wgcGxhaW4gZW5hYmxlZCB0byAke2thZmthLlNBU0xQbGFpbi5FbmFibGVkfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLkthZmthIS5TQVNMUGxhaW4hLkVuYWJsZWQgPSBrYWZrYS5TQVNMUGxhaW4uRW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2Fma2EuU0FTTFBsYWluLlVzZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgS2Fma2EgU0FTTCBwbGFpbiB1c2VyIHRvICR7a2Fma2EuU0FTTFBsYWluLlVzZXJ9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcuS2Fma2EhLlNBU0xQbGFpbiEuVXNlciA9IGthZmthLlNBU0xQbGFpbi5Vc2VyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrYWZrYS5TQVNMUGxhaW4uUGFzc3dvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgS2Fma2EgU0FTTCBwbGFpbiBwYXNzd29yZCB0byAke2thZmthLlNBU0xQbGFpbi5QYXNzd29yZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5LYWZrYSEuU0FTTFBsYWluIS5QYXNzd29yZCA9IGthZmthLlNBU0xQbGFpbi5QYXNzd29yZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEZpbGVMZWRnZXJMb2NhdGlvbihmaWxlTGVkZ2VyTG9jYXRpb24/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoZmlsZUxlZGdlckxvY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGZpbGUgbGVkZ2VyIGxvY2F0aW9uIHRvICR7ZmlsZUxlZGdlckxvY2F0aW9ufWApO1xuICAgICAgdGhpcy5jb25maWcuRmlsZUxlZGdlciEuTG9jYXRpb24gPSBmaWxlTGVkZ2VyTG9jYXRpb247XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXV0aFdpbmRvdyhhdXRoV2luZG93Pzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGF1dGhXaW5kb3cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgYXV0aCB3aW5kb3cgdG8gJHthdXRoV2luZG93fWApO1xuICAgICAgdGhpcy5jb25maWcuR2VuZXJhbCEuQXV0aGVudGljYXRpb24hLlRpbWVXaW5kb3cgPSBhdXRoV2luZG93O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEJDQ1NQKGJjY3NwPzogQkNDU1BDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoYmNjc3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGJjY3NwLkRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBCQ0NTUCBkZWZhdWx0IHRvICR7YmNjc3AuRGVmYXVsdH1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuR2VuZXJhbCEuQkNDU1AhLkRlZmF1bHQgPSBiY2NzcC5EZWZhdWx0O1xuICAgICAgfVxuICAgICAgaWYgKGJjY3NwLlNXICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGJjY3NwLlNXLkhhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIEJDQ1NQIFNXIGhhc2ggdG8gJHtiY2NzcC5TVy5IYXNofWApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLkdlbmVyYWwhLkJDQ1NQIS5TVyEuSGFzaCA9IGJjY3NwLlNXLkhhc2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJjY3NwLlNXLlNlY3VyaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBCQ0NTUCBTVyBzZWN1cml0eSB0byAke2JjY3NwLlNXLlNlY3VyaXR5fWApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLkdlbmVyYWwhLkJDQ1NQIS5TVyEuU2VjdXJpdHkgPSBiY2NzcC5TVy5TZWN1cml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmNjc3AuU1cuRmlsZUtleVN0b3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoYmNjc3AuU1cuRmlsZUtleVN0b3JlLktleVN0b3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgICBgU2V0dGluZyBCQ0NTUCBTVyBGaWxlS2V5U3RvcmUga2V5IHN0b3JlIHRvICR7YmNjc3AuU1cuRmlsZUtleVN0b3JlLktleVN0b3JlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5CQ0NTUCEuU1chLkZpbGVLZXlTdG9yZSEuS2V5U3RvcmUgPVxuICAgICAgICAgICAgICBiY2NzcC5TVy5GaWxlS2V5U3RvcmUuS2V5U3RvcmU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChiY2NzcC5QS0NTMTEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYmNjc3AuUEtDUzExLkxpYnJhcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgQkNDU1AgUEtDUzExIGxpYnJhcnkgdG8gJHtiY2NzcC5QS0NTMTEuTGlicmFyeX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5CQ0NTUCEuUEtDUzExIS5MaWJyYXJ5ID0gYmNjc3AuUEtDUzExLkxpYnJhcnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJjY3NwLlBLQ1MxMS5MYWJlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQkNDU1AgUEtDUzExIGxhYmVsIHRvICR7YmNjc3AuUEtDUzExLkxhYmVsfWApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLkdlbmVyYWwhLkJDQ1NQIS5QS0NTMTEhLkxhYmVsID0gYmNjc3AuUEtDUzExLkxhYmVsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiY2NzcC5QS0NTMTEuUGluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBCQ0NTUCBQS0NTMTEgcGluIHRvICR7YmNjc3AuUEtDUzExLlBpbn1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5CQ0NTUCEuUEtDUzExIS5QaW4gPSBiY2NzcC5QS0NTMTEuUGluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiY2NzcC5QS0NTMTEuSGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgQkNDU1AgUEtDUzExIGhhc2ggdG8gJHtiY2NzcC5QS0NTMTEuSGFzaH1gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5CQ0NTUCEuUEtDUzExIS5IYXNoID0gYmNjc3AuUEtDUzExLkhhc2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJjY3NwLlBLQ1MxMS5TZWN1cml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBCQ0NTUCBQS0NTMTEgc2VjdXJpdHkgdG8gJHtiY2NzcC5QS0NTMTEuU2VjdXJpdHl9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcuR2VuZXJhbCEuQkNDU1AhLlBLQ1MxMSEuU2VjdXJpdHkgPSBiY2NzcC5QS0NTMTEuU2VjdXJpdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJjY3NwLlBLQ1MxMS5GaWxlS2V5U3RvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChiY2NzcC5QS0NTMTEuRmlsZUtleVN0b3JlLktleVN0b3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgICBgU2V0dGluZyBCQ0NTUCBQS0NTMTEgRmlsZUtleVN0b3JlIGtleSBzdG9yZSB0byAke2JjY3NwLlBLQ1MxMS5GaWxlS2V5U3RvcmUuS2V5U3RvcmV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLkdlbmVyYWwhLkJDQ1NQIS5QS0NTMTEhLkZpbGVLZXlTdG9yZSEuS2V5U3RvcmUgPVxuICAgICAgICAgICAgICBiY2NzcC5QS0NTMTEuRmlsZUtleVN0b3JlLktleVN0b3JlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGVidWcoZGVidWc/OiBEZWJ1Z0NvbmZpZyk6IHRoaXMge1xuICAgIGlmIChkZWJ1ZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZGVidWcuQnJvYWRjYXN0VHJhY2VEaXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBkZWJ1ZyBicm9hZGNhc3QgdHJhY2UgZGlyZWN0b3J5IHRvICR7ZGVidWcuQnJvYWRjYXN0VHJhY2VEaXJ9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5EZWJ1ZyEuQnJvYWRjYXN0VHJhY2VEaXIgPSBkZWJ1Zy5Ccm9hZGNhc3RUcmFjZURpcjtcbiAgICAgIH1cbiAgICAgIGlmIChkZWJ1Zy5EZWxpdmVyVHJhY2VEaXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBkZWJ1ZyBkZWxpdmVyIHRyYWNlIGRpcmVjdG9yeSB0byAke2RlYnVnLkRlbGl2ZXJUcmFjZURpcn1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLkRlYnVnIS5EZWxpdmVyVHJhY2VEaXIgPSBkZWJ1Zy5EZWxpdmVyVHJhY2VEaXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3BlcmF0aW9ucyhvcGVyYXRpb25zPzogT3BlcmF0aW9uc0NvbmZpZyk6IHRoaXMge1xuICAgIGlmIChvcGVyYXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChvcGVyYXRpb25zLkxpc3RlbkFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBvcGVyYXRpb25zIGxpc3RlbiBhZGRyZXNzIHRvICR7b3BlcmF0aW9ucy5MaXN0ZW5BZGRyZXNzfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcuT3BlcmF0aW9ucyEuTGlzdGVuQWRkcmVzcyA9IG9wZXJhdGlvbnMuTGlzdGVuQWRkcmVzcztcbiAgICAgIH1cbiAgICAgIGlmIChvcGVyYXRpb25zLlRMUyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChvcGVyYXRpb25zLlRMUy5FbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgZW5hYmxlZCB0byAke29wZXJhdGlvbnMuVExTLkVuYWJsZWR9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcuT3BlcmF0aW9ucyEuVExTIS5FbmFibGVkID0gb3BlcmF0aW9ucy5UTFMuRW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BlcmF0aW9ucy5UTFMuQ2VydGlmaWNhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgVExTIGNlcnRpZmljYXRlIHRvICR7b3BlcmF0aW9ucy5UTFMuQ2VydGlmaWNhdGV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcuT3BlcmF0aW9ucyEuVExTIS5DZXJ0aWZpY2F0ZSA9IG9wZXJhdGlvbnMuVExTLkNlcnRpZmljYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcGVyYXRpb25zLlRMUy5Qcml2YXRlS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIFRMUyBwcml2YXRlIGtleSB0byAke29wZXJhdGlvbnMuVExTLlByaXZhdGVLZXl9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcuT3BlcmF0aW9ucyEuVExTIS5Qcml2YXRlS2V5ID0gb3BlcmF0aW9ucy5UTFMuUHJpdmF0ZUtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3BlcmF0aW9ucy5UTFMuQ2xpZW50QXV0aFJlcXVpcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIFRMUyBjbGllbnQgYXV0aGVudGljYXRpb24gcmVxdWlyZWQgdG8gJHtvcGVyYXRpb25zLlRMUy5DbGllbnRBdXRoUmVxdWlyZWR9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcuT3BlcmF0aW9ucyEuVExTIS5DbGllbnRBdXRoUmVxdWlyZWQgPVxuICAgICAgICAgICAgb3BlcmF0aW9ucy5UTFMuQ2xpZW50QXV0aFJlcXVpcmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcGVyYXRpb25zLlRMUy5DbGllbnRSb290Q0FzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIFRMUyBjbGllbnQgcm9vdCBDQXMgdG8gJHtvcGVyYXRpb25zLlRMUy5DbGllbnRSb290Q0FzfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLk9wZXJhdGlvbnMhLlRMUyEuQ2xpZW50Um9vdENBcyA9XG4gICAgICAgICAgICBvcGVyYXRpb25zLlRMUy5DbGllbnRSb290Q0FzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRNZXRyaWNzKG1ldHJpY3M/OiBNZXRyaWNzQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKG1ldHJpY3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG1ldHJpY3MuUHJvdmlkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBtZXRyaWNzIHByb3ZpZGVyIHRvICR7bWV0cmljcy5Qcm92aWRlcn1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuTWV0cmljcyEuUHJvdmlkZXIgPSBtZXRyaWNzLlByb3ZpZGVyO1xuICAgICAgfVxuICAgICAgaWYgKG1ldHJpY3MuU3RhdHNkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG1ldHJpY3MuU3RhdHNkLk5ldHdvcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHN0YXRzZCBuZXR3b3JrIHRvICR7bWV0cmljcy5TdGF0c2QuTmV0d29ya31gKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5NZXRyaWNzIS5TdGF0c2QhLk5ldHdvcmsgPSBtZXRyaWNzLlN0YXRzZC5OZXR3b3JrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRyaWNzLlN0YXRzZC5BZGRyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBzdGF0c2QgYWRkcmVzcyB0byAke21ldHJpY3MuU3RhdHNkLkFkZHJlc3N9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcuTWV0cmljcyEuU3RhdHNkIS5BZGRyZXNzID0gbWV0cmljcy5TdGF0c2QuQWRkcmVzcztcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0cmljcy5TdGF0c2QuV3JpdGVJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgICBgU2V0dGluZyBzdGF0c2Qgd3JpdGUgaW50ZXJ2YWwgdG8gJHttZXRyaWNzLlN0YXRzZC5Xcml0ZUludGVydmFsfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLk1ldHJpY3MhLlN0YXRzZCEuV3JpdGVJbnRlcnZhbCA9XG4gICAgICAgICAgICBtZXRyaWNzLlN0YXRzZC5Xcml0ZUludGVydmFsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRyaWNzLlN0YXRzZC5QcmVmaXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHN0YXRzZCBwcmVmaXggdG8gJHttZXRyaWNzLlN0YXRzZC5QcmVmaXh9YCk7XG4gICAgICAgICAgdGhpcy5jb25maWcuTWV0cmljcyEuU3RhdHNkIS5QcmVmaXggPSBtZXRyaWNzLlN0YXRzZC5QcmVmaXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRQcm9maWxlKHByb2ZpbGU/OiBQcm9maWxlQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKHByb2ZpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHByb2ZpbGUuRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHByb2ZpbGUgdG8gJHtwcm9maWxlLkVuYWJsZWR9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLkdlbmVyYWwhLlByb2ZpbGUgPSBwcm9maWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvZmlsZS5BZGRyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcHJvZmlsZSBhZGRyZXNzIHRvICR7cHJvZmlsZS5BZGRyZXNzfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5Qcm9maWxlIS5BZGRyZXNzID0gcHJvZmlsZS5BZGRyZXNzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TG9jYWxNU1AobXNwPzogTVNQQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKG1zcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAobXNwLkxvY2FsTVNQRGlyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgbG9jYWwgTVNQIGRpcmVjdG9yeSB0byAke21zcC5Mb2NhbE1TUERpcn1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuR2VuZXJhbCEuTG9jYWxNU1BEaXIgPSBtc3AuTG9jYWxNU1BEaXI7XG4gICAgICB9XG4gICAgICBpZiAobXNwLkxvY2FsTVNQSUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBsb2NhbCBNU1AgSUQgdG8gJHttc3AuTG9jYWxNU1BJRH1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuR2VuZXJhbCEuTG9jYWxNU1BJRCA9IG1zcC5Mb2NhbE1TUElEO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEJvb3RzdHJhcChib290PzogQm9vdHN0cmFwQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKGJvb3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGJvb3QuQm9vdHN0cmFwRmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGJvb3RzdHJhcCBmaWxlIHRvICR7Ym9vdC5Cb290c3RyYXBGaWxlfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5Cb290c3RyYXBGaWxlID0gYm9vdC5Cb290c3RyYXBGaWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYm9vdC5Cb290c3RyYXBNZXRob2QpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgYm9vdHN0cmFwIG1ldGhvZCB0byAke2Jvb3QuQm9vdHN0cmFwTWV0aG9kfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5Cb290c3RyYXBNZXRob2QgPSBib290LkJvb3RzdHJhcE1ldGhvZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENsdXN0ZXIoY2x1c3Rlcj86IENsdXN0ZXJDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoY2x1c3RlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY2x1c3Rlci5TZW5kQnVmZmVyU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHNlbmQgYnVmZmVyIHNpemUgdG8gJHtjbHVzdGVyLlNlbmRCdWZmZXJTaXplfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5DbHVzdGVyIS5TZW5kQnVmZmVyU2l6ZSA9IGNsdXN0ZXIuU2VuZEJ1ZmZlclNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjbHVzdGVyLkNsaWVudENlcnRpZmljYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgY2xpZW50IGNlcnRpZmljYXRlIHRvICR7Y2x1c3Rlci5DbGllbnRDZXJ0aWZpY2F0ZX1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLkdlbmVyYWwhLkNsdXN0ZXIhLkNsaWVudENlcnRpZmljYXRlID1cbiAgICAgICAgICBjbHVzdGVyLkNsaWVudENlcnRpZmljYXRlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2x1c3Rlci5DbGllbnRQcml2YXRlS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgY2xpZW50IHByaXZhdGUga2V5IHRvICR7Y2x1c3Rlci5DbGllbnRQcml2YXRlS2V5fWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcuR2VuZXJhbCEuQ2x1c3RlciEuQ2xpZW50UHJpdmF0ZUtleSA9XG4gICAgICAgICAgY2x1c3Rlci5DbGllbnRQcml2YXRlS2V5O1xuICAgICAgfVxuXG4gICAgICBpZiAoY2x1c3Rlci5MaXN0ZW5BZGRyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgbGlzdGVuIGFkZHJlc3MgdG8gJHtjbHVzdGVyLkxpc3RlbkFkZHJlc3N9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLkdlbmVyYWwhLkNsdXN0ZXIhLkxpc3RlbkFkZHJlc3MgPSBjbHVzdGVyLkxpc3RlbkFkZHJlc3M7XG4gICAgICB9XG5cbiAgICAgIGlmIChjbHVzdGVyLkxpc3RlblBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBsaXN0ZW4gcG9ydCB0byAke2NsdXN0ZXIuTGlzdGVuUG9ydH1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuR2VuZXJhbCEuQ2x1c3RlciEuTGlzdGVuUG9ydCA9IGNsdXN0ZXIuTGlzdGVuUG9ydDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNsdXN0ZXIuU2VydmVyQ2VydGlmaWNhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBzZXJ2ZXIgY2VydGlmaWNhdGUgdG8gJHtjbHVzdGVyLlNlcnZlckNlcnRpZmljYXRlfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcuR2VuZXJhbCEuQ2x1c3RlciEuU2VydmVyQ2VydGlmaWNhdGUgPVxuICAgICAgICAgIGNsdXN0ZXIuU2VydmVyQ2VydGlmaWNhdGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjbHVzdGVyLlNlcnZlclByaXZhdGVLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBzZXJ2ZXIgcHJpdmF0ZSBrZXkgdG8gJHtjbHVzdGVyLlNlcnZlclByaXZhdGVLZXl9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5DbHVzdGVyIS5TZXJ2ZXJQcml2YXRlS2V5ID1cbiAgICAgICAgICBjbHVzdGVyLlNlcnZlclByaXZhdGVLZXk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRNU0dTaXplKGNmZz86IE1TR1NpemVDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoY2ZnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjZmcuTWF4UmVjdk1zZ1NpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBtYXggcmVjZWl2ZSBtZXNzYWdlIHNpemUgdG8gJHtjZmcuTWF4UmVjdk1zZ1NpemV9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5NYXhSZWN2TXNnU2l6ZSA9IGNmZy5NYXhSZWN2TXNnU2l6ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjZmcuTWF4U2VuZE1zZ1NpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBtYXggc2VuZCBtZXNzYWdlIHNpemUgdG8gJHtjZmcuTWF4U2VuZE1zZ1NpemV9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5NYXhTZW5kTXNnU2l6ZSA9IGNmZy5NYXhTZW5kTXNnU2l6ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEtlZXBBbGl2ZShrZWVwQWxpdmU/OiBLZWVwQWxpdmVDb25maWcpOiB0aGlzIHtcbiAgICBpZiAoa2VlcEFsaXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChrZWVwQWxpdmUuU2VydmVySW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBzZXJ2ZXIgaW50ZXJ2YWwgdG8gJHtrZWVwQWxpdmUuU2VydmVySW50ZXJ2YWx9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5LZWVwYWxpdmUhLlNlcnZlckludGVydmFsID1cbiAgICAgICAgICBrZWVwQWxpdmUuU2VydmVySW50ZXJ2YWw7XG4gICAgICB9XG4gICAgICBpZiAoa2VlcEFsaXZlLlNlcnZlck1pbkludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgICAgYFNldHRpbmcgc2VydmVyIG1pbmltdW0gaW50ZXJ2YWwgdG8gJHtrZWVwQWxpdmUuU2VydmVyTWluSW50ZXJ2YWx9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5LZWVwYWxpdmUhLlNlcnZlck1pbkludGVydmFsID1cbiAgICAgICAgICBrZWVwQWxpdmUuU2VydmVyTWluSW50ZXJ2YWw7XG4gICAgICB9XG4gICAgICBpZiAoa2VlcEFsaXZlLlNlcnZlclRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBzZXJ2ZXIgdGltZW91dCB0byAke2tlZXBBbGl2ZS5TZXJ2ZXJUaW1lb3V0fWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5LZWVwYWxpdmUhLlNlcnZlclRpbWVvdXQgPSBrZWVwQWxpdmUuU2VydmVyVGltZW91dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExpc3RlbkFkZHJlc3MoYWRkcmVzcz86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChhZGRyZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGxpc3RlbiBhZGRyZXNzIHRvICR7YWRkcmVzc31gKTtcbiAgICAgIHRoaXMuY29uZmlnLkdlbmVyYWwhLkxpc3RlbkFkZHJlc3MgPSBhZGRyZXNzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0UG9ydChwb3J0PzogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKHBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcG9ydCB0byAke3BvcnR9YCk7XG4gICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5MaXN0ZW5Qb3J0ID0gcG9ydDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFRMUyh0bHM/OiBUTFNDb25maWcpOiB0aGlzIHtcbiAgICBpZiAodGxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0bHMuRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBlbmFibGVkIHRvICR7dGxzLkVuYWJsZWR9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLkdlbmVyYWwhLlRMUyEuRW5hYmxlZCA9IHRscy5FbmFibGVkO1xuICAgICAgfVxuICAgICAgaWYgKHRscy5DZXJ0aWZpY2F0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBjZXJ0aWZpY2F0ZSB0byAke3Rscy5DZXJ0aWZpY2F0ZX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuR2VuZXJhbCEuVExTIS5DZXJ0aWZpY2F0ZSA9IHRscy5DZXJ0aWZpY2F0ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0bHMuUHJpdmF0ZUtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyBwcml2YXRlIGtleSB0byAke3Rscy5Qcml2YXRlS2V5fWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5UTFMhLlByaXZhdGVLZXkgPSB0bHMuUHJpdmF0ZUtleTtcbiAgICAgIH1cbiAgICAgIGlmICh0bHMuUm9vdENBcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFRMUyByb290IENBcyB0byAke3Rscy5Sb290Q0FzLmpvaW4oXCIsIFwiKX1gKTtcbiAgICAgICAgdGhpcy5jb25maWcuR2VuZXJhbCEuVExTIS5Sb290Q0FzID0gdGxzLlJvb3RDQXM7XG4gICAgICB9XG4gICAgICBpZiAodGxzLkNsaWVudEF1dGhSZXF1aXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIFRMUyBjbGllbnQgYXV0aCByZXF1aXJlZCB0byAke3Rscy5DbGllbnRBdXRoUmVxdWlyZWR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5HZW5lcmFsIS5UTFMhLkNsaWVudEF1dGhSZXF1aXJlZCA9IHRscy5DbGllbnRBdXRoUmVxdWlyZWQ7XG4gICAgICB9XG4gICAgICBpZiAodGxzLkNsaWVudFJvb3RDQXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICBgU2V0dGluZyBUTFMgY2xpZW50IHJvb3QgQ0FzIHRvICR7dGxzLkNsaWVudFJvb3RDQXMuam9pbihcIiwgXCIpfWBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25maWcuR2VuZXJhbCEuVExTIS5DbGllbnRSb290Q0FzID0gdGxzLkNsaWVudFJvb3RDQXM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QWRtaW4oY2ZnPzogQWRtaW5Db25maWcpOiB0aGlzIHtcbiAgICBpZiAoY2ZnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjZmcuTGlzdGVuQWRkcmVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGFkbWluIGxpc3RlbiBhZGRyZXNzIHRvICR7Y2ZnLkxpc3RlbkFkZHJlc3N9YCk7XG4gICAgICAgIHRoaXMuY29uZmlnLkFkbWluIS5MaXN0ZW5BZGRyZXNzID0gY2ZnLkxpc3RlbkFkZHJlc3M7XG4gICAgICB9XG4gICAgICBpZiAoY2ZnLlRMUyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChjZmcuVExTLkVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGFkbWluIFRMUyBlbmFibGVkIHRvICR7Y2ZnLlRMUy5FbmFibGVkfWApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLkFkbWluIS5UTFMhLkVuYWJsZWQgPSBjZmcuVExTLkVuYWJsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2ZnLlRMUy5Qcml2YXRlS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIGFkbWluIFRMUyBwcml2YXRlIGtleSB0byAke2NmZy5UTFMuUHJpdmF0ZUtleX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5BZG1pbiEuVExTIS5Qcml2YXRlS2V5ID0gY2ZnLlRMUy5Qcml2YXRlS2V5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNmZy5UTFMuQ2VydGlmaWNhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgYWRtaW4gVExTIGNlcnRpZmljYXRlIHRvICR7Y2ZnLlRMUy5DZXJ0aWZpY2F0ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5BZG1pbiEuVExTIS5DZXJ0aWZpY2F0ZSA9IGNmZy5UTFMuQ2VydGlmaWNhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2ZnLlRMUy5Sb290Q0FzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgIGBTZXR0aW5nIGFkbWluIFRMUyByb290IENBcyBmaWxlczogJHtjZmcuVExTLlJvb3RDQXMuam9pbihcIiwgXCIpfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29uZmlnLkFkbWluIS5UTFMhLlJvb3RDQXMgPSBjZmcuVExTLlJvb3RDQXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2ZnLlRMUy5DbGllbnRBdXRoUmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgICAgYFNldHRpbmcgYWRtaW4gVExTIGNsaWVudCBhdXRoIHJlcXVpcmVkIHRvICR7Y2ZnLlRMUy5DbGllbnRBdXRoUmVxdWlyZWR9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb25maWcuQWRtaW4hLlRMUyEuQ2xpZW50QXV0aFJlcXVpcmVkID1cbiAgICAgICAgICAgIGNmZy5UTFMuQ2xpZW50QXV0aFJlcXVpcmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNmZy5UTFMuQ2xpZW50Um9vdENBcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNmZy5UTFMuQ2xpZW50Um9vdENBcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFNldHRpbmcgYWRtaW4gVExTIGNsaWVudCByb290IENBcyBmaWxlczogJHtjZmcuVExTLkNsaWVudFJvb3RDQXMuam9pbihcbiAgICAgICAgICAgICAgICBcIiwgXCJcbiAgICAgICAgICAgICAgKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5jb25maWcuQWRtaW4hLlRMUyEuQ2xpZW50Um9vdENBcyA9IGNmZy5UTFMuQ2xpZW50Um9vdENBcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDaGFubmVsUGFydGljaXBhdGlvbihcbiAgICBjaGFubmVsUGFydGljaXBhdGlvbj86IENoYW5uZWxQYXJ0aWNpcGF0aW9uQ29uZmlnXG4gICk6IHRoaXMge1xuICAgIGlmIChjaGFubmVsUGFydGljaXBhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY2hhbm5lbFBhcnRpY2lwYXRpb24uRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIGNoYW5uZWwgcGFydGljaXBhdGlvbiB0byAke2NoYW5uZWxQYXJ0aWNpcGF0aW9uLkVuYWJsZWR9YFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNvbmZpZy5DaGFubmVsUGFydGljaXBhdGlvbiEuRW5hYmxlZCA9XG4gICAgICAgICAgY2hhbm5lbFBhcnRpY2lwYXRpb24uRW5hYmxlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5uZWxQYXJ0aWNpcGF0aW9uLk1heFJlcXVlc3RCb2R5U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKFxuICAgICAgICAgIGBTZXR0aW5nIG1heCByZXF1ZXN0IGJvZHkgc2l6ZSB0byAke2NoYW5uZWxQYXJ0aWNpcGF0aW9uLk1heFJlcXVlc3RCb2R5U2l6ZX1gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29uZmlnLkNoYW5uZWxQYXJ0aWNpcGF0aW9uIS5NYXhSZXF1ZXN0Qm9keVNpemUgPVxuICAgICAgICAgIGNoYW5uZWxQYXJ0aWNpcGF0aW9uLk1heFJlcXVlc3RCb2R5U2l6ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDb25zZW5zdXMoY29uc2Vuc3VzPzogQ29uc2Vuc3VzQ29uZmlnKTogdGhpcyB7XG4gICAgaWYgKGNvbnNlbnN1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29uc2Vuc3VzLldBTERpciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIFdBTCBkaXJlY3RvcnkgdG8gJHtjb25zZW5zdXMuV0FMRGlyfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5Db25zZW5zdXMhLldBTERpciA9IGNvbnNlbnN1cy5XQUxEaXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25zZW5zdXMuU25hcERpciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIHNuYXBzaG90IGRpcmVjdG9yeSB0byAke2NvbnNlbnN1cy5TbmFwRGlyfWApO1xuICAgICAgICB0aGlzLmNvbmZpZy5Db25zZW5zdXMhLlNuYXBEaXIgPSBjb25zZW5zdXMuU25hcERpcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNhdmVzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gYSBmaWxlLlxuICAgKiBAc3VtbWFyeSBXcml0ZXMgdGhlIGN1cnJlbnQgRmFicmljIENBIFNlcnZlciBjb25maWd1cmF0aW9uIHRvIGEgWUFNTCBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gSWYgdGhlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjcGF0aCAtIFRoZSBwYXRoIHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgc2hvdWxkIGJlIHNhdmVkLlxuICAgKiBAcmV0dXJuIHt0aGlzfSBUaGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgYnVpbGRlciBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBidWlsZGVyID0gbmV3IEZhYnJpY0NBU2VydmVyQ29tbWFuZEJ1aWxkZXIoKTtcbiAgICogYnVpbGRlci5zYXZlKCcvcGF0aC90by9jb25maWcvZmFicmljLWNhLXNlcnZlci55YW1sJyk7XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IEJ1aWxkZXIgYXMgRmFicmljQ0FTZXJ2ZXJDb21tYW5kQnVpbGRlclxuICAgKiAgIHBhcnRpY2lwYW50IEZpbGVTeXN0ZW0gYXMgRmlsZSBTeXN0ZW1cbiAgICogICBDbGllbnQtPj5CdWlsZGVyOiBzYXZlQ29uZmlnKCcvcGF0aC90by9jb25maWcvZmFicmljLWNhLXNlcnZlci55YW1sJylcbiAgICogICBCdWlsZGVyLT4+QnVpbGRlcjogQ2hlY2sgaWYgY3BhdGggaXMgZGVmaW5lZFxuICAgKiAgIGFsdCBjcGF0aCBpcyBkZWZpbmVkXG4gICAqICAgICBCdWlsZGVyLT4+RmlsZVN5c3RlbTogQ2hlY2sgaWYgZGlyZWN0b3J5IGV4aXN0c1xuICAgKiAgICAgYWx0IERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICAgIEJ1aWxkZXItPj5GaWxlU3lzdGVtOiBDcmVhdGUgZGlyZWN0b3J5XG4gICAqICAgICBlbmRcbiAgICogICAgIEJ1aWxkZXItPj5CdWlsZGVyOiBMb2cgZGVidWcgbWVzc2FnZVxuICAgKiAgICAgQnVpbGRlci0+PkZpbGVTeXN0ZW06IFdyaXRlIFlBTUwgY29uZmlndXJhdGlvbiB0byBmaWxlXG4gICAqICAgZW5kXG4gICAqICAgQnVpbGRlci0tPj5DbGllbnQ6IFJldHVybiB0aGlzXG4gICAqL1xuICBzYXZlKGNwYXRoPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNwYXRoID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjcGF0aCkpKVxuICAgICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihjcGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgaWYgKCFjcGF0aC5lbmRzV2l0aChcIi55YW1sXCIpKSBjcGF0aCA9IHBhdGguam9pbihjcGF0aCwgXCJvcmRlcmVyLnlhbWxcIik7XG5cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgV3JpdGluZyBjb25maWd1cmF0aW9uIHRvICR7Y3BhdGh9YCk7XG4gICAgdGhpcy5sb2cuZGVidWcoYENvbmZpZyBmaWxlOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29uZmlnLCBudWxsLCAyKX1gKTtcbiAgICB3cml0ZUZpbGVZYW1sKGNwYXRoLCB0aGlzLmNvbmZpZyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIl19