From f8fd86621df1e5ed875f50c7e5a4038f005bc5c0 Mon Sep 17 00:00:00 2001 From: wentout Date: Wed, 19 Aug 2026 15:41:07 +0300 Subject: [PATCH] additions for thunderstruck --- AGENTS.md | 2 +- README.md | 33 +- lib/errors.d.ts | 1 + lib/errors.js | 15 +- lib/esm/errors.d.ts | 1 + lib/esm/errors.js | 13 +- lib/esm/fields.js | 36 +- lib/esm/index.d.ts | 28 ++ lib/esm/index.js | 731 +++++++++++++++++++-------------- lib/esm/types/functions.js | 2 +- lib/esm/types/index.js | 8 +- lib/esm/types/nullish.js | 18 +- lib/esm/types/objects.js | 26 +- lib/esm/types/primitives.js | 112 ++--- lib/esm/types/special.js | 26 +- lib/fields.js | 40 +- lib/index.d.ts | 28 ++ lib/index.js | 748 ++++++++++++++++++++-------------- lib/types/functions.js | 6 +- lib/types/index.js | 30 +- lib/types/nullish.js | 22 +- lib/types/objects.js | 30 +- lib/types/primitives.js | 116 +++--- lib/types/special.js | 30 +- package-lock.json | 50 +-- package.json | 2 +- src/errors.ts | 1 + src/index.ts | 145 ++++++- test/esm/class-fields.test.ts | 63 +++ test/esm/imports.test.ts | 8 + test/index.ts | 163 +++++++- 31 files changed, 1628 insertions(+), 906 deletions(-) create mode 100644 test/esm/class-fields.test.ts diff --git a/AGENTS.md b/AGENTS.md index 519f9f4..6c723c6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,7 +8,7 @@ Runtime strict-type enforcement for JavaScript objects using Proxies and decorat | File | Purpose | |------|---------| -| `src/index.ts` | Core: `BaseClass`, `BaseConstructorPrototype` (default export), `@Strict` decorator, proxy handlers, CJS export setup. | +| `src/index.ts` | Core: `BaseClass`, `BaseConstructorPrototype` (default export), `@Strict` decorator, proxy handlers, construction-field tracking + `finalize` family + `unwrap`, CJS export setup. | | `src/esm.ts` | ESM entry point. Re-exports default + named bindings from `src/index.ts`. | | `src/fields.ts` | `FieldConstructor` class for custom property descriptors. | | `src/errors.ts` | Error message constants. | diff --git a/README.md b/README.md index 8c0ea9e..76e1aed 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,34 @@ user.age = 25; user.age = '25'; // TypeError: Type Mismatch ``` -> **Important:** initialized class fields (`name = 'default'`) are stored as own properties and bypass the proxy. Use `declare name: string;` plus constructor assignment, or see `FieldConstructor` for custom descriptors. +> **Important:** initialized class fields (`name = 'default'`) are stored as own properties and bypass the proxy. Use `declare name: string;` plus constructor assignment, or see `FieldConstructor` for custom descriptors — or call `finalize(instance)` to re-establish hiddenly-added fields as guarded ones (see below). + +## Construction Tracking & Finalization + +TypeØmatica records every field that passes through its define machinery, +per instance. Fields added with define semantics (class field initializers, +`Object.defineProperty`) bypass the proxy — `finalize` re-establishes them +as guarded fields after the fact: + +- `getConstructedFields(instance)` — `Set` of field names that certainly + passed through the machinery (a copy; mutating it affects nothing). +- `finalize(instance)` — auto mode: every hiddenly-added own field is + deleted and re-established through the define machinery; sets the + finalized flag. +- `finalizeBy(instance, fields)` — partial mode: same for a listed subset; + does **not** set the finalized flag. +- `isFinalized(instance)` — `true` only if auto `finalize` ran; manual or + partial finalization leaves it `false`. +- `unwrap(instance, field)` — turns a guarded field back into a plain value + property: boxed primitives are read back via `.valueOf()`, objects and + nullish values are placed as-is. Allowed **only** for fields re-established + by `finalize`/`finalizeBy` — those stay `configurable: true` by design. + Fields guarded since construction are non-configurable forever; that lock + is the essential design of the library, not an accident. + +Designed as the `postCreation`-hook companion for mnemonica chains: at each +construction level, diff the instance's own descriptors against +`getConstructedFields(instance)` to find what bypassed the proxy. --- @@ -72,8 +99,8 @@ npm run lint:src # ESLint on src/ - `src/esm.ts` — ESM entry point that re-exports the default and named bindings from `src/index.ts`. - `src/fields.ts` — `FieldConstructor` class for custom property descriptors. - `src/types/*.ts` — type-category handlers (primitives, objects, functions, special, nullish). -- `test/index.ts` — Jest CJS test suite (50 tests, 100% coverage). -- `test/esm/` — Vitest tests that exercise the actual ESM `exports` map. +- `test/index.ts` — Jest CJS test suite (70 tests, 100% coverage). +- `test/esm/` — Vitest tests that exercise the actual ESM `exports` map, including the native class-fields (define semantics) suite. - `examples/` — runnable integration examples. --- diff --git a/lib/errors.d.ts b/lib/errors.d.ts index 6615394..445a1f1 100644 --- a/lib/errors.d.ts +++ b/lib/errors.d.ts @@ -3,4 +3,5 @@ export declare const ErrorsNames: { ACCESS_DENIED: string; RIP_FUNCTIONS: string; FORBIDDEN_RE: string; + FORBIDDEN_UNWRAP: string; }; diff --git a/lib/errors.js b/lib/errors.js index fb27fa9..ed94628 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -1,11 +1,12 @@ 'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +Object.defineProperty(exports, "__esModule", { value: true }); exports.ErrorsNames = void 0; exports.ErrorsNames = { - TYPE_MISMATCH: 'Type Mismatch', - ACCESS_DENIED: 'Value Access Denied', - RIP_FUNCTIONS: 'Functions are Restricted', - FORBIDDEN_RE: 'Re-Assirnment is Forbidden', - // MISSING_PROP: 'Attempt to Access to Undefined Prop', + TYPE_MISMATCH: 'Type Mismatch', + ACCESS_DENIED: 'Value Access Denied', + RIP_FUNCTIONS: 'Functions are Restricted', + FORBIDDEN_RE: 'Re-Assirnment is Forbidden', + FORBIDDEN_UNWRAP: 'Unwrap is allowed only for finalized fields', + // MISSING_PROP: 'Attempt to Access to Undefined Prop', }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7OztBQUVBLFFBQUEsV0FBVyxHQUFHO0lBQzFCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLGFBQWEsRUFBRSxxQkFBcUI7SUFDcEMsYUFBYSxFQUFFLDBCQUEwQjtJQUN6QyxZQUFZLEVBQUUsNEJBQTRCO0lBQzFDLHVEQUF1RDtDQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgY29uc3QgRXJyb3JzTmFtZXMgPSB7XG5cdFRZUEVfTUlTTUFUQ0g6ICdUeXBlIE1pc21hdGNoJyxcblx0QUNDRVNTX0RFTklFRDogJ1ZhbHVlIEFjY2VzcyBEZW5pZWQnLFxuXHRSSVBfRlVOQ1RJT05TOiAnRnVuY3Rpb25zIGFyZSBSZXN0cmljdGVkJyxcblx0Rk9SQklEREVOX1JFOiAnUmUtQXNzaXJubWVudCBpcyBGb3JiaWRkZW4nLFxuXHQvLyBNSVNTSU5HX1BST1A6ICdBdHRlbXB0IHRvIEFjY2VzcyB0byBVbmRlZmluZWQgUHJvcCcsXG59O1xuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7OztBQUVBLFFBQUEsV0FBVyxHQUFHO0lBQzFCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLGFBQWEsRUFBRSxxQkFBcUI7SUFDcEMsYUFBYSxFQUFFLDBCQUEwQjtJQUN6QyxZQUFZLEVBQUUsNEJBQTRCO0lBQzFDLGdCQUFnQixFQUFFLDZDQUE2QztJQUMvRCx1REFBdUQ7Q0FDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGNvbnN0IEVycm9yc05hbWVzID0ge1xuXHRUWVBFX01JU01BVENIOiAnVHlwZSBNaXNtYXRjaCcsXG5cdEFDQ0VTU19ERU5JRUQ6ICdWYWx1ZSBBY2Nlc3MgRGVuaWVkJyxcblx0UklQX0ZVTkNUSU9OUzogJ0Z1bmN0aW9ucyBhcmUgUmVzdHJpY3RlZCcsXG5cdEZPUkJJRERFTl9SRTogJ1JlLUFzc2lybm1lbnQgaXMgRm9yYmlkZGVuJyxcblx0Rk9SQklEREVOX1VOV1JBUDogJ1Vud3JhcCBpcyBhbGxvd2VkIG9ubHkgZm9yIGZpbmFsaXplZCBmaWVsZHMnLFxuXHQvLyBNSVNTSU5HX1BST1A6ICdBdHRlbXB0IHRvIEFjY2VzcyB0byBVbmRlZmluZWQgUHJvcCcsXG59O1xuIl19 \ No newline at end of file diff --git a/lib/esm/errors.d.ts b/lib/esm/errors.d.ts index 6615394..445a1f1 100644 --- a/lib/esm/errors.d.ts +++ b/lib/esm/errors.d.ts @@ -3,4 +3,5 @@ export declare const ErrorsNames: { ACCESS_DENIED: string; RIP_FUNCTIONS: string; FORBIDDEN_RE: string; + FORBIDDEN_UNWRAP: string; }; diff --git a/lib/esm/errors.js b/lib/esm/errors.js index 0bdf37e..448168c 100644 --- a/lib/esm/errors.js +++ b/lib/esm/errors.js @@ -1,9 +1,10 @@ 'use strict'; export const ErrorsNames = { - TYPE_MISMATCH: 'Type Mismatch', - ACCESS_DENIED: 'Value Access Denied', - RIP_FUNCTIONS: 'Functions are Restricted', - FORBIDDEN_RE: 'Re-Assirnment is Forbidden', - // MISSING_PROP: 'Attempt to Access to Undefined Prop', + TYPE_MISMATCH: 'Type Mismatch', + ACCESS_DENIED: 'Value Access Denied', + RIP_FUNCTIONS: 'Functions are Restricted', + FORBIDDEN_RE: 'Re-Assirnment is Forbidden', + FORBIDDEN_UNWRAP: 'Unwrap is allowed only for finalized fields', + // MISSING_PROP: 'Attempt to Access to Undefined Prop', }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7QUFFYixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUc7SUFDMUIsYUFBYSxFQUFFLGVBQWU7SUFDOUIsYUFBYSxFQUFFLHFCQUFxQjtJQUNwQyxhQUFhLEVBQUUsMEJBQTBCO0lBQ3pDLFlBQVksRUFBRSw0QkFBNEI7SUFDMUMsdURBQXVEO0NBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBjb25zdCBFcnJvcnNOYW1lcyA9IHtcblx0VFlQRV9NSVNNQVRDSDogJ1R5cGUgTWlzbWF0Y2gnLFxuXHRBQ0NFU1NfREVOSUVEOiAnVmFsdWUgQWNjZXNzIERlbmllZCcsXG5cdFJJUF9GVU5DVElPTlM6ICdGdW5jdGlvbnMgYXJlIFJlc3RyaWN0ZWQnLFxuXHRGT1JCSURERU5fUkU6ICdSZS1Bc3Npcm5tZW50IGlzIEZvcmJpZGRlbicsXG5cdC8vIE1JU1NJTkdfUFJPUDogJ0F0dGVtcHQgdG8gQWNjZXNzIHRvIFVuZGVmaW5lZCBQcm9wJyxcbn07XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7QUFFYixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUc7SUFDMUIsYUFBYSxFQUFFLGVBQWU7SUFDOUIsYUFBYSxFQUFFLHFCQUFxQjtJQUNwQyxhQUFhLEVBQUUsMEJBQTBCO0lBQ3pDLFlBQVksRUFBRSw0QkFBNEI7SUFDMUMsZ0JBQWdCLEVBQUUsNkNBQTZDO0lBQy9ELHVEQUF1RDtDQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgY29uc3QgRXJyb3JzTmFtZXMgPSB7XG5cdFRZUEVfTUlTTUFUQ0g6ICdUeXBlIE1pc21hdGNoJyxcblx0QUNDRVNTX0RFTklFRDogJ1ZhbHVlIEFjY2VzcyBEZW5pZWQnLFxuXHRSSVBfRlVOQ1RJT05TOiAnRnVuY3Rpb25zIGFyZSBSZXN0cmljdGVkJyxcblx0Rk9SQklEREVOX1JFOiAnUmUtQXNzaXJubWVudCBpcyBGb3JiaWRkZW4nLFxuXHRGT1JCSURERU5fVU5XUkFQOiAnVW53cmFwIGlzIGFsbG93ZWQgb25seSBmb3IgZmluYWxpemVkIGZpZWxkcycsXG5cdC8vIE1JU1NJTkdfUFJPUDogJ0F0dGVtcHQgdG8gQWNjZXNzIHRvIFVuZGVmaW5lZCBQcm9wJyxcbn07XG4iXX0= \ No newline at end of file diff --git a/lib/esm/fields.js b/lib/esm/fields.js index dc9c106..1095d2e 100644 --- a/lib/esm/fields.js +++ b/lib/esm/fields.js @@ -5,24 +5,24 @@ const SymbolInitialValue = Symbol('Initial Value'); // this[SymbolInitialValue] = value; // } as ObjectConstructor; export class FieldConstructor { - [SymbolInitialValue]; - get get() { - const self = this; - return function ( /* this: FieldDefinition */) { - return self[SymbolInitialValue]; - }; - } - get set() { - return function () { - throw new TypeError(ErrorsNames.FORBIDDEN_RE); - }; - } - constructor(value) { - this[SymbolInitialValue] = value; - } - static get SymbolInitialValue() { - return SymbolInitialValue; - } + [SymbolInitialValue]; + get get() { + const self = this; + return function ( /* this: FieldDefinition */) { + return self[SymbolInitialValue]; + }; + } + get set() { + return function () { + throw new TypeError(ErrorsNames.FORBIDDEN_RE); + }; + } + constructor(value) { + this[SymbolInitialValue] = value; + } + static get SymbolInitialValue() { + return SymbolInitialValue; + } } // Object.assign(FieldConstructor.prototype, { // configurable: false, diff --git a/lib/esm/index.d.ts b/lib/esm/index.d.ts index 4a25d32..59b4356 100644 --- a/lib/esm/index.d.ts +++ b/lib/esm/index.d.ts @@ -16,3 +16,31 @@ export declare const SymbolInitialValue: symbol; declare const FieldConstructorExport: typeof FieldConstructor; export { FieldConstructorExport as FieldConstructor }; export declare const Strict: (_target?: object, options?: TypeomaticaOptions) => (cstr: T) => T; +/** + * Fields that certainly passed through the define machinery for this + * instance. Returns a copy of the internal Set — safe for the caller + * to mutate. + */ +export declare const getConstructedFields: (instance: object) => Set; +/** + * Auto finalization: every hiddenly-added own field of the instance + * (class fields and other define-semantics writes that bypassed the + * proxy) is deleted and re-established through the define machinery. + * Sets the finalized flag — `true` means auto mode ran. + */ +export declare const finalize: (instance: object) => void; +/** + * Partial finalization: re-establish only the listed fields. + * Does NOT set the finalized flag — that flag means auto mode ran, + * everything else is the user's choice. + */ +export declare const finalizeBy: (instance: object, fields: (string | symbol)[]) => void; +export declare const isFinalized: (instance: object) => boolean; +/** + * Turn a guarded field back into a plain value property. + * Allowed only for fields re-established by finalize/finalizeBy — + * they stay configurable by design. Fields guarded since construction + * are non-configurable: that lock is the essential design of the lib. + * Primitives are read back via .valueOf(); objects are placed as-is. + */ +export declare const unwrap: (instance: object, field: string | symbol) => void; diff --git a/lib/esm/index.js b/lib/esm/index.js index 8edcd60..4d973db 100644 --- a/lib/esm/index.js +++ b/lib/esm/index.js @@ -4,344 +4,471 @@ import { inspect } from 'util'; import { ErrorsNames } from './errors.js'; import { functions, nullish, objects, primitives, special, isPrimitive } from './types/index.js'; import { FieldConstructor } from './fields.js'; +// Fields that passed through the define machinery, per instance. +// The postConstruction comparator (Thunderstruck design) diffs the +// instance's own descriptors against this Set to find fields added +// hiddenly — class fields and other define-semantics writes. +const constructionRecords = new WeakMap(); +const ensureRecord = (instance) => { + let record = constructionRecords.get(instance); + if (!record) { + record = { + fields: new Set(), + options: undefined, + finalized: false + }; + constructionRecords.set(instance, record); + } + return record; +}; const createResolver = (options = {}) => { - const { strictAccessCheck = false } = options; - return Object.entries({ - primitives, - special, - nullish, - objects, - functions - }).reduce((obj, [key, _handler]) => { - // @ts-ignore - obj[key] = function (initialValue, receiver) { - const handler = _handler(initialValue); - return { - get() { - const invocationThis = this; - if (strictAccessCheck && invocationThis !== receiver) { - throw new ReferenceError(ErrorsNames.ACCESS_DENIED); - } - const result = handler.get(); - return result; - }, - set(replacementValue) { - const invocationThis = this; - if (strictAccessCheck && invocationThis !== receiver) { - throw new ReferenceError(ErrorsNames.ACCESS_DENIED); - } - const result = handler.set(replacementValue); - return result; - } - }; - }; - return obj; - }, {}); + const { strictAccessCheck = false } = options; + return Object.entries({ + primitives, + special, + nullish, + objects, + functions + }).reduce((obj, [key, _handler]) => { + // @ts-ignore + obj[key] = function (initialValue, receiver) { + const handler = _handler(initialValue); + return { + get() { + const invocationThis = this; + if (strictAccessCheck && invocationThis !== receiver) { + throw new ReferenceError(ErrorsNames.ACCESS_DENIED); + } + const result = handler.get(); + return result; + }, + set(replacementValue) { + const invocationThis = this; + if (strictAccessCheck && invocationThis !== receiver) { + throw new ReferenceError(ErrorsNames.ACCESS_DENIED); + } + const result = handler.set(replacementValue); + return result; + } + }; + }; + return obj; + }, {}); }; -const createProperty = (propName, initialValue, receiver, options) => { - const value = initialValue; - const valueIsPrimitive = isPrimitive(initialValue); - const isObject = typeof initialValue === 'object'; - const isFunction = initialValue instanceof Function; - const isNull = initialValue === null; - /** +const createProperty = (propName, initialValue, receiver, options, configurable = false) => { + const value = initialValue; + const valueIsPrimitive = isPrimitive(initialValue); + const isObject = typeof initialValue === 'object'; + const isFunction = initialValue instanceof Function; + const isNull = initialValue === null; + /** * special: undefined or BigInt or Symbol * or other non constructible type */ - const types = valueIsPrimitive ? 'primitives' : (isObject ? (isNull ? 'nullish' : 'objects') : (isFunction ? 'functions' : 'special')); - const resolver = createResolver(options); - const descriptor = (isObject && (value instanceof FieldConstructor)) ? - value : { - enumerable: true, - // @ts-ignore - ...resolver[types](value, receiver), - }; - // if (value instanceof FieldConstructor) { - // descriptor; - // debugger; - // } - const result = Reflect.defineProperty(receiver, propName, descriptor); - return result; + const types = valueIsPrimitive ? 'primitives' : (isObject ? (isNull ? 'nullish' : 'objects') : (isFunction ? 'functions' : 'special')); + const resolver = createResolver(options); + const descriptor = (isObject && (value instanceof FieldConstructor)) ? + value : { + enumerable: true, + configurable, + // @ts-ignore + ...resolver[types](value, receiver), + }; + // if (value instanceof FieldConstructor) { + // descriptor; + // debugger; + // } + const result = Reflect.defineProperty(receiver, propName, descriptor); + const record = ensureRecord(receiver); + record.fields.add(propName); + record.options = options; + return result; }; // line below 'href' is for util.inspect works, useful for v24 const props2skip = new Set([ - Symbol.toStringTag, - Symbol.iterator, - // Symbol.toPrimitive, - 'toString', - 'valueOf', - 'href' + Symbol.toStringTag, + Symbol.iterator, + // Symbol.toPrimitive, + 'toString', + 'valueOf', + 'href' ]); // const props2skip = new Set([Symbol.toStringTag, Symbol.iterator]); const hasNodeInspect = (inspect && inspect.custom); // oxlint-disable-next-line no-unused-expressions (hasNodeInspect && (props2skip.add(inspect.custom))); const createHandlers = (options) => ({ - get(target, prop, receiver) { - const result = Reflect.get(target, prop, receiver); - if (result !== undefined) { - return result; - } - if (prop === 'toJSON') { - - return function () { - const entries = Object.entries(this); - return JSON.stringify(entries.reduce((obj, [key, value]) => { - // @ts-ignore - obj[key] = value.valueOf(); - return obj; - }, {})); - }; - } - if (prop === 'constructor') { - return undefined; - } - const { name } = receiver.constructor; - if (props2skip.has(prop)) { - const message = `${name} lacks definition of [ ${String(prop).valueOf()} ]`; - return message; - } - // const errorMessage = `${ErrorsNames.MISSING_PROP}: [ ${String(prop).valueOf()} ] for ${name}`; - // throw new Error(errorMessage); - }, - set(_, prop, value, receiver) { - const result = createProperty(prop, value, receiver, options); - return result; - }, - setPrototypeOf() { - throw new Error('Setting prototype is not allowed!'); - }, - // defineProperty(target: object, key: string, descriptor: object) { - defineProperty() { - throw new Error('Defining new Properties is not allowed!'); - // Reflect.defineProperty(target, key, descriptor); - }, - deleteProperty() { - throw new Error('Properties Deletion is not allowed!'); - }, - // getPrototypeOf() { - // debugger; - // throw new Error('Getting prototype is not allowed'); - // }, + get(target, prop, receiver) { + const result = Reflect.get(target, prop, receiver); + if (result !== undefined) { + return result; + } + if (prop === 'toJSON') { + // eslint-disable-next-line no-unused-vars + return function () { + const entries = Object.entries(this); + return JSON.stringify(entries.reduce((obj, [key, value]) => { + // @ts-ignore + obj[key] = value.valueOf(); + return obj; + }, {})); + }; + } + if (prop === 'constructor') { + return undefined; + } + const { name } = receiver.constructor; + if (props2skip.has(prop)) { + const message = `${name} lacks definition of [ ${String(prop).valueOf()} ]`; + return message; + } + // const errorMessage = `${ErrorsNames.MISSING_PROP}: [ ${String(prop).valueOf()} ] for ${name}`; + // throw new Error(errorMessage); + }, + set(_, prop, value, receiver) { + const result = createProperty(prop, value, receiver, options); + return result; + }, + setPrototypeOf() { + throw new Error('Setting prototype is not allowed!'); + }, + // defineProperty(target: object, key: string, descriptor: object) { + defineProperty() { + throw new Error('Defining new Properties is not allowed!'); + // Reflect.defineProperty(target, key, descriptor); + }, + deleteProperty() { + throw new Error('Properties Deletion is not allowed!'); + }, + // getPrototypeOf() { + // debugger; + // throw new Error('Getting prototype is not allowed'); + // }, }); // user have to precisely define all props export const baseTarget = (_proto) => { - const proto = typeof _proto === 'object' ? _proto : null; - const answer = Object.create(proto); - return answer; + const proto = typeof _proto === 'object' ? _proto : null; + const answer = Object.create(proto); + return answer; }; export const SymbolTypeomaticaProxyReference = Symbol('TypeØmaticaProxyReference'); const getTypeomaticaProxyReference = (_target, options) => { - const target = Object.create(_target); - const id = `TypeØmaticaProxyReference-${Math.random()}`; - Object.defineProperty(target, SymbolTypeomaticaProxyReference, { - get() { - return id; - } - }); - const handlers = createHandlers(options); - const proxy = new Proxy(target, handlers); - return proxy; + const target = Object.create(_target); + const id = `TypeØmaticaProxyReference-${Math.random()}`; + Object.defineProperty(target, SymbolTypeomaticaProxyReference, { + get() { + return id; + } + }); + const handlers = createHandlers(options); + const proxy = new Proxy(target, handlers); + return proxy; }; export const BaseConstructorPrototype = function (_target, options) { - if (!new.target) { - const self = BaseConstructorPrototype.bind(this, _target, options); - self.prototype = { - constructor: BaseConstructorPrototype - }; - // @ts-ignore - return self; - } - // @ts-ignore - if (this[SymbolTypeomaticaProxyReference]) { - // @ts-ignore - return this; - } - const target = baseTarget(_target); - const { frozenPrototypes: freezeProtos = true } = options || {}; - const InstancePrototype = getTypeomaticaProxyReference(target, options); - const classPrototype = Object.getPrototypeOf(this); - let proto; - let protoPointer = this; - let protoConstrcutor; - let constructors = false; - // @ts-ignore - // const hasProxyReference = protoPointer[SymbolTypeomaticaProxyReference] as unknown as boolean; - // if (hasProxyReference) { - // throw new Error('Multiple TypeØmatica instantiations are not allowed for the same Prototype Chain!'); - // } - do { - proto = protoPointer; - protoPointer = Object.getPrototypeOf(proto); - if (BaseConstructorPrototype.prototype === protoPointer) { - constructors = true; - break; - } - if (!protoPointer) - break; - const descriptor = Reflect.getOwnPropertyDescriptor(protoPointer, 'constructor'); - if (!descriptor) - continue; - const value = descriptor.value || descriptor.get; - // if (!value) continue; - protoConstrcutor = value; - } while (protoConstrcutor !== BaseConstructorPrototype); - if (!constructors && protoConstrcutor !== BaseConstructorPrototype) { - throw new Error('Unable to setup TypeØmatica handler!'); - } - Object.setPrototypeOf(proto, InstancePrototype); - if (freezeProtos) { - Object.freeze(classPrototype); - } - // @ts-ignore - return this; - + if (!new.target) { + const self = BaseConstructorPrototype.bind(this, _target, options); + self.prototype = { + constructor: BaseConstructorPrototype + }; + // @ts-ignore + return self; + } + // @ts-ignore + if (this[SymbolTypeomaticaProxyReference]) { + // @ts-ignore + return this; + } + const target = baseTarget(_target); + const { frozenPrototypes: freezeProtos = true } = options || {}; + const InstancePrototype = getTypeomaticaProxyReference(target, options); + const classPrototype = Object.getPrototypeOf(this); + let proto; + let protoPointer = this; + let protoConstrcutor; + let constructors = false; + // @ts-ignore + // const hasProxyReference = protoPointer[SymbolTypeomaticaProxyReference] as unknown as boolean; + // if (hasProxyReference) { + // throw new Error('Multiple TypeØmatica instantiations are not allowed for the same Prototype Chain!'); + // } + do { + proto = protoPointer; + protoPointer = Object.getPrototypeOf(proto); + if (BaseConstructorPrototype.prototype === protoPointer) { + constructors = true; + break; + } + if (!protoPointer) + break; + const descriptor = Reflect.getOwnPropertyDescriptor(protoPointer, 'constructor'); + if (!descriptor) + continue; + const value = descriptor.value || descriptor.get; + // if (!value) continue; + protoConstrcutor = value; + } while (protoConstrcutor !== BaseConstructorPrototype); + if (!constructors && protoConstrcutor !== BaseConstructorPrototype) { + throw new Error('Unable to setup TypeØmatica handler!'); + } + Object.setPrototypeOf(proto, InstancePrototype); + if (freezeProtos) { + Object.freeze(classPrototype); + } + // @ts-ignore + return this; + /* eslint-disable no-unused-vars */ }; - +/* eslint-enable no-unused-vars */ const freezeClassPrototypes = (instance, shouldFreeze) => { - if (!shouldFreeze) { - return; - } - const first = Object.getPrototypeOf(instance); - const firstIsProxy = first !== null && !!Reflect.getOwnPropertyDescriptor(first, SymbolTypeomaticaProxyReference); - if (firstIsProxy) { - Object.freeze(BaseClass.prototype); - return; - } - let p = first; - while (p !== null && p !== BaseClass.prototype && p !== Object.prototype) { - const next = Object.getPrototypeOf(p); - const nextIsProxy = next !== null && !!Reflect.getOwnPropertyDescriptor(next, SymbolTypeomaticaProxyReference); - Object.freeze(p); - if (nextIsProxy) { - break; - } - p = next; - } - Object.freeze(BaseClass.prototype); + if (!shouldFreeze) { + return; + } + const first = Object.getPrototypeOf(instance); + const firstIsProxy = first !== null && !!Reflect.getOwnPropertyDescriptor(first, SymbolTypeomaticaProxyReference); + if (firstIsProxy) { + Object.freeze(BaseClass.prototype); + return; + } + let p = first; + while (p !== null && p !== BaseClass.prototype && p !== Object.prototype) { + const next = Object.getPrototypeOf(p); + const nextIsProxy = next !== null && !!Reflect.getOwnPropertyDescriptor(next, SymbolTypeomaticaProxyReference); + Object.freeze(p); + if (nextIsProxy) { + break; + } + p = next; + } + Object.freeze(BaseClass.prototype); }; export class BaseClass { - constructor(_target, options) { - const { frozenPrototypes: freezeProtos = true } = options || {}; - // @ts-ignore - if (this[SymbolTypeomaticaProxyReference]) { - freezeClassPrototypes(this, freezeProtos); - return this; - } - const target = baseTarget(_target); - const proxy = getTypeomaticaProxyReference(target, options); - const instanceProto = Object.getPrototypeOf(this); - if (instanceProto === BaseClass.prototype) { - Object.setPrototypeOf(this, proxy); - freezeClassPrototypes(this, freezeProtos); - return this; - } - let classProto = instanceProto; - let parentProto = Object.getPrototypeOf(classProto); - while (parentProto !== BaseClass.prototype && parentProto !== null) { - classProto = parentProto; - parentProto = Object.getPrototypeOf(classProto); - } - Object.setPrototypeOf(classProto, proxy); - freezeClassPrototypes(this, freezeProtos); - } + constructor(_target, options) { + const { frozenPrototypes: freezeProtos = true } = options || {}; + // @ts-ignore + if (this[SymbolTypeomaticaProxyReference]) { + freezeClassPrototypes(this, freezeProtos); + return this; + } + const target = baseTarget(_target); + const proxy = getTypeomaticaProxyReference(target, options); + const instanceProto = Object.getPrototypeOf(this); + if (instanceProto === BaseClass.prototype) { + Object.setPrototypeOf(this, proxy); + freezeClassPrototypes(this, freezeProtos); + return this; + } + let classProto = instanceProto; + let parentProto = Object.getPrototypeOf(classProto); + while (parentProto !== BaseClass.prototype && parentProto !== null) { + classProto = parentProto; + parentProto = Object.getPrototypeOf(classProto); + } + Object.setPrototypeOf(classProto, proxy); + freezeClassPrototypes(this, freezeProtos); + } } const strict = function (_target, options) { - const { frozenPrototypes: freezeProtos = true } = options || {}; - const decorator = function (cstr) { - // @ts-ignore - if (cstr.prototype[SymbolTypeomaticaProxyReference]) { - return cstr; - } - const target = baseTarget(_target); - const proxy = getTypeomaticaProxyReference(target, options); - const _replacer = Object.create(proxy); - // @ts-ignore - Object.setPrototypeOf(cstr.prototype, _replacer); - if (freezeProtos) { - // @ts-ignore - Object.freeze(cstr.prototype); - } - return cstr; - // const MyClassProxy = new Proxy(cstr, { - // construct(_, argumentsList, newTarget) { - // debugger; - // const target = baseTarget(_target); - // const proxy = getTypeomaticaProxyReference(target); - // const _replacer = Object.create(proxy); - // const _proto = cstr.prototype; - // const proto = Object.create(Object.getPrototypeOf(_proto)); - // proto.iAmProto = true; - // Object.setPrototypeOf(cstr.prototype, proto); - // const descriptors = Object.getOwnPropertyDescriptors(_proto); - // Object.defineProperties(proto, descriptors); - // const replacer = Object.create(_replacer); - // Object.setPrototypeOf(proto, replacer); - // Object.setPrototypeOf(cstr.prototype, proto); - // const result = Reflect.construct(cstr, argumentsList, newTarget); - // debugger; - // Object.setPrototypeOf(cstr.prototype, _proto); - // debugger; - // return result; - // }, - // }); - // return MyClassProxy; - }; - return decorator; + const { frozenPrototypes: freezeProtos = true } = options || {}; + const decorator = function (cstr) { + // @ts-ignore + if (cstr.prototype[SymbolTypeomaticaProxyReference]) { + return cstr; + } + const target = baseTarget(_target); + const proxy = getTypeomaticaProxyReference(target, options); + const _replacer = Object.create(proxy); + // @ts-ignore + Object.setPrototypeOf(cstr.prototype, _replacer); + if (freezeProtos) { + // @ts-ignore + Object.freeze(cstr.prototype); + } + return cstr; + // const MyClassProxy = new Proxy(cstr, { + // construct(_, argumentsList, newTarget) { + // debugger; + // const target = baseTarget(_target); + // const proxy = getTypeomaticaProxyReference(target); + // const _replacer = Object.create(proxy); + // const _proto = cstr.prototype; + // const proto = Object.create(Object.getPrototypeOf(_proto)); + // proto.iAmProto = true; + // Object.setPrototypeOf(cstr.prototype, proto); + // const descriptors = Object.getOwnPropertyDescriptors(_proto); + // Object.defineProperties(proto, descriptors); + // const replacer = Object.create(_replacer); + // Object.setPrototypeOf(proto, replacer); + // Object.setPrototypeOf(cstr.prototype, proto); + // const result = Reflect.construct(cstr, argumentsList, newTarget); + // debugger; + // Object.setPrototypeOf(cstr.prototype, _proto); + // debugger; + // return result; + // }, + // }); + // return MyClassProxy; + }; + return decorator; }; export const { SymbolInitialValue } = FieldConstructor; const FieldConstructorExport = FieldConstructor; export { FieldConstructorExport as FieldConstructor }; export const Strict = strict; +/** + * Fields that certainly passed through the define machinery for this + * instance. Returns a copy of the internal Set — safe for the caller + * to mutate. + */ +export const getConstructedFields = (instance) => { + const record = constructionRecords.get(instance); + const result = record ? new Set(record.fields) : new Set(); + return result; +}; +const finaliseFields = (instance, names) => { + const record = ensureRecord(instance); + names.forEach((name) => { + if (record.fields.has(name)) { + // already passed through the machinery + return; + } + const descriptor = Reflect.getOwnPropertyDescriptor(instance, name); + if (!descriptor || !('value' in descriptor)) { + // nothing hidden under that name, or not a data field + return; + } + delete instance[name]; + // finalized fields stay configurable: they are the ones `unwrap` + // is allowed to turn back into plain value properties + createProperty(name, descriptor.value, instance, record.options, true); + }); +}; +/** + * Auto finalization: every hiddenly-added own field of the instance + * (class fields and other define-semantics writes that bypassed the + * proxy) is deleted and re-established through the define machinery. + * Sets the finalized flag — `true` means auto mode ran. + */ +export const finalize = (instance) => { + const record = ensureRecord(instance); + finaliseFields(instance, Reflect.ownKeys(instance)); + record.finalized = true; +}; +/** + * Partial finalization: re-establish only the listed fields. + * Does NOT set the finalized flag — that flag means auto mode ran, + * everything else is the user's choice. + */ +export const finalizeBy = (instance, fields) => { + finaliseFields(instance, fields); +}; +export const isFinalized = (instance) => { + const record = constructionRecords.get(instance); + const result = record ? record.finalized : false; + return result; +}; +/** + * Turn a guarded field back into a plain value property. + * Allowed only for fields re-established by finalize/finalizeBy — + * they stay configurable by design. Fields guarded since construction + * are non-configurable: that lock is the essential design of the lib. + * Primitives are read back via .valueOf(); objects are placed as-is. + */ +export const unwrap = (instance, field) => { + const descriptor = Reflect.getOwnPropertyDescriptor(instance, field); + if (!descriptor || !descriptor.configurable || typeof descriptor.get !== 'function') { + throw new TypeError(ErrorsNames.FORBIDDEN_UNWRAP); + } + const current = instance[field]; + const currentValueOf = current?.valueOf; + const unwrapped = typeof currentValueOf === 'function' + ? current.valueOf() + : current; + Object.defineProperty(instance, field, { + value: unwrapped, + writable: true, + enumerable: true, + configurable: true + }); +}; /* istanbul ignore next */ function setupCommonJS() { - if (typeof module === 'undefined' || typeof module.exports === 'undefined') { - return; - } - Object.defineProperty(module, 'exports', { - get() { - return BaseConstructorPrototype; - }, - enumerable: true - }); - Object.defineProperty(module.exports, 'BaseClass', { - get() { - return BaseClass; - }, - enumerable: true - }); - Object.defineProperty(module.exports, 'FieldConstructor', { - get() { - return FieldConstructor; - }, - enumerable: true - }); - Object.defineProperty(module.exports, 'SymbolInitialValue', { - get() { - return SymbolInitialValue; - }, - enumerable: true - }); - Object.defineProperty(module.exports, 'SymbolTypeomaticaProxyReference', { - get() { - return SymbolTypeomaticaProxyReference; - }, - enumerable: true - }); - Object.defineProperty(module.exports, 'baseTarget', { - get() { - return baseTarget; - }, - enumerable: true - }); - Object.defineProperty(module.exports, 'Strict', { - get() { - return strict; - }, - enumerable: true - }); + if (typeof module === 'undefined' || typeof module.exports === 'undefined') { + return; + } + Object.defineProperty(module, 'exports', { + get() { + return BaseConstructorPrototype; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'BaseClass', { + get() { + return BaseClass; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'FieldConstructor', { + get() { + return FieldConstructor; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'SymbolInitialValue', { + get() { + return SymbolInitialValue; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'SymbolTypeomaticaProxyReference', { + get() { + return SymbolTypeomaticaProxyReference; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'baseTarget', { + get() { + return baseTarget; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'Strict', { + get() { + return strict; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'getConstructedFields', { + get() { + return getConstructedFields; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'finalize', { + get() { + return finalize; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'finalizeBy', { + get() { + return finalizeBy; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'isFinalized', { + get() { + return isFinalized; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'unwrap', { + get() { + return unwrap; + }, + enumerable: true + }); } setupCommonJS(); Object.freeze(BaseConstructorPrototype); Object.freeze(BaseConstructorPrototype.prototype); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMENBQTBDO0FBRTFDLFlBQVksQ0FBQztBQUViLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUxQyxPQUFPLEVBQ04sU0FBUyxFQUNULE9BQU8sRUFDUCxPQUFPLEVBQ1AsVUFBVSxFQUNWLE9BQU8sRUFDUCxXQUFXLEVBQ1gsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFPL0MsTUFBTSxjQUFjLEdBQUcsQ0FBQyxVQUE4QixFQUFFLEVBQUUsRUFBRTtJQUMzRCxNQUFNLEVBQUUsaUJBQWlCLEdBQUcsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTlDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNyQixVQUFVO1FBQ1YsT0FBTztRQUNQLE9BQU87UUFDUCxPQUFPO1FBQ1AsU0FBUztLQUNULENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtRQUMxQyxhQUFhO1FBQ2IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsWUFBb0IsRUFBRSxRQUFnQjtZQUMxRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkMsT0FBTztnQkFDTixHQUFHO29CQUNGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQztvQkFDNUIsSUFBSSxpQkFBaUIsSUFBSSxjQUFjLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ3RELE1BQU0sSUFBSSxjQUFjLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNyRCxDQUFDO29CQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDN0IsT0FBTyxNQUFNLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxHQUFHLENBQUMsZ0JBQXlCO29CQUM1QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7b0JBQzVCLElBQUksaUJBQWlCLElBQUksY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUN0RCxNQUFNLElBQUksY0FBYyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDckQsQ0FBQztvQkFDRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7b0JBQzdDLE9BQU8sTUFBTSxDQUFDO2dCQUNmLENBQUM7YUFDRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsT0FBTyxHQUFHLENBQUM7SUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDUixDQUFDLENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxDQUFDLFFBQWdCLEVBQUUsWUFBcUIsRUFBRSxRQUFnQixFQUFFLE9BQTRCLEVBQUUsRUFBRTtJQUVsSCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUM7SUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkQsTUFBTSxRQUFRLEdBQUcsT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDO0lBQ2xELE1BQU0sVUFBVSxHQUFHLFlBQVksWUFBWSxRQUFRLENBQUM7SUFDcEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxLQUFLLElBQUksQ0FBQztJQUVyQzs7O09BR0c7SUFFSCxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUMvQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQ1YsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDOUIsQ0FBQyxDQUFDLENBQUMsQ0FDSCxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUNwQyxDQUNELENBQUM7SUFFRixNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFekMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLFlBQVksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNQLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLGFBQWE7UUFDYixHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO0tBQ25DLENBQUM7SUFFSCwyQ0FBMkM7SUFDM0MsZUFBZTtJQUNmLGFBQWE7SUFDYixJQUFJO0lBRUosTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RFLE9BQU8sTUFBTSxDQUFDO0FBRWYsQ0FBQyxDQUFDO0FBRUYsOERBQThEO0FBQzlELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDO0lBQzFCLE1BQU0sQ0FBQyxXQUFXO0lBQ2xCLE1BQU0sQ0FBQyxRQUFRO0lBQ2Ysc0JBQXNCO0lBQ3RCLFVBQVU7SUFDVixTQUFTO0lBQ1QsTUFBTTtDQUNOLENBQUMsQ0FBQztBQUNILHFFQUFxRTtBQUNyRSxNQUFNLGNBQWMsR0FBRyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbkQsaURBQWlEO0FBQ2pELENBQUMsY0FBYyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXJELE1BQU0sY0FBYyxHQUFHLENBQUMsT0FBNEIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RCxHQUFHLENBQUMsTUFBYyxFQUFFLElBQXFCLEVBQUUsUUFBZ0I7UUFDMUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFCLE9BQU8sTUFBTSxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3ZCLDBDQUEwQztZQUMxQyxPQUFPO2dCQUNOLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7b0JBQzFELGFBQWE7b0JBQ2IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDM0IsT0FBTyxHQUFHLENBQUM7Z0JBQ1osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDVCxDQUFDLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDNUIsT0FBTyxTQUFTLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3RDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSwwQkFBMEIsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7WUFDNUUsT0FBTyxPQUFPLENBQUM7UUFDaEIsQ0FBQztRQUNELGlHQUFpRztRQUNqRyxpQ0FBaUM7SUFDbEMsQ0FBQztJQUNELEdBQUcsQ0FBQyxDQUFTLEVBQUUsSUFBWSxFQUFFLEtBQWMsRUFBRSxRQUFnQjtRQUM1RCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBQ0QsY0FBYztRQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0Qsb0VBQW9FO0lBQ3BFLGNBQWM7UUFDYixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDM0QsbURBQW1EO0lBQ3BELENBQUM7SUFDRCxjQUFjO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRCxxQkFBcUI7SUFDckIsYUFBYTtJQUNiLHdEQUF3RDtJQUN4RCxLQUFLO0NBQ0wsQ0FBQyxDQUFDO0FBRUgsMENBQTBDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQWUsRUFBRSxFQUFFO0lBQzdDLE1BQU0sS0FBSyxHQUFHLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxPQUFPLE1BQU0sQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0FBQ25GLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxPQUFlLEVBQUUsT0FBNEIsRUFBRSxFQUFFO0lBQ3RGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsTUFBTSxFQUFFLEdBQUcsNkJBQTZCLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO0lBQ3hELE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLCtCQUErQixFQUFFO1FBQzlELEdBQUc7WUFDRixPQUFPLEVBQUUsQ0FBQztRQUNYLENBQUM7S0FDRCxDQUFDLENBQUM7SUFDSCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sS0FBSyxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBR0YsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsVUFBcUUsT0FBVyxFQUFFLE9BQTRCO0lBQ3JKLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFakIsTUFBTSxJQUFJLEdBS04sd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLFNBQVMsR0FBRztZQUNoQixXQUFXLEVBQUUsd0JBQXdCO1NBQ3JDLENBQUM7UUFFRixhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUM7SUFFYixDQUFDO0lBRUQsYUFBYTtJQUNiLElBQUksSUFBSSxDQUFDLCtCQUErQixDQUFDLEVBQUUsQ0FBQztRQUMzQyxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBVyxDQUFDO0lBQzdDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUVoRSxNQUFNLGlCQUFpQixHQUFHLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUV4RSxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBVyxDQUFDO0lBRTdELElBQUksS0FBSyxDQUFDO0lBQ1YsSUFBSSxZQUFZLEdBQUcsSUFBYyxDQUFDO0lBQ2xDLElBQUksZ0JBQWdCLENBQUM7SUFFckIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXpCLGFBQWE7SUFDYixpR0FBaUc7SUFDakcsMkJBQTJCO0lBQzNCLHlHQUF5RztJQUN6RyxJQUFJO0lBRUosR0FBRyxDQUFDO1FBQ0gsS0FBSyxHQUFHLFlBQVksQ0FBQztRQUNyQixZQUFZLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxJQUFJLHdCQUF3QixDQUFDLFNBQVMsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUN6RCxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE1BQU07UUFDUCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVk7WUFBRSxNQUFNO1FBQ3pCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLFVBQVU7WUFBRSxTQUFTO1FBQzFCLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUNqRCx3QkFBd0I7UUFDeEIsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUMsUUFBUSxnQkFBZ0IsS0FBSyx3QkFBd0IsRUFBRTtJQUV4RCxJQUFJLENBQUMsWUFBWSxJQUFJLGdCQUFnQixLQUFLLHdCQUF3QixFQUFFLENBQUM7UUFDcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2hELElBQUksWUFBWSxFQUFFLENBQUM7UUFDbEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsYUFBYTtJQUNiLE9BQU8sSUFBSSxDQUFDO0lBRWIsbUNBQW1DO0FBQ25DLENBR0MsQ0FBQztBQUNGLGtDQUFrQztBQUVsQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsUUFBZ0IsRUFBRSxZQUFxQixFQUFFLEVBQUU7SUFDekUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ25CLE9BQU87SUFDUixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QyxNQUFNLFlBQVksR0FBRyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLCtCQUErQixDQUFDLENBQUM7SUFDbEgsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxPQUFPO0lBQ1IsQ0FBQztJQUVELElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNkLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1FBQy9HLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNO1FBQ1AsQ0FBQztRQUNELENBQUMsR0FBRyxJQUFJLENBQUM7SUFDVixDQUFDO0lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxPQUFPLFNBQVM7SUFDckIsWUFBWSxPQUFnQixFQUFFLE9BQTRCO1FBQ3pELE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUVoRSxhQUFhO1FBQ2IsSUFBSSxJQUFJLENBQUMsK0JBQStCLENBQUMsRUFBRSxDQUFDO1lBQzNDLHFCQUFxQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztZQUMxQyxPQUFPLElBQUksQ0FBQztRQUNiLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFXLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsNEJBQTRCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEQsSUFBSSxhQUFhLEtBQUssU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25DLHFCQUFxQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztZQUMxQyxPQUFPLElBQUksQ0FBQztRQUNiLENBQUM7UUFFRCxJQUFJLFVBQVUsR0FBRyxhQUFhLENBQUM7UUFDL0IsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRCxPQUFPLFdBQVcsS0FBSyxTQUFTLENBQUMsU0FBUyxJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNwRSxVQUFVLEdBQUcsV0FBVyxDQUFDO1lBQ3pCLFdBQVcsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6QyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDM0MsQ0FBQztDQUNEO0FBR0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxPQUFnQixFQUFFLE9BQTRCO0lBQ3RFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEdBQUcsSUFBSSxFQUFFLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUVoRSxNQUFNLFNBQVMsR0FBRyxVQUFZLElBQU87UUFFcEMsYUFBYTtRQUNiLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQyxFQUFFLENBQUM7WUFDckQsT0FBTyxJQUFJLENBQUM7UUFDYixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1RCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXZDLGFBQWE7UUFDYixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDakQsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNsQixhQUFhO1lBQ2IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO1FBR1oseUNBQXlDO1FBQ3pDLDRDQUE0QztRQUM1QyxjQUFjO1FBQ2Qsd0NBQXdDO1FBQ3hDLHdEQUF3RDtRQUN4RCw0Q0FBNEM7UUFFNUMsbUNBQW1DO1FBRW5DLGdFQUFnRTtRQUNoRSwyQkFBMkI7UUFFM0Isa0RBQWtEO1FBRWxELGtFQUFrRTtRQUNsRSxpREFBaUQ7UUFFakQsK0NBQStDO1FBQy9DLDRDQUE0QztRQUc1QyxrREFBa0Q7UUFDbEQsc0VBQXNFO1FBRXRFLGNBQWM7UUFDZCxtREFBbUQ7UUFDbkQsY0FBYztRQUVkLG1CQUFtQjtRQUNuQixNQUFNO1FBQ04sTUFBTTtRQUNOLHVCQUF1QjtJQUN4QixDQUFDLENBQUM7SUFFRixPQUFPLFNBQVMsQ0FBQztBQUVsQixDQUFDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLEdBQUcsZ0JBQWdCLENBQUM7QUFDdkQsTUFBTSxzQkFBc0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsc0JBQXNCLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBRTdCLDBCQUEwQjtBQUMxQixTQUFTLGFBQWE7SUFDckIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1FBQzVFLE9BQU87SUFDUixDQUFDO0lBQ0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFO1FBQ3hDLEdBQUc7WUFDRixPQUFPLHdCQUF3QixDQUFDO1FBQ2pDLENBQUM7UUFDRCxVQUFVLEVBQUUsSUFBSTtLQUNoQixDQUFDLENBQUM7SUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFO1FBQ2xELEdBQUc7WUFDRixPQUFPLFNBQVMsQ0FBQztRQUNsQixDQUFDO1FBQ0QsVUFBVSxFQUFFLElBQUk7S0FDaEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFO1FBQ3pELEdBQUc7WUFDRixPQUFPLGdCQUFnQixDQUFDO1FBQ3pCLENBQUM7UUFDRCxVQUFVLEVBQUUsSUFBSTtLQUNoQixDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUU7UUFDM0QsR0FBRztZQUNGLE9BQU8sa0JBQWtCLENBQUM7UUFDM0IsQ0FBQztRQUNELFVBQVUsRUFBRSxJQUFJO0tBQ2hCLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRTtRQUN4RSxHQUFHO1lBQ0YsT0FBTywrQkFBK0IsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsVUFBVSxFQUFFLElBQUk7S0FDaEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRTtRQUNuRCxHQUFHO1lBQ0YsT0FBTyxVQUFVLENBQUM7UUFDbkIsQ0FBQztRQUNELFVBQVUsRUFBRSxJQUFJO0tBQ2hCLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUU7UUFDL0MsR0FBRztZQUNGLE9BQU8sTUFBTSxDQUFDO1FBQ2YsQ0FBQztRQUNELFVBQVUsRUFBRSxJQUFJO0tBQ2hCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxhQUFhLEVBQUUsQ0FBQztBQUVoQixNQUFNLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFDeEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIG94bGludC1kaXNhYmxlIHR5cGVzY3JpcHQvbm8tdGhpcy1hbGlhc1xuIFxuJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBpbnNwZWN0IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgeyBFcnJvcnNOYW1lcyB9IGZyb20gJy4vZXJyb3JzLmpzJztcblxuaW1wb3J0IHtcblx0ZnVuY3Rpb25zLFxuXHRudWxsaXNoLFxuXHRvYmplY3RzLFxuXHRwcmltaXRpdmVzLFxuXHRzcGVjaWFsLFxuXHRpc1ByaW1pdGl2ZVxufSBmcm9tICcuL3R5cGVzL2luZGV4LmpzJztcblxuaW1wb3J0IHsgRmllbGRDb25zdHJ1Y3RvciB9IGZyb20gJy4vZmllbGRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUeXBlb21hdGljYU9wdGlvbnMge1xuXHRzdHJpY3RBY2Nlc3NDaGVjaz86IGJvb2xlYW47XG5cdGZyb3plblByb3RvdHlwZXM/OiBib29sZWFuO1xufVxuXG5jb25zdCBjcmVhdGVSZXNvbHZlciA9IChvcHRpb25zOiBUeXBlb21hdGljYU9wdGlvbnMgPSB7fSkgPT4ge1xuXHRjb25zdCB7IHN0cmljdEFjY2Vzc0NoZWNrID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdFxuXHRyZXR1cm4gT2JqZWN0LmVudHJpZXMoe1xuXHRcdHByaW1pdGl2ZXMsXG5cdFx0c3BlY2lhbCxcblx0XHRudWxsaXNoLFxuXHRcdG9iamVjdHMsXG5cdFx0ZnVuY3Rpb25zXG5cdH0pLnJlZHVjZSgob2JqOiBvYmplY3QsIFtrZXksIF9oYW5kbGVyXSkgPT4ge1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRvYmpba2V5XSA9IGZ1bmN0aW9uIChpbml0aWFsVmFsdWU6IG9iamVjdCwgcmVjZWl2ZXI6IG9iamVjdCkge1xuXHRcdFx0Y29uc3QgaGFuZGxlciA9IF9oYW5kbGVyKGluaXRpYWxWYWx1ZSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRnZXQoKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW52b2NhdGlvblRoaXMgPSB0aGlzO1xuXHRcdFx0XHRcdGlmIChzdHJpY3RBY2Nlc3NDaGVjayAmJiBpbnZvY2F0aW9uVGhpcyAhPT0gcmVjZWl2ZXIpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihFcnJvcnNOYW1lcy5BQ0NFU1NfREVOSUVEKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gaGFuZGxlci5nZXQoKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZXQocmVwbGFjZW1lbnRWYWx1ZTogdW5rbm93bikge1xuXHRcdFx0XHRcdGNvbnN0IGludm9jYXRpb25UaGlzID0gdGhpcztcblx0XHRcdFx0XHRpZiAoc3RyaWN0QWNjZXNzQ2hlY2sgJiYgaW52b2NhdGlvblRoaXMgIT09IHJlY2VpdmVyKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoRXJyb3JzTmFtZXMuQUNDRVNTX0RFTklFRCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGhhbmRsZXIuc2V0KHJlcGxhY2VtZW50VmFsdWUpO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdHJldHVybiBvYmo7XG5cdH0sIHt9KTtcbn07XG5cbmNvbnN0IGNyZWF0ZVByb3BlcnR5ID0gKHByb3BOYW1lOiBzdHJpbmcsIGluaXRpYWxWYWx1ZTogdW5rbm93biwgcmVjZWl2ZXI6IG9iamVjdCwgb3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucykgPT4ge1xuXG5cdGNvbnN0IHZhbHVlID0gaW5pdGlhbFZhbHVlO1xuXHRjb25zdCB2YWx1ZUlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmUoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgaXNPYmplY3QgPSB0eXBlb2YgaW5pdGlhbFZhbHVlID09PSAnb2JqZWN0Jztcblx0Y29uc3QgaXNGdW5jdGlvbiA9IGluaXRpYWxWYWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuXHRjb25zdCBpc051bGwgPSBpbml0aWFsVmFsdWUgPT09IG51bGw7XG5cblx0LyoqXG5cdCAqIHNwZWNpYWw6IHVuZGVmaW5lZCBvciBCaWdJbnQgb3IgU3ltYm9sXG5cdCAqIFx0b3Igb3RoZXIgbm9uIGNvbnN0cnVjdGlibGUgdHlwZVxuXHQgKi9cblxuXHRjb25zdCB0eXBlcyA9IHZhbHVlSXNQcmltaXRpdmUgPyAncHJpbWl0aXZlcycgOiAoXG5cdFx0aXNPYmplY3QgPyAoXG5cdFx0XHRpc051bGwgPyAnbnVsbGlzaCcgOiAnb2JqZWN0cydcblx0XHQpIDogKFxuXHRcdFx0aXNGdW5jdGlvbiA/ICdmdW5jdGlvbnMnIDogJ3NwZWNpYWwnXG5cdFx0KVxuXHQpO1xuXG5cdGNvbnN0IHJlc29sdmVyID0gY3JlYXRlUmVzb2x2ZXIob3B0aW9ucyk7XG5cblx0Y29uc3QgZGVzY3JpcHRvciA9IChpc09iamVjdCAmJiAodmFsdWUgaW5zdGFuY2VvZiBGaWVsZENvbnN0cnVjdG9yKSkgP1xuXHRcdHZhbHVlIDoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdC4uLnJlc29sdmVyW3R5cGVzXSh2YWx1ZSwgcmVjZWl2ZXIpLFxuXHRcdH07XG5cblx0Ly8gaWYgKHZhbHVlIGluc3RhbmNlb2YgRmllbGRDb25zdHJ1Y3Rvcikge1xuXHQvLyBcdGRlc2NyaXB0b3I7XG5cdC8vIFx0ZGVidWdnZXI7XG5cdC8vIH1cblxuXHRjb25zdCByZXN1bHQgPSBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHJlY2VpdmVyLCBwcm9wTmFtZSwgZGVzY3JpcHRvcik7XG5cdHJldHVybiByZXN1bHQ7XG5cbn07XG5cbi8vIGxpbmUgYmVsb3cgJ2hyZWYnIGlzIGZvciB1dGlsLmluc3BlY3Qgd29ya3MsIHVzZWZ1bCBmb3IgdjI0XG5jb25zdCBwcm9wczJza2lwID0gbmV3IFNldChbXG5cdFN5bWJvbC50b1N0cmluZ1RhZyxcblx0U3ltYm9sLml0ZXJhdG9yLFxuXHQvLyBTeW1ib2wudG9QcmltaXRpdmUsXG5cdCd0b1N0cmluZycsXG5cdCd2YWx1ZU9mJyxcblx0J2hyZWYnXG5dKTtcbi8vIGNvbnN0IHByb3BzMnNraXAgPSBuZXcgU2V0KFtTeW1ib2wudG9TdHJpbmdUYWcsIFN5bWJvbC5pdGVyYXRvcl0pO1xuY29uc3QgaGFzTm9kZUluc3BlY3QgPSAoaW5zcGVjdCAmJiBpbnNwZWN0LmN1c3RvbSk7XG4vLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4oaGFzTm9kZUluc3BlY3QgJiYgKHByb3BzMnNraXAuYWRkKGluc3BlY3QuY3VzdG9tKSkpO1xuXG5jb25zdCBjcmVhdGVIYW5kbGVycyA9IChvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zKSA9PiAoe1xuXHRnZXQodGFyZ2V0OiBvYmplY3QsIHByb3A6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IG9iamVjdCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuXHRcdGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdFx0aWYgKHByb3AgPT09ICd0b0pTT04nKSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblx0XHRcdHJldHVybiBmdW5jdGlvbiAodGhpczogdHlwZW9mIHRhcmdldCkge1xuXHRcdFx0XHRjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGhpcyk7XG5cdFx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShlbnRyaWVzLnJlZHVjZSgob2JqLCBba2V5LCB2YWx1ZV0pID0+IHtcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0b2JqW2tleV0gPSB2YWx1ZS52YWx1ZU9mKCk7XG5cdFx0XHRcdFx0cmV0dXJuIG9iajtcblx0XHRcdFx0fSwge30pKTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdGlmIChwcm9wID09PSAnY29uc3RydWN0b3InKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCB7IG5hbWUgfSA9IHJlY2VpdmVyLmNvbnN0cnVjdG9yO1xuXHRcdGlmIChwcm9wczJza2lwLmhhcyhwcm9wKSkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGAke25hbWV9IGxhY2tzIGRlZmluaXRpb24gb2YgWyAke1N0cmluZyhwcm9wKS52YWx1ZU9mKCl9IF1gO1xuXHRcdFx0cmV0dXJuIG1lc3NhZ2U7XG5cdFx0fVxuXHRcdC8vIGNvbnN0IGVycm9yTWVzc2FnZSA9IGAke0Vycm9yc05hbWVzLk1JU1NJTkdfUFJPUH06IFsgJHtTdHJpbmcocHJvcCkudmFsdWVPZigpfSBdIGZvciAke25hbWV9YDtcblx0XHQvLyB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcblx0fSxcblx0c2V0KF86IG9iamVjdCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcmVjZWl2ZXI6IG9iamVjdCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGNyZWF0ZVByb3BlcnR5KHByb3AsIHZhbHVlLCByZWNlaXZlciwgb3B0aW9ucyk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblx0c2V0UHJvdG90eXBlT2YoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdTZXR0aW5nIHByb3RvdHlwZSBpcyBub3QgYWxsb3dlZCEnKTtcblx0fSxcblx0Ly8gZGVmaW5lUHJvcGVydHkodGFyZ2V0OiBvYmplY3QsIGtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBvYmplY3QpIHtcblx0ZGVmaW5lUHJvcGVydHkoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdEZWZpbmluZyBuZXcgUHJvcGVydGllcyBpcyBub3QgYWxsb3dlZCEnKTtcblx0XHQvLyBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKTtcblx0fSxcblx0ZGVsZXRlUHJvcGVydHkoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0aWVzIERlbGV0aW9uIGlzIG5vdCBhbGxvd2VkIScpO1xuXHR9LFxuXHQvLyBnZXRQcm90b3R5cGVPZigpIHtcblx0Ly8gXHRkZWJ1Z2dlcjtcblx0Ly8gXHR0aHJvdyBuZXcgRXJyb3IoJ0dldHRpbmcgcHJvdG90eXBlIGlzIG5vdCBhbGxvd2VkJyk7XG5cdC8vIH0sXG59KTtcblxuLy8gdXNlciBoYXZlIHRvIHByZWNpc2VseSBkZWZpbmUgYWxsIHByb3BzXG5leHBvcnQgY29uc3QgYmFzZVRhcmdldCA9IChfcHJvdG8/OiBvYmplY3QpID0+IHtcblx0Y29uc3QgcHJvdG8gPSB0eXBlb2YgX3Byb3RvID09PSAnb2JqZWN0JyA/IF9wcm90byA6IG51bGw7XG5cdGNvbnN0IGFuc3dlciA9IE9iamVjdC5jcmVhdGUocHJvdG8pO1xuXHRyZXR1cm4gYW5zd2VyO1xufTtcblxuZXhwb3J0IGNvbnN0IFN5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UgPSBTeW1ib2woJ1R5cGXDmG1hdGljYVByb3h5UmVmZXJlbmNlJyk7XG5jb25zdCBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlID0gKF90YXJnZXQ6IG9iamVjdCwgb3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucykgPT4ge1xuXHRjb25zdCB0YXJnZXQgPSBPYmplY3QuY3JlYXRlKF90YXJnZXQpO1xuXHRjb25zdCBpZCA9IGBUeXBlw5htYXRpY2FQcm94eVJlZmVyZW5jZS0ke01hdGgucmFuZG9tKCl9YDtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSwge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpZDtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBoYW5kbGVycyA9IGNyZWF0ZUhhbmRsZXJzKG9wdGlvbnMpO1xuXHRjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXJzKTtcblx0cmV0dXJuIHByb3h5O1xufTtcblxuXG5leHBvcnQgY29uc3QgQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBvYmplY3QsIFMgZXh0ZW5kcyBUPih0aGlzOiBTIGV4dGVuZHMgVCA/IFMgOiB7fSwgX3RhcmdldD86IFQsIG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMgKTogVCB7XG5cdGlmICghbmV3LnRhcmdldCkge1xuXG5cdFx0Y29uc3Qgc2VsZjoge1xuXHRcdFx0cHJvdG90eXBlOiB7XG5cdFx0XHRcdGNvbnN0cnVjdG9yOiB0eXBlb2YgQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlXG5cdFx0XHR9XG5cdFx0XHQvL0B0cy1pZ25vcmVcblx0XHR9ID0gQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlLmJpbmQodGhpcywgX3RhcmdldCwgb3B0aW9ucyk7XG5cblx0XHRzZWxmLnByb3RvdHlwZSA9IHtcblx0XHRcdGNvbnN0cnVjdG9yOiBCYXNlQ29uc3RydWN0b3JQcm90b3R5cGVcblx0XHR9O1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHJldHVybiBzZWxmO1xuXG5cdH1cblxuXHQvLyBAdHMtaWdub3JlXG5cdGlmICh0aGlzW1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2VdKSB7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Y29uc3QgdGFyZ2V0ID0gYmFzZVRhcmdldChfdGFyZ2V0KSBhcyBvYmplY3Q7XG5cdGNvbnN0IHsgZnJvemVuUHJvdG90eXBlczogZnJlZXplUHJvdG9zID0gdHJ1ZSB9ID0gb3B0aW9ucyB8fCB7fTtcblxuXHRjb25zdCBJbnN0YW5jZVByb3RvdHlwZSA9IGdldFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UodGFyZ2V0LCBvcHRpb25zKTtcblxuXHRjb25zdCBjbGFzc1Byb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSBhcyBvYmplY3Q7XG5cblx0bGV0IHByb3RvO1xuXHRsZXQgcHJvdG9Qb2ludGVyID0gdGhpcyBhcyBvYmplY3Q7XG5cdGxldCBwcm90b0NvbnN0cmN1dG9yO1xuXG5cdGxldCBjb25zdHJ1Y3RvcnMgPSBmYWxzZTtcblxuXHQvLyBAdHMtaWdub3JlXG5cdC8vIGNvbnN0IGhhc1Byb3h5UmVmZXJlbmNlID0gcHJvdG9Qb2ludGVyW1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2VdIGFzIHVua25vd24gYXMgYm9vbGVhbjtcblx0Ly8gaWYgKGhhc1Byb3h5UmVmZXJlbmNlKSB7XG5cdC8vIFx0dGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBUeXBlw5htYXRpY2EgaW5zdGFudGlhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIGZvciB0aGUgc2FtZSBQcm90b3R5cGUgQ2hhaW4hJyk7XG5cdC8vIH1cblxuXHRkbyB7XG5cdFx0cHJvdG8gPSBwcm90b1BvaW50ZXI7XG5cdFx0cHJvdG9Qb2ludGVyID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcblx0XHRpZiAoQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlLnByb3RvdHlwZSA9PT0gcHJvdG9Qb2ludGVyKSB7XG5cdFx0XHRjb25zdHJ1Y3RvcnMgPSB0cnVlO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlmICghcHJvdG9Qb2ludGVyKSBicmVhaztcblx0XHRjb25zdCBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG9Qb2ludGVyLCAnY29uc3RydWN0b3InKTtcblx0XHRpZiAoIWRlc2NyaXB0b3IpIGNvbnRpbnVlO1xuXHRcdGNvbnN0IHZhbHVlID0gZGVzY3JpcHRvci52YWx1ZSB8fCBkZXNjcmlwdG9yLmdldDtcblx0XHQvLyBpZiAoIXZhbHVlKSBjb250aW51ZTtcblx0XHRwcm90b0NvbnN0cmN1dG9yID0gdmFsdWU7XG5cdH0gd2hpbGUgKHByb3RvQ29uc3RyY3V0b3IgIT09IEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZSk7XG5cblx0aWYgKCFjb25zdHJ1Y3RvcnMgJiYgcHJvdG9Db25zdHJjdXRvciAhPT0gQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gc2V0dXAgVHlwZcOYbWF0aWNhIGhhbmRsZXIhJyk7XG5cdH1cblxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIEluc3RhbmNlUHJvdG90eXBlKTtcblx0aWYgKGZyZWV6ZVByb3Rvcykge1xuXHRcdE9iamVjdC5mcmVlemUoY2xhc3NQcm90b3R5cGUpO1xuXHR9XG5cdC8vIEB0cy1pZ25vcmVcblx0cmV0dXJuIHRoaXM7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG59IGFzIHtcblx0bmV3PFQgZXh0ZW5kcyBvYmplY3QgfCB7fT4oX3RhcmdldD86IFQsIG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMpOiBUXG5cdDxUIGV4dGVuZHMgb2JqZWN0IHwge30sIFMgZXh0ZW5kcyBUPihfdGFyZ2V0PzogUyBleHRlbmRzIGluZmVyIEluZmVycmVkUyA/IEluZmVycmVkUyA6IHt9LCBvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zKTogU1xufTtcbi8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuY29uc3QgZnJlZXplQ2xhc3NQcm90b3R5cGVzID0gKGluc3RhbmNlOiBvYmplY3QsIHNob3VsZEZyZWV6ZTogYm9vbGVhbikgPT4ge1xuXHRpZiAoIXNob3VsZEZyZWV6ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGZpcnN0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGluc3RhbmNlKTtcblx0Y29uc3QgZmlyc3RJc1Byb3h5ID0gZmlyc3QgIT09IG51bGwgJiYgISFSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmaXJzdCwgU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSk7XG5cdGlmIChmaXJzdElzUHJveHkpIHtcblx0XHRPYmplY3QuZnJlZXplKEJhc2VDbGFzcy5wcm90b3R5cGUpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGxldCBwID0gZmlyc3Q7XG5cdHdoaWxlIChwICE9PSBudWxsICYmIHAgIT09IEJhc2VDbGFzcy5wcm90b3R5cGUgJiYgcCAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuXHRcdGNvbnN0IG5leHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocCk7XG5cdFx0Y29uc3QgbmV4dElzUHJveHkgPSBuZXh0ICE9PSBudWxsICYmICEhUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobmV4dCwgU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSk7XG5cdFx0T2JqZWN0LmZyZWV6ZShwKTtcblx0XHRpZiAobmV4dElzUHJveHkpIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRwID0gbmV4dDtcblx0fVxuXHRPYmplY3QuZnJlZXplKEJhc2VDbGFzcy5wcm90b3R5cGUpO1xufTtcblxuZXhwb3J0IGNsYXNzIEJhc2VDbGFzcyB7XG5cdGNvbnN0cnVjdG9yKF90YXJnZXQ/OiBvYmplY3QsIG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMpIHtcblx0XHRjb25zdCB7IGZyb3plblByb3RvdHlwZXM6IGZyZWV6ZVByb3RvcyA9IHRydWUgfSA9IG9wdGlvbnMgfHwge307XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXNbU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZV0pIHtcblx0XHRcdGZyZWV6ZUNsYXNzUHJvdG90eXBlcyh0aGlzLCBmcmVlemVQcm90b3MpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGFyZ2V0ID0gYmFzZVRhcmdldChfdGFyZ2V0KSBhcyBvYmplY3Q7XG5cdFx0Y29uc3QgcHJveHkgPSBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlKHRhcmdldCwgb3B0aW9ucyk7XG5cdFx0Y29uc3QgaW5zdGFuY2VQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcblxuXHRcdGlmIChpbnN0YW5jZVByb3RvID09PSBCYXNlQ2xhc3MucHJvdG90eXBlKSB7XG5cdFx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgcHJveHkpO1xuXHRcdFx0ZnJlZXplQ2xhc3NQcm90b3R5cGVzKHRoaXMsIGZyZWV6ZVByb3Rvcyk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHRsZXQgY2xhc3NQcm90byA9IGluc3RhbmNlUHJvdG87XG5cdFx0bGV0IHBhcmVudFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsYXNzUHJvdG8pO1xuXHRcdHdoaWxlIChwYXJlbnRQcm90byAhPT0gQmFzZUNsYXNzLnByb3RvdHlwZSAmJiBwYXJlbnRQcm90byAhPT0gbnVsbCkge1xuXHRcdFx0Y2xhc3NQcm90byA9IHBhcmVudFByb3RvO1xuXHRcdFx0cGFyZW50UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2xhc3NQcm90byk7XG5cdFx0fVxuXG5cdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNsYXNzUHJvdG8sIHByb3h5KTtcblx0XHRmcmVlemVDbGFzc1Byb3RvdHlwZXModGhpcywgZnJlZXplUHJvdG9zKTtcblx0fVxufVxuXG5cbmNvbnN0IHN0cmljdCA9IGZ1bmN0aW9uIChfdGFyZ2V0Pzogb2JqZWN0LCBvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zKSB7XG5cdGNvbnN0IHsgZnJvemVuUHJvdG90eXBlczogZnJlZXplUHJvdG9zID0gdHJ1ZSB9ID0gb3B0aW9ucyB8fCB7fTtcblxuXHRjb25zdCBkZWNvcmF0b3IgPSBmdW5jdGlvbjxUPihjc3RyOiBUKTogVCB7XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKGNzdHIucHJvdG90eXBlW1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2VdKSB7XG5cdFx0XHRyZXR1cm4gY3N0cjtcblx0XHR9XG5cblx0XHRjb25zdCB0YXJnZXQgPSBiYXNlVGFyZ2V0KF90YXJnZXQpO1xuXHRcdGNvbnN0IHByb3h5ID0gZ2V0VHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSh0YXJnZXQsIG9wdGlvbnMpO1xuXHRcdGNvbnN0IF9yZXBsYWNlciA9IE9iamVjdC5jcmVhdGUocHJveHkpO1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihjc3RyLnByb3RvdHlwZSwgX3JlcGxhY2VyKTtcblx0XHRpZiAoZnJlZXplUHJvdG9zKSB7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRPYmplY3QuZnJlZXplKGNzdHIucHJvdG90eXBlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY3N0cjtcblxuXG5cdFx0Ly8gY29uc3QgTXlDbGFzc1Byb3h5ID0gbmV3IFByb3h5KGNzdHIsIHtcblx0XHQvLyBcdGNvbnN0cnVjdChfLCBhcmd1bWVudHNMaXN0LCBuZXdUYXJnZXQpIHtcblx0XHQvLyBcdFx0ZGVidWdnZXI7XG5cdFx0Ly8gXHRcdGNvbnN0IHRhcmdldCA9IGJhc2VUYXJnZXQoX3RhcmdldCk7XG5cdFx0Ly8gXHRcdGNvbnN0IHByb3h5ID0gZ2V0VHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSh0YXJnZXQpO1xuXHRcdC8vIFx0XHRjb25zdCBfcmVwbGFjZXIgPSBPYmplY3QuY3JlYXRlKHByb3h5KTtcblxuXHRcdC8vIFx0XHRjb25zdCBfcHJvdG8gPSBjc3RyLnByb3RvdHlwZTtcblxuXHRcdC8vIFx0XHRjb25zdCBwcm90byA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKF9wcm90bykpO1xuXHRcdC8vIFx0XHRwcm90by5pQW1Qcm90byA9IHRydWU7XG5cblx0XHQvLyBcdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNzdHIucHJvdG90eXBlLCBwcm90byk7XG5cblx0XHQvLyBcdFx0Y29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhfcHJvdG8pO1xuXHRcdC8vIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwcm90bywgZGVzY3JpcHRvcnMpO1xuXG5cdFx0Ly8gXHRcdGNvbnN0IHJlcGxhY2VyID0gT2JqZWN0LmNyZWF0ZShfcmVwbGFjZXIpO1xuXHRcdC8vIFx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIHJlcGxhY2VyKTtcblxuXG5cdFx0Ly8gXHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihjc3RyLnByb3RvdHlwZSwgcHJvdG8pO1xuXHRcdC8vIFx0XHRjb25zdCByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChjc3RyLCBhcmd1bWVudHNMaXN0LCBuZXdUYXJnZXQpO1xuXG5cdFx0Ly8gXHRcdGRlYnVnZ2VyO1xuXHRcdC8vIFx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY3N0ci5wcm90b3R5cGUsIF9wcm90byk7XG5cdFx0Ly8gXHRcdGRlYnVnZ2VyO1xuXG5cdFx0Ly8gXHRcdHJldHVybiByZXN1bHQ7XG5cdFx0Ly8gXHR9LFxuXHRcdC8vIH0pO1xuXHRcdC8vIHJldHVybiBNeUNsYXNzUHJveHk7XG5cdH07XG5cblx0cmV0dXJuIGRlY29yYXRvcjtcblxufTtcbmV4cG9ydCBjb25zdCB7IFN5bWJvbEluaXRpYWxWYWx1ZSB9ID0gRmllbGRDb25zdHJ1Y3RvcjtcbmNvbnN0IEZpZWxkQ29uc3RydWN0b3JFeHBvcnQgPSBGaWVsZENvbnN0cnVjdG9yO1xuZXhwb3J0IHsgRmllbGRDb25zdHJ1Y3RvckV4cG9ydCBhcyBGaWVsZENvbnN0cnVjdG9yIH07XG5leHBvcnQgY29uc3QgU3RyaWN0ID0gc3RyaWN0O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gc2V0dXBDb21tb25KUygpIHtcblx0aWYgKHR5cGVvZiBtb2R1bGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgJ2V4cG9ydHMnLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZTtcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnQmFzZUNsYXNzJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBCYXNlQ2xhc3M7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdGaWVsZENvbnN0cnVjdG9yJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBGaWVsZENvbnN0cnVjdG9yO1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnU3ltYm9sSW5pdGlhbFZhbHVlJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBTeW1ib2xJbml0aWFsVmFsdWU7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlO1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnYmFzZVRhcmdldCcsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gYmFzZVRhcmdldDtcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ1N0cmljdCcsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gc3RyaWN0O1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcbn1cblxuc2V0dXBDb21tb25KUygpO1xuXG5PYmplY3QuZnJlZXplKEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZSk7XG5PYmplY3QuZnJlZXplKEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZS5wcm90b3R5cGUpO1xuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMENBQTBDO0FBRTFDLFlBQVksQ0FBQztBQUViLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUxQyxPQUFPLEVBQ04sU0FBUyxFQUNULE9BQU8sRUFDUCxPQUFPLEVBQ1AsVUFBVSxFQUNWLE9BQU8sRUFDUCxXQUFXLEVBQ1gsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFhL0MsaUVBQWlFO0FBQ2pFLG1FQUFtRTtBQUNuRSxtRUFBbUU7QUFDbkUsNkRBQTZEO0FBQzdELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQThCLENBQUM7QUFFdEUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxRQUFnQixFQUFzQixFQUFFO0lBQzdELElBQUksTUFBTSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDYixNQUFNLEdBQUc7WUFDUixNQUFNLEVBQU0sSUFBSSxHQUFHLEVBQUU7WUFDckIsT0FBTyxFQUFLLFNBQVM7WUFDckIsU0FBUyxFQUFHLEtBQUs7U0FDakIsQ0FBQztRQUNGLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxVQUE4QixFQUFFLEVBQUUsRUFBRTtJQUMzRCxNQUFNLEVBQUUsaUJBQWlCLEdBQUcsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTlDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FB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LE1BQU0sQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBveGxpbnQtZGlzYWJsZSB0eXBlc2NyaXB0L25vLXRoaXMtYWxpYXNcbiBcbid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgRXJyb3JzTmFtZXMgfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5cbmltcG9ydCB7XG5cdGZ1bmN0aW9ucyxcblx0bnVsbGlzaCxcblx0b2JqZWN0cyxcblx0cHJpbWl0aXZlcyxcblx0c3BlY2lhbCxcblx0aXNQcmltaXRpdmVcbn0gZnJvbSAnLi90eXBlcy9pbmRleC5qcyc7XG5cbmltcG9ydCB7IEZpZWxkQ29uc3RydWN0b3IgfSBmcm9tICcuL2ZpZWxkcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZW9tYXRpY2FPcHRpb25zIHtcblx0c3RyaWN0QWNjZXNzQ2hlY2s/OiBib29sZWFuO1xuXHRmcm96ZW5Qcm90b3R5cGVzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENvbnN0cnVjdGlvblJlY29yZCB7XG5cdGZpZWxkcyAgICA6IFNldDxzdHJpbmcgfCBzeW1ib2w+O1xuXHRvcHRpb25zICAgOiBUeXBlb21hdGljYU9wdGlvbnMgfCB1bmRlZmluZWQ7XG5cdGZpbmFsaXplZCA6IGJvb2xlYW47XG59XG5cbi8vIEZpZWxkcyB0aGF0IHBhc3NlZCB0aHJvdWdoIHRoZSBkZWZpbmUgbWFjaGluZXJ5LCBwZXIgaW5zdGFuY2UuXG4vLyBUaGUgcG9zdENvbnN0cnVjdGlvbiBjb21wYXJhdG9yIChUaHVuZGVyc3RydWNrIGRlc2lnbikgZGlmZnMgdGhlXG4vLyBpbnN0YW5jZSdzIG93biBkZXNjcmlwdG9ycyBhZ2FpbnN0IHRoaXMgU2V0IHRvIGZpbmQgZmllbGRzIGFkZGVkXG4vLyBoaWRkZW5seSDigJQgY2xhc3MgZmllbGRzIGFuZCBvdGhlciBkZWZpbmUtc2VtYW50aWNzIHdyaXRlcy5cbmNvbnN0IGNvbnN0cnVjdGlvblJlY29yZHMgPSBuZXcgV2Vha01hcDxvYmplY3QsIENvbnN0cnVjdGlvblJlY29yZD4oKTtcblxuY29uc3QgZW5zdXJlUmVjb3JkID0gKGluc3RhbmNlOiBvYmplY3QpOiBDb25zdHJ1Y3Rpb25SZWNvcmQgPT4ge1xuXHRsZXQgcmVjb3JkID0gY29uc3RydWN0aW9uUmVjb3Jkcy5nZXQoaW5zdGFuY2UpO1xuXHRpZiAoIXJlY29yZCkge1xuXHRcdHJlY29yZCA9IHtcblx0XHRcdGZpZWxkcyAgICA6IG5ldyBTZXQoKSxcblx0XHRcdG9wdGlvbnMgICA6IHVuZGVmaW5lZCxcblx0XHRcdGZpbmFsaXplZCA6IGZhbHNlXG5cdFx0fTtcblx0XHRjb25zdHJ1Y3Rpb25SZWNvcmRzLnNldChpbnN0YW5jZSwgcmVjb3JkKTtcblx0fVxuXHRyZXR1cm4gcmVjb3JkO1xufTtcblxuY29uc3QgY3JlYXRlUmVzb2x2ZXIgPSAob3B0aW9uczogVHlwZW9tYXRpY2FPcHRpb25zID0ge30pID0+IHtcblx0Y29uc3QgeyBzdHJpY3RBY2Nlc3NDaGVjayA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXHRcblx0cmV0dXJuIE9iamVjdC5lbnRyaWVzKHtcblx0XHRwcmltaXRpdmVzLFxuXHRcdHNwZWNpYWwsXG5cdFx0bnVsbGlzaCxcblx0XHRvYmplY3RzLFxuXHRcdGZ1bmN0aW9uc1xuXHR9KS5yZWR1Y2UoKG9iajogb2JqZWN0LCBba2V5LCBfaGFuZGxlcl0pID0+IHtcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0b2JqW2tleV0gPSBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlOiBvYmplY3QsIHJlY2VpdmVyOiBvYmplY3QpIHtcblx0XHRcdGNvbnN0IGhhbmRsZXIgPSBfaGFuZGxlcihpbml0aWFsVmFsdWUpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Z2V0KCkge1xuXHRcdFx0XHRcdGNvbnN0IGludm9jYXRpb25UaGlzID0gdGhpcztcblx0XHRcdFx0XHRpZiAoc3RyaWN0QWNjZXNzQ2hlY2sgJiYgaW52b2NhdGlvblRoaXMgIT09IHJlY2VpdmVyKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoRXJyb3JzTmFtZXMuQUNDRVNTX0RFTklFRCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGhhbmRsZXIuZ2V0KCk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0fSxcblx0XHRcdFx0c2V0KHJlcGxhY2VtZW50VmFsdWU6IHVua25vd24pIHtcblx0XHRcdFx0XHRjb25zdCBpbnZvY2F0aW9uVGhpcyA9IHRoaXM7XG5cdFx0XHRcdFx0aWYgKHN0cmljdEFjY2Vzc0NoZWNrICYmIGludm9jYXRpb25UaGlzICE9PSByZWNlaXZlcikge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKEVycm9yc05hbWVzLkFDQ0VTU19ERU5JRUQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCByZXN1bHQgPSBoYW5kbGVyLnNldChyZXBsYWNlbWVudFZhbHVlKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHRyZXR1cm4gb2JqO1xuXHR9LCB7fSk7XG59O1xuXG5jb25zdCBjcmVhdGVQcm9wZXJ0eSA9IChwcm9wTmFtZTogc3RyaW5nIHwgc3ltYm9sLCBpbml0aWFsVmFsdWU6IHVua25vd24sIHJlY2VpdmVyOiBvYmplY3QsIG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMsIGNvbmZpZ3VyYWJsZSA9IGZhbHNlKSA9PiB7XG5cblx0Y29uc3QgdmFsdWUgPSBpbml0aWFsVmFsdWU7XG5cdGNvbnN0IHZhbHVlSXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZShpbml0aWFsVmFsdWUpO1xuXHRjb25zdCBpc09iamVjdCA9IHR5cGVvZiBpbml0aWFsVmFsdWUgPT09ICdvYmplY3QnO1xuXHRjb25zdCBpc0Z1bmN0aW9uID0gaW5pdGlhbFZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb247XG5cdGNvbnN0IGlzTnVsbCA9IGluaXRpYWxWYWx1ZSA9PT0gbnVsbDtcblxuXHQvKipcblx0ICogc3BlY2lhbDogdW5kZWZpbmVkIG9yIEJpZ0ludCBvciBTeW1ib2xcblx0ICogXHRvciBvdGhlciBub24gY29uc3RydWN0aWJsZSB0eXBlXG5cdCAqL1xuXG5cdGNvbnN0IHR5cGVzID0gdmFsdWVJc1ByaW1pdGl2ZSA/ICdwcmltaXRpdmVzJyA6IChcblx0XHRpc09iamVjdCA/IChcblx0XHRcdGlzTnVsbCA/ICdudWxsaXNoJyA6ICdvYmplY3RzJ1xuXHRcdCkgOiAoXG5cdFx0XHRpc0Z1bmN0aW9uID8gJ2Z1bmN0aW9ucycgOiAnc3BlY2lhbCdcblx0XHQpXG5cdCk7XG5cblx0Y29uc3QgcmVzb2x2ZXIgPSBjcmVhdGVSZXNvbHZlcihvcHRpb25zKTtcblxuXHRjb25zdCBkZXNjcmlwdG9yID0gKGlzT2JqZWN0ICYmICh2YWx1ZSBpbnN0YW5jZW9mIEZpZWxkQ29uc3RydWN0b3IpKSA/XG5cdFx0dmFsdWUgOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlLFxuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0Li4ucmVzb2x2ZXJbdHlwZXNdKHZhbHVlLCByZWNlaXZlciksXG5cdFx0fTtcblxuXHQvLyBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWVsZENvbnN0cnVjdG9yKSB7XG5cdC8vIFx0ZGVzY3JpcHRvcjtcblx0Ly8gXHRkZWJ1Z2dlcjtcblx0Ly8gfVxuXG5cdGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZGVmaW5lUHJvcGVydHkocmVjZWl2ZXIsIHByb3BOYW1lLCBkZXNjcmlwdG9yKTtcblxuXHRjb25zdCByZWNvcmQgPSBlbnN1cmVSZWNvcmQocmVjZWl2ZXIpO1xuXHRyZWNvcmQuZmllbGRzLmFkZChwcm9wTmFtZSk7XG5cdHJlY29yZC5vcHRpb25zID0gb3B0aW9ucztcblxuXHRyZXR1cm4gcmVzdWx0O1xuXG59O1xuXG4vLyBsaW5lIGJlbG93ICdocmVmJyBpcyBmb3IgdXRpbC5pbnNwZWN0IHdvcmtzLCB1c2VmdWwgZm9yIHYyNFxuY29uc3QgcHJvcHMyc2tpcCA9IG5ldyBTZXQoW1xuXHRTeW1ib2wudG9TdHJpbmdUYWcsXG5cdFN5bWJvbC5pdGVyYXRvcixcblx0Ly8gU3ltYm9sLnRvUHJpbWl0aXZlLFxuXHQndG9TdHJpbmcnLFxuXHQndmFsdWVPZicsXG5cdCdocmVmJ1xuXSk7XG4vLyBjb25zdCBwcm9wczJza2lwID0gbmV3IFNldChbU3ltYm9sLnRvU3RyaW5nVGFnLCBTeW1ib2wuaXRlcmF0b3JdKTtcbmNvbnN0IGhhc05vZGVJbnNwZWN0ID0gKGluc3BlY3QgJiYgaW5zcGVjdC5jdXN0b20pO1xuLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuKGhhc05vZGVJbnNwZWN0ICYmIChwcm9wczJza2lwLmFkZChpbnNwZWN0LmN1c3RvbSkpKTtcblxuY29uc3QgY3JlYXRlSGFuZGxlcnMgPSAob3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucykgPT4gKHtcblx0Z2V0KHRhcmdldDogb2JqZWN0LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHJlY2VpdmVyOiBvYmplY3QpIHtcblx0XHRjb25zdCByZXN1bHQgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcblx0XHRpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHRcdGlmIChwcm9wID09PSAndG9KU09OJykge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKHRoaXM6IHR5cGVvZiB0YXJnZXQpIHtcblx0XHRcdFx0Y29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMpO1xuXHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZW50cmllcy5yZWR1Y2UoKG9iaiwgW2tleSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdG9ialtrZXldID0gdmFsdWUudmFsdWVPZigpO1xuXHRcdFx0XHRcdHJldHVybiBvYmo7XG5cdFx0XHRcdH0sIHt9KSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRpZiAocHJvcCA9PT0gJ2NvbnN0cnVjdG9yJykge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgeyBuYW1lIH0gPSByZWNlaXZlci5jb25zdHJ1Y3Rvcjtcblx0XHRpZiAocHJvcHMyc2tpcC5oYXMocHJvcCkpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBgJHtuYW1lfSBsYWNrcyBkZWZpbml0aW9uIG9mIFsgJHtTdHJpbmcocHJvcCkudmFsdWVPZigpfSBdYDtcblx0XHRcdHJldHVybiBtZXNzYWdlO1xuXHRcdH1cblx0XHQvLyBjb25zdCBlcnJvck1lc3NhZ2UgPSBgJHtFcnJvcnNOYW1lcy5NSVNTSU5HX1BST1B9OiBbICR7U3RyaW5nKHByb3ApLnZhbHVlT2YoKX0gXSBmb3IgJHtuYW1lfWA7XG5cdFx0Ly8gdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG5cdH0sXG5cdHNldChfOiBvYmplY3QsIHByb3A6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHJlY2VpdmVyOiBvYmplY3QpIHtcblx0XHRjb25zdCByZXN1bHQgPSBjcmVhdGVQcm9wZXJ0eShwcm9wLCB2YWx1ZSwgcmVjZWl2ZXIsIG9wdGlvbnMpO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cdHNldFByb3RvdHlwZU9mKCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignU2V0dGluZyBwcm90b3R5cGUgaXMgbm90IGFsbG93ZWQhJyk7XG5cdH0sXG5cdC8vIGRlZmluZVByb3BlcnR5KHRhcmdldDogb2JqZWN0LCBrZXk6IHN0cmluZywgZGVzY3JpcHRvcjogb2JqZWN0KSB7XG5cdGRlZmluZVByb3BlcnR5KCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignRGVmaW5pbmcgbmV3IFByb3BlcnRpZXMgaXMgbm90IGFsbG93ZWQhJyk7XG5cdFx0Ly8gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzY3JpcHRvcik7XG5cdH0sXG5cdGRlbGV0ZVByb3BlcnR5KCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignUHJvcGVydGllcyBEZWxldGlvbiBpcyBub3QgYWxsb3dlZCEnKTtcblx0fSxcblx0Ly8gZ2V0UHJvdG90eXBlT2YoKSB7XG5cdC8vIFx0ZGVidWdnZXI7XG5cdC8vIFx0dGhyb3cgbmV3IEVycm9yKCdHZXR0aW5nIHByb3RvdHlwZSBpcyBub3QgYWxsb3dlZCcpO1xuXHQvLyB9LFxufSk7XG5cbi8vIHVzZXIgaGF2ZSB0byBwcmVjaXNlbHkgZGVmaW5lIGFsbCBwcm9wc1xuZXhwb3J0IGNvbnN0IGJhc2VUYXJnZXQgPSAoX3Byb3RvPzogb2JqZWN0KSA9PiB7XG5cdGNvbnN0IHByb3RvID0gdHlwZW9mIF9wcm90byA9PT0gJ29iamVjdCcgPyBfcHJvdG8gOiBudWxsO1xuXHRjb25zdCBhbnN3ZXIgPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcblx0cmV0dXJuIGFuc3dlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlID0gU3ltYm9sKCdUeXBlw5htYXRpY2FQcm94eVJlZmVyZW5jZScpO1xuY29uc3QgZ2V0VHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSA9IChfdGFyZ2V0OiBvYmplY3QsIG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMpID0+IHtcblx0Y29uc3QgdGFyZ2V0ID0gT2JqZWN0LmNyZWF0ZShfdGFyZ2V0KTtcblx0Y29uc3QgaWQgPSBgVHlwZcOYbWF0aWNhUHJveHlSZWZlcmVuY2UtJHtNYXRoLnJhbmRvbSgpfWA7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIFN5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gaWQ7XG5cdFx0fVxuXHR9KTtcblx0Y29uc3QgaGFuZGxlcnMgPSBjcmVhdGVIYW5kbGVycyhvcHRpb25zKTtcblx0Y29uc3QgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVycyk7XG5cdHJldHVybiBwcm94eTtcbn07XG5cblxuZXhwb3J0IGNvbnN0IEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZSA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgb2JqZWN0LCBTIGV4dGVuZHMgVD4odGhpczogUyBleHRlbmRzIFQgPyBTIDoge30sIF90YXJnZXQ/OiBULCBvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zICk6IFQge1xuXHRpZiAoIW5ldy50YXJnZXQpIHtcblxuXHRcdGNvbnN0IHNlbGY6IHtcblx0XHRcdHByb3RvdHlwZToge1xuXHRcdFx0XHRjb25zdHJ1Y3RvcjogdHlwZW9mIEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZVxuXHRcdFx0fVxuXHRcdFx0Ly9AdHMtaWdub3JlXG5cdFx0fSA9IEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZS5iaW5kKHRoaXMsIF90YXJnZXQsIG9wdGlvbnMpO1xuXG5cdFx0c2VsZi5wcm90b3R5cGUgPSB7XG5cdFx0XHRjb25zdHJ1Y3RvcjogQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlXG5cdFx0fTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRyZXR1cm4gc2VsZjtcblxuXHR9XG5cblx0Ly8gQHRzLWlnbm9yZVxuXHRpZiAodGhpc1tTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlXSkge1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdGNvbnN0IHRhcmdldCA9IGJhc2VUYXJnZXQoX3RhcmdldCkgYXMgb2JqZWN0O1xuXHRjb25zdCB7IGZyb3plblByb3RvdHlwZXM6IGZyZWV6ZVByb3RvcyA9IHRydWUgfSA9IG9wdGlvbnMgfHwge307XG5cblx0Y29uc3QgSW5zdGFuY2VQcm90b3R5cGUgPSBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlKHRhcmdldCwgb3B0aW9ucyk7XG5cblx0Y29uc3QgY2xhc3NQcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykgYXMgb2JqZWN0O1xuXG5cdGxldCBwcm90bztcblx0bGV0IHByb3RvUG9pbnRlciA9IHRoaXMgYXMgb2JqZWN0O1xuXHRsZXQgcHJvdG9Db25zdHJjdXRvcjtcblxuXHRsZXQgY29uc3RydWN0b3JzID0gZmFsc2U7XG5cblx0Ly8gQHRzLWlnbm9yZVxuXHQvLyBjb25zdCBoYXNQcm94eVJlZmVyZW5jZSA9IHByb3RvUG9pbnRlcltTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlXSBhcyB1bmtub3duIGFzIGJvb2xlYW47XG5cdC8vIGlmIChoYXNQcm94eVJlZmVyZW5jZSkge1xuXHQvLyBcdHRocm93IG5ldyBFcnJvcignTXVsdGlwbGUgVHlwZcOYbWF0aWNhIGluc3RhbnRpYXRpb25zIGFyZSBub3QgYWxsb3dlZCBmb3IgdGhlIHNhbWUgUHJvdG90eXBlIENoYWluIScpO1xuXHQvLyB9XG5cblx0ZG8ge1xuXHRcdHByb3RvID0gcHJvdG9Qb2ludGVyO1xuXHRcdHByb3RvUG9pbnRlciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG5cdFx0aWYgKEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZS5wcm90b3R5cGUgPT09IHByb3RvUG9pbnRlcikge1xuXHRcdFx0Y29uc3RydWN0b3JzID0gdHJ1ZTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRpZiAoIXByb3RvUG9pbnRlcikgYnJlYWs7XG5cdFx0Y29uc3QgZGVzY3JpcHRvciA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvUG9pbnRlciwgJ2NvbnN0cnVjdG9yJyk7XG5cdFx0aWYgKCFkZXNjcmlwdG9yKSBjb250aW51ZTtcblx0XHRjb25zdCB2YWx1ZSA9IGRlc2NyaXB0b3IudmFsdWUgfHwgZGVzY3JpcHRvci5nZXQ7XG5cdFx0Ly8gaWYgKCF2YWx1ZSkgY29udGludWU7XG5cdFx0cHJvdG9Db25zdHJjdXRvciA9IHZhbHVlO1xuXHR9IHdoaWxlIChwcm90b0NvbnN0cmN1dG9yICE9PSBCYXNlQ29uc3RydWN0b3JQcm90b3R5cGUpO1xuXG5cdGlmICghY29uc3RydWN0b3JzICYmIHByb3RvQ29uc3RyY3V0b3IgIT09IEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHNldHVwIFR5cGXDmG1hdGljYSBoYW5kbGVyIScpO1xuXHR9XG5cblx0T2JqZWN0LnNldFByb3RvdHlwZU9mKHByb3RvLCBJbnN0YW5jZVByb3RvdHlwZSk7XG5cdGlmIChmcmVlemVQcm90b3MpIHtcblx0XHRPYmplY3QuZnJlZXplKGNsYXNzUHJvdG90eXBlKTtcblx0fVxuXHQvLyBAdHMtaWdub3JlXG5cdHJldHVybiB0aGlzO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xufSBhcyB7XG5cdG5ldzxUIGV4dGVuZHMgb2JqZWN0IHwge30+KF90YXJnZXQ/OiBULCBvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zKTogVFxuXHQ8VCBleHRlbmRzIG9iamVjdCB8IHt9LCBTIGV4dGVuZHMgVD4oX3RhcmdldD86IFMgZXh0ZW5kcyBpbmZlciBJbmZlcnJlZFMgPyBJbmZlcnJlZFMgOiB7fSwgb3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucyk6IFNcbn07XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG5cbmNvbnN0IGZyZWV6ZUNsYXNzUHJvdG90eXBlcyA9IChpbnN0YW5jZTogb2JqZWN0LCBzaG91bGRGcmVlemU6IGJvb2xlYW4pID0+IHtcblx0aWYgKCFzaG91bGRGcmVlemUpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBmaXJzdCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnN0YW5jZSk7XG5cdGNvbnN0IGZpcnN0SXNQcm94eSA9IGZpcnN0ICE9PSBudWxsICYmICEhUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZmlyc3QsIFN5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UpO1xuXHRpZiAoZmlyc3RJc1Byb3h5KSB7XG5cdFx0T2JqZWN0LmZyZWV6ZShCYXNlQ2xhc3MucHJvdG90eXBlKTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRsZXQgcCA9IGZpcnN0O1xuXHR3aGlsZSAocCAhPT0gbnVsbCAmJiBwICE9PSBCYXNlQ2xhc3MucHJvdG90eXBlICYmIHAgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcblx0XHRjb25zdCBuZXh0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHApO1xuXHRcdGNvbnN0IG5leHRJc1Byb3h5ID0gbmV4dCAhPT0gbnVsbCAmJiAhIVJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5leHQsIFN5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UpO1xuXHRcdE9iamVjdC5mcmVlemUocCk7XG5cdFx0aWYgKG5leHRJc1Byb3h5KSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0cCA9IG5leHQ7XG5cdH1cblx0T2JqZWN0LmZyZWV6ZShCYXNlQ2xhc3MucHJvdG90eXBlKTtcbn07XG5cbmV4cG9ydCBjbGFzcyBCYXNlQ2xhc3Mge1xuXHRjb25zdHJ1Y3RvcihfdGFyZ2V0Pzogb2JqZWN0LCBvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBmcm96ZW5Qcm90b3R5cGVzOiBmcmVlemVQcm90b3MgPSB0cnVlIH0gPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmICh0aGlzW1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2VdKSB7XG5cdFx0XHRmcmVlemVDbGFzc1Byb3RvdHlwZXModGhpcywgZnJlZXplUHJvdG9zKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRhcmdldCA9IGJhc2VUYXJnZXQoX3RhcmdldCkgYXMgb2JqZWN0O1xuXHRcdGNvbnN0IHByb3h5ID0gZ2V0VHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSh0YXJnZXQsIG9wdGlvbnMpO1xuXHRcdGNvbnN0IGluc3RhbmNlUHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG5cblx0XHRpZiAoaW5zdGFuY2VQcm90byA9PT0gQmFzZUNsYXNzLnByb3RvdHlwZSkge1xuXHRcdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIHByb3h5KTtcblx0XHRcdGZyZWV6ZUNsYXNzUHJvdG90eXBlcyh0aGlzLCBmcmVlemVQcm90b3MpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0bGV0IGNsYXNzUHJvdG8gPSBpbnN0YW5jZVByb3RvO1xuXHRcdGxldCBwYXJlbnRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjbGFzc1Byb3RvKTtcblx0XHR3aGlsZSAocGFyZW50UHJvdG8gIT09IEJhc2VDbGFzcy5wcm90b3R5cGUgJiYgcGFyZW50UHJvdG8gIT09IG51bGwpIHtcblx0XHRcdGNsYXNzUHJvdG8gPSBwYXJlbnRQcm90bztcblx0XHRcdHBhcmVudFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsYXNzUHJvdG8pO1xuXHRcdH1cblxuXHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihjbGFzc1Byb3RvLCBwcm94eSk7XG5cdFx0ZnJlZXplQ2xhc3NQcm90b3R5cGVzKHRoaXMsIGZyZWV6ZVByb3Rvcyk7XG5cdH1cbn1cblxuXG5jb25zdCBzdHJpY3QgPSBmdW5jdGlvbiAoX3RhcmdldD86IG9iamVjdCwgb3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucykge1xuXHRjb25zdCB7IGZyb3plblByb3RvdHlwZXM6IGZyZWV6ZVByb3RvcyA9IHRydWUgfSA9IG9wdGlvbnMgfHwge307XG5cblx0Y29uc3QgZGVjb3JhdG9yID0gZnVuY3Rpb248VD4oY3N0cjogVCk6IFQge1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGlmIChjc3RyLnByb3RvdHlwZVtTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlXSkge1xuXHRcdFx0cmV0dXJuIGNzdHI7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGFyZ2V0ID0gYmFzZVRhcmdldChfdGFyZ2V0KTtcblx0XHRjb25zdCBwcm94eSA9IGdldFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UodGFyZ2V0LCBvcHRpb25zKTtcblx0XHRjb25zdCBfcmVwbGFjZXIgPSBPYmplY3QuY3JlYXRlKHByb3h5KTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY3N0ci5wcm90b3R5cGUsIF9yZXBsYWNlcik7XG5cdFx0aWYgKGZyZWV6ZVByb3Rvcykge1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0T2JqZWN0LmZyZWV6ZShjc3RyLnByb3RvdHlwZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNzdHI7XG5cblxuXHRcdC8vIGNvbnN0IE15Q2xhc3NQcm94eSA9IG5ldyBQcm94eShjc3RyLCB7XG5cdFx0Ly8gXHRjb25zdHJ1Y3QoXywgYXJndW1lbnRzTGlzdCwgbmV3VGFyZ2V0KSB7XG5cdFx0Ly8gXHRcdGRlYnVnZ2VyO1xuXHRcdC8vIFx0XHRjb25zdCB0YXJnZXQgPSBiYXNlVGFyZ2V0KF90YXJnZXQpO1xuXHRcdC8vIFx0XHRjb25zdCBwcm94eSA9IGdldFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UodGFyZ2V0KTtcblx0XHQvLyBcdFx0Y29uc3QgX3JlcGxhY2VyID0gT2JqZWN0LmNyZWF0ZShwcm94eSk7XG5cblx0XHQvLyBcdFx0Y29uc3QgX3Byb3RvID0gY3N0ci5wcm90b3R5cGU7XG5cblx0XHQvLyBcdFx0Y29uc3QgcHJvdG8gPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihfcHJvdG8pKTtcblx0XHQvLyBcdFx0cHJvdG8uaUFtUHJvdG8gPSB0cnVlO1xuXG5cdFx0Ly8gXHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihjc3RyLnByb3RvdHlwZSwgcHJvdG8pO1xuXG5cdFx0Ly8gXHRcdGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoX3Byb3RvKTtcblx0XHQvLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocHJvdG8sIGRlc2NyaXB0b3JzKTtcblxuXHRcdC8vIFx0XHRjb25zdCByZXBsYWNlciA9IE9iamVjdC5jcmVhdGUoX3JlcGxhY2VyKTtcblx0XHQvLyBcdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKHByb3RvLCByZXBsYWNlcik7XG5cblxuXHRcdC8vIFx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY3N0ci5wcm90b3R5cGUsIHByb3RvKTtcblx0XHQvLyBcdFx0Y29uc3QgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoY3N0ciwgYXJndW1lbnRzTGlzdCwgbmV3VGFyZ2V0KTtcblxuXHRcdC8vIFx0XHRkZWJ1Z2dlcjtcblx0XHQvLyBcdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNzdHIucHJvdG90eXBlLCBfcHJvdG8pO1xuXHRcdC8vIFx0XHRkZWJ1Z2dlcjtcblxuXHRcdC8vIFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdC8vIFx0fSxcblx0XHQvLyB9KTtcblx0XHQvLyByZXR1cm4gTXlDbGFzc1Byb3h5O1xuXHR9O1xuXG5cdHJldHVybiBkZWNvcmF0b3I7XG5cbn07XG5leHBvcnQgY29uc3QgeyBTeW1ib2xJbml0aWFsVmFsdWUgfSA9IEZpZWxkQ29uc3RydWN0b3I7XG5jb25zdCBGaWVsZENvbnN0cnVjdG9yRXhwb3J0ID0gRmllbGRDb25zdHJ1Y3RvcjtcbmV4cG9ydCB7IEZpZWxkQ29uc3RydWN0b3JFeHBvcnQgYXMgRmllbGRDb25zdHJ1Y3RvciB9O1xuZXhwb3J0IGNvbnN0IFN0cmljdCA9IHN0cmljdDtcblxuLyoqXG4gKiBGaWVsZHMgdGhhdCBjZXJ0YWlubHkgcGFzc2VkIHRocm91Z2ggdGhlIGRlZmluZSBtYWNoaW5lcnkgZm9yIHRoaXNcbiAqIGluc3RhbmNlLiBSZXR1cm5zIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgU2V0IOKAlCBzYWZlIGZvciB0aGUgY2FsbGVyXG4gKiB0byBtdXRhdGUuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb25zdHJ1Y3RlZEZpZWxkcyA9IChpbnN0YW5jZTogb2JqZWN0KTogU2V0PHN0cmluZyB8IHN5bWJvbD4gPT4ge1xuXHRjb25zdCByZWNvcmQgPSBjb25zdHJ1Y3Rpb25SZWNvcmRzLmdldChpbnN0YW5jZSk7XG5cdGNvbnN0IHJlc3VsdCA9IHJlY29yZCA/IG5ldyBTZXQocmVjb3JkLmZpZWxkcykgOiBuZXcgU2V0PHN0cmluZyB8IHN5bWJvbD4oKTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IGZpbmFsaXNlRmllbGRzID0gKGluc3RhbmNlOiBvYmplY3QsIG5hbWVzOiAoc3RyaW5nIHwgc3ltYm9sKVtdKTogdm9pZCA9PiB7XG5cdGNvbnN0IHJlY29yZCA9IGVuc3VyZVJlY29yZChpbnN0YW5jZSk7XG5cdG5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRpZiAocmVjb3JkLmZpZWxkcy5oYXMobmFtZSkpIHtcblx0XHRcdC8vIGFscmVhZHkgcGFzc2VkIHRocm91Z2ggdGhlIG1hY2hpbmVyeVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW5zdGFuY2UsIG5hbWUpO1xuXHRcdGlmICghZGVzY3JpcHRvciB8fCAhKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikpIHtcblx0XHRcdC8vIG5vdGhpbmcgaGlkZGVuIHVuZGVyIHRoYXQgbmFtZSwgb3Igbm90IGEgZGF0YSBmaWVsZFxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRkZWxldGUgKGluc3RhbmNlIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW25hbWVdO1xuXHRcdC8vIGZpbmFsaXplZCBmaWVsZHMgc3RheSBjb25maWd1cmFibGU6IHRoZXkgYXJlIHRoZSBvbmVzIGB1bndyYXBgXG5cdFx0Ly8gaXMgYWxsb3dlZCB0byB0dXJuIGJhY2sgaW50byBwbGFpbiB2YWx1ZSBwcm9wZXJ0aWVzXG5cdFx0Y3JlYXRlUHJvcGVydHkobmFtZSwgZGVzY3JpcHRvci52YWx1ZSwgaW5zdGFuY2UsIHJlY29yZC5vcHRpb25zLCB0cnVlKTtcblx0fSk7XG59O1xuXG4vKipcbiAqIEF1dG8gZmluYWxpemF0aW9uOiBldmVyeSBoaWRkZW5seS1hZGRlZCBvd24gZmllbGQgb2YgdGhlIGluc3RhbmNlXG4gKiAoY2xhc3MgZmllbGRzIGFuZCBvdGhlciBkZWZpbmUtc2VtYW50aWNzIHdyaXRlcyB0aGF0IGJ5cGFzc2VkIHRoZVxuICogcHJveHkpIGlzIGRlbGV0ZWQgYW5kIHJlLWVzdGFibGlzaGVkIHRocm91Z2ggdGhlIGRlZmluZSBtYWNoaW5lcnkuXG4gKiBTZXRzIHRoZSBmaW5hbGl6ZWQgZmxhZyDigJQgYHRydWVgIG1lYW5zIGF1dG8gbW9kZSByYW4uXG4gKi9cbmV4cG9ydCBjb25zdCBmaW5hbGl6ZSA9IChpbnN0YW5jZTogb2JqZWN0KTogdm9pZCA9PiB7XG5cdGNvbnN0IHJlY29yZCA9IGVuc3VyZVJlY29yZChpbnN0YW5jZSk7XG5cdGZpbmFsaXNlRmllbGRzKGluc3RhbmNlLCBSZWZsZWN0Lm93bktleXMoaW5zdGFuY2UpKTtcblx0cmVjb3JkLmZpbmFsaXplZCA9IHRydWU7XG59O1xuXG4vKipcbiAqIFBhcnRpYWwgZmluYWxpemF0aW9uOiByZS1lc3RhYmxpc2ggb25seSB0aGUgbGlzdGVkIGZpZWxkcy5cbiAqIERvZXMgTk9UIHNldCB0aGUgZmluYWxpemVkIGZsYWcg4oCUIHRoYXQgZmxhZyBtZWFucyBhdXRvIG1vZGUgcmFuLFxuICogZXZlcnl0aGluZyBlbHNlIGlzIHRoZSB1c2VyJ3MgY2hvaWNlLlxuICovXG5leHBvcnQgY29uc3QgZmluYWxpemVCeSA9IChpbnN0YW5jZTogb2JqZWN0LCBmaWVsZHM6IChzdHJpbmcgfCBzeW1ib2wpW10pOiB2b2lkID0+IHtcblx0ZmluYWxpc2VGaWVsZHMoaW5zdGFuY2UsIGZpZWxkcyk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNGaW5hbGl6ZWQgPSAoaW5zdGFuY2U6IG9iamVjdCk6IGJvb2xlYW4gPT4ge1xuXHRjb25zdCByZWNvcmQgPSBjb25zdHJ1Y3Rpb25SZWNvcmRzLmdldChpbnN0YW5jZSk7XG5cdGNvbnN0IHJlc3VsdCA9IHJlY29yZCA/IHJlY29yZC5maW5hbGl6ZWQgOiBmYWxzZTtcblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogVHVybiBhIGd1YXJkZWQgZmllbGQgYmFjayBpbnRvIGEgcGxhaW4gdmFsdWUgcHJvcGVydHkuXG4gKiBBbGxvd2VkIG9ubHkgZm9yIGZpZWxkcyByZS1lc3RhYmxpc2hlZCBieSBmaW5hbGl6ZS9maW5hbGl6ZUJ5IOKAlFxuICogdGhleSBzdGF5IGNvbmZpZ3VyYWJsZSBieSBkZXNpZ24uIEZpZWxkcyBndWFyZGVkIHNpbmNlIGNvbnN0cnVjdGlvblxuICogYXJlIG5vbi1jb25maWd1cmFibGU6IHRoYXQgbG9jayBpcyB0aGUgZXNzZW50aWFsIGRlc2lnbiBvZiB0aGUgbGliLlxuICogUHJpbWl0aXZlcyBhcmUgcmVhZCBiYWNrIHZpYSAudmFsdWVPZigpOyBvYmplY3RzIGFyZSBwbGFjZWQgYXMtaXMuXG4gKi9cbmV4cG9ydCBjb25zdCB1bndyYXAgPSAoaW5zdGFuY2U6IG9iamVjdCwgZmllbGQ6IHN0cmluZyB8IHN5bWJvbCk6IHZvaWQgPT4ge1xuXHRjb25zdCBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW5zdGFuY2UsIGZpZWxkKTtcblx0aWYgKCFkZXNjcmlwdG9yIHx8ICFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSB8fCB0eXBlb2YgZGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKEVycm9yc05hbWVzLkZPUkJJRERFTl9VTldSQVApO1xuXHR9XG5cdGNvbnN0IGN1cnJlbnQgPSAoaW5zdGFuY2UgYXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPilbZmllbGRdO1xuXHRjb25zdCBjdXJyZW50VmFsdWVPZiA9IChjdXJyZW50IGFzIHsgdmFsdWVPZj86IHVua25vd24gfSk/LnZhbHVlT2Y7XG5cdGNvbnN0IHVud3JhcHBlZCA9IHR5cGVvZiBjdXJyZW50VmFsdWVPZiA9PT0gJ2Z1bmN0aW9uJ1xuXHRcdD8gKGN1cnJlbnQgYXMgeyB2YWx1ZU9mOiAoKSA9PiB1bmtub3duIH0pLnZhbHVlT2YoKVxuXHRcdDogY3VycmVudDtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlLCBmaWVsZCwge1xuXHRcdHZhbHVlICAgICAgICA6IHVud3JhcHBlZCxcblx0XHR3cml0YWJsZSAgICAgOiB0cnVlLFxuXHRcdGVudW1lcmFibGUgICA6IHRydWUsXG5cdFx0Y29uZmlndXJhYmxlIDogdHJ1ZVxuXHR9KTtcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBzZXR1cENvbW1vbkpTKCkge1xuXHRpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSAndW5kZWZpbmVkJykge1xuXHRcdHJldHVybjtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAnZXhwb3J0cycsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlO1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdCYXNlQ2xhc3MnLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIEJhc2VDbGFzcztcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ0ZpZWxkQ29uc3RydWN0b3InLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIEZpZWxkQ29uc3RydWN0b3I7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdTeW1ib2xJbml0aWFsVmFsdWUnLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIFN5bWJvbEluaXRpYWxWYWx1ZTtcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UnLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIFN5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2U7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdiYXNlVGFyZ2V0Jywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBiYXNlVGFyZ2V0O1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnU3RyaWN0Jywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBzdHJpY3Q7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdnZXRDb25zdHJ1Y3RlZEZpZWxkcycsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gZ2V0Q29uc3RydWN0ZWRGaWVsZHM7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdmaW5hbGl6ZScsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gZmluYWxpemU7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdmaW5hbGl6ZUJ5Jywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBmaW5hbGl6ZUJ5O1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnaXNGaW5hbGl6ZWQnLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGlzRmluYWxpemVkO1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAndW53cmFwJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiB1bndyYXA7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xufVxuXG5zZXR1cENvbW1vbkpTKCk7XG5cbk9iamVjdC5mcmVlemUoQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlKTtcbk9iamVjdC5mcmVlemUoQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlLnByb3RvdHlwZSk7XG4iXX0= \ No newline at end of file diff --git a/lib/esm/types/functions.js b/lib/esm/types/functions.js index 620dd96..527c2db 100644 --- a/lib/esm/types/functions.js +++ b/lib/esm/types/functions.js @@ -1,6 +1,6 @@ 'use strict'; import { ErrorsNames } from '../errors.js'; export const functions = () => { - throw new TypeError(ErrorsNames.RIP_FUNCTIONS); + throw new TypeError(ErrorsNames.RIP_FUNCTIONS); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3R5cGVzL2Z1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7QUFFYixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTNDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUU7SUFDN0IsTUFBTSxJQUFJLFNBQVMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDaEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBFcnJvcnNOYW1lcyB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnMgPSAoKSA9PiB7XG5cdHRocm93IG5ldyBUeXBlRXJyb3IoRXJyb3JzTmFtZXMuUklQX0ZVTkNUSU9OUyk7XG59OyJdfQ== \ No newline at end of file diff --git a/lib/esm/types/index.js b/lib/esm/types/index.js index 02e2db4..d4b5d2b 100644 --- a/lib/esm/types/index.js +++ b/lib/esm/types/index.js @@ -5,11 +5,11 @@ export { objects } from './objects.js'; export { primitives } from './primitives.js'; export { special } from './special.js'; const PRIMITIVE_TYPES = [ - 'string', - 'number', - 'boolean', + 'string', + 'number', + 'boolean', ]; export const isPrimitive = (value) => { - return PRIMITIVE_TYPES.includes(typeof value); + return PRIMITIVE_TYPES.includes(typeof value); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBRWIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV2QyxNQUFNLGVBQWUsR0FBRztJQUN2QixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7Q0FDVCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBYyxFQUFFLEVBQUU7SUFDN0MsT0FBTyxlQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgeyBmdW5jdGlvbnMgfSBmcm9tICcuL2Z1bmN0aW9ucy5qcyc7XG5leHBvcnQgeyBudWxsaXNoIH0gZnJvbSAnLi9udWxsaXNoLmpzJztcbmV4cG9ydCB7IG9iamVjdHMgfSBmcm9tICcuL29iamVjdHMuanMnO1xuZXhwb3J0IHsgcHJpbWl0aXZlcyB9IGZyb20gJy4vcHJpbWl0aXZlcy5qcyc7XG5leHBvcnQgeyBzcGVjaWFsIH0gZnJvbSAnLi9zcGVjaWFsLmpzJztcblxuY29uc3QgUFJJTUlUSVZFX1RZUEVTID0gW1xuXHQnc3RyaW5nJyxcblx0J251bWJlcicsXG5cdCdib29sZWFuJyxcbl07XG5cbmV4cG9ydCBjb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuXHRyZXR1cm4gUFJJTUlUSVZFX1RZUEVTLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSk7XG59O1xuIl19 \ No newline at end of file diff --git a/lib/esm/types/nullish.js b/lib/esm/types/nullish.js index ef7e049..755ba7a 100644 --- a/lib/esm/types/nullish.js +++ b/lib/esm/types/nullish.js @@ -1,14 +1,14 @@ 'use strict'; import { ErrorsNames } from '../errors.js'; export const nullish = (value) => { - return { - get() { - return value; - }, - set() { - const error = new TypeError(ErrorsNames.TYPE_MISMATCH); - throw error; - } - }; + return { + get() { + return value; + }, + set() { + const error = new TypeError(ErrorsNames.TYPE_MISMATCH); + throw error; + } + }; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVsbGlzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90eXBlcy9udWxsaXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUViLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0MsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDeEMsT0FBTztRQUNOLEdBQUc7WUFDRixPQUFPLEtBQUssQ0FBQztRQUNkLENBQUM7UUFDRCxHQUFHO1lBQ0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sS0FBSyxDQUFDO1FBQ2IsQ0FBQztLQUNELENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7IEVycm9yc05hbWVzIH0gZnJvbSAnLi4vZXJyb3JzLmpzJztcblxuZXhwb3J0IGNvbnN0IG51bGxpc2ggPSAodmFsdWU6IG9iamVjdCkgPT4ge1xuXHRyZXR1cm4ge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9LFxuXHRcdHNldCgpIHtcblx0XHRcdGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcihFcnJvcnNOYW1lcy5UWVBFX01JU01BVENIKTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fTtcbn07Il19 \ No newline at end of file diff --git a/lib/esm/types/objects.js b/lib/esm/types/objects.js index 854a61e..cf00c93 100644 --- a/lib/esm/types/objects.js +++ b/lib/esm/types/objects.js @@ -1,18 +1,18 @@ 'use strict'; import { ErrorsNames } from '../errors.js'; export const objects = (value) => { - return { - get() { - return value; - }, - set(replacementValue) { - if (replacementValue instanceof Object && replacementValue.constructor === value.constructor) { - value = replacementValue; - return value; - } - const error = new TypeError(ErrorsNames.TYPE_MISMATCH); - throw error; - } - }; + return { + get() { + return value; + }, + set(replacementValue) { + if (replacementValue instanceof Object && replacementValue.constructor === value.constructor) { + value = replacementValue; + return value; + } + const error = new TypeError(ErrorsNames.TYPE_MISMATCH); + throw error; + } + }; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90eXBlcy9vYmplY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUViLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0MsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDeEMsT0FBTztRQUNOLEdBQUc7WUFDRixPQUFPLEtBQUssQ0FBQztRQUNkLENBQUM7UUFDRCxHQUFHLENBQUMsZ0JBQXlCO1lBQzVCLElBQUksZ0JBQWdCLFlBQVksTUFBTSxJQUFJLGdCQUFnQixDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzlGLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQztnQkFDekIsT0FBTyxLQUFLLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sS0FBSyxDQUFDO1FBQ2IsQ0FBQztLQUNELENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7IEVycm9yc05hbWVzIH0gZnJvbSAnLi4vZXJyb3JzLmpzJztcblxuZXhwb3J0IGNvbnN0IG9iamVjdHMgPSAodmFsdWU6IG9iamVjdCkgPT4ge1xuXHRyZXR1cm4ge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9LFxuXHRcdHNldChyZXBsYWNlbWVudFZhbHVlOiB1bmtub3duKSB7XG5cdFx0XHRpZiAocmVwbGFjZW1lbnRWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiByZXBsYWNlbWVudFZhbHVlLmNvbnN0cnVjdG9yID09PSB2YWx1ZS5jb25zdHJ1Y3Rvcikge1xuXHRcdFx0XHR2YWx1ZSA9IHJlcGxhY2VtZW50VmFsdWU7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcihFcnJvcnNOYW1lcy5UWVBFX01JU01BVENIKTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fTtcbn07Il19 \ No newline at end of file diff --git a/lib/esm/types/primitives.js b/lib/esm/types/primitives.js index 57f6828..6c3f5b6 100644 --- a/lib/esm/types/primitives.js +++ b/lib/esm/types/primitives.js @@ -1,61 +1,61 @@ 'use strict'; import { ErrorsNames } from '../errors.js'; export const primitives = (initialValue) => { - let value = Object(initialValue); - const initialType = typeof initialValue; - return { - get() { - const proxyAsValue = new Proxy(value, { - // get(target, prop, receiver) { - get(_, prop) { - if (prop === Symbol.toPrimitive) { - return function (hint) { - if (hint !== initialType) { - throw new ReferenceError(ErrorsNames.ACCESS_DENIED); - } - return value.valueOf(); - }; - } - if (prop === 'valueOf') { - return function () { - return value.valueOf(); - }; - } - // @ts-ignore - if (value[prop] instanceof Function) { - return value[prop].bind(value); - } - const answer = value[prop]; - return answer; - } - }); - return proxyAsValue; - }, - // get() { - // const preparedValue = { - // [Symbol.toPrimitive]() { - // return function () { - // throw new ReferenceError(ErrorsNames.ACCESS_DENIED); - // }; - // } - // }; - // Reflect.setPrototypeOf(preparedValue, value); - // debugger; - // return preparedValue; - // }, - set(replacementValue) { - if (replacementValue instanceof value.constructor) { - value = replacementValue; - return value; - } - const prevalue = Object(replacementValue); - if (prevalue instanceof value.constructor) { - value = prevalue; - return value; - } - const error = new TypeError(ErrorsNames.TYPE_MISMATCH); - throw error; - } - }; + let value = Object(initialValue); + const initialType = typeof initialValue; + return { + get() { + const proxyAsValue = new Proxy(value, { + // get(target, prop, receiver) { + get(_, prop) { + if (prop === Symbol.toPrimitive) { + return function (hint) { + if (hint !== initialType) { + throw new ReferenceError(ErrorsNames.ACCESS_DENIED); + } + return value.valueOf(); + }; + } + if (prop === 'valueOf') { + return function () { + return value.valueOf(); + }; + } + // @ts-ignore + if (value[prop] instanceof Function) { + return value[prop].bind(value); + } + const answer = value[prop]; + return answer; + } + }); + return proxyAsValue; + }, + // get() { + // const preparedValue = { + // [Symbol.toPrimitive]() { + // return function () { + // throw new ReferenceError(ErrorsNames.ACCESS_DENIED); + // }; + // } + // }; + // Reflect.setPrototypeOf(preparedValue, value); + // debugger; + // return preparedValue; + // }, + set(replacementValue) { + if (replacementValue instanceof value.constructor) { + value = replacementValue; + return value; + } + const prevalue = Object(replacementValue); + if (prevalue instanceof value.constructor) { + value = prevalue; + return value; + } + const error = new TypeError(ErrorsNames.TYPE_MISMATCH); + throw error; + } + }; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbWl0aXZlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90eXBlcy9wcmltaXRpdmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUViLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0MsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsWUFBb0IsRUFBRSxFQUFFO0lBQ2xELElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqQyxNQUFNLFdBQVcsR0FBRyxPQUFPLFlBQVksQ0FBQztJQUV4QyxPQUFPO1FBQ04sR0FBRztZQUNGLE1BQU0sWUFBWSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRTtnQkFDckMsZ0NBQWdDO2dCQUNoQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUk7b0JBQ1YsSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUNqQyxPQUFPLFVBQVUsSUFBWTs0QkFDNUIsSUFBSSxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7Z0NBQzFCLE1BQU0sSUFBSSxjQUFjLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDOzRCQUNyRCxDQUFDOzRCQUNELE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN4QixDQUFDLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDeEIsT0FBTzs0QkFDTixPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDeEIsQ0FBQyxDQUFDO29CQUNILENBQUM7b0JBRUQsYUFBYTtvQkFDYixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxRQUFRLEVBQUUsQ0FBQzt3QkFDckMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNoQyxDQUFDO29CQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0IsT0FBTyxNQUFNLENBQUM7Z0JBQ2YsQ0FBQzthQUNELENBQUMsQ0FBQztZQUNILE9BQU8sWUFBWSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxVQUFVO1FBQ1YsMkJBQTJCO1FBQzNCLDZCQUE2QjtRQUM3QiwwQkFBMEI7UUFDMUIsMkRBQTJEO1FBQzNELFFBQVE7UUFDUixNQUFNO1FBQ04sTUFBTTtRQUNOLGlEQUFpRDtRQUNqRCxhQUFhO1FBQ2IseUJBQXlCO1FBQ3pCLEtBQUs7UUFDTCxHQUFHLENBQUMsZ0JBQXlCO1lBQzVCLElBQUksZ0JBQWdCLFlBQVksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNuRCxLQUFLLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRTFDLElBQUksUUFBUSxZQUFZLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDM0MsS0FBSyxHQUFHLFFBQVEsQ0FBQztnQkFDakIsT0FBTyxLQUFLLENBQUM7WUFDZCxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sS0FBSyxDQUFDO1FBQ2IsQ0FBQztLQUNELENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7IEVycm9yc05hbWVzIH0gZnJvbSAnLi4vZXJyb3JzLmpzJztcblxuZXhwb3J0IGNvbnN0IHByaW1pdGl2ZXMgPSAoaW5pdGlhbFZhbHVlOiBvYmplY3QpID0+IHtcblx0bGV0IHZhbHVlID0gT2JqZWN0KGluaXRpYWxWYWx1ZSk7XG5cdGNvbnN0IGluaXRpYWxUeXBlID0gdHlwZW9mIGluaXRpYWxWYWx1ZTtcblxuXHRyZXR1cm4ge1xuXHRcdGdldCgpIHtcblx0XHRcdGNvbnN0IHByb3h5QXNWYWx1ZSA9IG5ldyBQcm94eSh2YWx1ZSwge1xuXHRcdFx0XHQvLyBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuXHRcdFx0XHRnZXQoXywgcHJvcCkge1xuXHRcdFx0XHRcdGlmIChwcm9wID09PSBTeW1ib2wudG9QcmltaXRpdmUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoaGludDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChoaW50ICE9PSBpbml0aWFsVHlwZSkge1xuXHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihFcnJvcnNOYW1lcy5BQ0NFU1NfREVOSUVEKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWUudmFsdWVPZigpO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAocHJvcCA9PT0gJ3ZhbHVlT2YnKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWUudmFsdWVPZigpO1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0aWYgKHZhbHVlW3Byb3BdIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZVtwcm9wXS5iaW5kKHZhbHVlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBhbnN3ZXIgPSB2YWx1ZVtwcm9wXTtcblx0XHRcdFx0XHRyZXR1cm4gYW5zd2VyO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBwcm94eUFzVmFsdWU7XG5cdFx0fSxcblx0XHQvLyBnZXQoKSB7XG5cdFx0Ly8gXHRjb25zdCBwcmVwYXJlZFZhbHVlID0ge1xuXHRcdC8vIFx0XHRbU3ltYm9sLnRvUHJpbWl0aXZlXSgpIHtcblx0XHQvLyBcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKCkge1xuXHRcdC8vIFx0XHRcdFx0dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKEVycm9yc05hbWVzLkFDQ0VTU19ERU5JRUQpO1xuXHRcdC8vIFx0XHRcdH07XG5cdFx0Ly8gXHRcdH1cblx0XHQvLyBcdH07XG5cdFx0Ly8gXHRSZWZsZWN0LnNldFByb3RvdHlwZU9mKHByZXBhcmVkVmFsdWUsIHZhbHVlKTtcblx0XHQvLyBcdGRlYnVnZ2VyO1xuXHRcdC8vIFx0cmV0dXJuIHByZXBhcmVkVmFsdWU7XG5cdFx0Ly8gfSxcblx0XHRzZXQocmVwbGFjZW1lbnRWYWx1ZTogdW5rbm93bikge1xuXHRcdFx0aWYgKHJlcGxhY2VtZW50VmFsdWUgaW5zdGFuY2VvZiB2YWx1ZS5jb25zdHJ1Y3Rvcikge1xuXHRcdFx0XHR2YWx1ZSA9IHJlcGxhY2VtZW50VmFsdWU7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcHJldmFsdWUgPSBPYmplY3QocmVwbGFjZW1lbnRWYWx1ZSk7XG5cblx0XHRcdGlmIChwcmV2YWx1ZSBpbnN0YW5jZW9mIHZhbHVlLmNvbnN0cnVjdG9yKSB7XG5cdFx0XHRcdHZhbHVlID0gcHJldmFsdWU7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZXJyb3IgPSBuZXcgVHlwZUVycm9yKEVycm9yc05hbWVzLlRZUEVfTUlTTUFUQ0gpO1xuXHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0fVxuXHR9O1xufTsiXX0= \ No newline at end of file diff --git a/lib/esm/types/special.js b/lib/esm/types/special.js index ed49aa7..3bfaa93 100644 --- a/lib/esm/types/special.js +++ b/lib/esm/types/special.js @@ -1,18 +1,18 @@ 'use strict'; import { ErrorsNames } from '../errors.js'; export const special = (value) => { - return { - get() { - return value; - }, - set(replacementValue) { - if (typeof replacementValue === typeof value) { - value = replacementValue; - return value; - } - const error = new TypeError(ErrorsNames.TYPE_MISMATCH); - throw error; - } - }; + return { + get() { + return value; + }, + set(replacementValue) { + if (typeof replacementValue === typeof value) { + value = replacementValue; + return value; + } + const error = new TypeError(ErrorsNames.TYPE_MISMATCH); + throw error; + } + }; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY2lhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90eXBlcy9zcGVjaWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUViLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0MsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDeEMsT0FBTztRQUNOLEdBQUc7WUFDRixPQUFPLEtBQUssQ0FBQztRQUNkLENBQUM7UUFDRCxHQUFHLENBQUMsZ0JBQXdCO1lBQzNCLElBQUksT0FBTyxnQkFBZ0IsS0FBSyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUM5QyxLQUFLLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2RCxNQUFNLEtBQUssQ0FBQztRQUNiLENBQUM7S0FDRCxDQUFDO0FBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBFcnJvcnNOYW1lcyB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5cbmV4cG9ydCBjb25zdCBzcGVjaWFsID0gKHZhbHVlOiBvYmplY3QpID0+IHtcblx0cmV0dXJuIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSxcblx0XHRzZXQocmVwbGFjZW1lbnRWYWx1ZTogb2JqZWN0KSB7XG5cdFx0XHRpZiAodHlwZW9mIHJlcGxhY2VtZW50VmFsdWUgPT09IHR5cGVvZiB2YWx1ZSkge1xuXHRcdFx0XHR2YWx1ZSA9IHJlcGxhY2VtZW50VmFsdWU7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcihFcnJvcnNOYW1lcy5UWVBFX01JU01BVENIKTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fTtcbn07Il19 \ No newline at end of file diff --git a/lib/fields.js b/lib/fields.js index aed8908..a132419 100644 --- a/lib/fields.js +++ b/lib/fields.js @@ -1,30 +1,30 @@ 'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +Object.defineProperty(exports, "__esModule", { value: true }); exports.FieldConstructor = void 0; -const errors_js_1 = require('./errors.js'); +const errors_js_1 = require("./errors.js"); const SymbolInitialValue = Symbol('Initial Value'); // export const FieldConstructor = function (this: FieldDefinition, value: unknown) { // this[SymbolInitialValue] = value; // } as ObjectConstructor; class FieldConstructor { - [SymbolInitialValue]; - get get() { - const self = this; - return function ( /* this: FieldDefinition */) { - return self[SymbolInitialValue]; - }; - } - get set() { - return function () { - throw new TypeError(errors_js_1.ErrorsNames.FORBIDDEN_RE); - }; - } - constructor(value) { - this[SymbolInitialValue] = value; - } - static get SymbolInitialValue() { - return SymbolInitialValue; - } + [SymbolInitialValue]; + get get() { + const self = this; + return function ( /* this: FieldDefinition */) { + return self[SymbolInitialValue]; + }; + } + get set() { + return function () { + throw new TypeError(errors_js_1.ErrorsNames.FORBIDDEN_RE); + }; + } + constructor(value) { + this[SymbolInitialValue] = value; + } + static get SymbolInitialValue() { + return SymbolInitialValue; + } } exports.FieldConstructor = FieldConstructor; // Object.assign(FieldConstructor.prototype, { diff --git a/lib/index.d.ts b/lib/index.d.ts index 4a25d32..59b4356 100644 --- a/lib/index.d.ts +++ b/lib/index.d.ts @@ -16,3 +16,31 @@ export declare const SymbolInitialValue: symbol; declare const FieldConstructorExport: typeof FieldConstructor; export { FieldConstructorExport as FieldConstructor }; export declare const Strict: (_target?: object, options?: TypeomaticaOptions) => (cstr: T) => T; +/** + * Fields that certainly passed through the define machinery for this + * instance. Returns a copy of the internal Set — safe for the caller + * to mutate. + */ +export declare const getConstructedFields: (instance: object) => Set; +/** + * Auto finalization: every hiddenly-added own field of the instance + * (class fields and other define-semantics writes that bypassed the + * proxy) is deleted and re-established through the define machinery. + * Sets the finalized flag — `true` means auto mode ran. + */ +export declare const finalize: (instance: object) => void; +/** + * Partial finalization: re-establish only the listed fields. + * Does NOT set the finalized flag — that flag means auto mode ran, + * everything else is the user's choice. + */ +export declare const finalizeBy: (instance: object, fields: (string | symbol)[]) => void; +export declare const isFinalized: (instance: object) => boolean; +/** + * Turn a guarded field back into a plain value property. + * Allowed only for fields re-established by finalize/finalizeBy — + * they stay configurable by design. Fields guarded since construction + * are non-configurable: that lock is the essential design of the lib. + * Primitives are read back via .valueOf(); objects are placed as-is. + */ +export declare const unwrap: (instance: object, field: string | symbol) => void; diff --git a/lib/index.js b/lib/index.js index fa278ef..4e3386c 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,351 +1,483 @@ // oxlint-disable typescript/no-this-alias 'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -exports.Strict = exports.FieldConstructor = exports.SymbolInitialValue = exports.BaseClass = exports.BaseConstructorPrototype = exports.SymbolTypeomaticaProxyReference = exports.baseTarget = void 0; -const util_1 = require('util'); -const errors_js_1 = require('./errors.js'); -const index_js_1 = require('./types/index.js'); -const fields_js_1 = require('./fields.js'); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.unwrap = exports.isFinalized = exports.finalizeBy = exports.finalize = exports.getConstructedFields = exports.Strict = exports.FieldConstructor = exports.SymbolInitialValue = exports.BaseClass = exports.BaseConstructorPrototype = exports.SymbolTypeomaticaProxyReference = exports.baseTarget = void 0; +const util_1 = require("util"); +const errors_js_1 = require("./errors.js"); +const index_js_1 = require("./types/index.js"); +const fields_js_1 = require("./fields.js"); +// Fields that passed through the define machinery, per instance. +// The postConstruction comparator (Thunderstruck design) diffs the +// instance's own descriptors against this Set to find fields added +// hiddenly — class fields and other define-semantics writes. +const constructionRecords = new WeakMap(); +const ensureRecord = (instance) => { + let record = constructionRecords.get(instance); + if (!record) { + record = { + fields: new Set(), + options: undefined, + finalized: false + }; + constructionRecords.set(instance, record); + } + return record; +}; const createResolver = (options = {}) => { - const { strictAccessCheck = false } = options; - return Object.entries({ - primitives: index_js_1.primitives, - special: index_js_1.special, - nullish: index_js_1.nullish, - objects: index_js_1.objects, - functions: index_js_1.functions - }).reduce((obj, [key, _handler]) => { - // @ts-ignore - obj[key] = function (initialValue, receiver) { - const handler = _handler(initialValue); - return { - get() { - const invocationThis = this; - if (strictAccessCheck && invocationThis !== receiver) { - throw new ReferenceError(errors_js_1.ErrorsNames.ACCESS_DENIED); - } - const result = handler.get(); - return result; - }, - set(replacementValue) { - const invocationThis = this; - if (strictAccessCheck && invocationThis !== receiver) { - throw new ReferenceError(errors_js_1.ErrorsNames.ACCESS_DENIED); - } - const result = handler.set(replacementValue); - return result; - } - }; - }; - return obj; - }, {}); + const { strictAccessCheck = false } = options; + return Object.entries({ + primitives: index_js_1.primitives, + special: index_js_1.special, + nullish: index_js_1.nullish, + objects: index_js_1.objects, + functions: index_js_1.functions + }).reduce((obj, [key, _handler]) => { + // @ts-ignore + obj[key] = function (initialValue, receiver) { + const handler = _handler(initialValue); + return { + get() { + const invocationThis = this; + if (strictAccessCheck && invocationThis !== receiver) { + throw new ReferenceError(errors_js_1.ErrorsNames.ACCESS_DENIED); + } + const result = handler.get(); + return result; + }, + set(replacementValue) { + const invocationThis = this; + if (strictAccessCheck && invocationThis !== receiver) { + throw new ReferenceError(errors_js_1.ErrorsNames.ACCESS_DENIED); + } + const result = handler.set(replacementValue); + return result; + } + }; + }; + return obj; + }, {}); }; -const createProperty = (propName, initialValue, receiver, options) => { - const value = initialValue; - const valueIsPrimitive = (0, index_js_1.isPrimitive)(initialValue); - const isObject = typeof initialValue === 'object'; - const isFunction = initialValue instanceof Function; - const isNull = initialValue === null; - /** +const createProperty = (propName, initialValue, receiver, options, configurable = false) => { + const value = initialValue; + const valueIsPrimitive = (0, index_js_1.isPrimitive)(initialValue); + const isObject = typeof initialValue === 'object'; + const isFunction = initialValue instanceof Function; + const isNull = initialValue === null; + /** * special: undefined or BigInt or Symbol * or other non constructible type */ - const types = valueIsPrimitive ? 'primitives' : (isObject ? (isNull ? 'nullish' : 'objects') : (isFunction ? 'functions' : 'special')); - const resolver = createResolver(options); - const descriptor = (isObject && (value instanceof fields_js_1.FieldConstructor)) ? - value : { - enumerable: true, - // @ts-ignore - ...resolver[types](value, receiver), - }; - // if (value instanceof FieldConstructor) { - // descriptor; - // debugger; - // } - const result = Reflect.defineProperty(receiver, propName, descriptor); - return result; + const types = valueIsPrimitive ? 'primitives' : (isObject ? (isNull ? 'nullish' : 'objects') : (isFunction ? 'functions' : 'special')); + const resolver = createResolver(options); + const descriptor = (isObject && (value instanceof fields_js_1.FieldConstructor)) ? + value : { + enumerable: true, + configurable, + // @ts-ignore + ...resolver[types](value, receiver), + }; + // if (value instanceof FieldConstructor) { + // descriptor; + // debugger; + // } + const result = Reflect.defineProperty(receiver, propName, descriptor); + const record = ensureRecord(receiver); + record.fields.add(propName); + record.options = options; + return result; }; // line below 'href' is for util.inspect works, useful for v24 const props2skip = new Set([ - Symbol.toStringTag, - Symbol.iterator, - // Symbol.toPrimitive, - 'toString', - 'valueOf', - 'href' + Symbol.toStringTag, + Symbol.iterator, + // Symbol.toPrimitive, + 'toString', + 'valueOf', + 'href' ]); // const props2skip = new Set([Symbol.toStringTag, Symbol.iterator]); const hasNodeInspect = (util_1.inspect && util_1.inspect.custom); // oxlint-disable-next-line no-unused-expressions (hasNodeInspect && (props2skip.add(util_1.inspect.custom))); const createHandlers = (options) => ({ - get(target, prop, receiver) { - const result = Reflect.get(target, prop, receiver); - if (result !== undefined) { - return result; - } - if (prop === 'toJSON') { - - return function () { - const entries = Object.entries(this); - return JSON.stringify(entries.reduce((obj, [key, value]) => { - // @ts-ignore - obj[key] = value.valueOf(); - return obj; - }, {})); - }; - } - if (prop === 'constructor') { - return undefined; - } - const { name } = receiver.constructor; - if (props2skip.has(prop)) { - const message = `${name} lacks definition of [ ${String(prop).valueOf()} ]`; - return message; - } - // const errorMessage = `${ErrorsNames.MISSING_PROP}: [ ${String(prop).valueOf()} ] for ${name}`; - // throw new Error(errorMessage); - }, - set(_, prop, value, receiver) { - const result = createProperty(prop, value, receiver, options); - return result; - }, - setPrototypeOf() { - throw new Error('Setting prototype is not allowed!'); - }, - // defineProperty(target: object, key: string, descriptor: object) { - defineProperty() { - throw new Error('Defining new Properties is not allowed!'); - // Reflect.defineProperty(target, key, descriptor); - }, - deleteProperty() { - throw new Error('Properties Deletion is not allowed!'); - }, - // getPrototypeOf() { - // debugger; - // throw new Error('Getting prototype is not allowed'); - // }, + get(target, prop, receiver) { + const result = Reflect.get(target, prop, receiver); + if (result !== undefined) { + return result; + } + if (prop === 'toJSON') { + // eslint-disable-next-line no-unused-vars + return function () { + const entries = Object.entries(this); + return JSON.stringify(entries.reduce((obj, [key, value]) => { + // @ts-ignore + obj[key] = value.valueOf(); + return obj; + }, {})); + }; + } + if (prop === 'constructor') { + return undefined; + } + const { name } = receiver.constructor; + if (props2skip.has(prop)) { + const message = `${name} lacks definition of [ ${String(prop).valueOf()} ]`; + return message; + } + // const errorMessage = `${ErrorsNames.MISSING_PROP}: [ ${String(prop).valueOf()} ] for ${name}`; + // throw new Error(errorMessage); + }, + set(_, prop, value, receiver) { + const result = createProperty(prop, value, receiver, options); + return result; + }, + setPrototypeOf() { + throw new Error('Setting prototype is not allowed!'); + }, + // defineProperty(target: object, key: string, descriptor: object) { + defineProperty() { + throw new Error('Defining new Properties is not allowed!'); + // Reflect.defineProperty(target, key, descriptor); + }, + deleteProperty() { + throw new Error('Properties Deletion is not allowed!'); + }, + // getPrototypeOf() { + // debugger; + // throw new Error('Getting prototype is not allowed'); + // }, }); // user have to precisely define all props const baseTarget = (_proto) => { - const proto = typeof _proto === 'object' ? _proto : null; - const answer = Object.create(proto); - return answer; + const proto = typeof _proto === 'object' ? _proto : null; + const answer = Object.create(proto); + return answer; }; exports.baseTarget = baseTarget; exports.SymbolTypeomaticaProxyReference = Symbol('TypeØmaticaProxyReference'); const getTypeomaticaProxyReference = (_target, options) => { - const target = Object.create(_target); - const id = `TypeØmaticaProxyReference-${Math.random()}`; - Object.defineProperty(target, exports.SymbolTypeomaticaProxyReference, { - get() { - return id; - } - }); - const handlers = createHandlers(options); - const proxy = new Proxy(target, handlers); - return proxy; + const target = Object.create(_target); + const id = `TypeØmaticaProxyReference-${Math.random()}`; + Object.defineProperty(target, exports.SymbolTypeomaticaProxyReference, { + get() { + return id; + } + }); + const handlers = createHandlers(options); + const proxy = new Proxy(target, handlers); + return proxy; }; exports.BaseConstructorPrototype = function (_target, options) { - if (!new.target) { - const self = exports.BaseConstructorPrototype.bind(this, _target, options); - self.prototype = { - constructor: exports.BaseConstructorPrototype - }; - // @ts-ignore - return self; - } - // @ts-ignore - if (this[exports.SymbolTypeomaticaProxyReference]) { - // @ts-ignore - return this; - } - const target = (0, exports.baseTarget)(_target); - const { frozenPrototypes: freezeProtos = true } = options || {}; - const InstancePrototype = getTypeomaticaProxyReference(target, options); - const classPrototype = Object.getPrototypeOf(this); - let proto; - let protoPointer = this; - let protoConstrcutor; - let constructors = false; - // @ts-ignore - // const hasProxyReference = protoPointer[SymbolTypeomaticaProxyReference] as unknown as boolean; - // if (hasProxyReference) { - // throw new Error('Multiple TypeØmatica instantiations are not allowed for the same Prototype Chain!'); - // } - do { - proto = protoPointer; - protoPointer = Object.getPrototypeOf(proto); - if (exports.BaseConstructorPrototype.prototype === protoPointer) { - constructors = true; - break; - } - if (!protoPointer) - break; - const descriptor = Reflect.getOwnPropertyDescriptor(protoPointer, 'constructor'); - if (!descriptor) - continue; - const value = descriptor.value || descriptor.get; - // if (!value) continue; - protoConstrcutor = value; - } while (protoConstrcutor !== exports.BaseConstructorPrototype); - if (!constructors && protoConstrcutor !== exports.BaseConstructorPrototype) { - throw new Error('Unable to setup TypeØmatica handler!'); - } - Object.setPrototypeOf(proto, InstancePrototype); - if (freezeProtos) { - Object.freeze(classPrototype); - } - // @ts-ignore - return this; - + if (!new.target) { + const self = exports.BaseConstructorPrototype.bind(this, _target, options); + self.prototype = { + constructor: exports.BaseConstructorPrototype + }; + // @ts-ignore + return self; + } + // @ts-ignore + if (this[exports.SymbolTypeomaticaProxyReference]) { + // @ts-ignore + return this; + } + const target = (0, exports.baseTarget)(_target); + const { frozenPrototypes: freezeProtos = true } = options || {}; + const InstancePrototype = getTypeomaticaProxyReference(target, options); + const classPrototype = Object.getPrototypeOf(this); + let proto; + let protoPointer = this; + let protoConstrcutor; + let constructors = false; + // @ts-ignore + // const hasProxyReference = protoPointer[SymbolTypeomaticaProxyReference] as unknown as boolean; + // if (hasProxyReference) { + // throw new Error('Multiple TypeØmatica instantiations are not allowed for the same Prototype Chain!'); + // } + do { + proto = protoPointer; + protoPointer = Object.getPrototypeOf(proto); + if (exports.BaseConstructorPrototype.prototype === protoPointer) { + constructors = true; + break; + } + if (!protoPointer) + break; + const descriptor = Reflect.getOwnPropertyDescriptor(protoPointer, 'constructor'); + if (!descriptor) + continue; + const value = descriptor.value || descriptor.get; + // if (!value) continue; + protoConstrcutor = value; + } while (protoConstrcutor !== exports.BaseConstructorPrototype); + if (!constructors && protoConstrcutor !== exports.BaseConstructorPrototype) { + throw new Error('Unable to setup TypeØmatica handler!'); + } + Object.setPrototypeOf(proto, InstancePrototype); + if (freezeProtos) { + Object.freeze(classPrototype); + } + // @ts-ignore + return this; + /* eslint-disable no-unused-vars */ }; - +/* eslint-enable no-unused-vars */ const freezeClassPrototypes = (instance, shouldFreeze) => { - if (!shouldFreeze) { - return; - } - const first = Object.getPrototypeOf(instance); - const firstIsProxy = first !== null && !!Reflect.getOwnPropertyDescriptor(first, exports.SymbolTypeomaticaProxyReference); - if (firstIsProxy) { - Object.freeze(BaseClass.prototype); - return; - } - let p = first; - while (p !== null && p !== BaseClass.prototype && p !== Object.prototype) { - const next = Object.getPrototypeOf(p); - const nextIsProxy = next !== null && !!Reflect.getOwnPropertyDescriptor(next, exports.SymbolTypeomaticaProxyReference); - Object.freeze(p); - if (nextIsProxy) { - break; - } - p = next; - } - Object.freeze(BaseClass.prototype); + if (!shouldFreeze) { + return; + } + const first = Object.getPrototypeOf(instance); + const firstIsProxy = first !== null && !!Reflect.getOwnPropertyDescriptor(first, exports.SymbolTypeomaticaProxyReference); + if (firstIsProxy) { + Object.freeze(BaseClass.prototype); + return; + } + let p = first; + while (p !== null && p !== BaseClass.prototype && p !== Object.prototype) { + const next = Object.getPrototypeOf(p); + const nextIsProxy = next !== null && !!Reflect.getOwnPropertyDescriptor(next, exports.SymbolTypeomaticaProxyReference); + Object.freeze(p); + if (nextIsProxy) { + break; + } + p = next; + } + Object.freeze(BaseClass.prototype); }; class BaseClass { - constructor(_target, options) { - const { frozenPrototypes: freezeProtos = true } = options || {}; - // @ts-ignore - if (this[exports.SymbolTypeomaticaProxyReference]) { - freezeClassPrototypes(this, freezeProtos); - return this; - } - const target = (0, exports.baseTarget)(_target); - const proxy = getTypeomaticaProxyReference(target, options); - const instanceProto = Object.getPrototypeOf(this); - if (instanceProto === BaseClass.prototype) { - Object.setPrototypeOf(this, proxy); - freezeClassPrototypes(this, freezeProtos); - return this; - } - let classProto = instanceProto; - let parentProto = Object.getPrototypeOf(classProto); - while (parentProto !== BaseClass.prototype && parentProto !== null) { - classProto = parentProto; - parentProto = Object.getPrototypeOf(classProto); - } - Object.setPrototypeOf(classProto, proxy); - freezeClassPrototypes(this, freezeProtos); - } + constructor(_target, options) { + const { frozenPrototypes: freezeProtos = true } = options || {}; + // @ts-ignore + if (this[exports.SymbolTypeomaticaProxyReference]) { + freezeClassPrototypes(this, freezeProtos); + return this; + } + const target = (0, exports.baseTarget)(_target); + const proxy = getTypeomaticaProxyReference(target, options); + const instanceProto = Object.getPrototypeOf(this); + if (instanceProto === BaseClass.prototype) { + Object.setPrototypeOf(this, proxy); + freezeClassPrototypes(this, freezeProtos); + return this; + } + let classProto = instanceProto; + let parentProto = Object.getPrototypeOf(classProto); + while (parentProto !== BaseClass.prototype && parentProto !== null) { + classProto = parentProto; + parentProto = Object.getPrototypeOf(classProto); + } + Object.setPrototypeOf(classProto, proxy); + freezeClassPrototypes(this, freezeProtos); + } } exports.BaseClass = BaseClass; const strict = function (_target, options) { - const { frozenPrototypes: freezeProtos = true } = options || {}; - const decorator = function (cstr) { - // @ts-ignore - if (cstr.prototype[exports.SymbolTypeomaticaProxyReference]) { - return cstr; - } - const target = (0, exports.baseTarget)(_target); - const proxy = getTypeomaticaProxyReference(target, options); - const _replacer = Object.create(proxy); - // @ts-ignore - Object.setPrototypeOf(cstr.prototype, _replacer); - if (freezeProtos) { - // @ts-ignore - Object.freeze(cstr.prototype); - } - return cstr; - // const MyClassProxy = new Proxy(cstr, { - // construct(_, argumentsList, newTarget) { - // debugger; - // const target = baseTarget(_target); - // const proxy = getTypeomaticaProxyReference(target); - // const _replacer = Object.create(proxy); - // const _proto = cstr.prototype; - // const proto = Object.create(Object.getPrototypeOf(_proto)); - // proto.iAmProto = true; - // Object.setPrototypeOf(cstr.prototype, proto); - // const descriptors = Object.getOwnPropertyDescriptors(_proto); - // Object.defineProperties(proto, descriptors); - // const replacer = Object.create(_replacer); - // Object.setPrototypeOf(proto, replacer); - // Object.setPrototypeOf(cstr.prototype, proto); - // const result = Reflect.construct(cstr, argumentsList, newTarget); - // debugger; - // Object.setPrototypeOf(cstr.prototype, _proto); - // debugger; - // return result; - // }, - // }); - // return MyClassProxy; - }; - return decorator; + const { frozenPrototypes: freezeProtos = true } = options || {}; + const decorator = function (cstr) { + // @ts-ignore + if (cstr.prototype[exports.SymbolTypeomaticaProxyReference]) { + return cstr; + } + const target = (0, exports.baseTarget)(_target); + const proxy = getTypeomaticaProxyReference(target, options); + const _replacer = Object.create(proxy); + // @ts-ignore + Object.setPrototypeOf(cstr.prototype, _replacer); + if (freezeProtos) { + // @ts-ignore + Object.freeze(cstr.prototype); + } + return cstr; + // const MyClassProxy = new Proxy(cstr, { + // construct(_, argumentsList, newTarget) { + // debugger; + // const target = baseTarget(_target); + // const proxy = getTypeomaticaProxyReference(target); + // const _replacer = Object.create(proxy); + // const _proto = cstr.prototype; + // const proto = Object.create(Object.getPrototypeOf(_proto)); + // proto.iAmProto = true; + // Object.setPrototypeOf(cstr.prototype, proto); + // const descriptors = Object.getOwnPropertyDescriptors(_proto); + // Object.defineProperties(proto, descriptors); + // const replacer = Object.create(_replacer); + // Object.setPrototypeOf(proto, replacer); + // Object.setPrototypeOf(cstr.prototype, proto); + // const result = Reflect.construct(cstr, argumentsList, newTarget); + // debugger; + // Object.setPrototypeOf(cstr.prototype, _proto); + // debugger; + // return result; + // }, + // }); + // return MyClassProxy; + }; + return decorator; }; exports.SymbolInitialValue = fields_js_1.FieldConstructor.SymbolInitialValue; const FieldConstructorExport = fields_js_1.FieldConstructor; exports.FieldConstructor = FieldConstructorExport; exports.Strict = strict; +/** + * Fields that certainly passed through the define machinery for this + * instance. Returns a copy of the internal Set — safe for the caller + * to mutate. + */ +const getConstructedFields = (instance) => { + const record = constructionRecords.get(instance); + const result = record ? new Set(record.fields) : new Set(); + return result; +}; +exports.getConstructedFields = getConstructedFields; +const finaliseFields = (instance, names) => { + const record = ensureRecord(instance); + names.forEach((name) => { + if (record.fields.has(name)) { + // already passed through the machinery + return; + } + const descriptor = Reflect.getOwnPropertyDescriptor(instance, name); + if (!descriptor || !('value' in descriptor)) { + // nothing hidden under that name, or not a data field + return; + } + delete instance[name]; + // finalized fields stay configurable: they are the ones `unwrap` + // is allowed to turn back into plain value properties + createProperty(name, descriptor.value, instance, record.options, true); + }); +}; +/** + * Auto finalization: every hiddenly-added own field of the instance + * (class fields and other define-semantics writes that bypassed the + * proxy) is deleted and re-established through the define machinery. + * Sets the finalized flag — `true` means auto mode ran. + */ +const finalize = (instance) => { + const record = ensureRecord(instance); + finaliseFields(instance, Reflect.ownKeys(instance)); + record.finalized = true; +}; +exports.finalize = finalize; +/** + * Partial finalization: re-establish only the listed fields. + * Does NOT set the finalized flag — that flag means auto mode ran, + * everything else is the user's choice. + */ +const finalizeBy = (instance, fields) => { + finaliseFields(instance, fields); +}; +exports.finalizeBy = finalizeBy; +const isFinalized = (instance) => { + const record = constructionRecords.get(instance); + const result = record ? record.finalized : false; + return result; +}; +exports.isFinalized = isFinalized; +/** + * Turn a guarded field back into a plain value property. + * Allowed only for fields re-established by finalize/finalizeBy — + * they stay configurable by design. Fields guarded since construction + * are non-configurable: that lock is the essential design of the lib. + * Primitives are read back via .valueOf(); objects are placed as-is. + */ +const unwrap = (instance, field) => { + const descriptor = Reflect.getOwnPropertyDescriptor(instance, field); + if (!descriptor || !descriptor.configurable || typeof descriptor.get !== 'function') { + throw new TypeError(errors_js_1.ErrorsNames.FORBIDDEN_UNWRAP); + } + const current = instance[field]; + const currentValueOf = current?.valueOf; + const unwrapped = typeof currentValueOf === 'function' + ? current.valueOf() + : current; + Object.defineProperty(instance, field, { + value: unwrapped, + writable: true, + enumerable: true, + configurable: true + }); +}; +exports.unwrap = unwrap; /* istanbul ignore next */ function setupCommonJS() { - if (typeof module === 'undefined' || typeof module.exports === 'undefined') { - return; - } - Object.defineProperty(module, 'exports', { - get() { - return exports.BaseConstructorPrototype; - }, - enumerable: true - }); - Object.defineProperty(module.exports, 'BaseClass', { - get() { - return BaseClass; - }, - enumerable: true - }); - Object.defineProperty(module.exports, 'FieldConstructor', { - get() { - return fields_js_1.FieldConstructor; - }, - enumerable: true - }); - Object.defineProperty(module.exports, 'SymbolInitialValue', { - get() { - return exports.SymbolInitialValue; - }, - enumerable: true - }); - Object.defineProperty(module.exports, 'SymbolTypeomaticaProxyReference', { - get() { - return exports.SymbolTypeomaticaProxyReference; - }, - enumerable: true - }); - Object.defineProperty(module.exports, 'baseTarget', { - get() { - return exports.baseTarget; - }, - enumerable: true - }); - Object.defineProperty(module.exports, 'Strict', { - get() { - return strict; - }, - enumerable: true - }); + if (typeof module === 'undefined' || typeof module.exports === 'undefined') { + return; + } + Object.defineProperty(module, 'exports', { + get() { + return exports.BaseConstructorPrototype; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'BaseClass', { + get() { + return BaseClass; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'FieldConstructor', { + get() { + return fields_js_1.FieldConstructor; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'SymbolInitialValue', { + get() { + return exports.SymbolInitialValue; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'SymbolTypeomaticaProxyReference', { + get() { + return exports.SymbolTypeomaticaProxyReference; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'baseTarget', { + get() { + return exports.baseTarget; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'Strict', { + get() { + return strict; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'getConstructedFields', { + get() { + return exports.getConstructedFields; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'finalize', { + get() { + return exports.finalize; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'finalizeBy', { + get() { + return exports.finalizeBy; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'isFinalized', { + get() { + return exports.isFinalized; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'unwrap', { + get() { + return exports.unwrap; + }, + enumerable: true + }); } setupCommonJS(); Object.freeze(exports.BaseConstructorPrototype); Object.freeze(exports.BaseConstructorPrototype.prototype); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMENBQTBDO0FBRTFDLFlBQVksQ0FBQzs7O0FBRWIsK0JBQStCO0FBQy9CLDJDQUEwQztBQUUxQywrQ0FPMEI7QUFFMUIsMkNBQStDO0FBTy9DLE1BQU0sY0FBYyxHQUFHLENBQUMsVUFBOEIsRUFBRSxFQUFFLEVBQUU7SUFDM0QsTUFBTSxFQUFFLGlCQUFpQixHQUFHLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUU5QyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDckIsVUFBVSxFQUFWLHFCQUFVO1FBQ1YsT0FBTyxFQUFQLGtCQUFPO1FBQ1AsT0FBTyxFQUFQLGtCQUFPO1FBQ1AsT0FBTyxFQUFQLGtCQUFPO1FBQ1AsU0FBUyxFQUFULG9CQUFTO0tBQ1QsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO1FBQzFDLGFBQWE7UUFDYixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxZQUFvQixFQUFFLFFBQWdCO1lBQzFELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2QyxPQUFPO2dCQUNOLEdBQUc7b0JBQ0YsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUM1QixJQUFJLGlCQUFpQixJQUFJLGNBQWMsS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDdEQsTUFBTSxJQUFJLGNBQWMsQ0FBQyx1QkFBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUNyRCxDQUFDO29CQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDN0IsT0FBTyxNQUFNLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxHQUFHLENBQUMsZ0JBQXlCO29CQUM1QixNQUFNLGNBQWMsR0FBRyxJQUFJLENB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QUMsQ0FBQztBQUNKLENBQUM7QUFFRCxhQUFhLEVBQUUsQ0FBQztBQUVoQixNQUFNLENBQUMsTUFBTSxDQUFDLGdDQUF3QixDQUFDLENBQUM7QUFDeEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQ0FBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIG94bGludC1kaXNhYmxlIHR5cGVzY3JpcHQvbm8tdGhpcy1hbGlhc1xuIFxuJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBpbnNwZWN0IH0gZnJvbSAndXRpbCc7XG5pbXBvcnQgeyBFcnJvcnNOYW1lcyB9IGZyb20gJy4vZXJyb3JzLmpzJztcblxuaW1wb3J0IHtcblx0ZnVuY3Rpb25zLFxuXHRudWxsaXNoLFxuXHRvYmplY3RzLFxuXHRwcmltaXRpdmVzLFxuXHRzcGVjaWFsLFxuXHRpc1ByaW1pdGl2ZVxufSBmcm9tICcuL3R5cGVzL2luZGV4LmpzJztcblxuaW1wb3J0IHsgRmllbGRDb25zdHJ1Y3RvciB9IGZyb20gJy4vZmllbGRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUeXBlb21hdGljYU9wdGlvbnMge1xuXHRzdHJpY3RBY2Nlc3NDaGVjaz86IGJvb2xlYW47XG5cdGZyb3plblByb3RvdHlwZXM/OiBib29sZWFuO1xufVxuXG5jb25zdCBjcmVhdGVSZXNvbHZlciA9IChvcHRpb25zOiBUeXBlb21hdGljYU9wdGlvbnMgPSB7fSkgPT4ge1xuXHRjb25zdCB7IHN0cmljdEFjY2Vzc0NoZWNrID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cdFxuXHRyZXR1cm4gT2JqZWN0LmVudHJpZXMoe1xuXHRcdHByaW1pdGl2ZXMsXG5cdFx0c3BlY2lhbCxcblx0XHRudWxsaXNoLFxuXHRcdG9iamVjdHMsXG5cdFx0ZnVuY3Rpb25zXG5cdH0pLnJlZHVjZSgob2JqOiBvYmplY3QsIFtrZXksIF9oYW5kbGVyXSkgPT4ge1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRvYmpba2V5XSA9IGZ1bmN0aW9uIChpbml0aWFsVmFsdWU6IG9iamVjdCwgcmVjZWl2ZXI6IG9iamVjdCkge1xuXHRcdFx0Y29uc3QgaGFuZGxlciA9IF9oYW5kbGVyKGluaXRpYWxWYWx1ZSk7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRnZXQoKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW52b2NhdGlvblRoaXMgPSB0aGlzO1xuXHRcdFx0XHRcdGlmIChzdHJpY3RBY2Nlc3NDaGVjayAmJiBpbnZvY2F0aW9uVGhpcyAhPT0gcmVjZWl2ZXIpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihFcnJvcnNOYW1lcy5BQ0NFU1NfREVOSUVEKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gaGFuZGxlci5nZXQoKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRzZXQocmVwbGFjZW1lbnRWYWx1ZTogdW5rbm93bikge1xuXHRcdFx0XHRcdGNvbnN0IGludm9jYXRpb25UaGlzID0gdGhpcztcblx0XHRcdFx0XHRpZiAoc3RyaWN0QWNjZXNzQ2hlY2sgJiYgaW52b2NhdGlvblRoaXMgIT09IHJlY2VpdmVyKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoRXJyb3JzTmFtZXMuQUNDRVNTX0RFTklFRCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGhhbmRsZXIuc2V0KHJlcGxhY2VtZW50VmFsdWUpO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdHJldHVybiBvYmo7XG5cdH0sIHt9KTtcbn07XG5cbmNvbnN0IGNyZWF0ZVByb3BlcnR5ID0gKHByb3BOYW1lOiBzdHJpbmcsIGluaXRpYWxWYWx1ZTogdW5rbm93biwgcmVjZWl2ZXI6IG9iamVjdCwgb3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucykgPT4ge1xuXG5cdGNvbnN0IHZhbHVlID0gaW5pdGlhbFZhbHVlO1xuXHRjb25zdCB2YWx1ZUlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmUoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgaXNPYmplY3QgPSB0eXBlb2YgaW5pdGlhbFZhbHVlID09PSAnb2JqZWN0Jztcblx0Y29uc3QgaXNGdW5jdGlvbiA9IGluaXRpYWxWYWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuXHRjb25zdCBpc051bGwgPSBpbml0aWFsVmFsdWUgPT09IG51bGw7XG5cblx0LyoqXG5cdCAqIHNwZWNpYWw6IHVuZGVmaW5lZCBvciBCaWdJbnQgb3IgU3ltYm9sXG5cdCAqIFx0b3Igb3RoZXIgbm9uIGNvbnN0cnVjdGlibGUgdHlwZVxuXHQgKi9cblxuXHRjb25zdCB0eXBlcyA9IHZhbHVlSXNQcmltaXRpdmUgPyAncHJpbWl0aXZlcycgOiAoXG5cdFx0aXNPYmplY3QgPyAoXG5cdFx0XHRpc051bGwgPyAnbnVsbGlzaCcgOiAnb2JqZWN0cydcblx0XHQpIDogKFxuXHRcdFx0aXNGdW5jdGlvbiA/ICdmdW5jdGlvbnMnIDogJ3NwZWNpYWwnXG5cdFx0KVxuXHQpO1xuXG5cdGNvbnN0IHJlc29sdmVyID0gY3JlYXRlUmVzb2x2ZXIob3B0aW9ucyk7XG5cblx0Y29uc3QgZGVzY3JpcHRvciA9IChpc09iamVjdCAmJiAodmFsdWUgaW5zdGFuY2VvZiBGaWVsZENvbnN0cnVjdG9yKSkgP1xuXHRcdHZhbHVlIDoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdC4uLnJlc29sdmVyW3R5cGVzXSh2YWx1ZSwgcmVjZWl2ZXIpLFxuXHRcdH07XG5cblx0Ly8gaWYgKHZhbHVlIGluc3RhbmNlb2YgRmllbGRDb25zdHJ1Y3Rvcikge1xuXHQvLyBcdGRlc2NyaXB0b3I7XG5cdC8vIFx0ZGVidWdnZXI7XG5cdC8vIH1cblxuXHRjb25zdCByZXN1bHQgPSBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHJlY2VpdmVyLCBwcm9wTmFtZSwgZGVzY3JpcHRvcik7XG5cdHJldHVybiByZXN1bHQ7XG5cbn07XG5cbi8vIGxpbmUgYmVsb3cgJ2hyZWYnIGlzIGZvciB1dGlsLmluc3BlY3Qgd29ya3MsIHVzZWZ1bCBmb3IgdjI0XG5jb25zdCBwcm9wczJza2lwID0gbmV3IFNldChbXG5cdFN5bWJvbC50b1N0cmluZ1RhZyxcblx0U3ltYm9sLml0ZXJhdG9yLFxuXHQvLyBTeW1ib2wudG9QcmltaXRpdmUsXG5cdCd0b1N0cmluZycsXG5cdCd2YWx1ZU9mJyxcblx0J2hyZWYnXG5dKTtcbi8vIGNvbnN0IHByb3BzMnNraXAgPSBuZXcgU2V0KFtTeW1ib2wudG9TdHJpbmdUYWcsIFN5bWJvbC5pdGVyYXRvcl0pO1xuY29uc3QgaGFzTm9kZUluc3BlY3QgPSAoaW5zcGVjdCAmJiBpbnNwZWN0LmN1c3RvbSk7XG4vLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4oaGFzTm9kZUluc3BlY3QgJiYgKHByb3BzMnNraXAuYWRkKGluc3BlY3QuY3VzdG9tKSkpO1xuXG5jb25zdCBjcmVhdGVIYW5kbGVycyA9IChvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zKSA9PiAoe1xuXHRnZXQodGFyZ2V0OiBvYmplY3QsIHByb3A6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IG9iamVjdCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuXHRcdGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdFx0aWYgKHByb3AgPT09ICd0b0pTT04nKSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblx0XHRcdHJldHVybiBmdW5jdGlvbiAodGhpczogdHlwZW9mIHRhcmdldCkge1xuXHRcdFx0XHRjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModGhpcyk7XG5cdFx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShlbnRyaWVzLnJlZHVjZSgob2JqLCBba2V5LCB2YWx1ZV0pID0+IHtcblx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0b2JqW2tleV0gPSB2YWx1ZS52YWx1ZU9mKCk7XG5cdFx0XHRcdFx0cmV0dXJuIG9iajtcblx0XHRcdFx0fSwge30pKTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdGlmIChwcm9wID09PSAnY29uc3RydWN0b3InKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCB7IG5hbWUgfSA9IHJlY2VpdmVyLmNvbnN0cnVjdG9yO1xuXHRcdGlmIChwcm9wczJza2lwLmhhcyhwcm9wKSkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGAke25hbWV9IGxhY2tzIGRlZmluaXRpb24gb2YgWyAke1N0cmluZyhwcm9wKS52YWx1ZU9mKCl9IF1gO1xuXHRcdFx0cmV0dXJuIG1lc3NhZ2U7XG5cdFx0fVxuXHRcdC8vIGNvbnN0IGVycm9yTWVzc2FnZSA9IGAke0Vycm9yc05hbWVzLk1JU1NJTkdfUFJPUH06IFsgJHtTdHJpbmcocHJvcCkudmFsdWVPZigpfSBdIGZvciAke25hbWV9YDtcblx0XHQvLyB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcblx0fSxcblx0c2V0KF86IG9iamVjdCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcmVjZWl2ZXI6IG9iamVjdCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGNyZWF0ZVByb3BlcnR5KHByb3AsIHZhbHVlLCByZWNlaXZlciwgb3B0aW9ucyk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblx0c2V0UHJvdG90eXBlT2YoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdTZXR0aW5nIHByb3RvdHlwZSBpcyBub3QgYWxsb3dlZCEnKTtcblx0fSxcblx0Ly8gZGVmaW5lUHJvcGVydHkodGFyZ2V0OiBvYmplY3QsIGtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBvYmplY3QpIHtcblx0ZGVmaW5lUHJvcGVydHkoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdEZWZpbmluZyBuZXcgUHJvcGVydGllcyBpcyBub3QgYWxsb3dlZCEnKTtcblx0XHQvLyBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKTtcblx0fSxcblx0ZGVsZXRlUHJvcGVydHkoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0aWVzIERlbGV0aW9uIGlzIG5vdCBhbGxvd2VkIScpO1xuXHR9LFxuXHQvLyBnZXRQcm90b3R5cGVPZigpIHtcblx0Ly8gXHRkZWJ1Z2dlcjtcblx0Ly8gXHR0aHJvdyBuZXcgRXJyb3IoJ0dldHRpbmcgcHJvdG90eXBlIGlzIG5vdCBhbGxvd2VkJyk7XG5cdC8vIH0sXG59KTtcblxuLy8gdXNlciBoYXZlIHRvIHByZWNpc2VseSBkZWZpbmUgYWxsIHByb3BzXG5leHBvcnQgY29uc3QgYmFzZVRhcmdldCA9IChfcHJvdG8/OiBvYmplY3QpID0+IHtcblx0Y29uc3QgcHJvdG8gPSB0eXBlb2YgX3Byb3RvID09PSAnb2JqZWN0JyA/IF9wcm90byA6IG51bGw7XG5cdGNvbnN0IGFuc3dlciA9IE9iamVjdC5jcmVhdGUocHJvdG8pO1xuXHRyZXR1cm4gYW5zd2VyO1xufTtcblxuZXhwb3J0IGNvbnN0IFN5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UgPSBTeW1ib2woJ1R5cGXDmG1hdGljYVByb3h5UmVmZXJlbmNlJyk7XG5jb25zdCBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlID0gKF90YXJnZXQ6IG9iamVjdCwgb3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucykgPT4ge1xuXHRjb25zdCB0YXJnZXQgPSBPYmplY3QuY3JlYXRlKF90YXJnZXQpO1xuXHRjb25zdCBpZCA9IGBUeXBlw5htYXRpY2FQcm94eVJlZmVyZW5jZS0ke01hdGgucmFuZG9tKCl9YDtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSwge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpZDtcblx0XHR9XG5cdH0pO1xuXHRjb25zdCBoYW5kbGVycyA9IGNyZWF0ZUhhbmRsZXJzKG9wdGlvbnMpO1xuXHRjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXJzKTtcblx0cmV0dXJuIHByb3h5O1xufTtcblxuXG5leHBvcnQgY29uc3QgQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBvYmplY3QsIFMgZXh0ZW5kcyBUPih0aGlzOiBTIGV4dGVuZHMgVCA/IFMgOiB7fSwgX3RhcmdldD86IFQsIG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMgKTogVCB7XG5cdGlmICghbmV3LnRhcmdldCkge1xuXG5cdFx0Y29uc3Qgc2VsZjoge1xuXHRcdFx0cHJvdG90eXBlOiB7XG5cdFx0XHRcdGNvbnN0cnVjdG9yOiB0eXBlb2YgQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlXG5cdFx0XHR9XG5cdFx0XHQvL0B0cy1pZ25vcmVcblx0XHR9ID0gQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlLmJpbmQodGhpcywgX3RhcmdldCwgb3B0aW9ucyk7XG5cblx0XHRzZWxmLnByb3RvdHlwZSA9IHtcblx0XHRcdGNvbnN0cnVjdG9yOiBCYXNlQ29uc3RydWN0b3JQcm90b3R5cGVcblx0XHR9O1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHJldHVybiBzZWxmO1xuXG5cdH1cblxuXHQvLyBAdHMtaWdub3JlXG5cdGlmICh0aGlzW1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2VdKSB7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Y29uc3QgdGFyZ2V0ID0gYmFzZVRhcmdldChfdGFyZ2V0KSBhcyBvYmplY3Q7XG5cdGNvbnN0IHsgZnJvemVuUHJvdG90eXBlczogZnJlZXplUHJvdG9zID0gdHJ1ZSB9ID0gb3B0aW9ucyB8fCB7fTtcblxuXHRjb25zdCBJbnN0YW5jZVByb3RvdHlwZSA9IGdldFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UodGFyZ2V0LCBvcHRpb25zKTtcblxuXHRjb25zdCBjbGFzc1Byb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSBhcyBvYmplY3Q7XG5cblx0bGV0IHByb3RvO1xuXHRsZXQgcHJvdG9Qb2ludGVyID0gdGhpcyBhcyBvYmplY3Q7XG5cdGxldCBwcm90b0NvbnN0cmN1dG9yO1xuXG5cdGxldCBjb25zdHJ1Y3RvcnMgPSBmYWxzZTtcblxuXHQvLyBAdHMtaWdub3JlXG5cdC8vIGNvbnN0IGhhc1Byb3h5UmVmZXJlbmNlID0gcHJvdG9Qb2ludGVyW1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2VdIGFzIHVua25vd24gYXMgYm9vbGVhbjtcblx0Ly8gaWYgKGhhc1Byb3h5UmVmZXJlbmNlKSB7XG5cdC8vIFx0dGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBUeXBlw5htYXRpY2EgaW5zdGFudGlhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIGZvciB0aGUgc2FtZSBQcm90b3R5cGUgQ2hhaW4hJyk7XG5cdC8vIH1cblxuXHRkbyB7XG5cdFx0cHJvdG8gPSBwcm90b1BvaW50ZXI7XG5cdFx0cHJvdG9Qb2ludGVyID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcblx0XHRpZiAoQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlLnByb3RvdHlwZSA9PT0gcHJvdG9Qb2ludGVyKSB7XG5cdFx0XHRjb25zdHJ1Y3RvcnMgPSB0cnVlO1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGlmICghcHJvdG9Qb2ludGVyKSBicmVhaztcblx0XHRjb25zdCBkZXNjcmlwdG9yID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG9Qb2ludGVyLCAnY29uc3RydWN0b3InKTtcblx0XHRpZiAoIWRlc2NyaXB0b3IpIGNvbnRpbnVlO1xuXHRcdGNvbnN0IHZhbHVlID0gZGVzY3JpcHRvci52YWx1ZSB8fCBkZXNjcmlwdG9yLmdldDtcblx0XHQvLyBpZiAoIXZhbHVlKSBjb250aW51ZTtcblx0XHRwcm90b0NvbnN0cmN1dG9yID0gdmFsdWU7XG5cdH0gd2hpbGUgKHByb3RvQ29uc3RyY3V0b3IgIT09IEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZSk7XG5cblx0aWYgKCFjb25zdHJ1Y3RvcnMgJiYgcHJvdG9Db25zdHJjdXRvciAhPT0gQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gc2V0dXAgVHlwZcOYbWF0aWNhIGhhbmRsZXIhJyk7XG5cdH1cblxuXHRPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIEluc3RhbmNlUHJvdG90eXBlKTtcblx0aWYgKGZyZWV6ZVByb3Rvcykge1xuXHRcdE9iamVjdC5mcmVlemUoY2xhc3NQcm90b3R5cGUpO1xuXHR9XG5cdC8vIEB0cy1pZ25vcmVcblx0cmV0dXJuIHRoaXM7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG59IGFzIHtcblx0bmV3PFQgZXh0ZW5kcyBvYmplY3QgfCB7fT4oX3RhcmdldD86IFQsIG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMpOiBUXG5cdDxUIGV4dGVuZHMgb2JqZWN0IHwge30sIFMgZXh0ZW5kcyBUPihfdGFyZ2V0PzogUyBleHRlbmRzIGluZmVyIEluZmVycmVkUyA/IEluZmVycmVkUyA6IHt9LCBvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zKTogU1xufTtcbi8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuY29uc3QgZnJlZXplQ2xhc3NQcm90b3R5cGVzID0gKGluc3RhbmNlOiBvYmplY3QsIHNob3VsZEZyZWV6ZTogYm9vbGVhbikgPT4ge1xuXHRpZiAoIXNob3VsZEZyZWV6ZSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGZpcnN0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGluc3RhbmNlKTtcblx0Y29uc3QgZmlyc3RJc1Byb3h5ID0gZmlyc3QgIT09IG51bGwgJiYgISFSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmaXJzdCwgU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSk7XG5cdGlmIChmaXJzdElzUHJveHkpIHtcblx0XHRPYmplY3QuZnJlZXplKEJhc2VDbGFzcy5wcm90b3R5cGUpO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGxldCBwID0gZmlyc3Q7XG5cdHdoaWxlIChwICE9PSBudWxsICYmIHAgIT09IEJhc2VDbGFzcy5wcm90b3R5cGUgJiYgcCAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuXHRcdGNvbnN0IG5leHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocCk7XG5cdFx0Y29uc3QgbmV4dElzUHJveHkgPSBuZXh0ICE9PSBudWxsICYmICEhUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobmV4dCwgU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSk7XG5cdFx0T2JqZWN0LmZyZWV6ZShwKTtcblx0XHRpZiAobmV4dElzUHJveHkpIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRwID0gbmV4dDtcblx0fVxuXHRPYmplY3QuZnJlZXplKEJhc2VDbGFzcy5wcm90b3R5cGUpO1xufTtcblxuZXhwb3J0IGNsYXNzIEJhc2VDbGFzcyB7XG5cdGNvbnN0cnVjdG9yKF90YXJnZXQ/OiBvYmplY3QsIG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMpIHtcblx0XHRjb25zdCB7IGZyb3plblByb3RvdHlwZXM6IGZyZWV6ZVByb3RvcyA9IHRydWUgfSA9IG9wdGlvbnMgfHwge307XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKHRoaXNbU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZV0pIHtcblx0XHRcdGZyZWV6ZUNsYXNzUHJvdG90eXBlcyh0aGlzLCBmcmVlemVQcm90b3MpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGFyZ2V0ID0gYmFzZVRhcmdldChfdGFyZ2V0KSBhcyBvYmplY3Q7XG5cdFx0Y29uc3QgcHJveHkgPSBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlKHRhcmdldCwgb3B0aW9ucyk7XG5cdFx0Y29uc3QgaW5zdGFuY2VQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcblxuXHRcdGlmIChpbnN0YW5jZVByb3RvID09PSBCYXNlQ2xhc3MucHJvdG90eXBlKSB7XG5cdFx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgcHJveHkpO1xuXHRcdFx0ZnJlZXplQ2xhc3NQcm90b3R5cGVzKHRoaXMsIGZyZWV6ZVByb3Rvcyk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHRsZXQgY2xhc3NQcm90byA9IGluc3RhbmNlUHJvdG87XG5cdFx0bGV0IHBhcmVudFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsYXNzUHJvdG8pO1xuXHRcdHdoaWxlIChwYXJlbnRQcm90byAhPT0gQmFzZUNsYXNzLnByb3RvdHlwZSAmJiBwYXJlbnRQcm90byAhPT0gbnVsbCkge1xuXHRcdFx0Y2xhc3NQcm90byA9IHBhcmVudFByb3RvO1xuXHRcdFx0cGFyZW50UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2xhc3NQcm90byk7XG5cdFx0fVxuXG5cdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNsYXNzUHJvdG8sIHByb3h5KTtcblx0XHRmcmVlemVDbGFzc1Byb3RvdHlwZXModGhpcywgZnJlZXplUHJvdG9zKTtcblx0fVxufVxuXG5cbmNvbnN0IHN0cmljdCA9IGZ1bmN0aW9uIChfdGFyZ2V0Pzogb2JqZWN0LCBvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zKSB7XG5cdGNvbnN0IHsgZnJvemVuUHJvdG90eXBlczogZnJlZXplUHJvdG9zID0gdHJ1ZSB9ID0gb3B0aW9ucyB8fCB7fTtcblxuXHRjb25zdCBkZWNvcmF0b3IgPSBmdW5jdGlvbjxUPihjc3RyOiBUKTogVCB7XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0aWYgKGNzdHIucHJvdG90eXBlW1N5bWJvbFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2VdKSB7XG5cdFx0XHRyZXR1cm4gY3N0cjtcblx0XHR9XG5cblx0XHRjb25zdCB0YXJnZXQgPSBiYXNlVGFyZ2V0KF90YXJnZXQpO1xuXHRcdGNvbnN0IHByb3h5ID0gZ2V0VHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSh0YXJnZXQsIG9wdGlvbnMpO1xuXHRcdGNvbnN0IF9yZXBsYWNlciA9IE9iamVjdC5jcmVhdGUocHJveHkpO1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihjc3RyLnByb3RvdHlwZSwgX3JlcGxhY2VyKTtcblx0XHRpZiAoZnJlZXplUHJvdG9zKSB7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRPYmplY3QuZnJlZXplKGNzdHIucHJvdG90eXBlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY3N0cjtcblxuXG5cdFx0Ly8gY29uc3QgTXlDbGFzc1Byb3h5ID0gbmV3IFByb3h5KGNzdHIsIHtcblx0XHQvLyBcdGNvbnN0cnVjdChfLCBhcmd1bWVudHNMaXN0LCBuZXdUYXJnZXQpIHtcblx0XHQvLyBcdFx0ZGVidWdnZXI7XG5cdFx0Ly8gXHRcdGNvbnN0IHRhcmdldCA9IGJhc2VUYXJnZXQoX3RhcmdldCk7XG5cdFx0Ly8gXHRcdGNvbnN0IHByb3h5ID0gZ2V0VHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSh0YXJnZXQpO1xuXHRcdC8vIFx0XHRjb25zdCBfcmVwbGFjZXIgPSBPYmplY3QuY3JlYXRlKHByb3h5KTtcblxuXHRcdC8vIFx0XHRjb25zdCBfcHJvdG8gPSBjc3RyLnByb3RvdHlwZTtcblxuXHRcdC8vIFx0XHRjb25zdCBwcm90byA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKF9wcm90bykpO1xuXHRcdC8vIFx0XHRwcm90by5pQW1Qcm90byA9IHRydWU7XG5cblx0XHQvLyBcdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNzdHIucHJvdG90eXBlLCBwcm90byk7XG5cblx0XHQvLyBcdFx0Y29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhfcHJvdG8pO1xuXHRcdC8vIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwcm90bywgZGVzY3JpcHRvcnMpO1xuXG5cdFx0Ly8gXHRcdGNvbnN0IHJlcGxhY2VyID0gT2JqZWN0LmNyZWF0ZShfcmVwbGFjZXIpO1xuXHRcdC8vIFx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIHJlcGxhY2VyKTtcblxuXG5cdFx0Ly8gXHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihjc3RyLnByb3RvdHlwZSwgcHJvdG8pO1xuXHRcdC8vIFx0XHRjb25zdCByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChjc3RyLCBhcmd1bWVudHNMaXN0LCBuZXdUYXJnZXQpO1xuXG5cdFx0Ly8gXHRcdGRlYnVnZ2VyO1xuXHRcdC8vIFx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY3N0ci5wcm90b3R5cGUsIF9wcm90byk7XG5cdFx0Ly8gXHRcdGRlYnVnZ2VyO1xuXG5cdFx0Ly8gXHRcdHJldHVybiByZXN1bHQ7XG5cdFx0Ly8gXHR9LFxuXHRcdC8vIH0pO1xuXHRcdC8vIHJldHVybiBNeUNsYXNzUHJveHk7XG5cdH07XG5cblx0cmV0dXJuIGRlY29yYXRvcjtcblxufTtcbmV4cG9ydCBjb25zdCB7IFN5bWJvbEluaXRpYWxWYWx1ZSB9ID0gRmllbGRDb25zdHJ1Y3RvcjtcbmNvbnN0IEZpZWxkQ29uc3RydWN0b3JFeHBvcnQgPSBGaWVsZENvbnN0cnVjdG9yO1xuZXhwb3J0IHsgRmllbGRDb25zdHJ1Y3RvckV4cG9ydCBhcyBGaWVsZENvbnN0cnVjdG9yIH07XG5leHBvcnQgY29uc3QgU3RyaWN0ID0gc3RyaWN0O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gc2V0dXBDb21tb25KUygpIHtcblx0aWYgKHR5cGVvZiBtb2R1bGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgJ2V4cG9ydHMnLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZTtcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnQmFzZUNsYXNzJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBCYXNlQ2xhc3M7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdGaWVsZENvbnN0cnVjdG9yJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBGaWVsZENvbnN0cnVjdG9yO1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnU3ltYm9sSW5pdGlhbFZhbHVlJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBTeW1ib2xJbml0aWFsVmFsdWU7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlO1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnYmFzZVRhcmdldCcsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gYmFzZVRhcmdldDtcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ1N0cmljdCcsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gc3RyaWN0O1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcbn1cblxuc2V0dXBDb21tb25KUygpO1xuXG5PYmplY3QuZnJlZXplKEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZSk7XG5PYmplY3QuZnJlZXplKEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZS5wcm90b3R5cGUpO1xuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMENBQTBDO0FBRTFDLFlBQVksQ0FBQzs7O0FBRWIsK0JBQStCO0FBQy9CLDJDQUEwQztBQUUxQywrQ0FPMEI7QUFFMUIsMkNBQStDO0FBYS9DLGlFQUFpRTtBQUNqRSxtRUFBbUU7QUFDbkUsbUVBQW1FO0FBQ25FLDZEQUE2RDtBQUM3RCxNQUFNLG1CQUFtQixHQUFHLElBQUksT0FBTyxFQUE4QixDQUFDO0FBRXRFLE1BQU0sWUFBWSxHQUFHLENBQUMsUUFBZ0IsRUFBc0IsRUFBRTtJQUM3RCxJQUFJLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2IsTUFBTSxHQUFHO1lBQ1IsTUFBTSxFQUFNLElBQUksR0FBRyxFQUFFO1lBQ3JCLE9BQU8sRUFBSyxTQUFTO1lBQ3JCLFNBQVMsRUFBRyxLQUFLO1NBQ2pCLENBQUM7UUFDRixtQkFBbUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLE1BQU0sY0FBYyxHQUFHLENBQUMsVUFBOEIsRUFBRSxFQUFFLEVBQUU7SUFDM0QsTUFBTSxFQUFFLGlCQUFpQixHQUFHLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUU5QyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDckIsVUFBVSxFQUFWLHFCQUFVO1FBQ1YsT0FBTyxFQUFQLGtCQUFPO1FBQ1AsT0FBTyxFQUFQLGtCQUFPO1FBQ1AsT0FBTyxFQUFQLGtCQUFPO1FBQ1AsU0FBUyxFQUFULG9CQUFTO0tBQ1QsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFR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ZXNjcmlwdC9uby10aGlzLWFsaWFzXG4gXG4ndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7IGluc3BlY3QgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IEVycm9yc05hbWVzIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuXG5pbXBvcnQge1xuXHRmdW5jdGlvbnMsXG5cdG51bGxpc2gsXG5cdG9iamVjdHMsXG5cdHByaW1pdGl2ZXMsXG5cdHNwZWNpYWwsXG5cdGlzUHJpbWl0aXZlXG59IGZyb20gJy4vdHlwZXMvaW5kZXguanMnO1xuXG5pbXBvcnQgeyBGaWVsZENvbnN0cnVjdG9yIH0gZnJvbSAnLi9maWVsZHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVvbWF0aWNhT3B0aW9ucyB7XG5cdHN0cmljdEFjY2Vzc0NoZWNrPzogYm9vbGVhbjtcblx0ZnJvemVuUHJvdG90eXBlcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBDb25zdHJ1Y3Rpb25SZWNvcmQge1xuXHRmaWVsZHMgICAgOiBTZXQ8c3RyaW5nIHwgc3ltYm9sPjtcblx0b3B0aW9ucyAgIDogVHlwZW9tYXRpY2FPcHRpb25zIHwgdW5kZWZpbmVkO1xuXHRmaW5hbGl6ZWQgOiBib29sZWFuO1xufVxuXG4vLyBGaWVsZHMgdGhhdCBwYXNzZWQgdGhyb3VnaCB0aGUgZGVmaW5lIG1hY2hpbmVyeSwgcGVyIGluc3RhbmNlLlxuLy8gVGhlIHBvc3RDb25zdHJ1Y3Rpb24gY29tcGFyYXRvciAoVGh1bmRlcnN0cnVjayBkZXNpZ24pIGRpZmZzIHRoZVxuLy8gaW5zdGFuY2UncyBvd24gZGVzY3JpcHRvcnMgYWdhaW5zdCB0aGlzIFNldCB0byBmaW5kIGZpZWxkcyBhZGRlZFxuLy8gaGlkZGVubHkg4oCUIGNsYXNzIGZpZWxkcyBhbmQgb3RoZXIgZGVmaW5lLXNlbWFudGljcyB3cml0ZXMuXG5jb25zdCBjb25zdHJ1Y3Rpb25SZWNvcmRzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBDb25zdHJ1Y3Rpb25SZWNvcmQ+KCk7XG5cbmNvbnN0IGVuc3VyZVJlY29yZCA9IChpbnN0YW5jZTogb2JqZWN0KTogQ29uc3RydWN0aW9uUmVjb3JkID0+IHtcblx0bGV0IHJlY29yZCA9IGNvbnN0cnVjdGlvblJlY29yZHMuZ2V0KGluc3RhbmNlKTtcblx0aWYgKCFyZWNvcmQpIHtcblx0XHRyZWNvcmQgPSB7XG5cdFx0XHRmaWVsZHMgICAgOiBuZXcgU2V0KCksXG5cdFx0XHRvcHRpb25zICAgOiB1bmRlZmluZWQsXG5cdFx0XHRmaW5hbGl6ZWQgOiBmYWxzZVxuXHRcdH07XG5cdFx0Y29uc3RydWN0aW9uUmVjb3Jkcy5zZXQoaW5zdGFuY2UsIHJlY29yZCk7XG5cdH1cblx0cmV0dXJuIHJlY29yZDtcbn07XG5cbmNvbnN0IGNyZWF0ZVJlc29sdmVyID0gKG9wdGlvbnM6IFR5cGVvbWF0aWNhT3B0aW9ucyA9IHt9KSA9PiB7XG5cdGNvbnN0IHsgc3RyaWN0QWNjZXNzQ2hlY2sgPSBmYWxzZSB9ID0gb3B0aW9ucztcblx0XG5cdHJldHVybiBPYmplY3QuZW50cmllcyh7XG5cdFx0cHJpbWl0aXZlcyxcblx0XHRzcGVjaWFsLFxuXHRcdG51bGxpc2gsXG5cdFx0b2JqZWN0cyxcblx0XHRmdW5jdGlvbnNcblx0fSkucmVkdWNlKChvYmo6IG9iamVjdCwgW2tleSwgX2hhbmRsZXJdKSA9PiB7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdG9ialtrZXldID0gZnVuY3Rpb24gKGluaXRpYWxWYWx1ZTogb2JqZWN0LCByZWNlaXZlcjogb2JqZWN0KSB7XG5cdFx0XHRjb25zdCBoYW5kbGVyID0gX2hhbmRsZXIoaW5pdGlhbFZhbHVlKTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGdldCgpIHtcblx0XHRcdFx0XHRjb25zdCBpbnZvY2F0aW9uVGhpcyA9IHRoaXM7XG5cdFx0XHRcdFx0aWYgKHN0cmljdEFjY2Vzc0NoZWNrICYmIGludm9jYXRpb25UaGlzICE9PSByZWNlaXZlcikge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKEVycm9yc05hbWVzLkFDQ0VTU19ERU5JRUQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCByZXN1bHQgPSBoYW5kbGVyLmdldCgpO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNldChyZXBsYWNlbWVudFZhbHVlOiB1bmtub3duKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW52b2NhdGlvblRoaXMgPSB0aGlzO1xuXHRcdFx0XHRcdGlmIChzdHJpY3RBY2Nlc3NDaGVjayAmJiBpbnZvY2F0aW9uVGhpcyAhPT0gcmVjZWl2ZXIpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihFcnJvcnNOYW1lcy5BQ0NFU1NfREVOSUVEKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gaGFuZGxlci5zZXQocmVwbGFjZW1lbnRWYWx1ZSk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIG9iajtcblx0fSwge30pO1xufTtcblxuY29uc3QgY3JlYXRlUHJvcGVydHkgPSAocHJvcE5hbWU6IHN0cmluZyB8IHN5bWJvbCwgaW5pdGlhbFZhbHVlOiB1bmtub3duLCByZWNlaXZlcjogb2JqZWN0LCBvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zLCBjb25maWd1cmFibGUgPSBmYWxzZSkgPT4ge1xuXG5cdGNvbnN0IHZhbHVlID0gaW5pdGlhbFZhbHVlO1xuXHRjb25zdCB2YWx1ZUlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmUoaW5pdGlhbFZhbHVlKTtcblx0Y29uc3QgaXNPYmplY3QgPSB0eXBlb2YgaW5pdGlhbFZhbHVlID09PSAnb2JqZWN0Jztcblx0Y29uc3QgaXNGdW5jdGlvbiA9IGluaXRpYWxWYWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uO1xuXHRjb25zdCBpc051bGwgPSBpbml0aWFsVmFsdWUgPT09IG51bGw7XG5cblx0LyoqXG5cdCAqIHNwZWNpYWw6IHVuZGVmaW5lZCBvciBCaWdJbnQgb3IgU3ltYm9sXG5cdCAqIFx0b3Igb3RoZXIgbm9uIGNvbnN0cnVjdGlibGUgdHlwZVxuXHQgKi9cblxuXHRjb25zdCB0eXBlcyA9IHZhbHVlSXNQcmltaXRpdmUgPyAncHJpbWl0aXZlcycgOiAoXG5cdFx0aXNPYmplY3QgPyAoXG5cdFx0XHRpc051bGwgPyAnbnVsbGlzaCcgOiAnb2JqZWN0cydcblx0XHQpIDogKFxuXHRcdFx0aXNGdW5jdGlvbiA/ICdmdW5jdGlvbnMnIDogJ3NwZWNpYWwnXG5cdFx0KVxuXHQpO1xuXG5cdGNvbnN0IHJlc29sdmVyID0gY3JlYXRlUmVzb2x2ZXIob3B0aW9ucyk7XG5cblx0Y29uc3QgZGVzY3JpcHRvciA9IChpc09iamVjdCAmJiAodmFsdWUgaW5zdGFuY2VvZiBGaWVsZENvbnN0cnVjdG9yKSkgP1xuXHRcdHZhbHVlIDoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZSxcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdC4uLnJlc29sdmVyW3R5cGVzXSh2YWx1ZSwgcmVjZWl2ZXIpLFxuXHRcdH07XG5cblx0Ly8gaWYgKHZhbHVlIGluc3RhbmNlb2YgRmllbGRDb25zdHJ1Y3Rvcikge1xuXHQvLyBcdGRlc2NyaXB0b3I7XG5cdC8vIFx0ZGVidWdnZXI7XG5cdC8vIH1cblxuXHRjb25zdCByZXN1bHQgPSBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHJlY2VpdmVyLCBwcm9wTmFtZSwgZGVzY3JpcHRvcik7XG5cblx0Y29uc3QgcmVjb3JkID0gZW5zdXJlUmVjb3JkKHJlY2VpdmVyKTtcblx0cmVjb3JkLmZpZWxkcy5hZGQocHJvcE5hbWUpO1xuXHRyZWNvcmQub3B0aW9ucyA9IG9wdGlvbnM7XG5cblx0cmV0dXJuIHJlc3VsdDtcblxufTtcblxuLy8gbGluZSBiZWxvdyAnaHJlZicgaXMgZm9yIHV0aWwuaW5zcGVjdCB3b3JrcywgdXNlZnVsIGZvciB2MjRcbmNvbnN0IHByb3BzMnNraXAgPSBuZXcgU2V0KFtcblx0U3ltYm9sLnRvU3RyaW5nVGFnLFxuXHRTeW1ib2wuaXRlcmF0b3IsXG5cdC8vIFN5bWJvbC50b1ByaW1pdGl2ZSxcblx0J3RvU3RyaW5nJyxcblx0J3ZhbHVlT2YnLFxuXHQnaHJlZidcbl0pO1xuLy8gY29uc3QgcHJvcHMyc2tpcCA9IG5ldyBTZXQoW1N5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yXSk7XG5jb25zdCBoYXNOb2RlSW5zcGVjdCA9IChpbnNwZWN0ICYmIGluc3BlY3QuY3VzdG9tKTtcbi8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcbihoYXNOb2RlSW5zcGVjdCAmJiAocHJvcHMyc2tpcC5hZGQoaW5zcGVjdC5jdXN0b20pKSk7XG5cbmNvbnN0IGNyZWF0ZUhhbmRsZXJzID0gKG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMpID0+ICh7XG5cdGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcDogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogb2JqZWN0KSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG5cdFx0aWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0XHRpZiAocHJvcCA9PT0gJ3RvSlNPTicpIHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICh0aGlzOiB0eXBlb2YgdGFyZ2V0KSB7XG5cdFx0XHRcdGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0aGlzKTtcblx0XHRcdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KGVudHJpZXMucmVkdWNlKChvYmosIFtrZXksIHZhbHVlXSkgPT4ge1xuXHRcdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0XHRvYmpba2V5XSA9IHZhbHVlLnZhbHVlT2YoKTtcblx0XHRcdFx0XHRyZXR1cm4gb2JqO1xuXHRcdFx0XHR9LCB7fSkpO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0aWYgKHByb3AgPT09ICdjb25zdHJ1Y3RvcicpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGNvbnN0IHsgbmFtZSB9ID0gcmVjZWl2ZXIuY29uc3RydWN0b3I7XG5cdFx0aWYgKHByb3BzMnNraXAuaGFzKHByb3ApKSB7XG5cdFx0XHRjb25zdCBtZXNzYWdlID0gYCR7bmFtZX0gbGFja3MgZGVmaW5pdGlvbiBvZiBbICR7U3RyaW5nKHByb3ApLnZhbHVlT2YoKX0gXWA7XG5cdFx0XHRyZXR1cm4gbWVzc2FnZTtcblx0XHR9XG5cdFx0Ly8gY29uc3QgZXJyb3JNZXNzYWdlID0gYCR7RXJyb3JzTmFtZXMuTUlTU0lOR19QUk9QfTogWyAke1N0cmluZyhwcm9wKS52YWx1ZU9mKCl9IF0gZm9yICR7bmFtZX1gO1xuXHRcdC8vIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuXHR9LFxuXHRzZXQoXzogb2JqZWN0LCBwcm9wOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCByZWNlaXZlcjogb2JqZWN0KSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gY3JlYXRlUHJvcGVydHkocHJvcCwgdmFsdWUsIHJlY2VpdmVyLCBvcHRpb25zKTtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXHRzZXRQcm90b3R5cGVPZigpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1NldHRpbmcgcHJvdG90eXBlIGlzIG5vdCBhbGxvd2VkIScpO1xuXHR9LFxuXHQvLyBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQ6IG9iamVjdCwga2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IG9iamVjdCkge1xuXHRkZWZpbmVQcm9wZXJ0eSgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0RlZmluaW5nIG5ldyBQcm9wZXJ0aWVzIGlzIG5vdCBhbGxvd2VkIScpO1xuXHRcdC8vIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpO1xuXHR9LFxuXHRkZWxldGVQcm9wZXJ0eSgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Byb3BlcnRpZXMgRGVsZXRpb24gaXMgbm90IGFsbG93ZWQhJyk7XG5cdH0sXG5cdC8vIGdldFByb3RvdHlwZU9mKCkge1xuXHQvLyBcdGRlYnVnZ2VyO1xuXHQvLyBcdHRocm93IG5ldyBFcnJvcignR2V0dGluZyBwcm90b3R5cGUgaXMgbm90IGFsbG93ZWQnKTtcblx0Ly8gfSxcbn0pO1xuXG4vLyB1c2VyIGhhdmUgdG8gcHJlY2lzZWx5IGRlZmluZSBhbGwgcHJvcHNcbmV4cG9ydCBjb25zdCBiYXNlVGFyZ2V0ID0gKF9wcm90bz86IG9iamVjdCkgPT4ge1xuXHRjb25zdCBwcm90byA9IHR5cGVvZiBfcHJvdG8gPT09ICdvYmplY3QnID8gX3Byb3RvIDogbnVsbDtcblx0Y29uc3QgYW5zd2VyID0gT2JqZWN0LmNyZWF0ZShwcm90byk7XG5cdHJldHVybiBhbnN3ZXI7XG59O1xuXG5leHBvcnQgY29uc3QgU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSA9IFN5bWJvbCgnVHlwZcOYbWF0aWNhUHJveHlSZWZlcmVuY2UnKTtcbmNvbnN0IGdldFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UgPSAoX3RhcmdldDogb2JqZWN0LCBvcHRpb25zPzogVHlwZW9tYXRpY2FPcHRpb25zKSA9PiB7XG5cdGNvbnN0IHRhcmdldCA9IE9iamVjdC5jcmVhdGUoX3RhcmdldCk7XG5cdGNvbnN0IGlkID0gYFR5cGXDmG1hdGljYVByb3h5UmVmZXJlbmNlLSR7TWF0aC5yYW5kb20oKX1gO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGlkO1xuXHRcdH1cblx0fSk7XG5cdGNvbnN0IGhhbmRsZXJzID0gY3JlYXRlSGFuZGxlcnMob3B0aW9ucyk7XG5cdGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcnMpO1xuXHRyZXR1cm4gcHJveHk7XG59O1xuXG5cbmV4cG9ydCBjb25zdCBCYXNlQ29uc3RydWN0b3JQcm90b3R5cGUgPSBmdW5jdGlvbiA8VCBleHRlbmRzIG9iamVjdCwgUyBleHRlbmRzIFQ+KHRoaXM6IFMgZXh0ZW5kcyBUID8gUyA6IHt9LCBfdGFyZ2V0PzogVCwgb3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucyApOiBUIHtcblx0aWYgKCFuZXcudGFyZ2V0KSB7XG5cblx0XHRjb25zdCBzZWxmOiB7XG5cdFx0XHRwcm90b3R5cGU6IHtcblx0XHRcdFx0Y29uc3RydWN0b3I6IHR5cGVvZiBCYXNlQ29uc3RydWN0b3JQcm90b3R5cGVcblx0XHRcdH1cblx0XHRcdC8vQHRzLWlnbm9yZVxuXHRcdH0gPSBCYXNlQ29uc3RydWN0b3JQcm90b3R5cGUuYmluZCh0aGlzLCBfdGFyZ2V0LCBvcHRpb25zKTtcblxuXHRcdHNlbGYucHJvdG90eXBlID0ge1xuXHRcdFx0Y29uc3RydWN0b3I6IEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZVxuXHRcdH07XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0cmV0dXJuIHNlbGY7XG5cblx0fVxuXG5cdC8vIEB0cy1pZ25vcmVcblx0aWYgKHRoaXNbU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZV0pIHtcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRjb25zdCB0YXJnZXQgPSBiYXNlVGFyZ2V0KF90YXJnZXQpIGFzIG9iamVjdDtcblx0Y29uc3QgeyBmcm96ZW5Qcm90b3R5cGVzOiBmcmVlemVQcm90b3MgPSB0cnVlIH0gPSBvcHRpb25zIHx8IHt9O1xuXG5cdGNvbnN0IEluc3RhbmNlUHJvdG90eXBlID0gZ2V0VHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZSh0YXJnZXQsIG9wdGlvbnMpO1xuXG5cdGNvbnN0IGNsYXNzUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpIGFzIG9iamVjdDtcblxuXHRsZXQgcHJvdG87XG5cdGxldCBwcm90b1BvaW50ZXIgPSB0aGlzIGFzIG9iamVjdDtcblx0bGV0IHByb3RvQ29uc3RyY3V0b3I7XG5cblx0bGV0IGNvbnN0cnVjdG9ycyA9IGZhbHNlO1xuXG5cdC8vIEB0cy1pZ25vcmVcblx0Ly8gY29uc3QgaGFzUHJveHlSZWZlcmVuY2UgPSBwcm90b1BvaW50ZXJbU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZV0gYXMgdW5rbm93biBhcyBib29sZWFuO1xuXHQvLyBpZiAoaGFzUHJveHlSZWZlcmVuY2UpIHtcblx0Ly8gXHR0aHJvdyBuZXcgRXJyb3IoJ011bHRpcGxlIFR5cGXDmG1hdGljYSBpbnN0YW50aWF0aW9ucyBhcmUgbm90IGFsbG93ZWQgZm9yIHRoZSBzYW1lIFByb3RvdHlwZSBDaGFpbiEnKTtcblx0Ly8gfVxuXG5cdGRvIHtcblx0XHRwcm90byA9IHByb3RvUG9pbnRlcjtcblx0XHRwcm90b1BvaW50ZXIgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuXHRcdGlmIChCYXNlQ29uc3RydWN0b3JQcm90b3R5cGUucHJvdG90eXBlID09PSBwcm90b1BvaW50ZXIpIHtcblx0XHRcdGNvbnN0cnVjdG9ycyA9IHRydWU7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdFx0aWYgKCFwcm90b1BvaW50ZXIpIGJyZWFrO1xuXHRcdGNvbnN0IGRlc2NyaXB0b3IgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b1BvaW50ZXIsICdjb25zdHJ1Y3RvcicpO1xuXHRcdGlmICghZGVzY3JpcHRvcikgY29udGludWU7XG5cdFx0Y29uc3QgdmFsdWUgPSBkZXNjcmlwdG9yLnZhbHVlIHx8IGRlc2NyaXB0b3IuZ2V0O1xuXHRcdC8vIGlmICghdmFsdWUpIGNvbnRpbnVlO1xuXHRcdHByb3RvQ29uc3RyY3V0b3IgPSB2YWx1ZTtcblx0fSB3aGlsZSAocHJvdG9Db25zdHJjdXRvciAhPT0gQmFzZUNvbnN0cnVjdG9yUHJvdG90eXBlKTtcblxuXHRpZiAoIWNvbnN0cnVjdG9ycyAmJiBwcm90b0NvbnN0cmN1dG9yICE9PSBCYXNlQ29uc3RydWN0b3JQcm90b3R5cGUpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBzZXR1cCBUeXBlw5htYXRpY2EgaGFuZGxlciEnKTtcblx0fVxuXG5cdE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm90bywgSW5zdGFuY2VQcm90b3R5cGUpO1xuXHRpZiAoZnJlZXplUHJvdG9zKSB7XG5cdFx0T2JqZWN0LmZyZWV6ZShjbGFzc1Byb3RvdHlwZSk7XG5cdH1cblx0Ly8gQHRzLWlnbm9yZVxuXHRyZXR1cm4gdGhpcztcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbn0gYXMge1xuXHRuZXc8VCBleHRlbmRzIG9iamVjdCB8IHt9PihfdGFyZ2V0PzogVCwgb3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucyk6IFRcblx0PFQgZXh0ZW5kcyBvYmplY3QgfCB7fSwgUyBleHRlbmRzIFQ+KF90YXJnZXQ/OiBTIGV4dGVuZHMgaW5mZXIgSW5mZXJyZWRTID8gSW5mZXJyZWRTIDoge30sIG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMpOiBTXG59O1xuLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG5jb25zdCBmcmVlemVDbGFzc1Byb3RvdHlwZXMgPSAoaW5zdGFuY2U6IG9iamVjdCwgc2hvdWxkRnJlZXplOiBib29sZWFuKSA9PiB7XG5cdGlmICghc2hvdWxkRnJlZXplKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgZmlyc3QgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoaW5zdGFuY2UpO1xuXHRjb25zdCBmaXJzdElzUHJveHkgPSBmaXJzdCAhPT0gbnVsbCAmJiAhIVJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGZpcnN0LCBTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlKTtcblx0aWYgKGZpcnN0SXNQcm94eSkge1xuXHRcdE9iamVjdC5mcmVlemUoQmFzZUNsYXNzLnByb3RvdHlwZSk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0bGV0IHAgPSBmaXJzdDtcblx0d2hpbGUgKHAgIT09IG51bGwgJiYgcCAhPT0gQmFzZUNsYXNzLnByb3RvdHlwZSAmJiBwICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG5cdFx0Y29uc3QgbmV4dCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwKTtcblx0XHRjb25zdCBuZXh0SXNQcm94eSA9IG5leHQgIT09IG51bGwgJiYgISFSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuZXh0LCBTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlKTtcblx0XHRPYmplY3QuZnJlZXplKHApO1xuXHRcdGlmIChuZXh0SXNQcm94eSkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdHAgPSBuZXh0O1xuXHR9XG5cdE9iamVjdC5mcmVlemUoQmFzZUNsYXNzLnByb3RvdHlwZSk7XG59O1xuXG5leHBvcnQgY2xhc3MgQmFzZUNsYXNzIHtcblx0Y29uc3RydWN0b3IoX3RhcmdldD86IG9iamVjdCwgb3B0aW9ucz86IFR5cGVvbWF0aWNhT3B0aW9ucykge1xuXHRcdGNvbnN0IHsgZnJvemVuUHJvdG90eXBlczogZnJlZXplUHJvdG9zID0gdHJ1ZSB9ID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAodGhpc1tTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlXSkge1xuXHRcdFx0ZnJlZXplQ2xhc3NQcm90b3R5cGVzKHRoaXMsIGZyZWV6ZVByb3Rvcyk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHRjb25zdCB0YXJnZXQgPSBiYXNlVGFyZ2V0KF90YXJnZXQpIGFzIG9iamVjdDtcblx0XHRjb25zdCBwcm94eSA9IGdldFR5cGVvbWF0aWNhUHJveHlSZWZlcmVuY2UodGFyZ2V0LCBvcHRpb25zKTtcblx0XHRjb25zdCBpbnN0YW5jZVByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuXG5cdFx0aWYgKGluc3RhbmNlUHJvdG8gPT09IEJhc2VDbGFzcy5wcm90b3R5cGUpIHtcblx0XHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBwcm94eSk7XG5cdFx0XHRmcmVlemVDbGFzc1Byb3RvdHlwZXModGhpcywgZnJlZXplUHJvdG9zKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdGxldCBjbGFzc1Byb3RvID0gaW5zdGFuY2VQcm90bztcblx0XHRsZXQgcGFyZW50UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2xhc3NQcm90byk7XG5cdFx0d2hpbGUgKHBhcmVudFByb3RvICE9PSBCYXNlQ2xhc3MucHJvdG90eXBlICYmIHBhcmVudFByb3RvICE9PSBudWxsKSB7XG5cdFx0XHRjbGFzc1Byb3RvID0gcGFyZW50UHJvdG87XG5cdFx0XHRwYXJlbnRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjbGFzc1Byb3RvKTtcblx0XHR9XG5cblx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY2xhc3NQcm90bywgcHJveHkpO1xuXHRcdGZyZWV6ZUNsYXNzUHJvdG90eXBlcyh0aGlzLCBmcmVlemVQcm90b3MpO1xuXHR9XG59XG5cblxuY29uc3Qgc3RyaWN0ID0gZnVuY3Rpb24gKF90YXJnZXQ/OiBvYmplY3QsIG9wdGlvbnM/OiBUeXBlb21hdGljYU9wdGlvbnMpIHtcblx0Y29uc3QgeyBmcm96ZW5Qcm90b3R5cGVzOiBmcmVlemVQcm90b3MgPSB0cnVlIH0gPSBvcHRpb25zIHx8IHt9O1xuXG5cdGNvbnN0IGRlY29yYXRvciA9IGZ1bmN0aW9uPFQ+KGNzdHI6IFQpOiBUIHtcblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRpZiAoY3N0ci5wcm90b3R5cGVbU3ltYm9sVHlwZW9tYXRpY2FQcm94eVJlZmVyZW5jZV0pIHtcblx0XHRcdHJldHVybiBjc3RyO1xuXHRcdH1cblxuXHRcdGNvbnN0IHRhcmdldCA9IGJhc2VUYXJnZXQoX3RhcmdldCk7XG5cdFx0Y29uc3QgcHJveHkgPSBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlKHRhcmdldCwgb3B0aW9ucyk7XG5cdFx0Y29uc3QgX3JlcGxhY2VyID0gT2JqZWN0LmNyZWF0ZShwcm94eSk7XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNzdHIucHJvdG90eXBlLCBfcmVwbGFjZXIpO1xuXHRcdGlmIChmcmVlemVQcm90b3MpIHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdE9iamVjdC5mcmVlemUoY3N0ci5wcm90b3R5cGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjc3RyO1xuXG5cblx0XHQvLyBjb25zdCBNeUNsYXNzUHJveHkgPSBuZXcgUHJveHkoY3N0ciwge1xuXHRcdC8vIFx0Y29uc3RydWN0KF8sIGFyZ3VtZW50c0xpc3QsIG5ld1RhcmdldCkge1xuXHRcdC8vIFx0XHRkZWJ1Z2dlcjtcblx0XHQvLyBcdFx0Y29uc3QgdGFyZ2V0ID0gYmFzZVRhcmdldChfdGFyZ2V0KTtcblx0XHQvLyBcdFx0Y29uc3QgcHJveHkgPSBnZXRUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlKHRhcmdldCk7XG5cdFx0Ly8gXHRcdGNvbnN0IF9yZXBsYWNlciA9IE9iamVjdC5jcmVhdGUocHJveHkpO1xuXG5cdFx0Ly8gXHRcdGNvbnN0IF9wcm90byA9IGNzdHIucHJvdG90eXBlO1xuXG5cdFx0Ly8gXHRcdGNvbnN0IHByb3RvID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YoX3Byb3RvKSk7XG5cdFx0Ly8gXHRcdHByb3RvLmlBbVByb3RvID0gdHJ1ZTtcblxuXHRcdC8vIFx0XHRPYmplY3Quc2V0UHJvdG90eXBlT2YoY3N0ci5wcm90b3R5cGUsIHByb3RvKTtcblxuXHRcdC8vIFx0XHRjb25zdCBkZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKF9wcm90byk7XG5cdFx0Ly8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHByb3RvLCBkZXNjcmlwdG9ycyk7XG5cblx0XHQvLyBcdFx0Y29uc3QgcmVwbGFjZXIgPSBPYmplY3QuY3JlYXRlKF9yZXBsYWNlcik7XG5cdFx0Ly8gXHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm90bywgcmVwbGFjZXIpO1xuXG5cblx0XHQvLyBcdFx0T2JqZWN0LnNldFByb3RvdHlwZU9mKGNzdHIucHJvdG90eXBlLCBwcm90byk7XG5cdFx0Ly8gXHRcdGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KGNzdHIsIGFyZ3VtZW50c0xpc3QsIG5ld1RhcmdldCk7XG5cblx0XHQvLyBcdFx0ZGVidWdnZXI7XG5cdFx0Ly8gXHRcdE9iamVjdC5zZXRQcm90b3R5cGVPZihjc3RyLnByb3RvdHlwZSwgX3Byb3RvKTtcblx0XHQvLyBcdFx0ZGVidWdnZXI7XG5cblx0XHQvLyBcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHQvLyBcdH0sXG5cdFx0Ly8gfSk7XG5cdFx0Ly8gcmV0dXJuIE15Q2xhc3NQcm94eTtcblx0fTtcblxuXHRyZXR1cm4gZGVjb3JhdG9yO1xuXG59O1xuZXhwb3J0IGNvbnN0IHsgU3ltYm9sSW5pdGlhbFZhbHVlIH0gPSBGaWVsZENvbnN0cnVjdG9yO1xuY29uc3QgRmllbGRDb25zdHJ1Y3RvckV4cG9ydCA9IEZpZWxkQ29uc3RydWN0b3I7XG5leHBvcnQgeyBGaWVsZENvbnN0cnVjdG9yRXhwb3J0IGFzIEZpZWxkQ29uc3RydWN0b3IgfTtcbmV4cG9ydCBjb25zdCBTdHJpY3QgPSBzdHJpY3Q7XG5cbi8qKlxuICogRmllbGRzIHRoYXQgY2VydGFpbmx5IHBhc3NlZCB0aHJvdWdoIHRoZSBkZWZpbmUgbWFjaGluZXJ5IGZvciB0aGlzXG4gKiBpbnN0YW5jZS4gUmV0dXJucyBhIGNvcHkgb2YgdGhlIGludGVybmFsIFNldCDigJQgc2FmZSBmb3IgdGhlIGNhbGxlclxuICogdG8gbXV0YXRlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0Q29uc3RydWN0ZWRGaWVsZHMgPSAoaW5zdGFuY2U6IG9iamVjdCk6IFNldDxzdHJpbmcgfCBzeW1ib2w+ID0+IHtcblx0Y29uc3QgcmVjb3JkID0gY29uc3RydWN0aW9uUmVjb3Jkcy5nZXQoaW5zdGFuY2UpO1xuXHRjb25zdCByZXN1bHQgPSByZWNvcmQgPyBuZXcgU2V0KHJlY29yZC5maWVsZHMpIDogbmV3IFNldDxzdHJpbmcgfCBzeW1ib2w+KCk7XG5cdHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBmaW5hbGlzZUZpZWxkcyA9IChpbnN0YW5jZTogb2JqZWN0LCBuYW1lczogKHN0cmluZyB8IHN5bWJvbClbXSk6IHZvaWQgPT4ge1xuXHRjb25zdCByZWNvcmQgPSBlbnN1cmVSZWNvcmQoaW5zdGFuY2UpO1xuXHRuYW1lcy5mb3JFYWNoKChuYW1lKSA9PiB7XG5cdFx0aWYgKHJlY29yZC5maWVsZHMuaGFzKG5hbWUpKSB7XG5cdFx0XHQvLyBhbHJlYWR5IHBhc3NlZCB0aHJvdWdoIHRoZSBtYWNoaW5lcnlcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZGVzY3JpcHRvciA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluc3RhbmNlLCBuYW1lKTtcblx0XHRpZiAoIWRlc2NyaXB0b3IgfHwgISgndmFsdWUnIGluIGRlc2NyaXB0b3IpKSB7XG5cdFx0XHQvLyBub3RoaW5nIGhpZGRlbiB1bmRlciB0aGF0IG5hbWUsIG9yIG5vdCBhIGRhdGEgZmllbGRcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0ZGVsZXRlIChpbnN0YW5jZSBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+KVtuYW1lXTtcblx0XHQvLyBmaW5hbGl6ZWQgZmllbGRzIHN0YXkgY29uZmlndXJhYmxlOiB0aGV5IGFyZSB0aGUgb25lcyBgdW53cmFwYFxuXHRcdC8vIGlzIGFsbG93ZWQgdG8gdHVybiBiYWNrIGludG8gcGxhaW4gdmFsdWUgcHJvcGVydGllc1xuXHRcdGNyZWF0ZVByb3BlcnR5KG5hbWUsIGRlc2NyaXB0b3IudmFsdWUsIGluc3RhbmNlLCByZWNvcmQub3B0aW9ucywgdHJ1ZSk7XG5cdH0pO1xufTtcblxuLyoqXG4gKiBBdXRvIGZpbmFsaXphdGlvbjogZXZlcnkgaGlkZGVubHktYWRkZWQgb3duIGZpZWxkIG9mIHRoZSBpbnN0YW5jZVxuICogKGNsYXNzIGZpZWxkcyBhbmQgb3RoZXIgZGVmaW5lLXNlbWFudGljcyB3cml0ZXMgdGhhdCBieXBhc3NlZCB0aGVcbiAqIHByb3h5KSBpcyBkZWxldGVkIGFuZCByZS1lc3RhYmxpc2hlZCB0aHJvdWdoIHRoZSBkZWZpbmUgbWFjaGluZXJ5LlxuICogU2V0cyB0aGUgZmluYWxpemVkIGZsYWcg4oCUIGB0cnVlYCBtZWFucyBhdXRvIG1vZGUgcmFuLlxuICovXG5leHBvcnQgY29uc3QgZmluYWxpemUgPSAoaW5zdGFuY2U6IG9iamVjdCk6IHZvaWQgPT4ge1xuXHRjb25zdCByZWNvcmQgPSBlbnN1cmVSZWNvcmQoaW5zdGFuY2UpO1xuXHRmaW5hbGlzZUZpZWxkcyhpbnN0YW5jZSwgUmVmbGVjdC5vd25LZXlzKGluc3RhbmNlKSk7XG5cdHJlY29yZC5maW5hbGl6ZWQgPSB0cnVlO1xufTtcblxuLyoqXG4gKiBQYXJ0aWFsIGZpbmFsaXphdGlvbjogcmUtZXN0YWJsaXNoIG9ubHkgdGhlIGxpc3RlZCBmaWVsZHMuXG4gKiBEb2VzIE5PVCBzZXQgdGhlIGZpbmFsaXplZCBmbGFnIOKAlCB0aGF0IGZsYWcgbWVhbnMgYXV0byBtb2RlIHJhbixcbiAqIGV2ZXJ5dGhpbmcgZWxzZSBpcyB0aGUgdXNlcidzIGNob2ljZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGZpbmFsaXplQnkgPSAoaW5zdGFuY2U6IG9iamVjdCwgZmllbGRzOiAoc3RyaW5nIHwgc3ltYm9sKVtdKTogdm9pZCA9PiB7XG5cdGZpbmFsaXNlRmllbGRzKGluc3RhbmNlLCBmaWVsZHMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRmluYWxpemVkID0gKGluc3RhbmNlOiBvYmplY3QpOiBib29sZWFuID0+IHtcblx0Y29uc3QgcmVjb3JkID0gY29uc3RydWN0aW9uUmVjb3Jkcy5nZXQoaW5zdGFuY2UpO1xuXHRjb25zdCByZXN1bHQgPSByZWNvcmQgPyByZWNvcmQuZmluYWxpemVkIDogZmFsc2U7XG5cdHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFR1cm4gYSBndWFyZGVkIGZpZWxkIGJhY2sgaW50byBhIHBsYWluIHZhbHVlIHByb3BlcnR5LlxuICogQWxsb3dlZCBvbmx5IGZvciBmaWVsZHMgcmUtZXN0YWJsaXNoZWQgYnkgZmluYWxpemUvZmluYWxpemVCeSDigJRcbiAqIHRoZXkgc3RheSBjb25maWd1cmFibGUgYnkgZGVzaWduLiBGaWVsZHMgZ3VhcmRlZCBzaW5jZSBjb25zdHJ1Y3Rpb25cbiAqIGFyZSBub24tY29uZmlndXJhYmxlOiB0aGF0IGxvY2sgaXMgdGhlIGVzc2VudGlhbCBkZXNpZ24gb2YgdGhlIGxpYi5cbiAqIFByaW1pdGl2ZXMgYXJlIHJlYWQgYmFjayB2aWEgLnZhbHVlT2YoKTsgb2JqZWN0cyBhcmUgcGxhY2VkIGFzLWlzLlxuICovXG5leHBvcnQgY29uc3QgdW53cmFwID0gKGluc3RhbmNlOiBvYmplY3QsIGZpZWxkOiBzdHJpbmcgfCBzeW1ib2wpOiB2b2lkID0+IHtcblx0Y29uc3QgZGVzY3JpcHRvciA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluc3RhbmNlLCBmaWVsZCk7XG5cdGlmICghZGVzY3JpcHRvciB8fCAhZGVzY3JpcHRvci5jb25maWd1cmFibGUgfHwgdHlwZW9mIGRlc2NyaXB0b3IuZ2V0ICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihFcnJvcnNOYW1lcy5GT1JCSURERU5fVU5XUkFQKTtcblx0fVxuXHRjb25zdCBjdXJyZW50ID0gKGluc3RhbmNlIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2ZpZWxkXTtcblx0Y29uc3QgY3VycmVudFZhbHVlT2YgPSAoY3VycmVudCBhcyB7IHZhbHVlT2Y/OiB1bmtub3duIH0pPy52YWx1ZU9mO1xuXHRjb25zdCB1bndyYXBwZWQgPSB0eXBlb2YgY3VycmVudFZhbHVlT2YgPT09ICdmdW5jdGlvbidcblx0XHQ/IChjdXJyZW50IGFzIHsgdmFsdWVPZjogKCkgPT4gdW5rbm93biB9KS52YWx1ZU9mKClcblx0XHQ6IGN1cnJlbnQ7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbnN0YW5jZSwgZmllbGQsIHtcblx0XHR2YWx1ZSAgICAgICAgOiB1bndyYXBwZWQsXG5cdFx0d3JpdGFibGUgICAgIDogdHJ1ZSxcblx0XHRlbnVtZXJhYmxlICAgOiB0cnVlLFxuXHRcdGNvbmZpZ3VyYWJsZSA6IHRydWVcblx0fSk7XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gc2V0dXBDb21tb25KUygpIHtcblx0aWYgKHR5cGVvZiBtb2R1bGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgJ2V4cG9ydHMnLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZTtcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnQmFzZUNsYXNzJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBCYXNlQ2xhc3M7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdGaWVsZENvbnN0cnVjdG9yJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBGaWVsZENvbnN0cnVjdG9yO1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnU3ltYm9sSW5pdGlhbFZhbHVlJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBTeW1ib2xJbml0aWFsVmFsdWU7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlXG5cdH0pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBTeW1ib2xUeXBlb21hdGljYVByb3h5UmVmZXJlbmNlO1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnYmFzZVRhcmdldCcsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gYmFzZVRhcmdldDtcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ1N0cmljdCcsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gc3RyaWN0O1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnZ2V0Q29uc3RydWN0ZWRGaWVsZHMnLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGdldENvbnN0cnVjdGVkRmllbGRzO1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnZmluYWxpemUnLCB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIGZpbmFsaXplO1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnZmluYWxpemVCeScsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gZmluYWxpemVCeTtcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ2lzRmluYWxpemVkJywge1xuXHRcdGdldCgpIHtcblx0XHRcdHJldHVybiBpc0ZpbmFsaXplZDtcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWVcblx0fSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ3Vud3JhcCcsIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gdW53cmFwO1xuXHRcdH0sXG5cdFx0ZW51bWVyYWJsZTogdHJ1ZVxuXHR9KTtcbn1cblxuc2V0dXBDb21tb25KUygpO1xuXG5PYmplY3QuZnJlZXplKEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZSk7XG5PYmplY3QuZnJlZXplKEJhc2VDb25zdHJ1Y3RvclByb3RvdHlwZS5wcm90b3R5cGUpO1xuIl19 \ No newline at end of file diff --git a/lib/types/functions.js b/lib/types/functions.js index 2a8998b..6c06696 100644 --- a/lib/types/functions.js +++ b/lib/types/functions.js @@ -1,9 +1,9 @@ 'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +Object.defineProperty(exports, "__esModule", { value: true }); exports.functions = void 0; -const errors_js_1 = require('../errors.js'); +const errors_js_1 = require("../errors.js"); const functions = () => { - throw new TypeError(errors_js_1.ErrorsNames.RIP_FUNCTIONS); + throw new TypeError(errors_js_1.ErrorsNames.RIP_FUNCTIONS); }; exports.functions = functions; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2Z1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7OztBQUViLDRDQUEyQztBQUVwQyxNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUU7SUFDN0IsTUFBTSxJQUFJLFNBQVMsQ0FBQyx1QkFBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ2hELENBQUMsQ0FBQztBQUZXLFFBQUEsU0FBUyxhQUVwQiIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHsgRXJyb3JzTmFtZXMgfSBmcm9tICcuLi9lcnJvcnMuanMnO1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zID0gKCkgPT4ge1xuXHR0aHJvdyBuZXcgVHlwZUVycm9yKEVycm9yc05hbWVzLlJJUF9GVU5DVElPTlMpO1xufTsiXX0= \ No newline at end of file diff --git a/lib/types/index.js b/lib/types/index.js index 0340b49..fcbc94c 100644 --- a/lib/types/index.js +++ b/lib/types/index.js @@ -1,23 +1,23 @@ 'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +Object.defineProperty(exports, "__esModule", { value: true }); exports.isPrimitive = exports.special = exports.primitives = exports.objects = exports.nullish = exports.functions = void 0; -var functions_js_1 = require('./functions.js'); -Object.defineProperty(exports, 'functions', { enumerable: true, get: function () { return functions_js_1.functions; } }); -var nullish_js_1 = require('./nullish.js'); -Object.defineProperty(exports, 'nullish', { enumerable: true, get: function () { return nullish_js_1.nullish; } }); -var objects_js_1 = require('./objects.js'); -Object.defineProperty(exports, 'objects', { enumerable: true, get: function () { return objects_js_1.objects; } }); -var primitives_js_1 = require('./primitives.js'); -Object.defineProperty(exports, 'primitives', { enumerable: true, get: function () { return primitives_js_1.primitives; } }); -var special_js_1 = require('./special.js'); -Object.defineProperty(exports, 'special', { enumerable: true, get: function () { return special_js_1.special; } }); +var functions_js_1 = require("./functions.js"); +Object.defineProperty(exports, "functions", { enumerable: true, get: function () { return functions_js_1.functions; } }); +var nullish_js_1 = require("./nullish.js"); +Object.defineProperty(exports, "nullish", { enumerable: true, get: function () { return nullish_js_1.nullish; } }); +var objects_js_1 = require("./objects.js"); +Object.defineProperty(exports, "objects", { enumerable: true, get: function () { return objects_js_1.objects; } }); +var primitives_js_1 = require("./primitives.js"); +Object.defineProperty(exports, "primitives", { enumerable: true, get: function () { return primitives_js_1.primitives; } }); +var special_js_1 = require("./special.js"); +Object.defineProperty(exports, "special", { enumerable: true, get: function () { return special_js_1.special; } }); const PRIMITIVE_TYPES = [ - 'string', - 'number', - 'boolean', + 'string', + 'number', + 'boolean', ]; const isPrimitive = (value) => { - return PRIMITIVE_TYPES.includes(typeof value); + return PRIMITIVE_TYPES.includes(typeof value); }; exports.isPrimitive = isPrimitive; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOzs7QUFFYiwrQ0FBMkM7QUFBbEMseUdBQUEsU0FBUyxPQUFBO0FBQ2xCLDJDQUF1QztBQUE5QixxR0FBQSxPQUFPLE9BQUE7QUFDaEIsMkNBQXVDO0FBQTlCLHFHQUFBLE9BQU8sT0FBQTtBQUNoQixpREFBNkM7QUFBcEMsMkdBQUEsVUFBVSxPQUFBO0FBQ25CLDJDQUF1QztBQUE5QixxR0FBQSxPQUFPLE9BQUE7QUFFaEIsTUFBTSxlQUFlLEdBQUc7SUFDdkIsUUFBUTtJQUNSLFFBQVE7SUFDUixTQUFTO0NBQ1QsQ0FBQztBQUVLLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBYyxFQUFFLEVBQUU7SUFDN0MsT0FBTyxlQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRlcsUUFBQSxXQUFXLGVBRXRCIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnQgeyBmdW5jdGlvbnMgfSBmcm9tICcuL2Z1bmN0aW9ucy5qcyc7XG5leHBvcnQgeyBudWxsaXNoIH0gZnJvbSAnLi9udWxsaXNoLmpzJztcbmV4cG9ydCB7IG9iamVjdHMgfSBmcm9tICcuL29iamVjdHMuanMnO1xuZXhwb3J0IHsgcHJpbWl0aXZlcyB9IGZyb20gJy4vcHJpbWl0aXZlcy5qcyc7XG5leHBvcnQgeyBzcGVjaWFsIH0gZnJvbSAnLi9zcGVjaWFsLmpzJztcblxuY29uc3QgUFJJTUlUSVZFX1RZUEVTID0gW1xuXHQnc3RyaW5nJyxcblx0J251bWJlcicsXG5cdCdib29sZWFuJyxcbl07XG5cbmV4cG9ydCBjb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuXHRyZXR1cm4gUFJJTUlUSVZFX1RZUEVTLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSk7XG59O1xuIl19 \ No newline at end of file diff --git a/lib/types/nullish.js b/lib/types/nullish.js index 3ab78f7..5111fb3 100644 --- a/lib/types/nullish.js +++ b/lib/types/nullish.js @@ -1,17 +1,17 @@ 'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +Object.defineProperty(exports, "__esModule", { value: true }); exports.nullish = void 0; -const errors_js_1 = require('../errors.js'); +const errors_js_1 = require("../errors.js"); const nullish = (value) => { - return { - get() { - return value; - }, - set() { - const error = new TypeError(errors_js_1.ErrorsNames.TYPE_MISMATCH); - throw error; - } - }; + return { + get() { + return value; + }, + set() { + const error = new TypeError(errors_js_1.ErrorsNames.TYPE_MISMATCH); + throw error; + } + }; }; exports.nullish = nullish; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVsbGlzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9udWxsaXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7O0FBRWIsNENBQTJDO0FBRXBDLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDeEMsT0FBTztRQUNOLEdBQUc7WUFDRixPQUFPLEtBQUssQ0FBQztRQUNkLENBQUM7UUFDRCxHQUFHO1lBQ0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUMsdUJBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2RCxNQUFNLEtBQUssQ0FBQztRQUNiLENBQUM7S0FDRCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBVlcsUUFBQSxPQUFPLFdBVWxCIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBFcnJvcnNOYW1lcyB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5cbmV4cG9ydCBjb25zdCBudWxsaXNoID0gKHZhbHVlOiBvYmplY3QpID0+IHtcblx0cmV0dXJuIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSxcblx0XHRzZXQoKSB7XG5cdFx0XHRjb25zdCBlcnJvciA9IG5ldyBUeXBlRXJyb3IoRXJyb3JzTmFtZXMuVFlQRV9NSVNNQVRDSCk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH07XG59OyJdfQ== \ No newline at end of file diff --git a/lib/types/objects.js b/lib/types/objects.js index f9bc639..54c1dc8 100644 --- a/lib/types/objects.js +++ b/lib/types/objects.js @@ -1,21 +1,21 @@ 'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +Object.defineProperty(exports, "__esModule", { value: true }); exports.objects = void 0; -const errors_js_1 = require('../errors.js'); +const errors_js_1 = require("../errors.js"); const objects = (value) => { - return { - get() { - return value; - }, - set(replacementValue) { - if (replacementValue instanceof Object && replacementValue.constructor === value.constructor) { - value = replacementValue; - return value; - } - const error = new TypeError(errors_js_1.ErrorsNames.TYPE_MISMATCH); - throw error; - } - }; + return { + get() { + return value; + }, + set(replacementValue) { + if (replacementValue instanceof Object && replacementValue.constructor === value.constructor) { + value = replacementValue; + return value; + } + const error = new TypeError(errors_js_1.ErrorsNames.TYPE_MISMATCH); + throw error; + } + }; }; exports.objects = objects; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9vYmplY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7O0FBRWIsNENBQTJDO0FBRXBDLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDeEMsT0FBTztRQUNOLEdBQUc7WUFDRixPQUFPLEtBQUssQ0FBQztRQUNkLENBQUM7UUFDRCxHQUFHLENBQUMsZ0JBQXlCO1lBQzVCLElBQUksZ0JBQWdCLFlBQVksTUFBTSxJQUFJLGdCQUFnQixDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzlGLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQztnQkFDekIsT0FBTyxLQUFLLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFTLENBQUMsdUJBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2RCxNQUFNLEtBQUssQ0FBQztRQUNiLENBQUM7S0FDRCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBZFcsUUFBQSxPQUFPLFdBY2xCIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBFcnJvcnNOYW1lcyB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5cbmV4cG9ydCBjb25zdCBvYmplY3RzID0gKHZhbHVlOiBvYmplY3QpID0+IHtcblx0cmV0dXJuIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSxcblx0XHRzZXQocmVwbGFjZW1lbnRWYWx1ZTogdW5rbm93bikge1xuXHRcdFx0aWYgKHJlcGxhY2VtZW50VmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgcmVwbGFjZW1lbnRWYWx1ZS5jb25zdHJ1Y3RvciA9PT0gdmFsdWUuY29uc3RydWN0b3IpIHtcblx0XHRcdFx0dmFsdWUgPSByZXBsYWNlbWVudFZhbHVlO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBlcnJvciA9IG5ldyBUeXBlRXJyb3IoRXJyb3JzTmFtZXMuVFlQRV9NSVNNQVRDSCk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH07XG59OyJdfQ== \ No newline at end of file diff --git a/lib/types/primitives.js b/lib/types/primitives.js index 45aee7c..2e05bfc 100644 --- a/lib/types/primitives.js +++ b/lib/types/primitives.js @@ -1,64 +1,64 @@ 'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +Object.defineProperty(exports, "__esModule", { value: true }); exports.primitives = void 0; -const errors_js_1 = require('../errors.js'); +const errors_js_1 = require("../errors.js"); const primitives = (initialValue) => { - let value = Object(initialValue); - const initialType = typeof initialValue; - return { - get() { - const proxyAsValue = new Proxy(value, { - // get(target, prop, receiver) { - get(_, prop) { - if (prop === Symbol.toPrimitive) { - return function (hint) { - if (hint !== initialType) { - throw new ReferenceError(errors_js_1.ErrorsNames.ACCESS_DENIED); - } - return value.valueOf(); - }; - } - if (prop === 'valueOf') { - return function () { - return value.valueOf(); - }; - } - // @ts-ignore - if (value[prop] instanceof Function) { - return value[prop].bind(value); - } - const answer = value[prop]; - return answer; - } - }); - return proxyAsValue; - }, - // get() { - // const preparedValue = { - // [Symbol.toPrimitive]() { - // return function () { - // throw new ReferenceError(ErrorsNames.ACCESS_DENIED); - // }; - // } - // }; - // Reflect.setPrototypeOf(preparedValue, value); - // debugger; - // return preparedValue; - // }, - set(replacementValue) { - if (replacementValue instanceof value.constructor) { - value = replacementValue; - return value; - } - const prevalue = Object(replacementValue); - if (prevalue instanceof value.constructor) { - value = prevalue; - return value; - } - const error = new TypeError(errors_js_1.ErrorsNames.TYPE_MISMATCH); - throw error; - } - }; + let value = Object(initialValue); + const initialType = typeof initialValue; + return { + get() { + const proxyAsValue = new Proxy(value, { + // get(target, prop, receiver) { + get(_, prop) { + if (prop === Symbol.toPrimitive) { + return function (hint) { + if (hint !== initialType) { + throw new ReferenceError(errors_js_1.ErrorsNames.ACCESS_DENIED); + } + return value.valueOf(); + }; + } + if (prop === 'valueOf') { + return function () { + return value.valueOf(); + }; + } + // @ts-ignore + if (value[prop] instanceof Function) { + return value[prop].bind(value); + } + const answer = value[prop]; + return answer; + } + }); + return proxyAsValue; + }, + // get() { + // const preparedValue = { + // [Symbol.toPrimitive]() { + // return function () { + // throw new ReferenceError(ErrorsNames.ACCESS_DENIED); + // }; + // } + // }; + // Reflect.setPrototypeOf(preparedValue, value); + // debugger; + // return preparedValue; + // }, + set(replacementValue) { + if (replacementValue instanceof value.constructor) { + value = replacementValue; + return value; + } + const prevalue = Object(replacementValue); + if (prevalue instanceof value.constructor) { + value = prevalue; + return value; + } + const error = new TypeError(errors_js_1.ErrorsNames.TYPE_MISMATCH); + throw error; + } + }; }; exports.primitives = primitives; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbWl0aXZlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wcmltaXRpdmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7O0FBRWIsNENBQTJDO0FBRXBDLE1BQU0sVUFBVSxHQUFHLENBQUMsWUFBb0IsRUFBRSxFQUFFO0lBQ2xELElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqQyxNQUFNLFdBQVcsR0FBRyxPQUFPLFlBQVksQ0FBQztJQUV4QyxPQUFPO1FBQ04sR0FBRztZQUNGLE1BQU0sWUFBWSxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRTtnQkFDckMsZ0NBQWdDO2dCQUNoQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUk7b0JBQ1YsSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUNqQyxPQUFPLFVBQVUsSUFBWTs0QkFDNUIsSUFBSSxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7Z0NBQzFCLE1BQU0sSUFBSSxjQUFjLENBQUMsdUJBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQzs0QkFDckQsQ0FBQzs0QkFDRCxPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDeEIsQ0FBQyxDQUFDO29CQUNILENBQUM7b0JBRUQsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ3hCLE9BQU87NEJBQ04sT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3hCLENBQUMsQ0FBQztvQkFDSCxDQUFDO29CQUVELGFBQWE7b0JBQ2IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksUUFBUSxFQUFFLENBQUM7d0JBQ3JDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEMsQ0FBQztvQkFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNCLE9BQU8sTUFBTSxDQUFDO2dCQUNmLENBQUM7YUFDRCxDQUFDLENBQUM7WUFDSCxPQUFPLFlBQVksQ0FBQztRQUNyQixDQUFDO1FBQ0QsVUFBVTtRQUNWLDJCQUEyQjtRQUMzQiw2QkFBNkI7UUFDN0IsMEJBQTBCO1FBQzFCLDJEQUEyRDtRQUMzRCxRQUFRO1FBQ1IsTUFBTTtRQUNOLE1BQU07UUFDTixpREFBaUQ7UUFDakQsYUFBYTtRQUNiLHlCQUF5QjtRQUN6QixLQUFLO1FBQ0wsR0FBRyxDQUFDLGdCQUF5QjtZQUM1QixJQUFJLGdCQUFnQixZQUFZLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkQsS0FBSyxHQUFHLGdCQUFnQixDQUFDO2dCQUN6QixPQUFPLEtBQUssQ0FBQztZQUNkLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUUxQyxJQUFJLFFBQVEsWUFBWSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzNDLEtBQUssR0FBRyxRQUFRLENBQUM7Z0JBQ2pCLE9BQU8sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUVELE1BQU0sS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLHVCQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkQsTUFBTSxLQUFLLENBQUM7UUFDYixDQUFDO0tBQ0QsQ0FBQztBQUNILENBQUMsQ0FBQztBQWhFVyxRQUFBLFVBQVUsY0FnRXJCIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBFcnJvcnNOYW1lcyB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5cbmV4cG9ydCBjb25zdCBwcmltaXRpdmVzID0gKGluaXRpYWxWYWx1ZTogb2JqZWN0KSA9PiB7XG5cdGxldCB2YWx1ZSA9IE9iamVjdChpbml0aWFsVmFsdWUpO1xuXHRjb25zdCBpbml0aWFsVHlwZSA9IHR5cGVvZiBpbml0aWFsVmFsdWU7XG5cblx0cmV0dXJuIHtcblx0XHRnZXQoKSB7XG5cdFx0XHRjb25zdCBwcm94eUFzVmFsdWUgPSBuZXcgUHJveHkodmFsdWUsIHtcblx0XHRcdFx0Ly8gZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcblx0XHRcdFx0Z2V0KF8sIHByb3ApIHtcblx0XHRcdFx0XHRpZiAocHJvcCA9PT0gU3ltYm9sLnRvUHJpbWl0aXZlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGhpbnQ6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRpZiAoaGludCAhPT0gaW5pdGlhbFR5cGUpIHtcblx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoRXJyb3JzTmFtZXMuQUNDRVNTX0RFTklFRCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlLnZhbHVlT2YoKTtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHByb3AgPT09ICd2YWx1ZU9mJykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlLnZhbHVlT2YoKTtcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRcdGlmICh2YWx1ZVtwcm9wXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWVbcHJvcF0uYmluZCh2YWx1ZSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgYW5zd2VyID0gdmFsdWVbcHJvcF07XG5cdFx0XHRcdFx0cmV0dXJuIGFuc3dlcjtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gcHJveHlBc1ZhbHVlO1xuXHRcdH0sXG5cdFx0Ly8gZ2V0KCkge1xuXHRcdC8vIFx0Y29uc3QgcHJlcGFyZWRWYWx1ZSA9IHtcblx0XHQvLyBcdFx0W1N5bWJvbC50b1ByaW1pdGl2ZV0oKSB7XG5cdFx0Ly8gXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHQvLyBcdFx0XHRcdHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihFcnJvcnNOYW1lcy5BQ0NFU1NfREVOSUVEKTtcblx0XHQvLyBcdFx0XHR9O1xuXHRcdC8vIFx0XHR9XG5cdFx0Ly8gXHR9O1xuXHRcdC8vIFx0UmVmbGVjdC5zZXRQcm90b3R5cGVPZihwcmVwYXJlZFZhbHVlLCB2YWx1ZSk7XG5cdFx0Ly8gXHRkZWJ1Z2dlcjtcblx0XHQvLyBcdHJldHVybiBwcmVwYXJlZFZhbHVlO1xuXHRcdC8vIH0sXG5cdFx0c2V0KHJlcGxhY2VtZW50VmFsdWU6IHVua25vd24pIHtcblx0XHRcdGlmIChyZXBsYWNlbWVudFZhbHVlIGluc3RhbmNlb2YgdmFsdWUuY29uc3RydWN0b3IpIHtcblx0XHRcdFx0dmFsdWUgPSByZXBsYWNlbWVudFZhbHVlO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHByZXZhbHVlID0gT2JqZWN0KHJlcGxhY2VtZW50VmFsdWUpO1xuXG5cdFx0XHRpZiAocHJldmFsdWUgaW5zdGFuY2VvZiB2YWx1ZS5jb25zdHJ1Y3Rvcikge1xuXHRcdFx0XHR2YWx1ZSA9IHByZXZhbHVlO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGVycm9yID0gbmV3IFR5cGVFcnJvcihFcnJvcnNOYW1lcy5UWVBFX01JU01BVENIKTtcblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fTtcbn07Il19 \ No newline at end of file diff --git a/lib/types/special.js b/lib/types/special.js index 7541a57..4185ad0 100644 --- a/lib/types/special.js +++ b/lib/types/special.js @@ -1,21 +1,21 @@ 'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +Object.defineProperty(exports, "__esModule", { value: true }); exports.special = void 0; -const errors_js_1 = require('../errors.js'); +const errors_js_1 = require("../errors.js"); const special = (value) => { - return { - get() { - return value; - }, - set(replacementValue) { - if (typeof replacementValue === typeof value) { - value = replacementValue; - return value; - } - const error = new TypeError(errors_js_1.ErrorsNames.TYPE_MISMATCH); - throw error; - } - }; + return { + get() { + return value; + }, + set(replacementValue) { + if (typeof replacementValue === typeof value) { + value = replacementValue; + return value; + } + const error = new TypeError(errors_js_1.ErrorsNames.TYPE_MISMATCH); + throw error; + } + }; }; exports.special = special; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY2lhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9zcGVjaWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7O0FBRWIsNENBQTJDO0FBRXBDLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDeEMsT0FBTztRQUNOLEdBQUc7WUFDRixPQUFPLEtBQUssQ0FBQztRQUNkLENBQUM7UUFDRCxHQUFHLENBQUMsZ0JBQXdCO1lBQzNCLElBQUksT0FBTyxnQkFBZ0IsS0FBSyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUM5QyxLQUFLLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLHVCQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdkQsTUFBTSxLQUFLLENBQUM7UUFDYixDQUFDO0tBQ0QsQ0FBQztBQUNILENBQUMsQ0FBQztBQWRXLFFBQUEsT0FBTyxXQWNsQiIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHsgRXJyb3JzTmFtZXMgfSBmcm9tICcuLi9lcnJvcnMuanMnO1xuXG5leHBvcnQgY29uc3Qgc3BlY2lhbCA9ICh2YWx1ZTogb2JqZWN0KSA9PiB7XG5cdHJldHVybiB7XG5cdFx0Z2V0KCkge1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH0sXG5cdFx0c2V0KHJlcGxhY2VtZW50VmFsdWU6IG9iamVjdCkge1xuXHRcdFx0aWYgKHR5cGVvZiByZXBsYWNlbWVudFZhbHVlID09PSB0eXBlb2YgdmFsdWUpIHtcblx0XHRcdFx0dmFsdWUgPSByZXBsYWNlbWVudFZhbHVlO1xuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBlcnJvciA9IG5ldyBUeXBlRXJyb3IoRXJyb3JzTmFtZXMuVFlQRV9NSVNNQVRDSCk7XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH07XG59OyJdfQ== \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3136adb..0d08a63 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "typeomatica", - "version": "0.3.59", + "version": "0.3.60", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "typeomatica", - "version": "0.3.59", + "version": "0.3.60", "license": "MIT", "devDependencies": { "@eslint/eslintrc": "^3.3.5", @@ -850,9 +850,9 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz", + "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", "dev": true, "license": "MIT", "dependencies": { @@ -2060,16 +2060,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { @@ -2825,9 +2825,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -3890,9 +3890,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -4860,9 +4860,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "dev": true, "funding": [ { @@ -5599,9 +5599,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -5987,9 +5987,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "dev": true, "funding": [ { @@ -6007,7 +6007,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, diff --git a/package.json b/package.json index f872add..e5db072 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typeomatica", - "version": "0.3.59", + "version": "0.3.60", "description": "type logic against javascript metaprogramming", "engines": { "node": ">=16" diff --git a/src/errors.ts b/src/errors.ts index 54f8084..7a67906 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -5,5 +5,6 @@ export const ErrorsNames = { ACCESS_DENIED: 'Value Access Denied', RIP_FUNCTIONS: 'Functions are Restricted', FORBIDDEN_RE: 'Re-Assirnment is Forbidden', + FORBIDDEN_UNWRAP: 'Unwrap is allowed only for finalized fields', // MISSING_PROP: 'Attempt to Access to Undefined Prop', }; diff --git a/src/index.ts b/src/index.ts index 4411b55..fdb50c4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,6 +21,31 @@ export interface TypeomaticaOptions { frozenPrototypes?: boolean; } +interface ConstructionRecord { + fields : Set; + options : TypeomaticaOptions | undefined; + finalized : boolean; +} + +// Fields that passed through the define machinery, per instance. +// The postConstruction comparator (Thunderstruck design) diffs the +// instance's own descriptors against this Set to find fields added +// hiddenly — class fields and other define-semantics writes. +const constructionRecords = new WeakMap(); + +const ensureRecord = (instance: object): ConstructionRecord => { + let record = constructionRecords.get(instance); + if (!record) { + record = { + fields : new Set(), + options : undefined, + finalized : false + }; + constructionRecords.set(instance, record); + } + return record; +}; + const createResolver = (options: TypeomaticaOptions = {}) => { const { strictAccessCheck = false } = options; @@ -58,7 +83,7 @@ const createResolver = (options: TypeomaticaOptions = {}) => { }, {}); }; -const createProperty = (propName: string, initialValue: unknown, receiver: object, options?: TypeomaticaOptions) => { +const createProperty = (propName: string | symbol, initialValue: unknown, receiver: object, options?: TypeomaticaOptions, configurable = false) => { const value = initialValue; const valueIsPrimitive = isPrimitive(initialValue); @@ -84,6 +109,7 @@ const createProperty = (propName: string, initialValue: unknown, receiver: objec const descriptor = (isObject && (value instanceof FieldConstructor)) ? value : { enumerable: true, + configurable, // @ts-ignore ...resolver[types](value, receiver), }; @@ -94,6 +120,11 @@ const createProperty = (propName: string, initialValue: unknown, receiver: objec // } const result = Reflect.defineProperty(receiver, propName, descriptor); + + const record = ensureRecord(receiver); + record.fields.add(propName); + record.options = options; + return result; }; @@ -384,6 +415,88 @@ const FieldConstructorExport = FieldConstructor; export { FieldConstructorExport as FieldConstructor }; export const Strict = strict; +/** + * Fields that certainly passed through the define machinery for this + * instance. Returns a copy of the internal Set — safe for the caller + * to mutate. + */ +export const getConstructedFields = (instance: object): Set => { + const record = constructionRecords.get(instance); + const result = record ? new Set(record.fields) : new Set(); + return result; +}; + +const finaliseFields = (instance: object, names: (string | symbol)[]): void => { + const record = ensureRecord(instance); + names.forEach((name) => { + if (record.fields.has(name)) { + // already passed through the machinery + return; + } + const descriptor = Reflect.getOwnPropertyDescriptor(instance, name); + if (!descriptor || !('value' in descriptor)) { + // nothing hidden under that name, or not a data field + return; + } + delete (instance as Record)[name]; + // finalized fields stay configurable: they are the ones `unwrap` + // is allowed to turn back into plain value properties + createProperty(name, descriptor.value, instance, record.options, true); + }); +}; + +/** + * Auto finalization: every hiddenly-added own field of the instance + * (class fields and other define-semantics writes that bypassed the + * proxy) is deleted and re-established through the define machinery. + * Sets the finalized flag — `true` means auto mode ran. + */ +export const finalize = (instance: object): void => { + const record = ensureRecord(instance); + finaliseFields(instance, Reflect.ownKeys(instance)); + record.finalized = true; +}; + +/** + * Partial finalization: re-establish only the listed fields. + * Does NOT set the finalized flag — that flag means auto mode ran, + * everything else is the user's choice. + */ +export const finalizeBy = (instance: object, fields: (string | symbol)[]): void => { + finaliseFields(instance, fields); +}; + +export const isFinalized = (instance: object): boolean => { + const record = constructionRecords.get(instance); + const result = record ? record.finalized : false; + return result; +}; + +/** + * Turn a guarded field back into a plain value property. + * Allowed only for fields re-established by finalize/finalizeBy — + * they stay configurable by design. Fields guarded since construction + * are non-configurable: that lock is the essential design of the lib. + * Primitives are read back via .valueOf(); objects are placed as-is. + */ +export const unwrap = (instance: object, field: string | symbol): void => { + const descriptor = Reflect.getOwnPropertyDescriptor(instance, field); + if (!descriptor || !descriptor.configurable || typeof descriptor.get !== 'function') { + throw new TypeError(ErrorsNames.FORBIDDEN_UNWRAP); + } + const current = (instance as Record)[field]; + const currentValueOf = (current as { valueOf?: unknown })?.valueOf; + const unwrapped = typeof currentValueOf === 'function' + ? (current as { valueOf: () => unknown }).valueOf() + : current; + Object.defineProperty(instance, field, { + value : unwrapped, + writable : true, + enumerable : true, + configurable : true + }); +}; + /* istanbul ignore next */ function setupCommonJS() { if (typeof module === 'undefined' || typeof module.exports === 'undefined') { @@ -432,6 +545,36 @@ function setupCommonJS() { }, enumerable: true }); + Object.defineProperty(module.exports, 'getConstructedFields', { + get() { + return getConstructedFields; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'finalize', { + get() { + return finalize; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'finalizeBy', { + get() { + return finalizeBy; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'isFinalized', { + get() { + return isFinalized; + }, + enumerable: true + }); + Object.defineProperty(module.exports, 'unwrap', { + get() { + return unwrap; + }, + enumerable: true + }); } setupCommonJS(); diff --git a/test/esm/class-fields.test.ts b/test/esm/class-fields.test.ts new file mode 100644 index 0000000..41856fe --- /dev/null +++ b/test/esm/class-fields.test.ts @@ -0,0 +1,63 @@ +import { describe, it, expect } from 'vitest'; + +import { + BaseClass, + finalize, + finalizeBy, + getConstructedFields, + isFinalized, + unwrap +} from 'typeomatica'; + +// The point of this suite: real class-field syntax. It only tests what it +// claims if the fields are installed with define semantics +// (useDefineForClassFields: true, native since ES2022) — see the local +// tsconfig.json in this directory. The Jest suite compiles class fields to +// constructor assignments instead and simulates the same with +// Object.defineProperty. + +class NativeFields extends BaseClass { + hidden = 42; + declare shown: number; + constructor () { + super(); + this.shown = 1; + } +} + +describe('native class fields (define semantics)', () => { + + it('class field initializers bypass the proxy and stay untracked', () => { + const i = new NativeFields(); + expect(getConstructedFields(i).has('shown')).toBe(true); + expect(getConstructedFields(i).has('hidden')).toBe(false); + expect(i.hidden).toBe(42); // plain own data property + }); + + it('finalize re-guards a native class field and preserves the value', () => { + const i = new NativeFields(); + finalize(i); + expect(isFinalized(i)).toBe(true); + expect(i.hidden.valueOf()).toBe(42); + expect(() => { + // @ts-ignore + i.hidden = 'nope'; + }).toThrow('Type Mismatch'); + }); + + it('finalizeBy partially re-guards; unwrap rolls it back', () => { + const i = new NativeFields(); + finalizeBy(i, ['hidden']); + expect(isFinalized(i)).toBe(false); + expect(() => { + // @ts-ignore + i.hidden = 'nope'; + }).toThrow('Type Mismatch'); + unwrap(i, 'hidden'); + expect(i.hidden).toBe(42); + // @ts-ignore + i.hidden = 'free again'; + expect(i.hidden).toBe('free again'); + }); + +}); diff --git a/test/esm/imports.test.ts b/test/esm/imports.test.ts index b21ab9c..57731a6 100644 --- a/test/esm/imports.test.ts +++ b/test/esm/imports.test.ts @@ -8,6 +8,10 @@ import BasePrototype, { SymbolInitialValue, SymbolTypeomaticaProxyReference, baseTarget, + finalize, + finalizeBy, + getConstructedFields, + isFinalized, TypeomaticaOptions } from 'typeomatica'; @@ -23,6 +27,10 @@ describe('ESM imports', () => { expect(typeof FieldConstructor).toBe('function'); expect(typeof Strict).toBe('function'); expect(typeof baseTarget).toBe('function'); + expect(typeof finalize).toBe('function'); + expect(typeof finalizeBy).toBe('function'); + expect(typeof getConstructedFields).toBe('function'); + expect(typeof isFinalized).toBe('function'); expect(typeof SymbolInitialValue).toBe('symbol'); expect(typeof SymbolTypeomaticaProxyReference).toBe('symbol'); }); diff --git a/test/index.ts b/test/index.ts index da3977c..b29c44c 100644 --- a/test/index.ts +++ b/test/index.ts @@ -11,7 +11,7 @@ const ogp = Object.getPrototypeOf; // go as you want for being meaningfull // or meaningless const BasePrototype = require('..'); -const { BaseClass, FieldConstructor, SymbolInitialValue, Strict, SymbolTypeomaticaProxyReference, baseTarget } = BasePrototype; +const { BaseClass, FieldConstructor, SymbolInitialValue, Strict, SymbolTypeomaticaProxyReference, baseTarget, getConstructedFields, finalize, finalizeBy, isFinalized, unwrap } = BasePrototype; const givenTags = new Map(); let givenTagsInvocations = 0; @@ -1078,3 +1078,164 @@ describe(`check duplications, skipped ${skip}`, () => { } } }); + + +describe('construction fields tracking + finalize (Thunderstruck step 1)', () => { + + // NOTE: ts-jest compiles class fields to constructor assignments + // (useDefineForClassFields: false), so class-field syntax would NOT + // bypass the proxy here. A truly hidden field is established with + // define semantics — exactly what native ES2022 class fields do. + + class TrackedProbe extends BaseClass { + declare shown: number; + declare name: string; + constructor() { + super(); + this.shown = 1; + this.name = 'first'; + } + } + + const addHiddenField = (instance: object, value: unknown) => { + Object.defineProperty(instance, 'hidden', { + value, + writable: true, + enumerable: true, + configurable: true + }); + }; + + test('fields assigned through the proxy are recorded per instance', () => { + const i = new TrackedProbe(); + addHiddenField(i, 42); + const fields = getConstructedFields(i); + expect(fields.has('shown')).toBe(true); + expect(fields.has('name')).toBe(true); + expect(fields.has('hidden')).toBe(false); + }); + + test('getConstructedFields returns a copy; untracked objects give an empty set', () => { + const i = new TrackedProbe(); + const fields = getConstructedFields(i); + fields.add('intruder'); + expect(getConstructedFields(i).has('intruder')).toBe(false); + expect(getConstructedFields({}).size).toBe(0); + }); + + test('finalize re-establishes hidden fields through the machinery', () => { + const i = new TrackedProbe(); + addHiddenField(i, 42); + expect(isFinalized(i)).toBe(false); + + // hidden is a plain own data property: unguarded writes pass + // @ts-ignore + i.hidden = 'anything goes'; + + finalize(i); + expect(isFinalized(i)).toBe(true); + + // the last value is preserved, now read through the primitives guard + // @ts-ignore + expect(i.hidden.valueOf()).toBe('anything goes'); + expect(() => { + // @ts-ignore + i.hidden = 123; + }).toThrow('Type Mismatch'); + + // same-type writes still pass after finalize + // @ts-ignore + i.hidden = 'guarded now'; + // @ts-ignore + expect(i.hidden.valueOf()).toBe('guarded now'); + }); + + test('finalizeBy guards only the listed fields and leaves finalized false', () => { + const i = new TrackedProbe(); + addHiddenField(i, 42); + finalizeBy(i, ['hidden']); + expect(isFinalized(i)).toBe(false); + // @ts-ignore + expect(i.hidden.valueOf()).toBe(42); + expect(() => { + // @ts-ignore + i.hidden = 'nope'; + }).toThrow('Type Mismatch'); + }); + + test('finalizeBy skips unknown names without touching anything', () => { + const i = new TrackedProbe(); + addHiddenField(i, 42); + expect(() => finalizeBy(i, ['nonexistent'])).not.toThrow(); + // still a plain own data property, unproxied read + // @ts-ignore + expect(i.hidden).toBe(42); + }); + + test('finalize leaves untracked own accessors as they are', () => { + const i = new TrackedProbe(); + Object.defineProperty(i, 'manual', { + get() { return 'manual value'; }, + configurable: true + }); + finalize(i); + // @ts-ignore + expect(i.manual).toBe('manual value'); + expect(isFinalized(i)).toBe(true); + }); + + test('isFinalized is false for objects typeomatica never saw', () => { + expect(isFinalized({})).toBe(false); + }); + + test('unwrap turns a finalized primitive field back into a plain value', () => { + const i = new TrackedProbe(); + addHiddenField(i, 42); + finalize(i); + // @ts-ignore + expect(i.hidden.valueOf()).toBe(42); + unwrap(i, 'hidden'); + // @ts-ignore + expect(i.hidden).toBe(42); + // @ts-ignore + i.hidden = 'free again'; + // @ts-ignore + expect(i.hidden).toBe('free again'); + }); + + test('unwrap places an object field as-is', () => { + const i = new TrackedProbe(); + addHiddenField(i, { deep: true }); + finalize(i); + // @ts-ignore + const before = i.hidden; + unwrap(i, 'hidden'); + // @ts-ignore + expect(i.hidden).toBe(before); + // @ts-ignore + expect(i.hidden.deep).toBe(true); + }); + + test('unwrap places a nullish field as-is', () => { + const i = new TrackedProbe(); + addHiddenField(i, null); + finalize(i); + unwrap(i, 'hidden'); + // @ts-ignore + expect(i.hidden).toBe(null); + }); + + test('unwrap refuses fields guarded since construction', () => { + const i = new TrackedProbe(); + finalize(i); + expect(() => unwrap(i, 'shown')).toThrow('Unwrap is allowed only for finalized fields'); + }); + + test('unwrap refuses missing and never-guarded fields', () => { + const i = new TrackedProbe(); + expect(() => unwrap(i, 'nonexistent')).toThrow('Unwrap is allowed only for finalized fields'); + addHiddenField(i, 42); + expect(() => unwrap(i, 'hidden')).toThrow('Unwrap is allowed only for finalized fields'); + }); + +});