UNPKG

@dollhousemcp/mcp-server

Version:

DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.

100 lines 32.4 kB
/** * Type definitions for element-agnostic query services * * This module provides reusable interfaces for querying, filtering, sorting, * and paginating any element type in the DollhouseMCP system. * * Design Principles: * 1. Element-agnostic: Works with any T that extends IElement * 2. Composable: Services can be used independently or combined * 3. Consistent: Follows patterns from src/types/collection.ts * 4. Secure: All inputs require validation before use * * @see src/types/collection.ts for collection-specific pagination patterns * @see src/types/elements/IElement.ts for base element interface */ // ============================================================================ // Helper Types // ============================================================================ /** * Type guard to check if an element has required metadata for filtering * * @param element - Element to check * @returns True if element has valid metadata */ export function hasFilterableMetadata(element) { return (typeof element === 'object' && element !== null && 'metadata' in element && typeof element.metadata === 'object' && element.metadata !== null); } /** * Type guard to check if metadata has a specific field * * @param metadata - Metadata object * @param field - Field name to check * @returns True if field exists and is not undefined */ export function hasMetadataField(metadata, field) { return metadata[field] !== undefined; } /** * Safely extract an arbitrary metadata field value from an element. * * Replaces the unsafe double cast pattern: * `el.metadata as unknown as Record<string, unknown>` * * Handles both known IElementMetadata fields and arbitrary metadata * properties that element types may add (e.g., category on skills). * * @param element - Element to read from * @param field - Metadata field name to extract * @returns The field value, or undefined if the element lacks metadata or the field * * @example * ```typescript * const category = getMetadataField(element, 'category'); // unknown * const tags = getMetadataField(element, 'tags'); // unknown * ``` */ export function getMetadataField(element, field) { if (!hasFilterableMetadata(element)) { return undefined; } // IElementMetadata doesn't have an index signature, so we go through unknown // to safely access arbitrary metadata fields that element types may add. const metadata = element.metadata; return metadata[field]; } /** * Extract sortable value from element for a given field * * Safely extracts the value used for sorting, handling missing fields * and element-specific fields (like retention for memories). * * @param element - Element to extract value from * @param field - Field to extract * @returns Value to use for sorting, or undefined if not available */ export function extractSortValue(element, field) { switch (field) { case 'name': return element.metadata.name; case 'created': return element.metadata.created; case 'modified': return element.metadata.modified; case 'version': return element.metadata.version; case 'retention': // Element-specific field - check if element has it if ('retention' in element && typeof element.retention === 'string') { return element.retention; } return undefined; default: return undefined; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcXVlcnkvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFrbUJILCtFQUErRTtBQUMvRSxlQUFlO0FBQ2YsK0VBQStFO0FBRS9FOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE9BQWdCO0lBQ3BELE9BQU8sQ0FDTCxPQUFPLE9BQU8sS0FBSyxRQUFRO1FBQzNCLE9BQU8sS0FBSyxJQUFJO1FBQ2hCLFVBQVUsSUFBSSxPQUFPO1FBQ3JCLE9BQVEsT0FBZSxDQUFDLFFBQVEsS0FBSyxRQUFRO1FBQzVDLE9BQWUsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsUUFBMEIsRUFDMUIsS0FBUTtJQUVSLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUFpQixFQUFFLEtBQWE7SUFDL0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDcEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELDZFQUE2RTtJQUM3RSx5RUFBeUU7SUFDekUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQThDLENBQUM7SUFDeEUsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUFpQixFQUFFLEtBQW9CO0lBQ3RFLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLE1BQU07WUFDVCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQy9CLEtBQUssU0FBUztZQUNaLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDbEMsS0FBSyxVQUFVO1lBQ2IsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNuQyxLQUFLLFNBQVM7WUFDWixPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ2xDLEtBQUssV0FBVztZQUNkLG1EQUFtRDtZQUNuRCxJQUFJLFdBQVcsSUFBSSxPQUFPLElBQUksT0FBUSxPQUFlLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3RSxPQUFRLE9BQWUsQ0FBQyxTQUFTLENBQUM7WUFDcEMsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CO1lBQ0UsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGVsZW1lbnQtYWdub3N0aWMgcXVlcnkgc2VydmljZXNcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyByZXVzYWJsZSBpbnRlcmZhY2VzIGZvciBxdWVyeWluZywgZmlsdGVyaW5nLCBzb3J0aW5nLFxuICogYW5kIHBhZ2luYXRpbmcgYW55IGVsZW1lbnQgdHlwZSBpbiB0aGUgRG9sbGhvdXNlTUNQIHN5c3RlbS5cbiAqXG4gKiBEZXNpZ24gUHJpbmNpcGxlczpcbiAqIDEuIEVsZW1lbnQtYWdub3N0aWM6IFdvcmtzIHdpdGggYW55IFQgdGhhdCBleHRlbmRzIElFbGVtZW50XG4gKiAyLiBDb21wb3NhYmxlOiBTZXJ2aWNlcyBjYW4gYmUgdXNlZCBpbmRlcGVuZGVudGx5IG9yIGNvbWJpbmVkXG4gKiAzLiBDb25zaXN0ZW50OiBGb2xsb3dzIHBhdHRlcm5zIGZyb20gc3JjL3R5cGVzL2NvbGxlY3Rpb24udHNcbiAqIDQuIFNlY3VyZTogQWxsIGlucHV0cyByZXF1aXJlIHZhbGlkYXRpb24gYmVmb3JlIHVzZVxuICpcbiAqIEBzZWUgc3JjL3R5cGVzL2NvbGxlY3Rpb24udHMgZm9yIGNvbGxlY3Rpb24tc3BlY2lmaWMgcGFnaW5hdGlvbiBwYXR0ZXJuc1xuICogQHNlZSBzcmMvdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQudHMgZm9yIGJhc2UgZWxlbWVudCBpbnRlcmZhY2VcbiAqL1xuXG5pbXBvcnQgeyBJRWxlbWVudCwgSUVsZW1lbnRNZXRhZGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGFnaW5hdGlvbiBUeXBlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFBhZ2luYXRpb24gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKlxuICogRm9sbG93cyBjb2xsZWN0aW9uLnRzIHBhdHRlcm5zOlxuICogLSAxLWluZGV4ZWQgcGFnZXMgKHBhZ2UgMSBpcyBmaXJzdCBwYWdlKVxuICogLSBEZWZhdWx0IHBhZ2VTaXplIG9mIDIwIChJc3N1ZSAjMjk5KVxuICogLSBNYXhpbXVtIHBhZ2VTaXplIGVuZm9yY2VkIGJ5IGltcGxlbWVudGF0aW9uc1xuICpcbiAqIFNFQ1VSSVRZOiBWYWxpZGF0ZSBwYWdlIGFuZCBwYWdlU2l6ZSBiZWZvcmUgdXNlIHRvIHByZXZlbnQ6XG4gKiAtIE5lZ2F0aXZlIHBhZ2UgbnVtYmVyc1xuICogLSBaZXJvIG9yIG5lZ2F0aXZlIHBhZ2Ugc2l6ZXNcbiAqIC0gRXhjZXNzaXZlbHkgbGFyZ2UgcGFnZSBzaXplcyAoRG9TIHJpc2spXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogUGFnZSBudW1iZXIgKDEtaW5kZXhlZClcbiAgICogQGRlZmF1bHQgMVxuICAgKiBAbWluaW11bSAxXG4gICAqL1xuICBwYWdlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgaXRlbXMgcGVyIHBhZ2VcbiAgICogQGRlZmF1bHQgMjBcbiAgICogQG1pbmltdW0gMVxuICAgKiBAbWF4aW11bSBJbXBsZW1lbnRhdGlvbi1kZWZpbmVkICh0eXBpY2FsbHkgMTAwKVxuICAgKi9cbiAgcGFnZVNpemU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFnaW5hdGlvbiBtZXRhZGF0YSByZXR1cm5lZCB3aXRoIHF1ZXJ5IHJlc3VsdHNcbiAqXG4gKiBQcm92aWRlcyBjb21wbGV0ZSBwYWdpbmF0aW9uIHN0YXRlIHRvIGVuYWJsZTpcbiAqIC0gVUkgcGFnaW5hdGlvbiBjb250cm9sc1xuICogLSBOZXh0L3ByZXZpb3VzIHBhZ2UgbmF2aWdhdGlvblxuICogLSBUb3RhbCByZXN1bHQgc2V0IHNpemUgYXdhcmVuZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvbk1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIEN1cnJlbnQgcGFnZSBudW1iZXIgKDEtaW5kZXhlZClcbiAgICovXG4gIHBhZ2U6IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGl0ZW1zIHBlciBwYWdlXG4gICAqL1xuICBwYWdlU2l6ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUb3RhbCBudW1iZXIgb2YgaXRlbXMgYWNyb3NzIGFsbCBwYWdlc1xuICAgKi9cbiAgdG90YWxJdGVtczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUb3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICovXG4gIHRvdGFsUGFnZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGVyZSBpcyBhIG5leHQgcGFnZSBhdmFpbGFibGVcbiAgICovXG4gIGhhc05leHRQYWdlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZXJlIGlzIGEgcHJldmlvdXMgcGFnZSBhdmFpbGFibGVcbiAgICovXG4gIGhhc1ByZXZQYWdlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEdlbmVyaWMgcGFnaW5hdGVkIHJlc3VsdCBjb250YWluZXJcbiAqXG4gKiBXcmFwcyBhbnkgYXJyYXkgb2YgaXRlbXMgd2l0aCBwYWdpbmF0aW9uIG1ldGFkYXRhLlxuICogVXNlZCBhcyBiYXNlIHR5cGUgZm9yIG1vcmUgc3BlY2lmaWMgcmVzdWx0IHR5cGVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVHlwZSBvZiBpdGVtcyBpbiB0aGUgcmVzdWx0IHNldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRlZFJlc3VsdDxUPiB7XG4gIC8qKlxuICAgKiBJdGVtcyBmb3IgdGhlIGN1cnJlbnQgcGFnZVxuICAgKi9cbiAgaXRlbXM6IFRbXTtcblxuICAvKipcbiAgICogUGFnaW5hdGlvbiBtZXRhZGF0YVxuICAgKi9cbiAgcGFnaW5hdGlvbjogUGFnaW5hdGlvbk1ldGFkYXRhO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGaWx0ZXJpbmcgVHlwZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBGaWx0ZXIgY3JpdGVyaWEgZm9yIHF1ZXJ5aW5nIGVsZW1lbnRzXG4gKlxuICogQWxsIGNyaXRlcmlhIGFyZSBvcHRpb25hbCBhbmQgY29tYmluZWQgd2l0aCBBTkQgbG9naWMgd2hlbiBtdWx0aXBsZVxuICogZmlsdGVycyBhcmUgc3BlY2lmaWVkIChleGNlcHQgdGFnc0FueSB3aGljaCB1c2VzIE9SKS5cbiAqXG4gKiBTRUNVUklUWSBOT1RFUzpcbiAqIDEuIEFsbCBzdHJpbmcgaW5wdXRzIE1VU1QgYmUgc2FuaXRpemVkIHRvIHByZXZlbnQgaW5qZWN0aW9uIGF0dGFja3NcbiAqIDIuIERhdGUgaW5wdXRzIE1VU1QgYmUgdmFsaWRhdGVkIHRvIGVuc3VyZSB2YWxpZCBJU08gODYwMSBmb3JtYXRcbiAqIDMuIFRhZyBhcnJheXMgTVVTVCBiZSB2YWxpZGF0ZWQgdG8gcHJldmVudCBhcnJheSBtYW5pcHVsYXRpb24gYXR0YWNrc1xuICogNC4gU3RhdHVzIHZhbHVlcyBNVVNUIGJlIHZhbGlkYXRlZCBhZ2FpbnN0IEVsZW1lbnRTdGF0dXMgZW51bVxuICpcbiAqIEBleGFtcGxlXG4gKiB7XG4gKiAgIG5hbWVDb250YWluczogJ2NvZGUgcmV2aWV3JyxcbiAqICAgdGFnczogWyd0eXBlc2NyaXB0JywgJ2xpbnRpbmcnXSwgIC8vIEFORCBsb2dpYzogaGFzIGJvdGggdGFnc1xuICogICB0YWdzQW55OiBbJ2phdmFzY3JpcHQnLCAncHl0aG9uJ10sIC8vIE9SIGxvZ2ljOiBoYXMgZWl0aGVyIHRhZ1xuICogICBhdXRob3I6ICdhbGljZScsXG4gKiAgIGNyZWF0ZWRBZnRlcjogJzIwMjQtMDEtMDFUMDA6MDA6MDBaJyxcbiAqICAgc3RhdHVzOiAnYWN0aXZlJ1xuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNyaXRlcmlhIHtcbiAgLyoqXG4gICAqIEZpbHRlciBieSBwYXJ0aWFsIG5hbWUgbWF0Y2ggKGNhc2UtaW5zZW5zaXRpdmUpXG4gICAqIEltcGxlbWVudGF0aW9uIHNob3VsZCB1c2UgZnV6enkgbWF0Y2hpbmcgb3IgY29udGFpbnMgbG9naWNcbiAgICpcbiAgICogU0VDVVJJVFk6IFNhbml0aXplIGlucHV0LCBsaW1pdCBsZW5ndGggdG8gcHJldmVudCBSZURvU1xuICAgKi9cbiAgbmFtZUNvbnRhaW5zPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgdGFncyAoQU5EIGxvZ2ljIC0gZWxlbWVudCBtdXN0IGhhdmUgQUxMIHNwZWNpZmllZCB0YWdzKVxuICAgKlxuICAgKiBTRUNVUklUWTogVmFsaWRhdGUgZWFjaCB0YWcgc3RyaW5nLCBsaW1pdCBhcnJheSBzaXplXG4gICAqL1xuICB0YWdzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSB0YWdzIChPUiBsb2dpYyAtIGVsZW1lbnQgbXVzdCBoYXZlIEFOWSBvZiB0aGUgc3BlY2lmaWVkIHRhZ3MpXG4gICAqXG4gICAqIFNFQ1VSSVRZOiBWYWxpZGF0ZSBlYWNoIHRhZyBzdHJpbmcsIGxpbWl0IGFycmF5IHNpemVcbiAgICovXG4gIHRhZ3NBbnk/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRmlsdGVyIGJ5IGF1dGhvciB1c2VybmFtZVxuICAgKlxuICAgKiBTRUNVUklUWTogU2FuaXRpemUgaW5wdXQsIHZhbGlkYXRlIGFnYWluc3QgdXNlcm5hbWUgcGF0dGVyblxuICAgKi9cbiAgYXV0aG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgZm9yIGVsZW1lbnRzIGNyZWF0ZWQgYWZ0ZXIgdGhpcyBkYXRlIChpbmNsdXNpdmUpXG4gICAqXG4gICAqIFNFQ1VSSVRZOiBWYWxpZGF0ZSBJU08gODYwMSBmb3JtYXQsIGVuc3VyZSB2YWxpZCBkYXRlXG4gICAqIEBmb3JtYXQgSVNPIDg2MDEgZGF0ZS10aW1lIHN0cmluZ1xuICAgKi9cbiAgY3JlYXRlZEFmdGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgZm9yIGVsZW1lbnRzIGNyZWF0ZWQgYmVmb3JlIHRoaXMgZGF0ZSAoaW5jbHVzaXZlKVxuICAgKlxuICAgKiBTRUNVUklUWTogVmFsaWRhdGUgSVNPIDg2MDEgZm9ybWF0LCBlbnN1cmUgdmFsaWQgZGF0ZVxuICAgKiBAZm9ybWF0IElTTyA4NjAxIGRhdGUtdGltZSBzdHJpbmdcbiAgICovXG4gIGNyZWF0ZWRCZWZvcmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBlbGVtZW50IHN0YXR1c1xuICAgKiAtICdhY3RpdmUnOiBPbmx5IGFjdGl2ZSBlbGVtZW50c1xuICAgKiAtICdpbmFjdGl2ZSc6IE9ubHkgaW5hY3RpdmUgZWxlbWVudHNcbiAgICogLSAnYWxsJzogQWxsIGVsZW1lbnRzIHJlZ2FyZGxlc3Mgb2Ygc3RhdHVzIChkZWZhdWx0KVxuICAgKlxuICAgKiBTRUNVUklUWTogVmFsaWRhdGUgYWdhaW5zdCBFbGVtZW50U3RhdHVzIGVudW0gdmFsdWVzXG4gICAqL1xuICBzdGF0dXM/OiAnYWN0aXZlJyB8ICdpbmFjdGl2ZScgfCAnYWxsJztcblxuICAvKipcbiAgICogRmlsdGVyIGJ5IHBhcnRpYWwgZGVzY3JpcHRpb24gbWF0Y2ggKGNhc2UtaW5zZW5zaXRpdmUgc3Vic3RyaW5nKVxuICAgKlxuICAgKiBTRUNVUklUWTogU2FuaXRpemUgaW5wdXQsIGxpbWl0IGxlbmd0aCB0byBwcmV2ZW50IFJlRG9TXG4gICAqL1xuICBkZXNjcmlwdGlvbkNvbnRhaW5zPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgY2F0ZWdvcnkgKGNhc2UtaW5zZW5zaXRpdmUgZXhhY3QgbWF0Y2ggb24gbWV0YWRhdGEuY2F0ZWdvcnkpXG4gICAqXG4gICAqIFNFQ1VSSVRZOiBTYW5pdGl6ZSBpbnB1dCwgbGltaXQgbGVuZ3RoXG4gICAqL1xuICBjYXRlZ29yeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcHBsaWVkIGZpbHRlciBzdW1tYXJ5IGZvciBxdWVyeSByZXN1bHRzXG4gKlxuICogUmVwb3J0cyB3aGljaCBmaWx0ZXJzIHdlcmUgYWN0dWFsbHkgYXBwbGllZCB0byBoZWxwIHVzZXJzXG4gKiB1bmRlcnN0YW5kIHRoZSByZXN1bHQgc2V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpZWRGaWx0ZXJzIHtcbiAgLyoqXG4gICAqIE5hbWUgZmlsdGVyIHRoYXQgd2FzIGFwcGxpZWRcbiAgICovXG4gIG5hbWVDb250YWlucz86IHN0cmluZztcblxuICAvKipcbiAgICogVGFncyB0aGF0IHdlcmUgcmVxdWlyZWQgKEFORCBsb2dpYylcbiAgICovXG4gIHRhZ3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGFncyB3aGVyZSBhbnkgbWF0Y2ggd2FzIHJlcXVpcmVkIChPUiBsb2dpYylcbiAgICovXG4gIHRhZ3NBbnk/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQXV0aG9yIGZpbHRlciB0aGF0IHdhcyBhcHBsaWVkXG4gICAqL1xuICBhdXRob3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZWQgYWZ0ZXIgZGF0ZSBmaWx0ZXJcbiAgICovXG4gIGNyZWF0ZWRBZnRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlZCBiZWZvcmUgZGF0ZSBmaWx0ZXJcbiAgICovXG4gIGNyZWF0ZWRCZWZvcmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFN0YXR1cyBmaWx0ZXIgdGhhdCB3YXMgYXBwbGllZFxuICAgKi9cbiAgc3RhdHVzPzogJ2FjdGl2ZScgfCAnaW5hY3RpdmUnIHwgJ2FsbCc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIGZpbHRlciB0aGF0IHdhcyBhcHBsaWVkXG4gICAqL1xuICBkZXNjcmlwdGlvbkNvbnRhaW5zPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDYXRlZ29yeSBmaWx0ZXIgdGhhdCB3YXMgYXBwbGllZFxuICAgKi9cbiAgY2F0ZWdvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvdGFsIG51bWJlciBvZiBmaWx0ZXJzIGFwcGxpZWRcbiAgICovXG4gIGNvdW50OiBudW1iZXI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNvcnRpbmcgVHlwZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTb3J0IG9yZGVyIGRpcmVjdGlvblxuICovXG5leHBvcnQgdHlwZSBTb3J0T3JkZXIgPSAnYXNjJyB8ICdkZXNjJztcblxuLyoqXG4gKiBGaWVsZHMgYXZhaWxhYmxlIGZvciBzb3J0aW5nXG4gKlxuICogU3RhbmRhcmQgZmllbGRzIGF2YWlsYWJsZSBvbiBhbGwgZWxlbWVudHM6XG4gKiAtIG5hbWU6IEVsZW1lbnQgbmFtZSAoZnJvbSBtZXRhZGF0YSlcbiAqIC0gY3JlYXRlZDogQ3JlYXRpb24gdGltZXN0YW1wIChmcm9tIG1ldGFkYXRhKVxuICogLSBtb2RpZmllZDogTGFzdCBtb2RpZmljYXRpb24gdGltZXN0YW1wIChmcm9tIG1ldGFkYXRhKVxuICogLSB2ZXJzaW9uOiBTZW1hbnRpYyB2ZXJzaW9uIChmcm9tIG1ldGFkYXRhKVxuICpcbiAqIEVsZW1lbnQtc3BlY2lmaWMgZmllbGRzOlxuICogLSByZXRlbnRpb246IE1lbW9yeS1zcGVjaWZpYyByZXRlbnRpb24gcG9saWN5IGZpZWxkXG4gKlxuICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBoYW5kbGUgbWlzc2luZyBmaWVsZHMgZ3JhY2VmdWxseVxuICogKGUuZy4sIHNvcnQgbnVsbHMgbGFzdCkuXG4gKi9cbmV4cG9ydCB0eXBlIFNvcnRhYmxlRmllbGQgPSAnbmFtZScgfCAnY3JlYXRlZCcgfCAnbW9kaWZpZWQnIHwgJ3ZlcnNpb24nIHwgJ3JldGVudGlvbic7XG5cbi8qKlxuICogU29ydGluZyBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqXG4gKiBTRUNVUklUWTogVmFsaWRhdGUgc29ydEJ5IGFnYWluc3QgU29ydGFibGVGaWVsZCBlbnVtIHRvIHByZXZlbnRcbiAqIGFyYml0cmFyeSBmaWVsZCBhY2Nlc3Mgb3IgaW5qZWN0aW9uIGF0dGFja3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29ydE9wdGlvbnMge1xuICAvKipcbiAgICogRmllbGQgdG8gc29ydCBieVxuICAgKiBAZGVmYXVsdCAnbmFtZSdcbiAgICovXG4gIHNvcnRCeT86IFNvcnRhYmxlRmllbGQ7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgZGlyZWN0aW9uXG4gICAqIEBkZWZhdWx0ICdhc2MnXG4gICAqL1xuICBzb3J0T3JkZXI/OiBTb3J0T3JkZXI7XG59XG5cbi8qKlxuICogQXBwbGllZCBzb3J0aW5nIG1ldGFkYXRhIGZvciBxdWVyeSByZXN1bHRzXG4gKlxuICogUmVwb3J0cyB0aGUgYWN0dWFsIHNvcnRpbmcgdGhhdCB3YXMgYXBwbGllZCB0byB0aGUgcmVzdWx0IHNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWVkU29ydGluZyB7XG4gIC8qKlxuICAgKiBGaWVsZCB0aGF0IHdhcyB1c2VkIGZvciBzb3J0aW5nXG4gICAqL1xuICBzb3J0Qnk6IFNvcnRhYmxlRmllbGQ7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgdGhhdCB3YXMgYXBwbGllZFxuICAgKi9cbiAgc29ydE9yZGVyOiBTb3J0T3JkZXI7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbWJpbmVkIFF1ZXJ5IFR5cGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQWdncmVnYXRpb24gb3B0aW9ucyBmb3IgY291bnQvZ3JvdXBfYnkgcXVlcmllcyAoSXNzdWUgIzMwOSkuXG4gKiBXaGVuIHByZXNlbnQsIHRoZSBxdWVyeSByZXR1cm5zIGFnZ3JlZ2F0aW9uIHJlc3VsdHMgaW5zdGVhZCBvZiBwYWdpbmF0ZWQgaXRlbXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdncmVnYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHJldHVybiBvbmx5IHRoZSBjb3VudCBvZiBtYXRjaGluZyBlbGVtZW50cyAobm8gaXRlbXMpLlxuICAgKi9cbiAgY291bnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHcm91cCByZXN1bHRzIGJ5IGEgbWV0YWRhdGEgZmllbGQgKGUuZy4sICdjYXRlZ29yeScsICdhdXRob3InLCAndGFncycpLlxuICAgKiBSZXR1cm5zIGEgUmVjb3JkPHN0cmluZywgbnVtYmVyPiBtYXBwaW5nIGZpZWxkIHZhbHVlcyB0byBjb3VudHMuXG4gICAqL1xuICBncm91cF9ieT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21wbGV0ZSBxdWVyeSBvcHRpb25zIGNvbWJpbmluZyBwYWdpbmF0aW9uLCBmaWx0ZXJpbmcsIGFuZCBzb3J0aW5nXG4gKlxuICogQWxsIG9wdGlvbnMgYXJlIG9wdGlvbmFsLiBEZWZhdWx0czpcbiAqIC0gUGFnaW5hdGlvbjogcGFnZT0xLCBwYWdlU2l6ZT0yMFxuICogLSBGaWx0ZXJzOiBub25lIGFwcGxpZWRcbiAqIC0gU29ydDogc29ydEJ5PSduYW1lJywgc29ydE9yZGVyPSdhc2MnXG4gKiAtIEFnZ3JlZ2F0ZTogbm9uZSAocmV0dXJucyBpdGVtcykuIFdoZW4gc2V0LCByZXR1cm5zIGNvdW50L2dyb3VwcyBpbnN0ZWFkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBQYWdpbmF0ZWQgbGlzdGluZ1xuICogeyBwYWdpbmF0aW9uOiB7IHBhZ2U6IDIsIHBhZ2VTaXplOiAxMCB9LCBmaWx0ZXJzOiB7IHRhZ3M6IFsndHlwZXNjcmlwdCddIH0sIHNvcnQ6IHsgc29ydEJ5OiAnbW9kaWZpZWQnLCBzb3J0T3JkZXI6ICdkZXNjJyB9IH1cbiAqXG4gKiAvLyBDb3VudCBhZ2dyZWdhdGlvblxuICogeyBhZ2dyZWdhdGU6IHsgY291bnQ6IHRydWUgfSB9XG4gKlxuICogLy8gR3JvdXBlZCBjb3VudFxuICogeyBhZ2dyZWdhdGU6IHsgY291bnQ6IHRydWUsIGdyb3VwX2J5OiAnY2F0ZWdvcnknIH0sIGZpbHRlcnM6IHsgc3RhdHVzOiAnYWN0aXZlJyB9IH1cbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQYWdpbmF0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHBhZ2luYXRpb24/OiBQYWdpbmF0aW9uT3B0aW9ucztcblxuICAvKipcbiAgICogRmlsdGVyIGNyaXRlcmlhXG4gICAqL1xuICBmaWx0ZXJzPzogRmlsdGVyQ3JpdGVyaWE7XG5cbiAgLyoqXG4gICAqIFNvcnRpbmcgY29uZmlndXJhdGlvblxuICAgKi9cbiAgc29ydD86IFNvcnRPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBBZ2dyZWdhdGlvbiBvcHRpb25zIChJc3N1ZSAjMzA5KS5cbiAgICogV2hlbiBwcmVzZW50LCByZXR1cm5zIGNvdW50L2dyb3VwX2J5IHJlc3VsdHMgaW5zdGVhZCBvZiBwYWdpbmF0ZWQgaXRlbXMuXG4gICAqL1xuICBhZ2dyZWdhdGU/OiBBZ2dyZWdhdGlvbk9wdGlvbnM7XG59XG5cbi8qKlxuICogQ29tcGxldGUgcXVlcnkgcmVzdWx0IHdpdGggaXRlbXMsIHBhZ2luYXRpb24sIHNvcnRpbmcsIGFuZCBmaWx0ZXIgbWV0YWRhdGFcbiAqXG4gKiBFeHRlbmRzIFBhZ2luYXRlZFJlc3VsdCB3aXRoIGFkZGl0aW9uYWwgY29udGV4dCBhYm91dCB0aGUgcXVlcnlcbiAqIHRoYXQgd2FzIGV4ZWN1dGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVHlwZSBvZiBpdGVtcyBpbiB0aGUgcmVzdWx0IHNldCAobXVzdCBleHRlbmQgSUVsZW1lbnQpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlSZXN1bHQ8VCBleHRlbmRzIElFbGVtZW50PiBleHRlbmRzIFBhZ2luYXRlZFJlc3VsdDxUPiB7XG4gIC8qKlxuICAgKiBTb3J0aW5nIHRoYXQgd2FzIGFwcGxpZWRcbiAgICovXG4gIHNvcnRpbmc6IEFwcGxpZWRTb3J0aW5nO1xuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHRoYXQgd2VyZSBhcHBsaWVkXG4gICAqL1xuICBmaWx0ZXJzOiB7XG4gICAgLyoqXG4gICAgICogU3VtbWFyeSBvZiBhcHBsaWVkIGZpbHRlcnNcbiAgICAgKi9cbiAgICBhcHBsaWVkOiBBcHBsaWVkRmlsdGVycztcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2VydmljZSBJbnRlcmZhY2VzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2VydmljZSBpbnRlcmZhY2UgZm9yIHBhZ2luYXRpb24gb3BlcmF0aW9uc1xuICpcbiAqIFByb3ZpZGVzIHV0aWxpdGllcyB0byBwYWdpbmF0ZSBhbnkgYXJyYXkgb2YgaXRlbXMgd2l0aCBjb25zaXN0ZW50XG4gKiBiZWhhdmlvciBhY3Jvc3MgdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEltcGxlbWVudGF0aW9uIHJlcXVpcmVtZW50czpcbiAqIC0gVmFsaWRhdGUgcGFnaW5hdGlvbiBvcHRpb25zXG4gKiAtIEhhbmRsZSBlbXB0eSBhcnJheXMgZ3JhY2VmdWxseVxuICogLSBSZXR1cm4gYWNjdXJhdGUgbWV0YWRhdGFcbiAqIC0gVXNlIDEtaW5kZXhlZCBwYWdlc1xuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVHlwZSBvZiBpdGVtcyBiZWluZyBwYWdpbmF0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUGFnaW5hdGlvblNlcnZpY2U8VD4ge1xuICAvKipcbiAgICogUGFnaW5hdGUgYW4gYXJyYXkgb2YgaXRlbXNcbiAgICpcbiAgICogQHBhcmFtIGl0ZW1zIC0gQ29tcGxldGUgYXJyYXkgb2YgaXRlbXMgdG8gcGFnaW5hdGVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBQYWdpbmF0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybnMgUGFnaW5hdGVkIHJlc3VsdCB3aXRoIG1ldGFkYXRhXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBwYWdpbmF0aW9uIG9wdGlvbnMgYXJlIGludmFsaWRcbiAgICovXG4gIHBhZ2luYXRlKGl0ZW1zOiBUW10sIG9wdGlvbnM/OiBQYWdpbmF0aW9uT3B0aW9ucyk6IFBhZ2luYXRlZFJlc3VsdDxUPjtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHBhZ2luYXRpb24gbWV0YWRhdGEgd2l0aG91dCByZXR1cm5pbmcgaXRlbXNcbiAgICpcbiAgICogVXNlZnVsIGZvciBBUEkgcmVzcG9uc2VzIHdoZXJlIHlvdSBuZWVkIG1ldGFkYXRhIGJ1dCBhbHJlYWR5XG4gICAqIGhhdmUgdGhlIGl0ZW1zLlxuICAgKlxuICAgKiBAcGFyYW0gdG90YWxJdGVtcyAtIFRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiBmdWxsIHJlc3VsdCBzZXRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBQYWdpbmF0aW9uIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybnMgUGFnaW5hdGlvbiBtZXRhZGF0YSBvbmx5XG4gICAqL1xuICBjYWxjdWxhdGVNZXRhZGF0YSh0b3RhbEl0ZW1zOiBudW1iZXIsIG9wdGlvbnM/OiBQYWdpbmF0aW9uT3B0aW9ucyk6IFBhZ2luYXRpb25NZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGludGVyZmFjZSBmb3IgZmlsdGVyaW5nIG9wZXJhdGlvbnNcbiAqXG4gKiBQcm92aWRlcyB1dGlsaXRpZXMgdG8gZmlsdGVyIGFycmF5cyBvZiBlbGVtZW50cyBiYXNlZCBvbiBtZXRhZGF0YVxuICogYW5kIG90aGVyIGNyaXRlcmlhLlxuICpcbiAqIEltcGxlbWVudGF0aW9uIHJlcXVpcmVtZW50czpcbiAqIC0gU2FuaXRpemUgYWxsIGZpbHRlciBpbnB1dHNcbiAqIC0gU3VwcG9ydCBwYXJ0aWFsIG1hdGNoZXMgZm9yIG5hbWVcbiAqIC0gSGFuZGxlIG1pc3NpbmcgbWV0YWRhdGEgZmllbGRzIGdyYWNlZnVsbHlcbiAqIC0gQ29tYmluZSBtdWx0aXBsZSBmaWx0ZXJzIHdpdGggQU5EIGxvZ2ljIChleGNlcHQgdGFnc0FueSlcbiAqIC0gUmV0dXJuIGVtcHR5IGFycmF5IGlmIG5vIGl0ZW1zIG1hdGNoXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUeXBlIG9mIGl0ZW1zIGJlaW5nIGZpbHRlcmVkIChtdXN0IGV4dGVuZCBJRWxlbWVudClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRmlsdGVyU2VydmljZTxUIGV4dGVuZHMgSUVsZW1lbnQ+IHtcbiAgLyoqXG4gICAqIEZpbHRlciBhbiBhcnJheSBvZiBlbGVtZW50cyBiYXNlZCBvbiBjcml0ZXJpYVxuICAgKlxuICAgKiBAcGFyYW0gaXRlbXMgLSBBcnJheSBvZiBlbGVtZW50cyB0byBmaWx0ZXJcbiAgICogQHBhcmFtIGNyaXRlcmlhIC0gRmlsdGVyIGNyaXRlcmlhIHRvIGFwcGx5XG4gICAqIEByZXR1cm5zIEZpbHRlcmVkIGFycmF5IChtYXkgYmUgZW1wdHkpXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBmaWx0ZXIgY3JpdGVyaWEgY29udGFpbiBpbnZhbGlkIHZhbHVlc1xuICAgKi9cbiAgZmlsdGVyKGl0ZW1zOiBUW10sIGNyaXRlcmlhPzogRmlsdGVyQ3JpdGVyaWEpOiBUW107XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgc3VtbWFyeSBvZiB3aGljaCBmaWx0ZXJzIHdpbGwgYmUgYXBwbGllZFxuICAgKlxuICAgKiBVc2VmdWwgZm9yIGxvZ2dpbmcgYW5kIGRlYnVnZ2luZyBxdWVyeSBleGVjdXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjcml0ZXJpYSAtIEZpbHRlciBjcml0ZXJpYVxuICAgKiBAcmV0dXJucyBTdW1tYXJ5IG9mIGFwcGxpY2FibGUgZmlsdGVyc1xuICAgKi9cbiAgc3VtbWFyaXplRmlsdGVycyhjcml0ZXJpYT86IEZpbHRlckNyaXRlcmlhKTogQXBwbGllZEZpbHRlcnM7XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGZpbHRlciBjcml0ZXJpYSB3aXRob3V0IGFwcGx5aW5nIHRoZW1cbiAgICpcbiAgICogQHBhcmFtIGNyaXRlcmlhIC0gRmlsdGVyIGNyaXRlcmlhIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFRydWUgaWYgY3JpdGVyaWEgYXJlIHZhbGlkXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBjcml0ZXJpYSBhcmUgaW52YWxpZFxuICAgKi9cbiAgdmFsaWRhdGVDcml0ZXJpYShjcml0ZXJpYT86IEZpbHRlckNyaXRlcmlhKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGludGVyZmFjZSBmb3Igc29ydGluZyBvcGVyYXRpb25zXG4gKlxuICogUHJvdmlkZXMgdXRpbGl0aWVzIHRvIHNvcnQgYXJyYXlzIG9mIGVsZW1lbnRzIGJ5IHZhcmlvdXMgZmllbGRzLlxuICpcbiAqIEltcGxlbWVudGF0aW9uIHJlcXVpcmVtZW50czpcbiAqIC0gVmFsaWRhdGUgc29ydCBvcHRpb25zXG4gKiAtIEhhbmRsZSBtaXNzaW5nIGZpZWxkIHZhbHVlcyAoc29ydCBudWxscyBsYXN0KVxuICogLSBTdXBwb3J0IGNhc2UtaW5zZW5zaXRpdmUgc3RyaW5nIHNvcnRpbmdcbiAqIC0gU3VwcG9ydCBzZW1hbnRpYyB2ZXJzaW9uIHNvcnRpbmdcbiAqIC0gU3VwcG9ydCBJU08gODYwMSBkYXRlIHNvcnRpbmdcbiAqIC0gTWFpbnRhaW4gc3RhYmxlIHNvcnQgb3JkZXJcbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFR5cGUgb2YgaXRlbXMgYmVpbmcgc29ydGVkIChtdXN0IGV4dGVuZCBJRWxlbWVudClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU29ydFNlcnZpY2U8VCBleHRlbmRzIElFbGVtZW50PiB7XG4gIC8qKlxuICAgKiBTb3J0IGFuIGFycmF5IG9mIGVsZW1lbnRzXG4gICAqXG4gICAqIEBwYXJhbSBpdGVtcyAtIEFycmF5IG9mIGVsZW1lbnRzIHRvIHNvcnRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBTb3J0aW5nIGNvbmZpZ3VyYXRpb25cbiAgICogQHJldHVybnMgU29ydGVkIGFycmF5IChkb2VzIG5vdCBtdXRhdGUgb3JpZ2luYWwpXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBzb3J0IG9wdGlvbnMgYXJlIGludmFsaWRcbiAgICovXG4gIHNvcnQoaXRlbXM6IFRbXSwgb3B0aW9ucz86IFNvcnRPcHRpb25zKTogVFtdO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgc29ydGluZyBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEByZXR1cm5zIERlZmF1bHQgc29ydCBvcHRpb25zXG4gICAqL1xuICBnZXREZWZhdWx0U29ydGluZygpOiBBcHBsaWVkU29ydGluZztcblxuICAvKipcbiAgICogVmFsaWRhdGUgc29ydCBvcHRpb25zIHdpdGhvdXQgYXBwbHlpbmcgdGhlbVxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFNvcnQgb3B0aW9ucyB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBUcnVlIGlmIG9wdGlvbnMgYXJlIHZhbGlkXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBvcHRpb25zIGFyZSBpbnZhbGlkXG4gICAqL1xuICB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucz86IFNvcnRPcHRpb25zKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb21iaW5lZCBzZXJ2aWNlIGludGVyZmFjZSBmb3IgZWxlbWVudCBxdWVyeWluZ1xuICpcbiAqIE9yY2hlc3RyYXRlcyBwYWdpbmF0aW9uLCBmaWx0ZXJpbmcsIGFuZCBzb3J0aW5nIGludG8gYSBzaW5nbGVcbiAqIGNvaGVzaXZlIHF1ZXJ5IG9wZXJhdGlvbi5cbiAqXG4gKiBJbXBsZW1lbnRhdGlvbiByZXF1aXJlbWVudHM6XG4gKiAtIFZhbGlkYXRlIGFsbCBxdWVyeSBvcHRpb25zXG4gKiAtIEFwcGx5IG9wZXJhdGlvbnMgaW4gY29ycmVjdCBvcmRlcjogZmlsdGVyIOKGkiBzb3J0IOKGkiBwYWdpbmF0ZVxuICogLSBSZXR1cm4gY29tcGxldGUgcXVlcnkgcmVzdWx0IHdpdGggbWV0YWRhdGFcbiAqIC0gTG9nIHF1ZXJ5IGV4ZWN1dGlvbiBmb3IgZGVidWdnaW5nXG4gKiAtIEhhbmRsZSBlbXB0eSByZXN1bHQgc2V0cyBncmFjZWZ1bGx5XG4gKlxuICogQ09OQ1VSUkVOVCBNT0RJRklDQVRJT04gQkVIQVZJT1I6XG4gKiBRdWVyeSBzZXJ2aWNlcyBvcGVyYXRlIG9uIGEgc25hcHNob3Qgb2YgZWxlbWVudHMgcGFzc2VkIHRvIHRoZW0uXG4gKiBUaGV5IGFyZSBzdGF0ZWxlc3MgYW5kIGRvIG5vdCB0cmFjayBmaWxlIHN5c3RlbSBjaGFuZ2VzLiBJZiBlbGVtZW50c1xuICogYXJlIG1vZGlmaWVkIG9uIGRpc2sgYmV0d2VlbiBmZXRjaCBhbmQgcXVlcnksIHJlc3VsdHMgbWF5IGJlIGluY29uc2lzdGVudFxuICogd2l0aCB0aGUgY3VycmVudCBmaWxlIHN5c3RlbSBzdGF0ZS4gRm9yIHJlYWwtdGltZSBjb25zaXN0ZW5jeSwgY2FsbGVyc1xuICogc2hvdWxkIHJlLWZldGNoIGVsZW1lbnRzIGJlZm9yZSBlYWNoIHF1ZXJ5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVHlwZSBvZiBlbGVtZW50cyBiZWluZyBxdWVyaWVkIChtdXN0IGV4dGVuZCBJRWxlbWVudClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRWxlbWVudFF1ZXJ5U2VydmljZTxUIGV4dGVuZHMgSUVsZW1lbnQ+IHtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBjb21wbGV0ZSBxdWVyeSBvcGVyYXRpb25cbiAgICpcbiAgICogT3JkZXIgb2Ygb3BlcmF0aW9uczpcbiAgICogMS4gRmlsdGVyIGl0ZW1zIGJhc2VkIG9uIGNyaXRlcmlhXG4gICAqIDIuIFNvcnQgZmlsdGVyZWQgaXRlbXNcbiAgICogMy4gUGFnaW5hdGUgc29ydGVkIGl0ZW1zXG4gICAqXG4gICAqIFNOQVBTSE9UIFNFTUFOVElDUzpcbiAgICogVGhpcyBtZXRob2Qgb3BlcmF0ZXMgb24gdGhlIGFycmF5IG9mIGVsZW1lbnRzIHBhc3NlZCB0byBpdCBhdCB0aGUgdGltZVxuICAgKiBvZiB0aGUgY2FsbC4gSXQgZG9lcyBub3QgdHJhY2sgZmlsZSBzeXN0ZW0gY2hhbmdlcyBvciByZS1yZWFkIGVsZW1lbnRzLlxuICAgKiBJZiBlbGVtZW50cyBhcmUgbW9kaWZpZWQgYmV0d2VlbiBmZXRjaCBhbmQgcXVlcnksIHJlc3VsdHMgcmVmbGVjdCB0aGVcbiAgICogc3RhdGUgYXQgZmV0Y2ggdGltZSwgbm90IHF1ZXJ5IHRpbWUuIFRoaXMgaXMgZXhwZWN0ZWQgYmVoYXZpb3IgZm9yIGFcbiAgICogc3RhdGVsZXNzIHNlcnZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBpdGVtcyAtIEFycmF5IG9mIGVsZW1lbnRzIHRvIHF1ZXJ5IChzbmFwc2hvdCBhdCB0aW1lIG9mIGNhbGwpXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ29tcGxldGUgcXVlcnkgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBRdWVyeSByZXN1bHQgd2l0aCBpdGVtcyBhbmQgbWV0YWRhdGFcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHF1ZXJ5IG9wdGlvbnMgYXJlIGludmFsaWRcbiAgICovXG4gIHF1ZXJ5KGl0ZW1zOiBUW10sIG9wdGlvbnM/OiBRdWVyeU9wdGlvbnMpOiBRdWVyeVJlc3VsdDxUPjtcblxuICAvKipcbiAgICogRXhlY3V0ZSBxdWVyeSBhbmQgcmV0dXJuIG9ubHkgdGhlIGl0ZW1zIChubyBtZXRhZGF0YSlcbiAgICpcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjYXNlcyB3aGVyZSB5b3Ugb25seSBuZWVkIHRoZSBpdGVtcy5cbiAgICpcbiAgICogQHBhcmFtIGl0ZW1zIC0gQXJyYXkgb2YgZWxlbWVudHMgdG8gcXVlcnlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb21wbGV0ZSBxdWVyeSBjb25maWd1cmF0aW9uXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGl0ZW1zIG1hdGNoaW5nIHF1ZXJ5XG4gICAqL1xuICBxdWVyeUl0ZW1zKGl0ZW1zOiBUW10sIG9wdGlvbnM/OiBRdWVyeU9wdGlvbnMpOiBUW107XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVmYXVsdCBxdWVyeSBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm5zIERlZmF1bHQgcXVlcnkgY29uZmlndXJhdGlvblxuICAgKi9cbiAgZ2V0RGVmYXVsdE9wdGlvbnMoKTogUmVxdWlyZWQ8UXVlcnlPcHRpb25zPjtcblxuICAvKipcbiAgICogVmFsaWRhdGUgcXVlcnkgb3B0aW9ucyB3aXRob3V0IGV4ZWN1dGluZyBxdWVyeVxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFF1ZXJ5IG9wdGlvbnMgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBvcHRpb25zIGFyZSB2YWxpZFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgb3B0aW9ucyBhcmUgaW52YWxpZFxuICAgKi9cbiAgdmFsaWRhdGVPcHRpb25zKG9wdGlvbnM/OiBRdWVyeU9wdGlvbnMpOiBib29sZWFuO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIZWxwZXIgVHlwZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIGVsZW1lbnQgaGFzIHJlcXVpcmVkIG1ldGFkYXRhIGZvciBmaWx0ZXJpbmdcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgZWxlbWVudCBoYXMgdmFsaWQgbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0ZpbHRlcmFibGVNZXRhZGF0YShlbGVtZW50OiB1bmtub3duKTogZWxlbWVudCBpcyB7IG1ldGFkYXRhOiBJRWxlbWVudE1ldGFkYXRhIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJlxuICAgIGVsZW1lbnQgIT09IG51bGwgJiZcbiAgICAnbWV0YWRhdGEnIGluIGVsZW1lbnQgJiZcbiAgICB0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS5tZXRhZGF0YSA9PT0gJ29iamVjdCcgJiZcbiAgICAoZWxlbWVudCBhcyBhbnkpLm1ldGFkYXRhICE9PSBudWxsXG4gICk7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBtZXRhZGF0YSBoYXMgYSBzcGVjaWZpYyBmaWVsZFxuICpcbiAqIEBwYXJhbSBtZXRhZGF0YSAtIE1ldGFkYXRhIG9iamVjdFxuICogQHBhcmFtIGZpZWxkIC0gRmllbGQgbmFtZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiBmaWVsZCBleGlzdHMgYW5kIGlzIG5vdCB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc01ldGFkYXRhRmllbGQ8SyBleHRlbmRzIGtleW9mIElFbGVtZW50TWV0YWRhdGE+KFxuICBtZXRhZGF0YTogSUVsZW1lbnRNZXRhZGF0YSxcbiAgZmllbGQ6IEtcbik6IG1ldGFkYXRhIGlzIElFbGVtZW50TWV0YWRhdGEgJiBSZXF1aXJlZDxQaWNrPElFbGVtZW50TWV0YWRhdGEsIEs+PiB7XG4gIHJldHVybiBtZXRhZGF0YVtmaWVsZF0gIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTYWZlbHkgZXh0cmFjdCBhbiBhcmJpdHJhcnkgbWV0YWRhdGEgZmllbGQgdmFsdWUgZnJvbSBhbiBlbGVtZW50LlxuICpcbiAqIFJlcGxhY2VzIHRoZSB1bnNhZmUgZG91YmxlIGNhc3QgcGF0dGVybjpcbiAqICAgYGVsLm1ldGFkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gXG4gKlxuICogSGFuZGxlcyBib3RoIGtub3duIElFbGVtZW50TWV0YWRhdGEgZmllbGRzIGFuZCBhcmJpdHJhcnkgbWV0YWRhdGFcbiAqIHByb3BlcnRpZXMgdGhhdCBlbGVtZW50IHR5cGVzIG1heSBhZGQgKGUuZy4sIGNhdGVnb3J5IG9uIHNraWxscykuXG4gKlxuICogQHBhcmFtIGVsZW1lbnQgLSBFbGVtZW50IHRvIHJlYWQgZnJvbVxuICogQHBhcmFtIGZpZWxkIC0gTWV0YWRhdGEgZmllbGQgbmFtZSB0byBleHRyYWN0XG4gKiBAcmV0dXJucyBUaGUgZmllbGQgdmFsdWUsIG9yIHVuZGVmaW5lZCBpZiB0aGUgZWxlbWVudCBsYWNrcyBtZXRhZGF0YSBvciB0aGUgZmllbGRcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2F0ZWdvcnkgPSBnZXRNZXRhZGF0YUZpZWxkKGVsZW1lbnQsICdjYXRlZ29yeScpOyAvLyB1bmtub3duXG4gKiBjb25zdCB0YWdzID0gZ2V0TWV0YWRhdGFGaWVsZChlbGVtZW50LCAndGFncycpOyAgICAgICAgIC8vIHVua25vd25cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWV0YWRhdGFGaWVsZChlbGVtZW50OiBJRWxlbWVudCwgZmllbGQ6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIWhhc0ZpbHRlcmFibGVNZXRhZGF0YShlbGVtZW50KSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gSUVsZW1lbnRNZXRhZGF0YSBkb2Vzbid0IGhhdmUgYW4gaW5kZXggc2lnbmF0dXJlLCBzbyB3ZSBnbyB0aHJvdWdoIHVua25vd25cbiAgLy8gdG8gc2FmZWx5IGFjY2VzcyBhcmJpdHJhcnkgbWV0YWRhdGEgZmllbGRzIHRoYXQgZWxlbWVudCB0eXBlcyBtYXkgYWRkLlxuICBjb25zdCBtZXRhZGF0YSA9IGVsZW1lbnQubWV0YWRhdGEgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIG1ldGFkYXRhW2ZpZWxkXTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHNvcnRhYmxlIHZhbHVlIGZyb20gZWxlbWVudCBmb3IgYSBnaXZlbiBmaWVsZFxuICpcbiAqIFNhZmVseSBleHRyYWN0cyB0aGUgdmFsdWUgdXNlZCBmb3Igc29ydGluZywgaGFuZGxpbmcgbWlzc2luZyBmaWVsZHNcbiAqIGFuZCBlbGVtZW50LXNwZWNpZmljIGZpZWxkcyAobGlrZSByZXRlbnRpb24gZm9yIG1lbW9yaWVzKS5cbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZXh0cmFjdCB2YWx1ZSBmcm9tXG4gKiBAcGFyYW0gZmllbGQgLSBGaWVsZCB0byBleHRyYWN0XG4gKiBAcmV0dXJucyBWYWx1ZSB0byB1c2UgZm9yIHNvcnRpbmcsIG9yIHVuZGVmaW5lZCBpZiBub3QgYXZhaWxhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0U29ydFZhbHVlKGVsZW1lbnQ6IElFbGVtZW50LCBmaWVsZDogU29ydGFibGVGaWVsZCk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAoZmllbGQpIHtcbiAgICBjYXNlICduYW1lJzpcbiAgICAgIHJldHVybiBlbGVtZW50Lm1ldGFkYXRhLm5hbWU7XG4gICAgY2FzZSAnY3JlYXRlZCc6XG4gICAgICByZXR1cm4gZWxlbWVudC5tZXRhZGF0YS5jcmVhdGVkO1xuICAgIGNhc2UgJ21vZGlmaWVkJzpcbiAgICAgIHJldHVybiBlbGVtZW50Lm1ldGFkYXRhLm1vZGlmaWVkO1xuICAgIGNhc2UgJ3ZlcnNpb24nOlxuICAgICAgcmV0dXJuIGVsZW1lbnQubWV0YWRhdGEudmVyc2lvbjtcbiAgICBjYXNlICdyZXRlbnRpb24nOlxuICAgICAgLy8gRWxlbWVudC1zcGVjaWZpYyBmaWVsZCAtIGNoZWNrIGlmIGVsZW1lbnQgaGFzIGl0XG4gICAgICBpZiAoJ3JldGVudGlvbicgaW4gZWxlbWVudCAmJiB0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS5yZXRlbnRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAoZWxlbWVudCBhcyBhbnkpLnJldGVudGlvbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==