@aitos/input 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ export * from './pointer';
2
+ export * from './keyboard';
3
+ export * from './interact';
4
+ import { Atom } from '@aitos/core';
5
+ export declare const allAtoms: Atom[];
package/dist/index.js ADDED
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.allAtoms = void 0;
18
+ __exportStar(require("./pointer"), exports);
19
+ __exportStar(require("./keyboard"), exports);
20
+ __exportStar(require("./interact"), exports);
21
+ const pointer_1 = require("./pointer");
22
+ const keyboard_1 = require("./keyboard");
23
+ const interact_1 = require("./interact");
24
+ exports.allAtoms = [
25
+ pointer_1.getMousePositionAtom,
26
+ pointer_1.getTouchAtom,
27
+ pointer_1.addEventListenerAtom,
28
+ pointer_1.removeEventListenerAtom,
29
+ keyboard_1.getKeyAtom,
30
+ interact_1.showFilePickerAtom,
31
+ interact_1.readFileAtom,
32
+ ];
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDRDQUEwQjtBQUMxQiw2Q0FBMkI7QUFDM0IsNkNBQTJCO0FBRzNCLHVDQUttQjtBQUNuQix5Q0FFb0I7QUFDcEIseUNBR29CO0FBRVAsUUFBQSxRQUFRLEdBQVc7SUFDOUIsOEJBQW9CO0lBQ3BCLHNCQUFZO0lBQ1osOEJBQW9CO0lBQ3BCLGlDQUF1QjtJQUN2QixxQkFBVTtJQUNWLDZCQUFrQjtJQUNsQix1QkFBWTtDQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3BvaW50ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9rZXlib2FyZCc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyYWN0JztcblxuaW1wb3J0IHsgQXRvbSB9IGZyb20gJ0BhaXRvcy9jb3JlJztcbmltcG9ydCB7XG4gIGdldE1vdXNlUG9zaXRpb25BdG9tLFxuICBnZXRUb3VjaEF0b20sXG4gIGFkZEV2ZW50TGlzdGVuZXJBdG9tLFxuICByZW1vdmVFdmVudExpc3RlbmVyQXRvbSxcbn0gZnJvbSAnLi9wb2ludGVyJztcbmltcG9ydCB7XG4gIGdldEtleUF0b20sXG59IGZyb20gJy4va2V5Ym9hcmQnO1xuaW1wb3J0IHtcbiAgc2hvd0ZpbGVQaWNrZXJBdG9tLFxuICByZWFkRmlsZUF0b20sXG59IGZyb20gJy4vaW50ZXJhY3QnO1xuXG5leHBvcnQgY29uc3QgYWxsQXRvbXM6IEF0b21bXSA9IFtcbiAgZ2V0TW91c2VQb3NpdGlvbkF0b20sXG4gIGdldFRvdWNoQXRvbSxcbiAgYWRkRXZlbnRMaXN0ZW5lckF0b20sXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXJBdG9tLFxuICBnZXRLZXlBdG9tLFxuICBzaG93RmlsZVBpY2tlckF0b20sXG4gIHJlYWRGaWxlQXRvbSxcbl07XG4iXX0=
@@ -0,0 +1,3 @@
1
+ import { Atom } from '@aitos/core';
2
+ export declare const showFilePickerAtom: Atom;
3
+ export declare const readFileAtom: Atom;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readFileAtom = exports.showFilePickerAtom = void 0;
4
+ exports.showFilePickerAtom = {
5
+ name: 'showFilePicker',
6
+ version: '1.0.0',
7
+ meta: {
8
+ input: [
9
+ { name: 'accept', type: 'string', description: 'File types to accept (e.g. ".jpg,.png")' },
10
+ { name: 'multiple', type: 'boolean', description: 'Allow multiple file selection' }
11
+ ],
12
+ output: { type: 'object', description: 'Selected file(s) or FileList' }
13
+ },
14
+ characteristics: { stateless: true, atomic: true, composable: true },
15
+ execute: async (input, context) => {
16
+ return new Promise((resolve) => {
17
+ if (typeof document === 'undefined') {
18
+ resolve({ success: false, error: 'File picker not available' });
19
+ return;
20
+ }
21
+ const inputEl = document.createElement('input');
22
+ inputEl.type = 'file';
23
+ if (input.accept)
24
+ inputEl.accept = input.accept;
25
+ if (input.multiple)
26
+ inputEl.multiple = true;
27
+ inputEl.onchange = () => {
28
+ if (inputEl.files && inputEl.files.length > 0) {
29
+ if (input.multiple) {
30
+ resolve({ success: true, data: Array.from(inputEl.files) });
31
+ }
32
+ else {
33
+ resolve({ success: true, data: inputEl.files[0] });
34
+ }
35
+ }
36
+ else {
37
+ resolve({ success: false, error: 'No file selected' });
38
+ }
39
+ };
40
+ inputEl.click();
41
+ });
42
+ },
43
+ };
44
+ exports.readFileAtom = {
45
+ name: 'readFile',
46
+ version: '1.0.0',
47
+ meta: {
48
+ input: [
49
+ { name: 'file', type: 'object', description: 'File object to read' },
50
+ { name: 'encoding', type: 'string', description: 'Encoding type: text, dataURL, arrayBuffer' }
51
+ ],
52
+ output: { type: 'string', description: 'File content' }
53
+ },
54
+ characteristics: { stateless: true, atomic: true, composable: true },
55
+ execute: async (input, context) => {
56
+ return new Promise((resolve) => {
57
+ if (!input.file) {
58
+ resolve({ success: false, error: 'No file provided' });
59
+ return;
60
+ }
61
+ const reader = new FileReader();
62
+ const encoding = input.encoding || 'text';
63
+ reader.onload = () => {
64
+ resolve({ success: true, data: reader.result });
65
+ };
66
+ reader.onerror = () => {
67
+ resolve({ success: false, error: 'Failed to read file' });
68
+ };
69
+ switch (encoding) {
70
+ case 'dataURL':
71
+ reader.readAsDataURL(input.file);
72
+ break;
73
+ case 'arrayBuffer':
74
+ reader.readAsArrayBuffer(input.file);
75
+ break;
76
+ default:
77
+ reader.readAsText(input.file);
78
+ }
79
+ });
80
+ },
81
+ };
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbnRlcmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFYSxRQUFBLGtCQUFrQixHQUFTO0lBQ3RDLElBQUksRUFBRSxnQkFBZ0I7SUFDdEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsSUFBSSxFQUFFO1FBQ0osS0FBSyxFQUFFO1lBQ0wsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLHlDQUF5QyxFQUFFO1lBQzFGLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSwrQkFBK0IsRUFBRTtTQUNwRjtRQUNELE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLDhCQUE4QixFQUFFO0tBQ3hFO0lBQ0QsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7SUFDcEUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUE4QyxFQUFFLE9BQWdCLEVBQW1CLEVBQUU7UUFDbkcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdCLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQ3BDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFLENBQUMsQ0FBQztnQkFDaEUsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELE9BQU8sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO1lBQ3RCLElBQUksS0FBSyxDQUFDLE1BQU07Z0JBQUUsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFD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ckMsTUFBTTtnQkFDUjtvQkFDRSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0b20sIENvbnRleHQsIFJlc3VsdCB9IGZyb20gJ0BhaXRvcy9jb3JlJztcblxuZXhwb3J0IGNvbnN0IHNob3dGaWxlUGlja2VyQXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ3Nob3dGaWxlUGlja2VyJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdhY2NlcHQnLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdGaWxlIHR5cGVzIHRvIGFjY2VwdCAoZS5nLiBcIi5qcGcsLnBuZ1wiKScgfSxcbiAgICAgIHsgbmFtZTogJ211bHRpcGxlJywgdHlwZTogJ2Jvb2xlYW4nLCBkZXNjcmlwdGlvbjogJ0FsbG93IG11bHRpcGxlIGZpbGUgc2VsZWN0aW9uJyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ29iamVjdCcsIGRlc2NyaXB0aW9uOiAnU2VsZWN0ZWQgZmlsZShzKSBvciBGaWxlTGlzdCcgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IGFjY2VwdD86IHN0cmluZzsgbXVsdGlwbGU/OiBib29sZWFuIH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0ZpbGUgcGlja2VyIG5vdCBhdmFpbGFibGUnIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgaW5wdXRFbC50eXBlID0gJ2ZpbGUnO1xuICAgICAgaWYgKGlucHV0LmFjY2VwdCkgaW5wdXRFbC5hY2NlcHQgPSBpbnB1dC5hY2NlcHQ7XG4gICAgICBpZiAoaW5wdXQubXVsdGlwbGUpIGlucHV0RWwubXVsdGlwbGUgPSB0cnVlO1xuXG4gICAgICBpbnB1dEVsLm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICBpZiAoaW5wdXRFbC5maWxlcyAmJiBpbnB1dEVsLmZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAoaW5wdXQubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBBcnJheS5mcm9tKGlucHV0RWwuZmlsZXMpIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogaW5wdXRFbC5maWxlc1swXSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ05vIGZpbGUgc2VsZWN0ZWQnIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpbnB1dEVsLmNsaWNrKCk7XG4gICAgfSk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgcmVhZEZpbGVBdG9tOiBBdG9tID0ge1xuICBuYW1lOiAncmVhZEZpbGUnLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2ZpbGUnLCB0eXBlOiAnb2JqZWN0JywgZGVzY3JpcHRpb246ICdGaWxlIG9iamVjdCB0byByZWFkJyB9LFxuICAgICAgeyBuYW1lOiAnZW5jb2RpbmcnLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdFbmNvZGluZyB0eXBlOiB0ZXh0LCBkYXRhVVJMLCBhcnJheUJ1ZmZlcicgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ0ZpbGUgY29udGVudCcgfVxuICB9LFxuICBjaGFyYWN0ZXJpc3RpY3M6IHsgc3RhdGVsZXNzOiB0cnVlLCBhdG9taWM6IHRydWUsIGNvbXBvc2FibGU6IHRydWUgfSxcbiAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB7IGZpbGU6IEZpbGU7IGVuY29kaW5nPzogc3RyaW5nIH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKCFpbnB1dC5maWxlKSB7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdObyBmaWxlIHByb3ZpZGVkJyB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgY29uc3QgZW5jb2RpbmcgPSBpbnB1dC5lbmNvZGluZyB8fCAndGV4dCc7XG5cbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlLCBkYXRhOiByZWFkZXIucmVzdWx0IH0pO1xuICAgICAgfTtcblxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdGYWlsZWQgdG8gcmVhZCBmaWxlJyB9KTtcbiAgICAgIH07XG5cbiAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgY2FzZSAnZGF0YVVSTCc6XG4gICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoaW5wdXQuZmlsZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FycmF5QnVmZmVyJzpcbiAgICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoaW5wdXQuZmlsZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoaW5wdXQuZmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG59O1xuIl19
@@ -0,0 +1,2 @@
1
+ import { Atom } from '@aitos/core';
2
+ export declare const getKeyAtom: Atom;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getKeyAtom = void 0;
4
+ const keyState = new Map();
5
+ function initKeyListener() {
6
+ if (typeof window !== 'undefined' && !(window.__aitosKeyListenerAdded)) {
7
+ window.addEventListener('keydown', (e) => {
8
+ keyState.set(e.key, true);
9
+ });
10
+ window.addEventListener('keyup', (e) => {
11
+ keyState.set(e.key, false);
12
+ });
13
+ window.__aitosKeyListenerAdded = true;
14
+ }
15
+ }
16
+ initKeyListener();
17
+ exports.getKeyAtom = {
18
+ name: 'getKey',
19
+ version: '1.0.0',
20
+ meta: {
21
+ input: [
22
+ { name: 'key', type: 'string', description: 'Key name (e.g. "ArrowUp", "a", "Enter", "Space")' }
23
+ ],
24
+ output: { type: 'boolean', description: 'true if key is currently pressed' }
25
+ },
26
+ characteristics: { stateless: true, atomic: true, composable: true },
27
+ execute: async (input, context) => {
28
+ const pressed = keyState.get(input.key) ?? false;
29
+ return { success: true, data: pressed };
30
+ },
31
+ };
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Ym9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9rZXlib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztBQUU1QyxTQUFTLGVBQWU7SUFDdEIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxDQUFFLE1BQWMsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7UUFDaEYsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNyQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDRixNQUFjLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0lBQ2pELENBQUM7QUFDSCxDQUFDO0FBRUQsZUFBZSxFQUFFLENBQUM7QUFFTCxRQUFBLFVBQVUsR0FBUztJQUM5QixJQUFJLEVBQUUsUUFBUTtJQUNkLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLElBQUksRUFBRTtRQUNKLEtBQUssRUFBRTtZQUNMLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxrREFBa0QsRUFBRTtTQUNqRztRQUNELE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLGtDQUFrQyxFQUFFO0tBQzdFO0lBQ0QsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7SUFDcEUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFzQixFQUFFLE9BQWdCLEVBQW1CLEVBQUU7UUFDM0UsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDO1FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0b20sIENvbnRleHQsIFJlc3VsdCB9IGZyb20gJ0BhaXRvcy9jb3JlJztcblxuY29uc3Qga2V5U3RhdGUgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcblxuZnVuY3Rpb24gaW5pdEtleUxpc3RlbmVyKCk6IHZvaWQge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgISgod2luZG93IGFzIGFueSkuX19haXRvc0tleUxpc3RlbmVyQWRkZWQpKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAga2V5U3RhdGUuc2V0KGUua2V5LCB0cnVlKTtcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZSkgPT4ge1xuICAgICAga2V5U3RhdGUuc2V0KGUua2V5LCBmYWxzZSk7XG4gICAgfSk7XG4gICAgKHdpbmRvdyBhcyBhbnkpLl9fYWl0b3NLZXlMaXN0ZW5lckFkZGVkID0gdHJ1ZTtcbiAgfVxufVxuXG5pbml0S2V5TGlzdGVuZXIoKTtcblxuZXhwb3J0IGNvbnN0IGdldEtleUF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdnZXRLZXknLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2tleScsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ0tleSBuYW1lIChlLmcuIFwiQXJyb3dVcFwiLCBcImFcIiwgXCJFbnRlclwiLCBcIlNwYWNlXCIpJyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ2Jvb2xlYW4nLCBkZXNjcmlwdGlvbjogJ3RydWUgaWYga2V5IGlzIGN1cnJlbnRseSBwcmVzc2VkJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsga2V5OiBzdHJpbmcgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgY29uc3QgcHJlc3NlZCA9IGtleVN0YXRlLmdldChpbnB1dC5rZXkpID8/IGZhbHNlO1xuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHByZXNzZWQgfTtcbiAgfSxcbn07XG4iXX0=
@@ -0,0 +1,5 @@
1
+ import { Atom } from '@aitos/core';
2
+ export declare const getMousePositionAtom: Atom;
3
+ export declare const getTouchAtom: Atom;
4
+ export declare const addEventListenerAtom: Atom;
5
+ export declare const removeEventListenerAtom: Atom;
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.removeEventListenerAtom = exports.addEventListenerAtom = exports.getTouchAtom = exports.getMousePositionAtom = void 0;
4
+ exports.getMousePositionAtom = {
5
+ name: 'getMousePosition',
6
+ version: '1.0.0',
7
+ meta: {
8
+ input: [
9
+ { name: 'id', type: 'string', description: 'Element ID to track mouse position' },
10
+ { name: 'xKey', type: 'string', description: 'Store key for X coordinate' },
11
+ { name: 'yKey', type: 'string', description: 'Store key for Y coordinate' }
12
+ ],
13
+ output: { type: 'void', description: 'Nothing' }
14
+ },
15
+ characteristics: { stateless: true, atomic: true, composable: true },
16
+ execute: async (input, context) => {
17
+ if (typeof document === 'undefined') {
18
+ return { success: false, error: 'Mouse position requires browser environment' };
19
+ }
20
+ const el = document.getElementById(input.id);
21
+ if (!el) {
22
+ return { success: false, error: `Element "${input.id}" not found` };
23
+ }
24
+ const handler = (event) => {
25
+ const rect = el.getBoundingClientRect();
26
+ context.store.set(input.xKey, event.clientX - rect.left);
27
+ context.store.set(input.yKey, event.clientY - rect.top);
28
+ };
29
+ el.addEventListener('mousemove', handler);
30
+ return { success: true, data: { done: true } };
31
+ },
32
+ };
33
+ exports.getTouchAtom = {
34
+ name: 'getTouch',
35
+ version: '1.0.0',
36
+ meta: {
37
+ input: [
38
+ { name: 'id', type: 'string', description: 'Element ID to listen for touches' },
39
+ { name: 'xKey', type: 'string', description: 'Store key for X coordinate' },
40
+ { name: 'yKey', type: 'string', description: 'Store key for Y coordinate' }
41
+ ],
42
+ output: { type: 'void', description: 'Nothing' }
43
+ },
44
+ characteristics: { stateless: true, atomic: true, composable: true },
45
+ execute: async (input, context) => {
46
+ if (typeof document === 'undefined') {
47
+ return { success: false, error: 'Touch requires browser environment' };
48
+ }
49
+ const el = document.getElementById(input.id);
50
+ if (!el) {
51
+ return { success: false, error: `Element "${input.id}" not found` };
52
+ }
53
+ const handler = (event) => {
54
+ const touch = event.touches[0];
55
+ const rect = el.getBoundingClientRect();
56
+ context.store.set(input.xKey, touch.clientX - rect.left);
57
+ context.store.set(input.yKey, touch.clientY - rect.top);
58
+ };
59
+ el.addEventListener('touchstart', handler);
60
+ el.addEventListener('touchmove', handler);
61
+ return { success: true, data: { done: true } };
62
+ },
63
+ };
64
+ exports.addEventListenerAtom = {
65
+ name: 'addEventListener',
66
+ version: '1.0.0',
67
+ meta: {
68
+ input: [
69
+ { name: 'id', type: 'string', description: 'Element ID or "window" or "document"' },
70
+ { name: 'event', type: 'string', description: 'Event type (e.g., "click", "resize", "input")' },
71
+ { name: 'storeKey', type: 'string', description: 'Key to store event data in context store' },
72
+ { name: 'action', type: 'string', description: 'Optional graph file to execute when event fires' },
73
+ { name: 'preventDefault', type: 'boolean', description: 'Whether to call e.preventDefault() before executing action' }
74
+ ],
75
+ output: { type: 'void', description: 'Nothing' }
76
+ },
77
+ characteristics: { stateless: true, atomic: true, composable: true },
78
+ execute: async (input, context) => {
79
+ if (typeof document === 'undefined') {
80
+ return { success: false, error: 'addEventListener requires browser environment' };
81
+ }
82
+ const listenerKey = `__listener_${input.id}_${input.event}`;
83
+ const existingListener = context.store.get(listenerKey);
84
+ if (existingListener) {
85
+ const currentTarget = input.id === 'window' ? window : input.id === 'document' ? document : document.getElementById(input.id);
86
+ if (existingListener.target === currentTarget) {
87
+ return { success: true, data: null };
88
+ }
89
+ existingListener.target.removeEventListener(input.event, existingListener.handler);
90
+ context.store.delete(listenerKey);
91
+ }
92
+ let target = null;
93
+ if (input.id === 'window') {
94
+ target = window;
95
+ }
96
+ else if (input.id === 'document') {
97
+ target = document;
98
+ }
99
+ else {
100
+ target = document.getElementById(input.id);
101
+ }
102
+ if (!target) {
103
+ return { success: false, error: `Target "${input.id}" not found` };
104
+ }
105
+ const handler = async (e) => {
106
+ const eventData = { type: e.type };
107
+ if (e instanceof MouseEvent) {
108
+ eventData.x = e.clientX;
109
+ eventData.y = e.clientY;
110
+ eventData.button = e.button;
111
+ }
112
+ else if (e instanceof KeyboardEvent) {
113
+ eventData.key = e.key;
114
+ eventData.code = e.code;
115
+ eventData.shiftKey = e.shiftKey;
116
+ eventData.ctrlKey = e.ctrlKey;
117
+ eventData.altKey = e.altKey;
118
+ if (input.action && input.preventDefault && e.key === 'Enter') {
119
+ e.preventDefault();
120
+ }
121
+ }
122
+ else if (e instanceof Event && e.target?.value !== undefined) {
123
+ eventData.value = e.target.value;
124
+ }
125
+ if (e.target) {
126
+ let targetEl = e.target;
127
+ while (targetEl && targetEl !== document.body) {
128
+ if (targetEl.id) {
129
+ eventData.targetId = targetEl.id;
130
+ break;
131
+ }
132
+ targetEl = targetEl.parentElement;
133
+ }
134
+ }
135
+ if (e.target && e.target.dataset) {
136
+ eventData.targetData = e.target.dataset;
137
+ }
138
+ context.store.set(input.storeKey, eventData);
139
+ if (input.action && context.executeGraph) {
140
+ const graph = context.store.get(`__graph_${input.action}`);
141
+ if (graph) {
142
+ await context.executeGraph(graph);
143
+ }
144
+ }
145
+ };
146
+ target.addEventListener(input.event, handler);
147
+ context.store.set(listenerKey, { handler, target });
148
+ return { success: true, data: null };
149
+ },
150
+ };
151
+ exports.removeEventListenerAtom = {
152
+ name: 'removeEventListener',
153
+ version: '1.0.0',
154
+ meta: {
155
+ input: [
156
+ { name: 'id', type: 'string', description: 'Element ID or "window" or "document"' },
157
+ { name: 'event', type: 'string', description: 'Event type' }
158
+ ],
159
+ output: { type: 'void', description: 'Nothing' }
160
+ },
161
+ characteristics: { stateless: true, atomic: true, composable: true },
162
+ execute: async (input, context) => {
163
+ if (typeof document === 'undefined') {
164
+ return { success: false, error: 'removeEventListener requires browser environment' };
165
+ }
166
+ const listenerKey = `__listener_${input.id}_${input.event}`;
167
+ const listenerData = context.store.get(listenerKey);
168
+ if (listenerData) {
169
+ const { handler, target } = listenerData;
170
+ target.removeEventListener(input.event, handler);
171
+ context.store.delete(listenerKey);
172
+ }
173
+ return { success: true, data: null };
174
+ },
175
+ };
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3BvaW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSxvQkFBb0IsR0FBUztJQUN4QyxJQUFJLEVBQUUsa0JBQWtCO0lBQ3hCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLElBQUksRUFBRTtRQUNKLEtBQUssRUFBRTtZQUNMLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxvQ0FBb0MsRUFBRTtZQUNqRixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsNEJBQTRCLEVBQUU7WUFDM0UsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLDRCQUE0QixFQUFFO1NBQzVFO1FBQ0QsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFO0tBQ2pEO0lBQ0QsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7SUFDcEUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFpRCxFQUFFLE9BQWdCLEVBQW1CLEVBQUU7UUFDdEcsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsNkNBQTZDLEVBQUUsQ0FBQztRQUNsRixDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFlBQVksS0FBSyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDdEUsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBaUIsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekQsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUM7UUFFRixFQUFFLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQ2pELENBQUM7Q0FDRixDQUFDO0FBRVcsUUFBQSxZQUFZLEdBQVM7SUFDaEMsSUFBSSxFQUFFLFVBQVU7SUFDaEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsSUFBSSxFQUFFO1FBQ0osS0FBSyxFQUFFO1lBQ0wsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGtDQUFrQyxFQUFFO1lBQy9FLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSw0QkFBNEIsRUFBRTtZQUMzRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsNEJBQTRCLEVBQUU7U0FDNUU7UUFDRCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUU7S0FDakQ7SUFDRCxlQUFlLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtJQUNwRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQWlELEVBQUUsT0FBZ0IsRUFBbUIsRUFBRTtRQUN0RyxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3BDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxvQ0FBb0MsRUFBRSxDQUFDO1FBQ3pFLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxLQUFLLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUN0RSxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7WUFDcEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN4QyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pELE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDO1FBRUYsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQ2pELENBQUM7Q0FDRixDQUFDO0FBRVcsUUFBQSxvQkFBb0IsR0FBUztJQUN4QyxJQUFJLEVBQUUsa0JBQWtCO0lBQ3hCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLElBQUksRUFBRTtRQUNKLEtBQUssRUFBRTtZQUNMLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxzQ0FBc0MsRUFBRTtZQUNuRixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsK0NBQStDLEVBQUU7WUFDL0YsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLDBDQUEwQyxFQUFFO1lBQzdGLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxpREFBaUQsRUFBRTtZQUNsRyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSw0REFBNEQsRUFBRTtTQUN2SDtRQUNELE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRTtLQUNqRDtJQUNELGVBQWUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO0lBQ3BFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBaUcsRUFBRSxPQUFnQixFQUFtQixFQUFFO1FBQ3RKLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLCtDQUErQyxFQUFFLENBQUM7UUFDcEYsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLGNBQWMsS0FBSyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RCxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUgsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQzlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkYsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVELElBQUksTUFBTSxHQUF1QixJQUFJLENBQUM7UUFDdEMsSUFBSSxLQUFLLENBQUMsRUFBRSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFCLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDbEIsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxLQUFLLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUNyRSxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLENBQVEsRUFBRSxFQUFFO1lBQ2pDLE1BQU0sU0FBUyxHQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUV4QyxJQUFJLENBQUMsWUFBWSxVQUFVLEVBQUUsQ0FBQztnQkFDNUIsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUN4QixTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3hCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUM5QixDQUFDO2lCQUFNLElBQUksQ0FBQyxZQUFZLGFBQWEsRUFBRSxDQUFDO2dCQUN0QyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3RCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDeEIsU0FBUyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUNoQyxTQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQzlCLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDNUIsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUUsQ0FBQztvQkFDOUQsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNyQixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUssQ0FBQyxDQUFDLE1BQWMsRUFBRSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hFLFNBQVMsQ0FBQyxLQUFLLEdBQUksQ0FBQyxDQUFDLE1BQWMsQ0FBQyxLQUFLLENBQUM7WUFDNUMsQ0FBQztZQUVELElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNiLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFxQixDQUFDO2dCQUN2QyxPQUFPLFFBQVEsSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUM5QyxJQUFLLFFBQWdCLENBQUMsRUFBRSxFQUFFLENBQUM7d0JBQ3pCLFNBQVMsQ0FBQyxRQUFRLEdBQUksUUFBZ0IsQ0FBQyxFQUFFLENBQUM7d0JBQzFDLE1BQU07b0JBQ1IsQ0FBQztvQkFDRCxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQTRCLENBQUM7Z0JBQ25ELENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFLLENBQUMsQ0FBQyxNQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzFDLFNBQVMsQ0FBQyxVQUFVLEdBQUksQ0FBQyxDQUFDLE1BQWMsQ0FBQyxPQUFPLENBQUM7WUFDbkQsQ0FBQztZQUVELE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFN0MsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDVixNQUFNLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7Q0FDRixDQUFDO0FBRVcsUUFBQSx1QkFBdUIsR0FBUztJQUMzQyxJQUFJLEVBQUUscUJBQXFCO0lBQzNCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLElBQUksRUFBRTtRQUNKLEtBQUssRUFBRTtZQUNMLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxzQ0FBc0MsRUFBRTtZQUNuRixFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFO1NBQzdEO1FBQ0QsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFO0tBQ2pEO0lBQ0QsZUFBZSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7SUFDcEUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFvQyxFQUFFLE9BQWdCLEVBQW1CLEVBQUU7UUFDekYsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsa0RBQWtELEVBQUUsQ0FBQztRQUN2RixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsY0FBYyxLQUFLLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM1RCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVwRCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDdkMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdG9tLCBDb250ZXh0LCBSZXN1bHQgfSBmcm9tICdAYWl0b3MvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBnZXRNb3VzZVBvc2l0aW9uQXRvbTogQXRvbSA9IHtcbiAgbmFtZTogJ2dldE1vdXNlUG9zaXRpb24nLFxuICB2ZXJzaW9uOiAnMS4wLjAnLFxuICBtZXRhOiB7XG4gICAgaW5wdXQ6IFtcbiAgICAgIHsgbmFtZTogJ2lkJywgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnRWxlbWVudCBJRCB0byB0cmFjayBtb3VzZSBwb3NpdGlvbicgfSxcbiAgICAgIHsgbmFtZTogJ3hLZXknLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdTdG9yZSBrZXkgZm9yIFggY29vcmRpbmF0ZScgfSxcbiAgICAgIHsgbmFtZTogJ3lLZXknLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdTdG9yZSBrZXkgZm9yIFkgY29vcmRpbmF0ZScgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICd2b2lkJywgZGVzY3JpcHRpb246ICdOb3RoaW5nJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgaWQ6IHN0cmluZzsgeEtleTogc3RyaW5nOyB5S2V5OiBzdHJpbmcgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ01vdXNlIHBvc2l0aW9uIHJlcXVpcmVzIGJyb3dzZXIgZW52aXJvbm1lbnQnIH07XG4gICAgfVxuXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbnB1dC5pZCk7XG4gICAgaWYgKCFlbCkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBgRWxlbWVudCBcIiR7aW5wdXQuaWR9XCIgbm90IGZvdW5kYCB9O1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnRleHQuc3RvcmUuc2V0KGlucHV0LnhLZXksIGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQpO1xuICAgICAgY29udGV4dC5zdG9yZS5zZXQoaW5wdXQueUtleSwgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKTtcbiAgICB9O1xuXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlcik7XG4gICAgXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogeyBkb25lOiB0cnVlIH0gfTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUb3VjaEF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdnZXRUb3VjaCcsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAnaWQnLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdFbGVtZW50IElEIHRvIGxpc3RlbiBmb3IgdG91Y2hlcycgfSxcbiAgICAgIHsgbmFtZTogJ3hLZXknLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdTdG9yZSBrZXkgZm9yIFggY29vcmRpbmF0ZScgfSxcbiAgICAgIHsgbmFtZTogJ3lLZXknLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdTdG9yZSBrZXkgZm9yIFkgY29vcmRpbmF0ZScgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICd2b2lkJywgZGVzY3JpcHRpb246ICdOb3RoaW5nJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgaWQ6IHN0cmluZzsgeEtleTogc3RyaW5nOyB5S2V5OiBzdHJpbmcgfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1RvdWNoIHJlcXVpcmVzIGJyb3dzZXIgZW52aXJvbm1lbnQnIH07XG4gICAgfVxuXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbnB1dC5pZCk7XG4gICAgaWYgKCFlbCkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBgRWxlbWVudCBcIiR7aW5wdXQuaWR9XCIgbm90IGZvdW5kYCB9O1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQ6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHRvdWNoID0gZXZlbnQudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnRleHQuc3RvcmUuc2V0KGlucHV0LnhLZXksIHRvdWNoLmNsaWVudFggLSByZWN0LmxlZnQpO1xuICAgICAgY29udGV4dC5zdG9yZS5zZXQoaW5wdXQueUtleSwgdG91Y2guY2xpZW50WSAtIHJlY3QudG9wKTtcbiAgICB9O1xuXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGhhbmRsZXIpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZXIpO1xuICAgIFxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHsgZG9uZTogdHJ1ZSB9IH07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgYWRkRXZlbnRMaXN0ZW5lckF0b206IEF0b20gPSB7XG4gIG5hbWU6ICdhZGRFdmVudExpc3RlbmVyJyxcbiAgdmVyc2lvbjogJzEuMC4wJyxcbiAgbWV0YToge1xuICAgIGlucHV0OiBbXG4gICAgICB7IG5hbWU6ICdpZCcsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ0VsZW1lbnQgSUQgb3IgXCJ3aW5kb3dcIiBvciBcImRvY3VtZW50XCInIH0sXG4gICAgICB7IG5hbWU6ICdldmVudCcsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ0V2ZW50IHR5cGUgKGUuZy4sIFwiY2xpY2tcIiwgXCJyZXNpemVcIiwgXCJpbnB1dFwiKScgfSxcbiAgICAgIHsgbmFtZTogJ3N0b3JlS2V5JywgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnS2V5IHRvIHN0b3JlIGV2ZW50IGRhdGEgaW4gY29udGV4dCBzdG9yZScgfSxcbiAgICAgIHsgbmFtZTogJ2FjdGlvbicsIHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ09wdGlvbmFsIGdyYXBoIGZpbGUgdG8gZXhlY3V0ZSB3aGVuIGV2ZW50IGZpcmVzJyB9LFxuICAgICAgeyBuYW1lOiAncHJldmVudERlZmF1bHQnLCB0eXBlOiAnYm9vbGVhbicsIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBjYWxsIGUucHJldmVudERlZmF1bHQoKSBiZWZvcmUgZXhlY3V0aW5nIGFjdGlvbicgfVxuICAgIF0sXG4gICAgb3V0cHV0OiB7IHR5cGU6ICd2b2lkJywgZGVzY3JpcHRpb246ICdOb3RoaW5nJyB9XG4gIH0sXG4gIGNoYXJhY3RlcmlzdGljczogeyBzdGF0ZWxlc3M6IHRydWUsIGF0b21pYzogdHJ1ZSwgY29tcG9zYWJsZTogdHJ1ZSB9LFxuICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHsgaWQ6IHN0cmluZzsgZXZlbnQ6IHN0cmluZzsgc3RvcmVLZXk6IHN0cmluZzsgYWN0aW9uPzogc3RyaW5nOyBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW4gfSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8UmVzdWx0PiA9PiB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ2FkZEV2ZW50TGlzdGVuZXIgcmVxdWlyZXMgYnJvd3NlciBlbnZpcm9ubWVudCcgfTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ZW5lcktleSA9IGBfX2xpc3RlbmVyXyR7aW5wdXQuaWR9XyR7aW5wdXQuZXZlbnR9YDtcbiAgICBjb25zdCBleGlzdGluZ0xpc3RlbmVyID0gY29udGV4dC5zdG9yZS5nZXQobGlzdGVuZXJLZXkpO1xuICAgIGlmIChleGlzdGluZ0xpc3RlbmVyKSB7XG4gICAgICBjb25zdCBjdXJyZW50VGFyZ2V0ID0gaW5wdXQuaWQgPT09ICd3aW5kb3cnID8gd2luZG93IDogaW5wdXQuaWQgPT09ICdkb2N1bWVudCcgPyBkb2N1bWVudCA6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0LmlkKTtcbiAgICAgIGlmIChleGlzdGluZ0xpc3RlbmVyLnRhcmdldCA9PT0gY3VycmVudFRhcmdldCkge1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBudWxsIH07XG4gICAgICB9XG4gICAgICBleGlzdGluZ0xpc3RlbmVyLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGlucHV0LmV2ZW50LCBleGlzdGluZ0xpc3RlbmVyLmhhbmRsZXIpO1xuICAgICAgY29udGV4dC5zdG9yZS5kZWxldGUobGlzdGVuZXJLZXkpO1xuICAgIH1cblxuICAgIGxldCB0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGlucHV0LmlkID09PSAnd2luZG93Jykge1xuICAgICAgdGFyZ2V0ID0gd2luZG93O1xuICAgIH0gZWxzZSBpZiAoaW5wdXQuaWQgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHRhcmdldCA9IGRvY3VtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbnB1dC5pZCk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogYFRhcmdldCBcIiR7aW5wdXQuaWR9XCIgbm90IGZvdW5kYCB9O1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50RGF0YTogYW55ID0geyB0eXBlOiBlLnR5cGUgfTtcbiAgICAgIFxuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGV2ZW50RGF0YS54ID0gZS5jbGllbnRYO1xuICAgICAgICBldmVudERhdGEueSA9IGUuY2xpZW50WTtcbiAgICAgICAgZXZlbnREYXRhLmJ1dHRvbiA9IGUuYnV0dG9uO1xuICAgICAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudERhdGEua2V5ID0gZS5rZXk7XG4gICAgICAgIGV2ZW50RGF0YS5jb2RlID0gZS5jb2RlO1xuICAgICAgICBldmVudERhdGEuc2hpZnRLZXkgPSBlLnNoaWZ0S2V5O1xuICAgICAgICBldmVudERhdGEuY3RybEtleSA9IGUuY3RybEtleTtcbiAgICAgICAgZXZlbnREYXRhLmFsdEtleSA9IGUuYWx0S2V5O1xuICAgICAgICBpZiAoaW5wdXQuYWN0aW9uICYmIGlucHV0LnByZXZlbnREZWZhdWx0ICYmIGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBFdmVudCAmJiAoZS50YXJnZXQgYXMgYW55KT8udmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBldmVudERhdGEudmFsdWUgPSAoZS50YXJnZXQgYXMgYW55KS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGUudGFyZ2V0KSB7XG4gICAgICAgIGxldCB0YXJnZXRFbCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB3aGlsZSAodGFyZ2V0RWwgJiYgdGFyZ2V0RWwgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgICBpZiAoKHRhcmdldEVsIGFzIGFueSkuaWQpIHtcbiAgICAgICAgICAgIGV2ZW50RGF0YS50YXJnZXRJZCA9ICh0YXJnZXRFbCBhcyBhbnkpLmlkO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRhcmdldEVsID0gdGFyZ2V0RWwucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZS50YXJnZXQgJiYgKGUudGFyZ2V0IGFzIGFueSkuZGF0YXNldCkge1xuICAgICAgICBldmVudERhdGEudGFyZ2V0RGF0YSA9IChlLnRhcmdldCBhcyBhbnkpLmRhdGFzZXQ7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnRleHQuc3RvcmUuc2V0KGlucHV0LnN0b3JlS2V5LCBldmVudERhdGEpO1xuICAgICAgXG4gICAgICBpZiAoaW5wdXQuYWN0aW9uICYmIGNvbnRleHQuZXhlY3V0ZUdyYXBoKSB7XG4gICAgICAgIGNvbnN0IGdyYXBoID0gY29udGV4dC5zdG9yZS5nZXQoYF9fZ3JhcGhfJHtpbnB1dC5hY3Rpb259YCk7XG4gICAgICAgIGlmIChncmFwaCkge1xuICAgICAgICAgIGF3YWl0IGNvbnRleHQuZXhlY3V0ZUdyYXBoKGdyYXBoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihpbnB1dC5ldmVudCwgaGFuZGxlcik7XG4gICAgY29udGV4dC5zdG9yZS5zZXQobGlzdGVuZXJLZXksIHsgaGFuZGxlciwgdGFyZ2V0IH0pO1xuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogbnVsbCB9O1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJBdG9tOiBBdG9tID0ge1xuICBuYW1lOiAncmVtb3ZlRXZlbnRMaXN0ZW5lcicsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIG1ldGE6IHtcbiAgICBpbnB1dDogW1xuICAgICAgeyBuYW1lOiAnaWQnLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdFbGVtZW50IElEIG9yIFwid2luZG93XCIgb3IgXCJkb2N1bWVudFwiJyB9LFxuICAgICAgeyBuYW1lOiAnZXZlbnQnLCB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdFdmVudCB0eXBlJyB9XG4gICAgXSxcbiAgICBvdXRwdXQ6IHsgdHlwZTogJ3ZvaWQnLCBkZXNjcmlwdGlvbjogJ05vdGhpbmcnIH1cbiAgfSxcbiAgY2hhcmFjdGVyaXN0aWNzOiB7IHN0YXRlbGVzczogdHJ1ZSwgYXRvbWljOiB0cnVlLCBjb21wb3NhYmxlOiB0cnVlIH0sXG4gIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogeyBpZDogc3RyaW5nOyBldmVudDogc3RyaW5nIH0sIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdyZW1vdmVFdmVudExpc3RlbmVyIHJlcXVpcmVzIGJyb3dzZXIgZW52aXJvbm1lbnQnIH07XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdGVuZXJLZXkgPSBgX19saXN0ZW5lcl8ke2lucHV0LmlkfV8ke2lucHV0LmV2ZW50fWA7XG4gICAgY29uc3QgbGlzdGVuZXJEYXRhID0gY29udGV4dC5zdG9yZS5nZXQobGlzdGVuZXJLZXkpO1xuXG4gICAgaWYgKGxpc3RlbmVyRGF0YSkge1xuICAgICAgY29uc3QgeyBoYW5kbGVyLCB0YXJnZXQgfSA9IGxpc3RlbmVyRGF0YTtcbiAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGlucHV0LmV2ZW50LCBoYW5kbGVyKTtcbiAgICAgIGNvbnRleHQuc3RvcmUuZGVsZXRlKGxpc3RlbmVyS2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBudWxsIH07XG4gIH0sXG59O1xuIl19
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@aitos/input",
3
+ "version": "1.0.0",
4
+ "description": "AITOS Input Capability Package - Keyboard, Pointer, and Voice input atoms",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "tsc --watch"
10
+ },
11
+ "keywords": [
12
+ "aitos",
13
+ "input",
14
+ "keyboard",
15
+ "pointer",
16
+ "voice",
17
+ "capability"
18
+ ],
19
+ "author": "AITOS Team",
20
+ "license": "MIT",
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "peerDependencies": {
25
+ "@aitos/core": "^1.0.0"
26
+ },
27
+ "devDependencies": {
28
+ "@aitos/core": "file:../../../aitos",
29
+ "@types/node": "^20.0.0",
30
+ "typescript": "^5.9.3"
31
+ }
32
+ }