//----------------------
// <auto-generated>
//     Generated using the NSwag toolchain v13.15.10.0 (NJsonSchema v10.6.10.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org)
// </auto-generated>
//----------------------

/* tslint:disable */
/* eslint-disable */
// ReSharper disable InconsistentNaming

export module SessionManagerClient {

export class Client {
    private http: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> };
    private baseUrl: string;
    protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;

    constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> }) {
        this.http = http ? http : window as any;
        this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : "http://localhost:20116";
    }

    /**
     * Get all created images
     */
    getImages(): Promise<Image[]> {
        let url_ = this.baseUrl + "/images";
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetImages(_response);
        });
    }

    protected processGetImages(response: Response): Promise<Image[]> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            if (Array.isArray(resultData200)) {
                result200 = [] as any;
                for (let item of resultData200)
                    result200!.push(Image.fromJS(item));
            }
            else {
                result200 = <any>null;
            }
            return result200;
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<Image[]>(null as any);
    }

    /**
     * DEPRECATED. Use /images/create (ResolveImage) instead
     * @deprecated
     */
    createImage(imageParts: string[]): Promise<Image> {
        let url_ = this.baseUrl + "/images";
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(imageParts);

        let options_: RequestInit = {
            body: content_,
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processCreateImage(_response);
        });
    }

    protected processCreateImage(response: Response): Promise<Image> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = Image.fromJS(resultData200);
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<Image>(null as any);
    }

    /**
     * Get the created image with specified ID
     */
    getImage(imageId: string | null): Promise<Image> {
        let url_ = this.baseUrl + "/images/{imageId}";
        if (imageId === undefined || imageId === null)
            throw new Error("The parameter 'imageId' must be defined.");
        url_ = url_.replace("{imageId}", encodeURIComponent("" + imageId));
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetImage(_response);
        });
    }

    protected processGetImage(response: Response): Promise<Image> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = Image.fromJS(resultData200);
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<Image>(null as any);
    }

    /**
     * Create a OpenTAP package configuration image from a list image inputs consisting of user specified packages and repositories
     */
    resolveImage(images: Image[]): Promise<Image> {
        let url_ = this.baseUrl + "/images/create";
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(images);

        let options_: RequestInit = {
            body: content_,
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processResolveImage(_response);
        });
    }

    protected processResolveImage(response: Response): Promise<Image> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = Image.fromJS(resultData200);
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ImageResolveErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<Image>(null as any);
    }

    /**
     * Shut down a session
     */
    shutdownSession(sessionId: string): Promise<void> {
        let url_ = this.baseUrl + "/sessions/{sessionId}";
        if (sessionId === undefined || sessionId === null)
            throw new Error("The parameter 'sessionId' must be defined.");
        url_ = url_.replace("{sessionId}", encodeURIComponent("" + sessionId));
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "DELETE",
            headers: {
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processShutdownSession(_response);
        });
    }

    protected processShutdownSession(response: Response): Promise<void> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            return;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<void>(null as any);
    }

    /**
     * Start a session
     */
    startSession(): Promise<Session> {
        let url_ = this.baseUrl + "/sessions";
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "POST",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processStartSession(_response);
        });
    }

    protected processStartSession(response: Response): Promise<Session> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = Session.fromJS(resultData200);
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<Session>(null as any);
    }

    /**
     * Retrives the already running sessions
     */
    getSessions(): Promise<Session[]> {
        let url_ = this.baseUrl + "/sessions";
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetSessions(_response);
        });
    }

    protected processGetSessions(response: Response): Promise<Session[]> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            if (Array.isArray(resultData200)) {
                result200 = [] as any;
                for (let item of resultData200)
                    result200!.push(Session.fromJS(item));
            }
            else {
                result200 = <any>null;
            }
            return result200;
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<Session[]>(null as any);
    }

    /**
     * Start a session based on an image
     */
    startImageSession(imageId: string | null): Promise<Session> {
        let url_ = this.baseUrl + "/sessions/{imageId}";
        if (imageId === undefined || imageId === null)
            throw new Error("The parameter 'imageId' must be defined.");
        url_ = url_.replace("{imageId}", encodeURIComponent("" + imageId));
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "POST",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processStartImageSession(_response);
        });
    }

    protected processStartImageSession(response: Response): Promise<Session> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = Session.fromJS(resultData200);
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<Session>(null as any);
    }

    /**
     * Register a self-started Session to a SessionManager.
     */
    registerSession(session: Session): Promise<Session> {
        let url_ = this.baseUrl + "/sessions/register";
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(session);

        let options_: RequestInit = {
            body: content_,
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processRegisterSession(_response);
        });
    }

    protected processRegisterSession(response: Response): Promise<Session> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = Session.fromJS(resultData200);
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<Session>(null as any);
    }

    /**
     * Retrieves installed packages in this SessionManager
     */
    getSessionManagerImage(): Promise<Image> {
        let url_ = this.baseUrl + "/sessionmanager/image";
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetSessionManagerImage(_response);
        });
    }

    protected processGetSessionManagerImage(response: Response): Promise<Image> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = Image.fromJS(resultData200);
            return result200;
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<Image>(null as any);
    }

    /**
     * Shutdown Sessions and SessionManager
     */
    shutdown(): Promise<void> {
        let url_ = this.baseUrl + "/sessionmanager";
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "DELETE",
            headers: {
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processShutdown(_response);
        });
    }

    protected processShutdown(response: Response): Promise<void> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            return;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<void>(null as any);
    }

    /**
     * Links to other applications or services
     */
    getLinks(): Promise<Links> {
        let url_ = this.baseUrl + "/links";
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetLinks(_response);
        });
    }

    protected processGetLinks(response: Response): Promise<Links> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = Links.fromJS(resultData200);
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<Links>(null as any);
    }

    /**
     * Retrieve component settings overview
     */
    getComponentSettingsOverview(): Promise<ComponentSettingsIdentifier[]> {
        let url_ = this.baseUrl + "/componentsettings";
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetComponentSettingsOverview(_response);
        });
    }

    protected processGetComponentSettingsOverview(response: Response): Promise<ComponentSettingsIdentifier[]> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            if (Array.isArray(resultData200)) {
                result200 = [] as any;
                for (let item of resultData200)
                    result200!.push(ComponentSettingsIdentifier.fromJS(item));
            }
            else {
                result200 = <any>null;
            }
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<ComponentSettingsIdentifier[]>(null as any);
    }

    /**
     * Change componentsettings
     */
    setComponentSettings(groupName: string | null, name: string | null, returnedSettings: ComponentSettingsBase): Promise<ComponentSettingsBase> {
        let url_ = this.baseUrl + "/componentsettings/{groupName}/{name}";
        if (groupName === undefined || groupName === null)
            throw new Error("The parameter 'groupName' must be defined.");
        url_ = url_.replace("{groupName}", encodeURIComponent("" + groupName));
        if (name === undefined || name === null)
            throw new Error("The parameter 'name' must be defined.");
        url_ = url_.replace("{name}", encodeURIComponent("" + name));
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(returnedSettings);

        let options_: RequestInit = {
            body: content_,
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processSetComponentSettings(_response);
        });
    }

    protected processSetComponentSettings(response: Response): Promise<ComponentSettingsBase> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = ComponentSettingsBase.fromJS(resultData200);
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<ComponentSettingsBase>(null as any);
    }

    /**
     * Retrieve componentsettings
     */
    getComponentSettings(groupName: string | null, name: string | null): Promise<ComponentSettingsBase> {
        let url_ = this.baseUrl + "/componentsettings/{groupName}/{name}";
        if (groupName === undefined || groupName === null)
            throw new Error("The parameter 'groupName' must be defined.");
        url_ = url_.replace("{groupName}", encodeURIComponent("" + groupName));
        if (name === undefined || name === null)
            throw new Error("The parameter 'name' must be defined.");
        url_ = url_.replace("{name}", encodeURIComponent("" + name));
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetComponentSettings(_response);
        });
    }

    protected processGetComponentSettings(response: Response): Promise<ComponentSettingsBase> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = ComponentSettingsBase.fromJS(resultData200);
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<ComponentSettingsBase>(null as any);
    }

    /**
     * Retrieve componentsettings list item
     */
    getComponentSettingsListItem(groupName: string | null, name: string | null, index: number): Promise<ComponentSettingsListItem> {
        let url_ = this.baseUrl + "/componentsettings/{groupName}/{name}/item/{index}";
        if (groupName === undefined || groupName === null)
            throw new Error("The parameter 'groupName' must be defined.");
        url_ = url_.replace("{groupName}", encodeURIComponent("" + groupName));
        if (name === undefined || name === null)
            throw new Error("The parameter 'name' must be defined.");
        url_ = url_.replace("{name}", encodeURIComponent("" + name));
        if (index === undefined || index === null)
            throw new Error("The parameter 'index' must be defined.");
        url_ = url_.replace("{index}", encodeURIComponent("" + index));
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetComponentSettingsListItem(_response);
        });
    }

    protected processGetComponentSettingsListItem(response: Response): Promise<ComponentSettingsListItem> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = ComponentSettingsListItem.fromJS(resultData200);
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<ComponentSettingsListItem>(null as any);
    }

    /**
     * Set componentsettings list item settings
     */
    setComponentSettingsListItem(groupName: string | null, name: string | null, index: number, item: ComponentSettingsListItem): Promise<ComponentSettingsListItem> {
        let url_ = this.baseUrl + "/componentsettings/{groupName}/{name}/item/{index}";
        if (groupName === undefined || groupName === null)
            throw new Error("The parameter 'groupName' must be defined.");
        url_ = url_.replace("{groupName}", encodeURIComponent("" + groupName));
        if (name === undefined || name === null)
            throw new Error("The parameter 'name' must be defined.");
        url_ = url_.replace("{name}", encodeURIComponent("" + name));
        if (index === undefined || index === null)
            throw new Error("The parameter 'index' must be defined.");
        url_ = url_.replace("{index}", encodeURIComponent("" + index));
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(item);

        let options_: RequestInit = {
            body: content_,
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processSetComponentSettingsListItem(_response);
        });
    }

    protected processSetComponentSettingsListItem(response: Response): Promise<ComponentSettingsListItem> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = ComponentSettingsListItem.fromJS(resultData200);
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<ComponentSettingsListItem>(null as any);
    }

    /**
     * Get component setting data grid
     * @return Get component setting data grid
     */
    getComponentSettingDataGrid(groupName: string | null, name: string | null, index: number, propertyName: string | null): Promise<DataGridControl> {
        let url_ = this.baseUrl + "/componentsettings/{groupName}/{name}/item/{index}/{propertyName}/datagrid";
        if (groupName === undefined || groupName === null)
            throw new Error("The parameter 'groupName' must be defined.");
        url_ = url_.replace("{groupName}", encodeURIComponent("" + groupName));
        if (name === undefined || name === null)
            throw new Error("The parameter 'name' must be defined.");
        url_ = url_.replace("{name}", encodeURIComponent("" + name));
        if (index === undefined || index === null)
            throw new Error("The parameter 'index' must be defined.");
        url_ = url_.replace("{index}", encodeURIComponent("" + index));
        if (propertyName === undefined || propertyName === null)
            throw new Error("The parameter 'propertyName' must be defined.");
        url_ = url_.replace("{propertyName}", encodeURIComponent("" + propertyName));
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetComponentSettingDataGrid(_response);
        });
    }

    protected processGetComponentSettingDataGrid(response: Response): Promise<DataGridControl> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = DataGridControl.fromJS(resultData200);
            return result200;
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<DataGridControl>(null as any);
    }

    /**
     * Set component setting data grid
     * @return Set data grid
     */
    setComponentSettingDataGrid(groupName: string | null, name: string | null, index: number, propertyName: string | null, dataGridControl: DataGridControl): Promise<DataGridControl> {
        let url_ = this.baseUrl + "/componentsettings/{groupName}/{name}/item/{index}/{propertyName}/datagrid";
        if (groupName === undefined || groupName === null)
            throw new Error("The parameter 'groupName' must be defined.");
        url_ = url_.replace("{groupName}", encodeURIComponent("" + groupName));
        if (name === undefined || name === null)
            throw new Error("The parameter 'name' must be defined.");
        url_ = url_.replace("{name}", encodeURIComponent("" + name));
        if (index === undefined || index === null)
            throw new Error("The parameter 'index' must be defined.");
        url_ = url_.replace("{index}", encodeURIComponent("" + index));
        if (propertyName === undefined || propertyName === null)
            throw new Error("The parameter 'propertyName' must be defined.");
        url_ = url_.replace("{propertyName}", encodeURIComponent("" + propertyName));
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(dataGridControl);

        let options_: RequestInit = {
            body: content_,
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processSetComponentSettingDataGrid(_response);
        });
    }

    protected processSetComponentSettingDataGrid(response: Response): Promise<DataGridControl> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = DataGridControl.fromJS(resultData200);
            return result200;
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<DataGridControl>(null as any);
    }

    /**
     * Add component setting item to data grid
     * @return Add component setting data grid item
     */
    addComponentSettingDataGridItemType(groupName: string | null, name: string | null, index: number, propertyName: string | null, typeName: string | null): Promise<DataGridControl> {
        let url_ = this.baseUrl + "/componentsettings/{groupName}/{name}/item/{index}/{propertyName}/datagrid/new/{typeName}";
        if (groupName === undefined || groupName === null)
            throw new Error("The parameter 'groupName' must be defined.");
        url_ = url_.replace("{groupName}", encodeURIComponent("" + groupName));
        if (name === undefined || name === null)
            throw new Error("The parameter 'name' must be defined.");
        url_ = url_.replace("{name}", encodeURIComponent("" + name));
        if (index === undefined || index === null)
            throw new Error("The parameter 'index' must be defined.");
        url_ = url_.replace("{index}", encodeURIComponent("" + index));
        if (propertyName === undefined || propertyName === null)
            throw new Error("The parameter 'propertyName' must be defined.");
        url_ = url_.replace("{propertyName}", encodeURIComponent("" + propertyName));
        if (typeName === undefined || typeName === null)
            throw new Error("The parameter 'typeName' must be defined.");
        url_ = url_.replace("{typeName}", encodeURIComponent("" + typeName));
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "POST",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processAddComponentSettingDataGridItemType(_response);
        });
    }

    protected processAddComponentSettingDataGridItemType(response: Response): Promise<DataGridControl> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = DataGridControl.fromJS(resultData200);
            return result200;
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<DataGridControl>(null as any);
    }

    /**
     * Add component setting item to data grid
     * @return Add component setting data grid item
     */
    addComponentSettingDataGridItem(groupName: string | null, name: string | null, index: number, propertyName: string | null): Promise<DataGridControl> {
        let url_ = this.baseUrl + "/componentsettings/{groupName}/{name}/item/{index}/{propertyName}/datagrid/new";
        if (groupName === undefined || groupName === null)
            throw new Error("The parameter 'groupName' must be defined.");
        url_ = url_.replace("{groupName}", encodeURIComponent("" + groupName));
        if (name === undefined || name === null)
            throw new Error("The parameter 'name' must be defined.");
        url_ = url_.replace("{name}", encodeURIComponent("" + name));
        if (index === undefined || index === null)
            throw new Error("The parameter 'index' must be defined.");
        url_ = url_.replace("{index}", encodeURIComponent("" + index));
        if (propertyName === undefined || propertyName === null)
            throw new Error("The parameter 'propertyName' must be defined.");
        url_ = url_.replace("{propertyName}", encodeURIComponent("" + propertyName));
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "POST",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processAddComponentSettingDataGridItem(_response);
        });
    }

    protected processAddComponentSettingDataGridItem(response: Response): Promise<DataGridControl> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = DataGridControl.fromJS(resultData200);
            return result200;
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<DataGridControl>(null as any);
    }

    /**
     * Get item types available in the component setting data grid
     * @return Get component setting data grid types
     */
    getComponentSettingDataGridTypes(groupName: string | null, name: string | null, index: number, propertyName: string | null): Promise<ListItemType[]> {
        let url_ = this.baseUrl + "/componentsettings/{groupName}/{name}/item/{index}/{propertyName}/datagrid/availabletypes";
        if (groupName === undefined || groupName === null)
            throw new Error("The parameter 'groupName' must be defined.");
        url_ = url_.replace("{groupName}", encodeURIComponent("" + groupName));
        if (name === undefined || name === null)
            throw new Error("The parameter 'name' must be defined.");
        url_ = url_.replace("{name}", encodeURIComponent("" + name));
        if (index === undefined || index === null)
            throw new Error("The parameter 'index' must be defined.");
        url_ = url_.replace("{index}", encodeURIComponent("" + index));
        if (propertyName === undefined || propertyName === null)
            throw new Error("The parameter 'propertyName' must be defined.");
        url_ = url_.replace("{propertyName}", encodeURIComponent("" + propertyName));
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetComponentSettingDataGridTypes(_response);
        });
    }

    protected processGetComponentSettingDataGridTypes(response: Response): Promise<ListItemType[]> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            if (Array.isArray(resultData200)) {
                result200 = [] as any;
                for (let item of resultData200)
                    result200!.push(ListItemType.fromJS(item));
            }
            else {
                result200 = <any>null;
            }
            return result200;
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<ListItemType[]>(null as any);
    }

    /**
     * Change componentsettings profiles
     */
    setComponentSettingsProfiles(returnedSettings: ProfileGroup[]): Promise<ProfileGroup[]> {
        let url_ = this.baseUrl + "/componentsettings/profiles";
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(returnedSettings);

        let options_: RequestInit = {
            body: content_,
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processSetComponentSettingsProfiles(_response);
        });
    }

    protected processSetComponentSettingsProfiles(response: Response): Promise<ProfileGroup[]> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            if (Array.isArray(resultData200)) {
                result200 = [] as any;
                for (let item of resultData200)
                    result200!.push(ProfileGroup.fromJS(item));
            }
            else {
                result200 = <any>null;
            }
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<ProfileGroup[]>(null as any);
    }

    /**
     * Get componentsettings profiles
     */
    getComponentSettingsProfiles(): Promise<ProfileGroup[]> {
        let url_ = this.baseUrl + "/componentsettings/profiles";
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetComponentSettingsProfiles(_response);
        });
    }

    protected processGetComponentSettingsProfiles(response: Response): Promise<ProfileGroup[]> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            if (Array.isArray(resultData200)) {
                result200 = [] as any;
                for (let item of resultData200)
                    result200!.push(ProfileGroup.fromJS(item));
            }
            else {
                result200 = <any>null;
            }
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<ProfileGroup[]>(null as any);
    }

    /**
     * Upload exported OpenTAP Settings files
     * @param file (optional) 
     */
    uploadComponentSettings(file: FileParameter | null | undefined): Promise<void> {
        let url_ = this.baseUrl + "/componentsettings/upload";
        url_ = url_.replace(/[?&]$/, "");

        const content_ = new FormData();
        if (file !== null && file !== undefined)
            content_.append("file", file.data, file.fileName ? file.fileName : "file");

        let options_: RequestInit = {
            body: content_,
            method: "POST",
            headers: {
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processUploadComponentSettings(_response);
        });
    }

    protected processUploadComponentSettings(response: Response): Promise<void> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            return;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<void>(null as any);
    }

    /**
     * DEPRECATED: Use /componentsettings/load (LoadComponentSettingsFromRepository) instead
     * @deprecated
     */
    loadComponentSettingsFromPackageReference(packageReference: RepositoryPackageReference): Promise<ErrorResponse[]> {
        let url_ = this.baseUrl + "/componentsettings/packagereference";
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(packageReference);

        let options_: RequestInit = {
            body: content_,
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processLoadComponentSettingsFromPackageReference(_response);
        });
    }

    protected processLoadComponentSettingsFromPackageReference(response: Response): Promise<ErrorResponse[]> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            if (Array.isArray(resultData200)) {
                result200 = [] as any;
                for (let item of resultData200)
                    result200!.push(ErrorResponse.fromJS(item));
            }
            else {
                result200 = <any>null;
            }
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<ErrorResponse[]>(null as any);
    }

    /**
     * Load a component settings TapPackage by referencing a package in a package repository
     */
    loadComponentSettingsFromRepository(packageReference: RepositoryPackageReference): Promise<ErrorResponse[]> {
        let url_ = this.baseUrl + "/componentsettings/repository/load";
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(packageReference);

        let options_: RequestInit = {
            body: content_,
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processLoadComponentSettingsFromRepository(_response);
        });
    }

    protected processLoadComponentSettingsFromRepository(response: Response): Promise<ErrorResponse[]> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            if (Array.isArray(resultData200)) {
                result200 = [] as any;
                for (let item of resultData200)
                    result200!.push(ErrorResponse.fromJS(item));
            }
            else {
                result200 = <any>null;
            }
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<ErrorResponse[]>(null as any);
    }

    /**
     * Save a TapPackage containing component settings in a package repository
     * @return Settings TapPackage uploaded.
     */
    saveComponentSettingsToRepository(repositoryPackageDefinition: RepositorySettingsPackageDefinition): Promise<void> {
        let url_ = this.baseUrl + "/componentsettings/repository/save";
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(repositoryPackageDefinition);

        let options_: RequestInit = {
            body: content_,
            method: "POST",
            headers: {
                "Content-Type": "application/json",
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processSaveComponentSettingsToRepository(_response);
        });
    }

    protected processSaveComponentSettingsToRepository(response: Response): Promise<void> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            return;
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<void>(null as any);
    }

    /**
     * Retrieve types available to be added to specified component settings list
     */
    getComponentSettingsListAvailableTypes(groupName: string | null, name: string | null): Promise<ListItemType[]> {
        let url_ = this.baseUrl + "/componentsettings/{groupName}/{name}/types";
        if (groupName === undefined || groupName === null)
            throw new Error("The parameter 'groupName' must be defined.");
        url_ = url_.replace("{groupName}", encodeURIComponent("" + groupName));
        if (name === undefined || name === null)
            throw new Error("The parameter 'name' must be defined.");
        url_ = url_.replace("{name}", encodeURIComponent("" + name));
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetComponentSettingsListAvailableTypes(_response);
        });
    }

    protected processGetComponentSettingsListAvailableTypes(response: Response): Promise<ListItemType[]> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            if (Array.isArray(resultData200)) {
                result200 = [] as any;
                for (let item of resultData200)
                    result200!.push(ListItemType.fromJS(item));
            }
            else {
                result200 = <any>null;
            }
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<ListItemType[]>(null as any);
    }

    /**
     * Adds a new item to a component settings list
     */
    addComponentSettingsListItem(groupName: string | null, name: string | null, typeName: string | null): Promise<ComponentSettingsBase> {
        let url_ = this.baseUrl + "/componentsettings/{groupName}/{name}/item/new/{typeName}";
        if (groupName === undefined || groupName === null)
            throw new Error("The parameter 'groupName' must be defined.");
        url_ = url_.replace("{groupName}", encodeURIComponent("" + groupName));
        if (name === undefined || name === null)
            throw new Error("The parameter 'name' must be defined.");
        url_ = url_.replace("{name}", encodeURIComponent("" + name));
        if (typeName === undefined || typeName === null)
            throw new Error("The parameter 'typeName' must be defined.");
        url_ = url_.replace("{typeName}", encodeURIComponent("" + typeName));
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "POST",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processAddComponentSettingsListItem(_response);
        });
    }

    protected processAddComponentSettingsListItem(response: Response): Promise<ComponentSettingsBase> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result200 = ComponentSettingsBase.fromJS(resultData200);
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<ComponentSettingsBase>(null as any);
    }

    /**
     * Retrieve settings types used in creating a Settings TapPackage
     */
    getSettingsTypes(): Promise<string[]> {
        let url_ = this.baseUrl + "/componentsettings/types";
        url_ = url_.replace(/[?&]$/, "");

        let options_: RequestInit = {
            method: "GET",
            headers: {
                "Accept": "application/json"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processGetSettingsTypes(_response);
        });
    }

    protected processGetSettingsTypes(response: Response): Promise<string[]> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200) {
            return response.text().then((_responseText) => {
            let result200: any = null;
            let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            if (Array.isArray(resultData200)) {
                result200 = [] as any;
                for (let item of resultData200)
                    result200!.push(item);
            }
            else {
                result200 = <any>null;
            }
            return result200;
            });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<string[]>(null as any);
    }

    /**
     * Download a TapPackage containing settings files
     */
    downloadSettingsPackage(settingsTapPackage: SettingsTapPackage): Promise<FileResponse> {
        let url_ = this.baseUrl + "/componentsettings/download";
        url_ = url_.replace(/[?&]$/, "");

        const content_ = JSON.stringify(settingsTapPackage);

        let options_: RequestInit = {
            body: content_,
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/octet-stream"
            }
        };

        return this.http.fetch(url_, options_).then((_response: Response) => {
            return this.processDownloadSettingsPackage(_response);
        });
    }

    protected processDownloadSettingsPackage(response: Response): Promise<FileResponse> {
        const status = response.status;
        let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };
        if (status === 200 || status === 206) {
            const contentDisposition = response.headers ? response.headers.get("content-disposition") : undefined;
            const fileNameMatch = contentDisposition ? /filename="?([^"]*?)"?(;|$)/g.exec(contentDisposition) : undefined;
            const fileName = fileNameMatch && fileNameMatch.length > 1 ? fileNameMatch[1] : undefined;
            return response.blob().then(blob => { return { fileName: fileName, data: blob, status: status, headers: _headers }; });
        } else if (status === 400) {
            return response.text().then((_responseText) => {
            let result400: any = null;
            let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
            result400 = ErrorResponse.fromJS(resultData400);
            return throwException("A server side error occurred.", status, _responseText, _headers, result400);
            });
        } else if (status !== 200 && status !== 204) {
            return response.text().then((_responseText) => {
            return throwException("An unexpected server error occurred.", status, _responseText, _headers);
            });
        }
        return Promise.resolve<FileResponse>(null as any);
    }
}

export class Image implements IImage {
    name?: string | undefined;
    packages?: PackageSpecifier[] | undefined;
    repositories?: string[] | undefined;
    id?: string | undefined;

    constructor(data?: IImage) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.name = _data["Name"];
            if (Array.isArray(_data["Packages"])) {
                this.packages = [] as any;
                for (let item of _data["Packages"])
                    this.packages!.push(PackageSpecifier.fromJS(item));
            }
            if (Array.isArray(_data["Repositories"])) {
                this.repositories = [] as any;
                for (let item of _data["Repositories"])
                    this.repositories!.push(item);
            }
            this.id = _data["Id"];
        }
    }

    static fromJS(data: any): Image {
        data = typeof data === 'object' ? data : {};
        let result = new Image();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Name"] = this.name;
        if (Array.isArray(this.packages)) {
            data["Packages"] = [];
            for (let item of this.packages)
                data["Packages"].push(item.toJSON());
        }
        if (Array.isArray(this.repositories)) {
            data["Repositories"] = [];
            for (let item of this.repositories)
                data["Repositories"].push(item);
        }
        data["Id"] = this.id;
        return data;
    }
}

export interface IImage {
    name?: string | undefined;
    packages?: PackageSpecifier[] | undefined;
    repositories?: string[] | undefined;
    id?: string | undefined;
}

export class PackageSpecifier implements IPackageSpecifier {
    name?: string | undefined;
    version?: string | undefined;
    architecture?: string | undefined;
    oS?: string | undefined;

    constructor(data?: IPackageSpecifier) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.name = _data["Name"];
            this.version = _data["Version"];
            this.architecture = _data["Architecture"];
            this.oS = _data["OS"];
        }
    }

    static fromJS(data: any): PackageSpecifier {
        data = typeof data === 'object' ? data : {};
        let result = new PackageSpecifier();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Name"] = this.name;
        data["Version"] = this.version;
        data["Architecture"] = this.architecture;
        data["OS"] = this.oS;
        return data;
    }
}

export interface IPackageSpecifier {
    name?: string | undefined;
    version?: string | undefined;
    architecture?: string | undefined;
    oS?: string | undefined;
}

export class ErrorResponse implements IErrorResponse {
    type?: string | undefined;
    message?: string | undefined;
    parameter?: string | undefined;
    source?: string | undefined;
    stackTrace?: string | undefined;
    inner?: ErrorResponse | undefined;

    constructor(data?: IErrorResponse) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.type = _data["Type"];
            this.message = _data["Message"];
            this.parameter = _data["Parameter"];
            this.source = _data["Source"];
            this.stackTrace = _data["StackTrace"];
            this.inner = _data["Inner"] ? ErrorResponse.fromJS(_data["Inner"]) : <any>undefined;
        }
    }

    static fromJS(data: any): ErrorResponse {
        data = typeof data === 'object' ? data : {};
        let result = new ErrorResponse();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Type"] = this.type;
        data["Message"] = this.message;
        data["Parameter"] = this.parameter;
        data["Source"] = this.source;
        data["StackTrace"] = this.stackTrace;
        data["Inner"] = this.inner ? this.inner.toJSON() : <any>undefined;
        return data;
    }
}

export interface IErrorResponse {
    type?: string | undefined;
    message?: string | undefined;
    parameter?: string | undefined;
    source?: string | undefined;
    stackTrace?: string | undefined;
    inner?: ErrorResponse | undefined;
}

export class ImageResolveErrorResponse extends ErrorResponse implements IImageResolveErrorResponse {
    dotGraph?: string | undefined;

    constructor(data?: IImageResolveErrorResponse) {
        super(data);
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.dotGraph = _data["DotGraph"];
        }
    }

    static fromJS(data: any): ImageResolveErrorResponse {
        data = typeof data === 'object' ? data : {};
        let result = new ImageResolveErrorResponse();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["DotGraph"] = this.dotGraph;
        super.toJSON(data);
        return data;
    }
}

export interface IImageResolveErrorResponse extends IErrorResponse {
    dotGraph?: string | undefined;
}

export class Session implements ISession {
    url?: string | undefined;
    id?: string;
    imageId?: string | undefined;

    constructor(data?: ISession) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.url = _data["Url"];
            this.id = _data["Id"];
            this.imageId = _data["ImageId"];
        }
    }

    static fromJS(data: any): Session {
        data = typeof data === 'object' ? data : {};
        let result = new Session();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Url"] = this.url;
        data["Id"] = this.id;
        data["ImageId"] = this.imageId;
        return data;
    }
}

export interface ISession {
    url?: string | undefined;
    id?: string;
    imageId?: string | undefined;
}

export class Links implements ILinks {
    editor?: string | undefined;

    constructor(data?: ILinks) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.editor = _data["Editor"];
        }
    }

    static fromJS(data: any): Links {
        data = typeof data === 'object' ? data : {};
        let result = new Links();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Editor"] = this.editor;
        return data;
    }
}

export interface ILinks {
    editor?: string | undefined;
}

export abstract class ComponentSettingsBase implements IComponentSettingsBase {
    name?: string | undefined;
    groupName?: string | undefined;

    protected _discriminator: string;

    constructor(data?: IComponentSettingsBase) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
        this._discriminator = "ComponentSettingsBase";
    }

    init(_data?: any) {
        if (_data) {
            this.name = _data["Name"];
            this.groupName = _data["GroupName"];
        }
    }

    static fromJS(data: any): ComponentSettingsBase {
        data = typeof data === 'object' ? data : {};
        if (data["ComponentSettingsType"] === "ComponentSettingsIdentifier") {
            let result = new ComponentSettingsIdentifier();
            result.init(data);
            return result;
        }
        if (data["ComponentSettingsType"] === "ComponentSettingsList") {
            let result = new ComponentSettingsList();
            result.init(data);
            return result;
        }
        if (data["ComponentSettingsType"] === "ComponentSettings") {
            let result = new ComponentSettings();
            result.init(data);
            return result;
        }
        throw new Error("The abstract class 'ComponentSettingsBase' cannot be instantiated.");
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["ComponentSettingsType"] = this._discriminator;
        data["Name"] = this.name;
        data["GroupName"] = this.groupName;
        return data;
    }
}

export interface IComponentSettingsBase {
    name?: string | undefined;
    groupName?: string | undefined;
}

export class ComponentSettingsIdentifier extends ComponentSettingsBase implements IComponentSettingsIdentifier {

    constructor(data?: IComponentSettingsIdentifier) {
        super(data);
        this._discriminator = "ComponentSettingsIdentifier";
    }

    init(_data?: any) {
        super.init(_data);
    }

    static fromJS(data: any): ComponentSettingsIdentifier {
        data = typeof data === 'object' ? data : {};
        let result = new ComponentSettingsIdentifier();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        super.toJSON(data);
        return data;
    }
}

export interface IComponentSettingsIdentifier extends IComponentSettingsBase {
}

export class ComponentSettingsList extends ComponentSettingsBase implements IComponentSettingsList {
    items?: ComponentSettingsListItem[] | undefined;

    constructor(data?: IComponentSettingsList) {
        super(data);
        this._discriminator = "ComponentSettingsList";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            if (Array.isArray(_data["Items"])) {
                this.items = [] as any;
                for (let item of _data["Items"])
                    this.items!.push(ComponentSettingsListItem.fromJS(item));
            }
        }
    }

    static fromJS(data: any): ComponentSettingsList {
        data = typeof data === 'object' ? data : {};
        let result = new ComponentSettingsList();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        if (Array.isArray(this.items)) {
            data["Items"] = [];
            for (let item of this.items)
                data["Items"].push(item.toJSON());
        }
        super.toJSON(data);
        return data;
    }
}

export interface IComponentSettingsList extends IComponentSettingsBase {
    items?: ComponentSettingsListItem[] | undefined;
}

export abstract class AnnotatedObject implements IAnnotatedObject {
    visualStatus?: VisualStatus | undefined;
    valueType?: string | undefined;
    display?: DisplayAttribute | undefined;
    metaData?: MetaData | undefined;
    externalParameter?: ExternalParameter | undefined;

    constructor(data?: IAnnotatedObject) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.visualStatus = _data["VisualStatus"] ? VisualStatus.fromJS(_data["VisualStatus"]) : <any>undefined;
            this.valueType = _data["ValueType"];
            this.display = _data["Display"] ? DisplayAttribute.fromJS(_data["Display"]) : <any>undefined;
            this.metaData = _data["MetaData"] ? MetaData.fromJS(_data["MetaData"]) : <any>undefined;
            this.externalParameter = _data["ExternalParameter"] ? ExternalParameter.fromJS(_data["ExternalParameter"]) : <any>undefined;
        }
    }

    static fromJS(data: any): AnnotatedObject {
        data = typeof data === 'object' ? data : {};
        throw new Error("The abstract class 'AnnotatedObject' cannot be instantiated.");
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["VisualStatus"] = this.visualStatus ? this.visualStatus.toJSON() : <any>undefined;
        data["ValueType"] = this.valueType;
        data["Display"] = this.display ? this.display.toJSON() : <any>undefined;
        data["MetaData"] = this.metaData ? this.metaData.toJSON() : <any>undefined;
        data["ExternalParameter"] = this.externalParameter ? this.externalParameter.toJSON() : <any>undefined;
        return data;
    }
}

export interface IAnnotatedObject {
    visualStatus?: VisualStatus | undefined;
    valueType?: string | undefined;
    display?: DisplayAttribute | undefined;
    metaData?: MetaData | undefined;
    externalParameter?: ExternalParameter | undefined;
}

export class ComponentSettingsListItem extends AnnotatedObject implements IComponentSettingsListItem {
    settings?: Setting[] | undefined;
    name?: string | undefined;
    enabledResource?: boolean | undefined;

    constructor(data?: IComponentSettingsListItem) {
        super(data);
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            if (Array.isArray(_data["Settings"])) {
                this.settings = [] as any;
                for (let item of _data["Settings"])
                    this.settings!.push(Setting.fromJS(item));
            }
            this.name = _data["Name"];
            this.enabledResource = _data["EnabledResource"];
        }
    }

    static fromJS(data: any): ComponentSettingsListItem {
        data = typeof data === 'object' ? data : {};
        let result = new ComponentSettingsListItem();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        if (Array.isArray(this.settings)) {
            data["Settings"] = [];
            for (let item of this.settings)
                data["Settings"].push(item.toJSON());
        }
        data["Name"] = this.name;
        data["EnabledResource"] = this.enabledResource;
        super.toJSON(data);
        return data;
    }
}

export interface IComponentSettingsListItem extends IAnnotatedObject {
    settings?: Setting[] | undefined;
    name?: string | undefined;
    enabledResource?: boolean | undefined;
}

export class Setting extends AnnotatedObject implements ISetting {
    errors?: string[] | undefined;
    layout?: Layout | undefined;
    columnDisplayName?: ColumnDisplayName | undefined;
    valueDescription?: string | undefined;
    propertyName?: string | undefined;
    icons?: Icon[] | undefined;

    protected _discriminator: string;

    constructor(data?: ISetting) {
        super(data);
        this._discriminator = "Setting";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            if (Array.isArray(_data["Errors"])) {
                this.errors = [] as any;
                for (let item of _data["Errors"])
                    this.errors!.push(item);
            }
            this.layout = _data["Layout"] ? Layout.fromJS(_data["Layout"]) : <any>undefined;
            this.columnDisplayName = _data["ColumnDisplayName"] ? ColumnDisplayName.fromJS(_data["ColumnDisplayName"]) : <any>undefined;
            this.valueDescription = _data["ValueDescription"];
            this.propertyName = _data["PropertyName"];
            if (Array.isArray(_data["Icons"])) {
                this.icons = [] as any;
                for (let item of _data["Icons"])
                    this.icons!.push(Icon.fromJS(item));
            }
        }
    }

    static fromJS(data: any): Setting {
        data = typeof data === 'object' ? data : {};
        if (data["ControlType"] === "ButtonControl") {
            let result = new ButtonControl();
            result.init(data);
            return result;
        }
        if (data["ControlType"] === "ButtonsControl") {
            let result = new ButtonsControl();
            result.init(data);
            return result;
        }
        if (data["ControlType"] === "CheckBoxControl") {
            let result = new CheckBoxControl();
            result.init(data);
            return result;
        }
        if (data["ControlType"] === "DataGridReferenceControl") {
            let result = new DataGridReferenceControl();
            result.init(data);
            return result;
        }
        if (data["ControlType"] === "DataGridControl") {
            let result = new DataGridControl();
            result.init(data);
            return result;
        }
        if (data["ControlType"] === "TextBoxControl") {
            let result = new TextBoxControl();
            result.init(data);
            return result;
        }
        if (data["ControlType"] === "ComboBoxControl") {
            let result = new ComboBoxControl();
            result.init(data);
            return result;
        }
        if (data["ControlType"] === "FilePathControl") {
            let result = new FilePathControl();
            result.init(data);
            return result;
        }
        if (data["ControlType"] === "EnabledControl") {
            let result = new EnabledControl();
            result.init(data);
            return result;
        }
        if (data["ControlType"] === "DropdownControl") {
            let result = new DropdownControl();
            result.init(data);
            return result;
        }
        if (data["ControlType"] === "MultiSelectControl") {
            let result = new MultiSelectControl();
            result.init(data);
            return result;
        }
        if (data["ControlType"] === "PasswordControl") {
            let result = new PasswordControl();
            result.init(data);
            return result;
        }
        let result = new Setting();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["ControlType"] = this._discriminator;
        if (Array.isArray(this.errors)) {
            data["Errors"] = [];
            for (let item of this.errors)
                data["Errors"].push(item);
        }
        data["Layout"] = this.layout ? this.layout.toJSON() : <any>undefined;
        data["ColumnDisplayName"] = this.columnDisplayName ? this.columnDisplayName.toJSON() : <any>undefined;
        data["ValueDescription"] = this.valueDescription;
        data["PropertyName"] = this.propertyName;
        if (Array.isArray(this.icons)) {
            data["Icons"] = [];
            for (let item of this.icons)
                data["Icons"].push(item.toJSON());
        }
        super.toJSON(data);
        return data;
    }
}

export interface ISetting extends IAnnotatedObject {
    errors?: string[] | undefined;
    layout?: Layout | undefined;
    columnDisplayName?: ColumnDisplayName | undefined;
    valueDescription?: string | undefined;
    propertyName?: string | undefined;
    icons?: Icon[] | undefined;
}

export class Layout implements ILayout {
    mode?: LayoutMode;
    rowHeight?: number;
    maxRowHeight?: number;

    constructor(data?: ILayout) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.mode = _data["Mode"];
            this.rowHeight = _data["RowHeight"];
            this.maxRowHeight = _data["MaxRowHeight"];
        }
    }

    static fromJS(data: any): Layout {
        data = typeof data === 'object' ? data : {};
        let result = new Layout();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Mode"] = this.mode;
        data["RowHeight"] = this.rowHeight;
        data["MaxRowHeight"] = this.maxRowHeight;
        return data;
    }
}

export interface ILayout {
    mode?: LayoutMode;
    rowHeight?: number;
    maxRowHeight?: number;
}

/** The supported layout modes. */
export enum LayoutMode {
    Normal = "Normal",
    FullRow = "FullRow",
    FloatBottom = "FloatBottom",
}

export class ColumnDisplayName implements IColumnDisplayName {
    columnName?: string | undefined;
    order?: number;
    isReadOnly?: boolean;

    constructor(data?: IColumnDisplayName) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.columnName = _data["ColumnName"];
            this.order = _data["Order"];
            this.isReadOnly = _data["IsReadOnly"];
        }
    }

    static fromJS(data: any): ColumnDisplayName {
        data = typeof data === 'object' ? data : {};
        let result = new ColumnDisplayName();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["ColumnName"] = this.columnName;
        data["Order"] = this.order;
        data["IsReadOnly"] = this.isReadOnly;
        return data;
    }
}

export interface IColumnDisplayName {
    columnName?: string | undefined;
    order?: number;
    isReadOnly?: boolean;
}

export class Icon implements IIcon {
    iconName?: string | undefined;
    invoke?: boolean | undefined;
    stepReference?: string | undefined;
    propertyReference?: string | undefined;

    constructor(data?: IIcon) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.iconName = _data["IconName"];
            this.invoke = _data["Invoke"];
            this.stepReference = _data["StepReference"];
            this.propertyReference = _data["PropertyReference"];
        }
    }

    static fromJS(data: any): Icon {
        data = typeof data === 'object' ? data : {};
        let result = new Icon();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["IconName"] = this.iconName;
        data["Invoke"] = this.invoke;
        data["StepReference"] = this.stepReference;
        data["PropertyReference"] = this.propertyReference;
        return data;
    }
}

export interface IIcon {
    iconName?: string | undefined;
    invoke?: boolean | undefined;
    stepReference?: string | undefined;
    propertyReference?: string | undefined;
}

export class VisualStatus implements IVisualStatus {
    isReadOnly?: boolean;
    isVisible?: boolean;
    isEnabled?: boolean;

    constructor(data?: IVisualStatus) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.isReadOnly = _data["IsReadOnly"];
            this.isVisible = _data["IsVisible"];
            this.isEnabled = _data["IsEnabled"];
        }
    }

    static fromJS(data: any): VisualStatus {
        data = typeof data === 'object' ? data : {};
        let result = new VisualStatus();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["IsReadOnly"] = this.isReadOnly;
        data["IsVisible"] = this.isVisible;
        data["IsEnabled"] = this.isEnabled;
        return data;
    }
}

export interface IVisualStatus {
    isReadOnly?: boolean;
    isVisible?: boolean;
    isEnabled?: boolean;
}

export class DisplayAttribute implements IDisplayAttribute {
    description?: string | undefined;
    group?: string[] | undefined;
    name?: string | undefined;
    order?: number;
    collapsed?: boolean;

    constructor(data?: IDisplayAttribute) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.description = _data["Description"];
            if (Array.isArray(_data["Group"])) {
                this.group = [] as any;
                for (let item of _data["Group"])
                    this.group!.push(item);
            }
            this.name = _data["Name"];
            this.order = _data["Order"];
            this.collapsed = _data["Collapsed"];
        }
    }

    static fromJS(data: any): DisplayAttribute {
        data = typeof data === 'object' ? data : {};
        let result = new DisplayAttribute();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Description"] = this.description;
        if (Array.isArray(this.group)) {
            data["Group"] = [];
            for (let item of this.group)
                data["Group"].push(item);
        }
        data["Name"] = this.name;
        data["Order"] = this.order;
        data["Collapsed"] = this.collapsed;
        return data;
    }
}

export interface IDisplayAttribute {
    description?: string | undefined;
    group?: string[] | undefined;
    name?: string | undefined;
    order?: number;
    collapsed?: boolean;
}

export class MetaData implements IMetaData {
    name?: string | undefined;
    macroName?: string | undefined;
    group?: string | undefined;
    frozen?: boolean;

    constructor(data?: IMetaData) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.name = _data["Name"];
            this.macroName = _data["MacroName"];
            this.group = _data["Group"];
            this.frozen = _data["Frozen"];
        }
    }

    static fromJS(data: any): MetaData {
        data = typeof data === 'object' ? data : {};
        let result = new MetaData();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Name"] = this.name;
        data["MacroName"] = this.macroName;
        data["Group"] = this.group;
        data["Frozen"] = this.frozen;
        return data;
    }
}

export interface IMetaData {
    name?: string | undefined;
    macroName?: string | undefined;
    group?: string | undefined;
    frozen?: boolean;
}

export class ExternalParameter implements IExternalParameter {
    name?: string | undefined;

    constructor(data?: IExternalParameter) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.name = _data["Name"];
        }
    }

    static fromJS(data: any): ExternalParameter {
        data = typeof data === 'object' ? data : {};
        let result = new ExternalParameter();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Name"] = this.name;
        return data;
    }
}

export interface IExternalParameter {
    name?: string | undefined;
}

export class ButtonControl extends Setting implements IButtonControl {
    invokeMethod?: boolean;

    constructor(data?: IButtonControl) {
        super(data);
        this._discriminator = "ButtonControl";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.invokeMethod = _data["InvokeMethod"];
        }
    }

    static fromJS(data: any): ButtonControl {
        data = typeof data === 'object' ? data : {};
        let result = new ButtonControl();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["InvokeMethod"] = this.invokeMethod;
        super.toJSON(data);
        return data;
    }
}

export interface IButtonControl extends ISetting {
    invokeMethod?: boolean;
}

export class ButtonsControl extends Setting implements IButtonsControl {
    availableValues?: AvailableValue[] | undefined;
    selectedIndex?: number;
    invokeMethod?: boolean;

    constructor(data?: IButtonsControl) {
        super(data);
        this._discriminator = "ButtonsControl";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            if (Array.isArray(_data["AvailableValues"])) {
                this.availableValues = [] as any;
                for (let item of _data["AvailableValues"])
                    this.availableValues!.push(AvailableValue.fromJS(item));
            }
            this.selectedIndex = _data["SelectedIndex"];
            this.invokeMethod = _data["InvokeMethod"];
        }
    }

    static fromJS(data: any): ButtonsControl {
        data = typeof data === 'object' ? data : {};
        let result = new ButtonsControl();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        if (Array.isArray(this.availableValues)) {
            data["AvailableValues"] = [];
            for (let item of this.availableValues)
                data["AvailableValues"].push(item.toJSON());
        }
        data["SelectedIndex"] = this.selectedIndex;
        data["InvokeMethod"] = this.invokeMethod;
        super.toJSON(data);
        return data;
    }
}

export interface IButtonsControl extends ISetting {
    availableValues?: AvailableValue[] | undefined;
    selectedIndex?: number;
    invokeMethod?: boolean;
}

export class AvailableValue implements IAvailableValue {
    name?: string | undefined;
    description?: string | undefined;

    constructor(data?: IAvailableValue) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.name = _data["Name"];
            this.description = _data["Description"];
        }
    }

    static fromJS(data: any): AvailableValue {
        data = typeof data === 'object' ? data : {};
        let result = new AvailableValue();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Name"] = this.name;
        data["Description"] = this.description;
        return data;
    }
}

export interface IAvailableValue {
    name?: string | undefined;
    description?: string | undefined;
}

export class CheckBoxControl extends Setting implements ICheckBoxControl {
    boolValue?: boolean | undefined;

    constructor(data?: ICheckBoxControl) {
        super(data);
        this._discriminator = "CheckBoxControl";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.boolValue = _data["BoolValue"];
        }
    }

    static fromJS(data: any): CheckBoxControl {
        data = typeof data === 'object' ? data : {};
        let result = new CheckBoxControl();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["BoolValue"] = this.boolValue;
        super.toJSON(data);
        return data;
    }
}

export interface ICheckBoxControl extends ISetting {
    boolValue?: boolean | undefined;
}

export class DataGridReferenceControl extends Setting implements IDataGridReferenceControl {

    constructor(data?: IDataGridReferenceControl) {
        super(data);
        this._discriminator = "DataGridReferenceControl";
    }

    init(_data?: any) {
        super.init(_data);
    }

    static fromJS(data: any): DataGridReferenceControl {
        data = typeof data === 'object' ? data : {};
        let result = new DataGridReferenceControl();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        super.toJSON(data);
        return data;
    }
}

export interface IDataGridReferenceControl extends ISetting {
}

export class DataGridControl extends Setting implements IDataGridControl {
    items?: Setting[][] | undefined;
    fixedSize?: boolean;

    constructor(data?: IDataGridControl) {
        super(data);
        this._discriminator = "DataGridControl";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            if (Array.isArray(_data["Items"])) {
                this.items = [] as any;
                for (let item of _data["Items"])
                    this.items!.push(item);
            }
            this.fixedSize = _data["FixedSize"];
        }
    }

    static fromJS(data: any): DataGridControl {
        data = typeof data === 'object' ? data : {};
        let result = new DataGridControl();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        if (Array.isArray(this.items)) {
            data["Items"] = [];
            for (let item of this.items)
                data["Items"].push(item);
        }
        data["FixedSize"] = this.fixedSize;
        super.toJSON(data);
        return data;
    }
}

export interface IDataGridControl extends ISetting {
    items?: Setting[][] | undefined;
    fixedSize?: boolean;
}

export class TextBoxControl extends Setting implements ITextBoxControl {
    stringValue?: string | undefined;

    constructor(data?: ITextBoxControl) {
        super(data);
        this._discriminator = "TextBoxControl";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.stringValue = _data["StringValue"];
        }
    }

    static fromJS(data: any): TextBoxControl {
        data = typeof data === 'object' ? data : {};
        if (data["ControlType"] === "ComboBoxControl") {
            let result = new ComboBoxControl();
            result.init(data);
            return result;
        }
        let result = new TextBoxControl();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["StringValue"] = this.stringValue;
        super.toJSON(data);
        return data;
    }
}

export interface ITextBoxControl extends ISetting {
    stringValue?: string | undefined;
}

export class ComboBoxControl extends TextBoxControl implements IComboBoxControl {
    suggestedValues?: string[] | undefined;

    constructor(data?: IComboBoxControl) {
        super(data);
        this._discriminator = "ComboBoxControl";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            if (Array.isArray(_data["SuggestedValues"])) {
                this.suggestedValues = [] as any;
                for (let item of _data["SuggestedValues"])
                    this.suggestedValues!.push(item);
            }
        }
    }

    static fromJS(data: any): ComboBoxControl {
        data = typeof data === 'object' ? data : {};
        let result = new ComboBoxControl();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        if (Array.isArray(this.suggestedValues)) {
            data["SuggestedValues"] = [];
            for (let item of this.suggestedValues)
                data["SuggestedValues"].push(item);
        }
        super.toJSON(data);
        return data;
    }
}

export interface IComboBoxControl extends ITextBoxControl {
    suggestedValues?: string[] | undefined;
}

export class FilePathControl extends Setting implements IFilePathControl {
    stringValue?: string | undefined;
    fileExtension?: string | undefined;

    constructor(data?: IFilePathControl) {
        super(data);
        this._discriminator = "FilePathControl";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.stringValue = _data["StringValue"];
            this.fileExtension = _data["FileExtension"];
        }
    }

    static fromJS(data: any): FilePathControl {
        data = typeof data === 'object' ? data : {};
        let result = new FilePathControl();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["StringValue"] = this.stringValue;
        data["FileExtension"] = this.fileExtension;
        super.toJSON(data);
        return data;
    }
}

export interface IFilePathControl extends ISetting {
    stringValue?: string | undefined;
    fileExtension?: string | undefined;
}

export class EnabledControl extends Setting implements IEnabledControl {
    isEnabled?: boolean | undefined;
    value?: Setting | undefined;

    constructor(data?: IEnabledControl) {
        super(data);
        this._discriminator = "EnabledControl";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.isEnabled = _data["IsEnabled"];
            this.value = _data["Value"] ? Setting.fromJS(_data["Value"]) : <any>undefined;
        }
    }

    static fromJS(data: any): EnabledControl {
        data = typeof data === 'object' ? data : {};
        let result = new EnabledControl();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["IsEnabled"] = this.isEnabled;
        data["Value"] = this.value ? this.value.toJSON() : <any>undefined;
        super.toJSON(data);
        return data;
    }
}

export interface IEnabledControl extends ISetting {
    isEnabled?: boolean | undefined;
    value?: Setting | undefined;
}

export class DropdownControl extends Setting implements IDropdownControl {
    availableValues?: AvailableValue[] | undefined;
    selectedIndex?: number;

    constructor(data?: IDropdownControl) {
        super(data);
        this._discriminator = "DropdownControl";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            if (Array.isArray(_data["AvailableValues"])) {
                this.availableValues = [] as any;
                for (let item of _data["AvailableValues"])
                    this.availableValues!.push(AvailableValue.fromJS(item));
            }
            this.selectedIndex = _data["SelectedIndex"];
        }
    }

    static fromJS(data: any): DropdownControl {
        data = typeof data === 'object' ? data : {};
        let result = new DropdownControl();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        if (Array.isArray(this.availableValues)) {
            data["AvailableValues"] = [];
            for (let item of this.availableValues)
                data["AvailableValues"].push(item.toJSON());
        }
        data["SelectedIndex"] = this.selectedIndex;
        super.toJSON(data);
        return data;
    }
}

export interface IDropdownControl extends ISetting {
    availableValues?: AvailableValue[] | undefined;
    selectedIndex?: number;
}

export class MultiSelectControl extends Setting implements IMultiSelectControl {
    availableValues?: AvailableValue[] | undefined;
    selectedIndex?: number[] | undefined;

    constructor(data?: IMultiSelectControl) {
        super(data);
        this._discriminator = "MultiSelectControl";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            if (Array.isArray(_data["AvailableValues"])) {
                this.availableValues = [] as any;
                for (let item of _data["AvailableValues"])
                    this.availableValues!.push(AvailableValue.fromJS(item));
            }
            if (Array.isArray(_data["SelectedIndex"])) {
                this.selectedIndex = [] as any;
                for (let item of _data["SelectedIndex"])
                    this.selectedIndex!.push(item);
            }
        }
    }

    static fromJS(data: any): MultiSelectControl {
        data = typeof data === 'object' ? data : {};
        let result = new MultiSelectControl();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        if (Array.isArray(this.availableValues)) {
            data["AvailableValues"] = [];
            for (let item of this.availableValues)
                data["AvailableValues"].push(item.toJSON());
        }
        if (Array.isArray(this.selectedIndex)) {
            data["SelectedIndex"] = [];
            for (let item of this.selectedIndex)
                data["SelectedIndex"].push(item);
        }
        super.toJSON(data);
        return data;
    }
}

export interface IMultiSelectControl extends ISetting {
    availableValues?: AvailableValue[] | undefined;
    selectedIndex?: number[] | undefined;
}

export class PasswordControl extends Setting implements IPasswordControl {
    password?: string | undefined;

    constructor(data?: IPasswordControl) {
        super(data);
        this._discriminator = "PasswordControl";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.password = _data["Password"];
        }
    }

    static fromJS(data: any): PasswordControl {
        data = typeof data === 'object' ? data : {};
        let result = new PasswordControl();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Password"] = this.password;
        super.toJSON(data);
        return data;
    }
}

export interface IPasswordControl extends ISetting {
    password?: string | undefined;
}

export class ComponentSettings extends ComponentSettingsBase implements IComponentSettings {
    settings?: Setting[] | undefined;

    constructor(data?: IComponentSettings) {
        super(data);
        this._discriminator = "ComponentSettings";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            if (Array.isArray(_data["Settings"])) {
                this.settings = [] as any;
                for (let item of _data["Settings"])
                    this.settings!.push(Setting.fromJS(item));
            }
        }
    }

    static fromJS(data: any): ComponentSettings {
        data = typeof data === 'object' ? data : {};
        let result = new ComponentSettings();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        if (Array.isArray(this.settings)) {
            data["Settings"] = [];
            for (let item of this.settings)
                data["Settings"].push(item.toJSON());
        }
        super.toJSON(data);
        return data;
    }
}

export interface IComponentSettings extends IComponentSettingsBase {
    settings?: Setting[] | undefined;
}

export class ListItemType implements IListItemType {
    typeName?: string | undefined;
    typeDisplay?: DisplayAttribute | undefined;

    constructor(data?: IListItemType) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.typeName = _data["TypeName"];
            this.typeDisplay = _data["TypeDisplay"] ? DisplayAttribute.fromJS(_data["TypeDisplay"]) : <any>undefined;
        }
    }

    static fromJS(data: any): ListItemType {
        data = typeof data === 'object' ? data : {};
        let result = new ListItemType();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["TypeName"] = this.typeName;
        data["TypeDisplay"] = this.typeDisplay ? this.typeDisplay.toJSON() : <any>undefined;
        return data;
    }
}

export interface IListItemType {
    typeName?: string | undefined;
    typeDisplay?: DisplayAttribute | undefined;
}

export class ProfileGroup implements IProfileGroup {
    profiles?: string[] | undefined;
    currentProfile?: string | undefined;
    groupName?: string | undefined;

    constructor(data?: IProfileGroup) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            if (Array.isArray(_data["Profiles"])) {
                this.profiles = [] as any;
                for (let item of _data["Profiles"])
                    this.profiles!.push(item);
            }
            this.currentProfile = _data["CurrentProfile"];
            this.groupName = _data["GroupName"];
        }
    }

    static fromJS(data: any): ProfileGroup {
        data = typeof data === 'object' ? data : {};
        let result = new ProfileGroup();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        if (Array.isArray(this.profiles)) {
            data["Profiles"] = [];
            for (let item of this.profiles)
                data["Profiles"].push(item);
        }
        data["CurrentProfile"] = this.currentProfile;
        data["GroupName"] = this.groupName;
        return data;
    }
}

export interface IProfileGroup {
    profiles?: string[] | undefined;
    currentProfile?: string | undefined;
    groupName?: string | undefined;
}

export class RepositoryPackageReference implements IRepositoryPackageReference {
    name?: string | undefined;
    version?: string | undefined;
    repository?: string | undefined;
    path?: string | undefined;

    constructor(data?: IRepositoryPackageReference) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.name = _data["Name"];
            this.version = _data["Version"];
            this.repository = _data["Repository"];
            this.path = _data["Path"];
        }
    }

    static fromJS(data: any): RepositoryPackageReference {
        data = typeof data === 'object' ? data : {};
        let result = new RepositoryPackageReference();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Name"] = this.name;
        data["Version"] = this.version;
        data["Repository"] = this.repository;
        data["Path"] = this.path;
        return data;
    }
}

export interface IRepositoryPackageReference {
    name?: string | undefined;
    version?: string | undefined;
    repository?: string | undefined;
    path?: string | undefined;
}

export class RepositoryPackageDefinition extends RepositoryPackageReference implements IRepositoryPackageDefinition {
    tags?: string[] | undefined;

    constructor(data?: IRepositoryPackageDefinition) {
        super(data);
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            if (Array.isArray(_data["Tags"])) {
                this.tags = [] as any;
                for (let item of _data["Tags"])
                    this.tags!.push(item);
            }
        }
    }

    static fromJS(data: any): RepositoryPackageDefinition {
        data = typeof data === 'object' ? data : {};
        let result = new RepositoryPackageDefinition();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        if (Array.isArray(this.tags)) {
            data["Tags"] = [];
            for (let item of this.tags)
                data["Tags"].push(item);
        }
        super.toJSON(data);
        return data;
    }
}

export interface IRepositoryPackageDefinition extends IRepositoryPackageReference {
    tags?: string[] | undefined;
}

export class RepositorySettingsPackageDefinition extends RepositoryPackageDefinition implements IRepositorySettingsPackageDefinition {

    constructor(data?: IRepositorySettingsPackageDefinition) {
        super(data);
    }

    init(_data?: any) {
        super.init(_data);
    }

    static fromJS(data: any): RepositorySettingsPackageDefinition {
        data = typeof data === 'object' ? data : {};
        let result = new RepositorySettingsPackageDefinition();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        super.toJSON(data);
        return data;
    }
}

export interface IRepositorySettingsPackageDefinition extends IRepositoryPackageDefinition {
}

export class SettingsTapPackage implements ISettingsTapPackage {
    name?: string | undefined;
    version?: string | undefined;
    tags?: string | undefined;
    group?: string | undefined;
    owner?: string | undefined;
    infoLink?: string | undefined;
    description?: string | undefined;
    files?: string[] | undefined;
    settingsTypes?: string[] | undefined;

    constructor(data?: ISettingsTapPackage) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.name = _data["Name"];
            this.version = _data["Version"];
            this.tags = _data["Tags"];
            this.group = _data["Group"];
            this.owner = _data["Owner"];
            this.infoLink = _data["InfoLink"];
            this.description = _data["Description"];
            if (Array.isArray(_data["Files"])) {
                this.files = [] as any;
                for (let item of _data["Files"])
                    this.files!.push(item);
            }
            if (Array.isArray(_data["SettingsTypes"])) {
                this.settingsTypes = [] as any;
                for (let item of _data["SettingsTypes"])
                    this.settingsTypes!.push(item);
            }
        }
    }

    static fromJS(data: any): SettingsTapPackage {
        data = typeof data === 'object' ? data : {};
        let result = new SettingsTapPackage();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Name"] = this.name;
        data["Version"] = this.version;
        data["Tags"] = this.tags;
        data["Group"] = this.group;
        data["Owner"] = this.owner;
        data["InfoLink"] = this.infoLink;
        data["Description"] = this.description;
        if (Array.isArray(this.files)) {
            data["Files"] = [];
            for (let item of this.files)
                data["Files"].push(item);
        }
        if (Array.isArray(this.settingsTypes)) {
            data["SettingsTypes"] = [];
            for (let item of this.settingsTypes)
                data["SettingsTypes"].push(item);
        }
        return data;
    }
}

export interface ISettingsTapPackage {
    name?: string | undefined;
    version?: string | undefined;
    tags?: string | undefined;
    group?: string | undefined;
    owner?: string | undefined;
    infoLink?: string | undefined;
    description?: string | undefined;
    files?: string[] | undefined;
    settingsTypes?: string[] | undefined;
}

export class SessionEventArgs implements ISessionEventArgs {
    sessionId?: string;

    protected _discriminator: string;

    constructor(data?: ISessionEventArgs) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
        this._discriminator = "SessionEventArgs";
    }

    init(_data?: any) {
        if (_data) {
            this.sessionId = _data["SessionId"];
        }
    }

    static fromJS(data: any): SessionEventArgs {
        data = typeof data === 'object' ? data : {};
        if (data["SessionEventType"] === "SessionStartInitiated") {
            let result = new SessionStartInitiated();
            result.init(data);
            return result;
        }
        if (data["SessionEventType"] === "SessionStarted") {
            let result = new SessionStarted();
            result.init(data);
            return result;
        }
        if (data["SessionEventType"] === "SessionStartFailed") {
            let result = new SessionStartFailed();
            result.init(data);
            return result;
        }
        if (data["SessionEventType"] === "SessionShutdownInitiated") {
            let result = new SessionShutdownInitiated();
            result.init(data);
            return result;
        }
        if (data["SessionEventType"] === "SessionShutdown") {
            let result = new SessionShutdown();
            result.init(data);
            return result;
        }
        if (data["SessionEventType"] === "SessionShutdownFailed") {
            let result = new SessionShutdownFailed();
            result.init(data);
            return result;
        }
        if (data["SessionEventType"] === "SessionInactivityLimitHit") {
            let result = new SessionInactivityLimitHit();
            result.init(data);
            return result;
        }
        let result = new SessionEventArgs();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["SessionEventType"] = this._discriminator;
        data["SessionId"] = this.sessionId;
        return data;
    }
}

export interface ISessionEventArgs {
    sessionId?: string;
}

export class SessionStartInitiated extends SessionEventArgs implements ISessionStartInitiated {

    constructor(data?: ISessionStartInitiated) {
        super(data);
        this._discriminator = "SessionStartInitiated";
    }

    init(_data?: any) {
        super.init(_data);
    }

    static fromJS(data: any): SessionStartInitiated {
        data = typeof data === 'object' ? data : {};
        let result = new SessionStartInitiated();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        super.toJSON(data);
        return data;
    }
}

export interface ISessionStartInitiated extends ISessionEventArgs {
}

export class SessionStarted extends SessionEventArgs implements ISessionStarted {
    session?: Session | undefined;

    constructor(data?: ISessionStarted) {
        super(data);
        this._discriminator = "SessionStarted";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.session = _data["Session"] ? Session.fromJS(_data["Session"]) : <any>undefined;
        }
    }

    static fromJS(data: any): SessionStarted {
        data = typeof data === 'object' ? data : {};
        let result = new SessionStarted();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Session"] = this.session ? this.session.toJSON() : <any>undefined;
        super.toJSON(data);
        return data;
    }
}

export interface ISessionStarted extends ISessionEventArgs {
    session?: Session | undefined;
}

export class SessionStartFailed extends SessionEventArgs implements ISessionStartFailed {
    reason?: string | undefined;

    constructor(data?: ISessionStartFailed) {
        super(data);
        this._discriminator = "SessionStartFailed";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.reason = _data["Reason"];
        }
    }

    static fromJS(data: any): SessionStartFailed {
        data = typeof data === 'object' ? data : {};
        let result = new SessionStartFailed();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Reason"] = this.reason;
        super.toJSON(data);
        return data;
    }
}

export interface ISessionStartFailed extends ISessionEventArgs {
    reason?: string | undefined;
}

export class SessionShutdownInitiated extends SessionEventArgs implements ISessionShutdownInitiated {

    constructor(data?: ISessionShutdownInitiated) {
        super(data);
        this._discriminator = "SessionShutdownInitiated";
    }

    init(_data?: any) {
        super.init(_data);
    }

    static fromJS(data: any): SessionShutdownInitiated {
        data = typeof data === 'object' ? data : {};
        let result = new SessionShutdownInitiated();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        super.toJSON(data);
        return data;
    }
}

export interface ISessionShutdownInitiated extends ISessionEventArgs {
}

export class SessionShutdown extends SessionEventArgs implements ISessionShutdown {

    constructor(data?: ISessionShutdown) {
        super(data);
        this._discriminator = "SessionShutdown";
    }

    init(_data?: any) {
        super.init(_data);
    }

    static fromJS(data: any): SessionShutdown {
        data = typeof data === 'object' ? data : {};
        let result = new SessionShutdown();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        super.toJSON(data);
        return data;
    }
}

export interface ISessionShutdown extends ISessionEventArgs {
}

export class SessionShutdownFailed extends SessionEventArgs implements ISessionShutdownFailed {
    reason?: string | undefined;

    constructor(data?: ISessionShutdownFailed) {
        super(data);
        this._discriminator = "SessionShutdownFailed";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.reason = _data["Reason"];
        }
    }

    static fromJS(data: any): SessionShutdownFailed {
        data = typeof data === 'object' ? data : {};
        let result = new SessionShutdownFailed();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Reason"] = this.reason;
        super.toJSON(data);
        return data;
    }
}

export interface ISessionShutdownFailed extends ISessionEventArgs {
    reason?: string | undefined;
}

export class SessionInactivityLimitHit extends SessionEventArgs implements ISessionInactivityLimitHit {

    constructor(data?: ISessionInactivityLimitHit) {
        super(data);
        this._discriminator = "SessionInactivityLimitHit";
    }

    init(_data?: any) {
        super.init(_data);
    }

    static fromJS(data: any): SessionInactivityLimitHit {
        data = typeof data === 'object' ? data : {};
        let result = new SessionInactivityLimitHit();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        super.toJSON(data);
        return data;
    }
}

export interface ISessionInactivityLimitHit extends ISessionEventArgs {
}

export class ImageEventArgs implements IImageEventArgs {
    imageId?: string | undefined;

    protected _discriminator: string;

    constructor(data?: IImageEventArgs) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
        this._discriminator = "ImageEventArgs";
    }

    init(_data?: any) {
        if (_data) {
            this.imageId = _data["ImageId"];
        }
    }

    static fromJS(data: any): ImageEventArgs {
        data = typeof data === 'object' ? data : {};
        if (data["ImageEventType"] === "ImageCreating") {
            let result = new ImageCreating();
            result.init(data);
            return result;
        }
        if (data["ImageEventType"] === "ImageCreated") {
            let result = new ImageCreated();
            result.init(data);
            return result;
        }
        if (data["ImageEventType"] === "ImageCreationFailed") {
            let result = new ImageCreationFailed();
            result.init(data);
            return result;
        }
        let result = new ImageEventArgs();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["ImageEventType"] = this._discriminator;
        data["ImageId"] = this.imageId;
        return data;
    }
}

export interface IImageEventArgs {
    imageId?: string | undefined;
}

export class ImageCreating extends ImageEventArgs implements IImageCreating {

    constructor(data?: IImageCreating) {
        super(data);
        this._discriminator = "ImageCreating";
    }

    init(_data?: any) {
        super.init(_data);
    }

    static fromJS(data: any): ImageCreating {
        data = typeof data === 'object' ? data : {};
        let result = new ImageCreating();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        super.toJSON(data);
        return data;
    }
}

export interface IImageCreating extends IImageEventArgs {
}

export class ImageCreated extends ImageEventArgs implements IImageCreated {
    image?: Image | undefined;

    constructor(data?: IImageCreated) {
        super(data);
        this._discriminator = "ImageCreated";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.image = _data["Image"] ? Image.fromJS(_data["Image"]) : <any>undefined;
        }
    }

    static fromJS(data: any): ImageCreated {
        data = typeof data === 'object' ? data : {};
        let result = new ImageCreated();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Image"] = this.image ? this.image.toJSON() : <any>undefined;
        super.toJSON(data);
        return data;
    }
}

export interface IImageCreated extends IImageEventArgs {
    image?: Image | undefined;
}

export class ImageCreationFailed extends ImageEventArgs implements IImageCreationFailed {
    reason?: string | undefined;

    constructor(data?: IImageCreationFailed) {
        super(data);
        this._discriminator = "ImageCreationFailed";
    }

    init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.reason = _data["Reason"];
        }
    }

    static fromJS(data: any): ImageCreationFailed {
        data = typeof data === 'object' ? data : {};
        let result = new ImageCreationFailed();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Reason"] = this.reason;
        super.toJSON(data);
        return data;
    }
}

export interface IImageCreationFailed extends IImageEventArgs {
    reason?: string | undefined;
}

export interface FileParameter {
    data: any;
    fileName: string;
}

export interface FileResponse {
    data: Blob;
    status: number;
    fileName?: string;
    headers?: { [name: string]: any };
}

export class ApiException extends Error {
    message: string;
    status: number;
    response: string;
    headers: { [key: string]: any; };
    result: any;

    constructor(message: string, status: number, response: string, headers: { [key: string]: any; }, result: any) {
        super();

        this.message = message;
        this.status = status;
        this.response = response;
        this.headers = headers;
        this.result = result;
    }

    protected isApiException = true;

    static isApiException(obj: any): obj is ApiException {
        return obj.isApiException === true;
    }
}

function throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): any {
    if (result !== null && result !== undefined)
        throw result;
    else
        throw new ApiException(message, status, response, headers, null);
}

}