이 문서에서는 호환되는 Windows 11 호스트에 연결하는 촉각 펜 디바이스에 대한 프로토콜 구현에 대해 자세히 설명합니다. 여기에는 펜 트랜스듀서 내에서 촉각 응답을 생성하기 위한 기계적 제약 조건, 전기 제약 조건 또는 구성 요소 선택에 대한 지침이 포함되지 않습니다. 이 구현 지침은 펜 트랜스듀서와 펜 디지타이저 간에 사용되는 펜 프로토콜과 관련이 없습니다. 그러나 구현에서는 펜 디지타이저가 촉각 응답을 변조하기 위해 펜 트랜스듀서에 추가 매개 변수를 제공할 수 있도록 하는 업링크 기능이 있는 펜 프로토콜을 사용하도록 선택할 수 있습니다.
디바이스 클래스
촉각 펜은 Windows 펜 장치 클래스의 확장입니다. 이 구현 가이드는 펜 구현 가이드 에 추가하고 펜 트랜스듀서 내에서 촉각을 구현하는 데 중점을 두므로 촉각 펜은 여기에 포함된 것 외에도 펜 구현 가이드 의 요구 사항을 충족해야 합니다.
디바이스 버스 연결
촉각 펜은 Microsoft에서 제공하는 기본 드라이버를 사용하여 Bluetooth를 통해 HID로 Windows 호스트에 연결해야 합니다.
촉각 펜 프로토콜 구현
여기에 제시된 정보를 이해할 수 있도록 HID 프로토콜을 잘 이해해야 합니다. HID 프로토콜에 대한 자세한 내용은 다음 리소스를 참조하세요.
Windows HID 클래스 드라이버와 해당 HID Bluetooth 지원 미니포트 드라이버를 포함하므로 타사 미니 포트 드라이버가 필요하지 않습니다. 촉각 펜 디바이스 펌웨어는 이 항목에 설명된 사용량만 보고하면 됩니다. Windows 펌웨어 및 자체 HID 드라이버를 사용하여 디바이스를 사용하도록 설정하고 Windows 애플리케이션에 디바이스에 대한 액세스 권한을 부여합니다.
샘플 설명자는 아래의 샘플 보고서 설명자 섹션에 제공됩니다.
필수 최상위 HID 컬렉션
촉각 펜 디바이스는 디바이스가 디지타이저/스타일러스(Page 0x0D, Usage 0x20)로 표시되는 최상위 컬렉션을 제공하는 방식으로 Windows 11 시스템에서 HID 프로토콜을 사용해야 합니다.
펜 디지타이저 입력 보고서
펜 디지타이저 컬렉션은 OS에 보고된 입력 보고서에서 트랜스듀서 일련 번호 및 트랜스듀서 공급업체 ID로 구성된 스타일러스 식별자를 보고해야 합니다. 스타일러스 컬렉션을 통해 동일한 스타일러스 식별자를 보고해야 합니다. 이를 통해 OS는 디지타이저에서 생성된 펜 입력과 스타일러스의 상관 관계를 지정할 수 있습니다. 펜 구현 가이드에 대한 자세한 내용은 펜 프로토콜 구현에서 확인할 수 있습니다.
변환기 일련 번호
Transducer 일련 번호는 펜 디지타이저와 통신하는 펜 액세서리에 사용되는 트랜스듀서에 대한 고유한 영구 식별자입니다. 이는 32비트여야 하며, 변환기 공급업체 ID로 식별되는 공급업체 또는 엔터티에 의해 정의됩니다. 펜 액세서리가 이 값 전송을 지원하지 않거나 전송이 완전히 수신되지 않았기 때문에 트랜스듀서 일련 번호를 디지타이저에 알 수 없는 경우 디지타이저는 호스트에 0을 보고해야 합니다. Null 위치는 호스트에서 지원되지 않습니다.
트랜스듀서 일련 번호 - 2부
Transducer 일련 번호 – 2부에서는 펜 액세서리에 사용되는 트랜스듀서에 대한 고유 영구 식별자의 일부로 32비트를 추가로 지정할 수 있습니다. 펜 액세서리가 이 값 전송을 지원하지 않거나 전송이 완전히 수신되지 않았기 때문에 트랜스듀서 일련 번호 – 2부를 디지타이저에 알 수 없는 경우 디지타이저는 호스트에 0을 보고해야 합니다. Null 위치는 호스트에서 지원되지 않습니다.
| 페이지 | 아이디 | 비고 |
|---|---|---|
| 0xD | 0x5B | 고유한 펜 식별에 종속된 기능에 대한 필수 사항(아래 참조) |
| 0xD | 0x6E | 추가 32비트별 일련 번호의 선택적 확장 |
Transducer 공급업체 ID
Transducer Vendor ID는 펜 디지타이저와 통신하는 펜 액세서리에 사용되는 트랜스듀서 제조업체와 통신하기 위한 필드입니다. 이는 제조업체 또는 IHV/OEM이 해당 목적을 위해 USB-IF 벤더 ID 사용을 승인하는 2바이트 USB-IF 할당 벤더 ID가 필요로 합니다.
| 페이지 | 아이디 | 비고 |
|---|---|---|
| 0xD | 0x91 | 고유한 펜 식별에 종속된 기능에 대한 필수 사항(아래 참조) |
고유한 펜 식별에 종속된 기능
펜 촉각과 같은 시나리오를 사용하도록 설정하려면 PenID 보고가 필수입니다(이 가이드의 촉각 기능에 필요).
또한 디지털 잉크 작업을 위해 여러 펜을 사용하는 시나리오의 경우 필수입니다. 다음은 그 예입니다.
- Windows 화이트보드 앱은 각 펜을 특정 수동 입력 도구에 매핑할 수 있는 여러 펜 사용을 지원합니다.
- 일반적으로, 디지타이저가 화면에서 한 번에 한 개의 펜만 지원할 수 있는 경우에도, 다양한 물리적 펜에 특성이나 동작을 할당하려는 앱은
- 지원되는 디지타이저에서 여러 개의 동시 펜을 추적하려는 앱
촉각 기능 보고서
펜 디바이스가 촉각 피드백을 지원하는 경우 스타일러스 TLC 내에 촉각 피드백 컬렉션(페이지 0x0E, 사용량 0x01)을 포함하여 시스템과 애플리케이션이 이를 활용할 수 있습니다. HID 사양이 촉각 피드백을 지원하는 방법에 대한 자세한 내용은 HID 사양에 대한 Haptics 페이지 비준을 참조하세요.
호스트는 GET_FEATURE 보고서에서 다음 사용을 사용하여(촉각 피드백 수집을 통해) 펜 디바이스의 촉각 기능, 특히 지원되는 파형 및 기간을 쿼리합니다. 디바이스가 촉각 피드백 수집을 노출하도록 선택하는 경우 호스트가 적절한 출력 보고서를 통해 촉각 피드백을 시작할 때 사용할 수 있는 기능을 검색할 수 있도록 이 기능 보고서는 필수입니다.
| 회원 | Description | 페이지 | 아이디 | 필수/선택 |
|---|---|---|---|---|
| 파형 목록 | 디바이스에서 지원하는 촉각 파형의 순서가 지정된 목록 | 0x0E | 0x10 | 필수 |
| 기간 목록 | 파형 목록에 있는 파형의 지속 시간에 대한 정렬된 목록 | 0x0E | 0x11 | 필수 |
파형 목록
파형 목록 사용은 서수로 정렬된 지원되는 파형의 HID 사용량 컬렉션을 나타냅니다. 미리 정의된 촉각 파형은 HID 사양에 정의됩니다. 펜 촉각 디바이스의 경우 이러한 파형은 서로 다른 시나리오에 해당하는 두 세그먼트로 분류될 수 있습니다.
- 연속 - 사용자가 펜, 연필 등과 같은 다양한 도구를 사용하여 적극적으로 수동 입력하는 동안 다양한 질감을 시뮬레이션하기 위한 잉크 기반 피드백입니다.
- 불연속 - 사용자가 단추 위로 마우스를 가져가고, 비활성화된 단추를 클릭하고, 잉크 셰이프 인식에 성공하는 등의 입력 기반 작업을 수행하는 경우에 대한 불연속적이고 비연속적인 상호 작용 기반 피드백입니다.
펜 촉각 디바이스에 대해 지원되는 파형의 전체 목록은 다음과 같습니다.
| 파형 | Description | 페이지 | 아이디 | 필수/선택 |
|---|---|---|---|---|
| 없음 | No-op. 진행 중인 파형의 재생 상태에 영향을 주지 않아야 합니다. | 0x0E | 0x1001 | 필수 |
| 중지 | 진행 중인 파형의 재생을 중지합니다. | 0x0E | 0x1002 | 필수 |
| 클릭 | 짧은 "클릭" 피드백을 만듭니다. 앱에서 선택한 상호 작용 피드백 파형이 촉각 펜에서 지원되지 않는 경우 기본 대체 | 0x0E | 0x1003 | 필수 |
| InkContinuous | 실제 볼 포인트 펜으로 수동 입력의 느낌을 시뮬레이션합니다. 잉킹 파형이 촉각 펜이 지원되지 않는 경우 기본 대체 옵션 | 0x0E | 0x100B | 필수 |
| 성공 | 완료된 작업을 확인하는 오름차순 패턴 | 0x0E | 0x1009 | 아래 참조 |
| 오류 | 실패한 작업을 나타내는 내림차순 패턴 | 0x0E | 0x100A | 아래 참조 |
| 호버 | 사용자가 촉각 펜으로 대화형 UI 요소 위로 마우스를 가져간 경우 촉각 신호 | 0x0E | 0x1008 | 선택적 |
| 눌러주세요 | 단추 누름을 나타내는 펄스 | 0x0E | 0x1006 | 아래 참조 |
| 릴리스 | 단추 릴리스를 나타내는 펄스 | 0x0E | 0x1007 | 아래 참조 |
| 충돌 | 경계 또는 제한에 도달했음을 나타내는 소프트 펄스 | 0x0E | 0x1012 | 선택적 |
| 정렬 | 개체가 맞춤 안내선에 맞춰질 때 강한 신호가 발생합니다. | 0x0E | 0x1013 | 선택적 |
| Step | 단계 또는 값 이동과 같은 불연속 변경에 대한 확고한 펄스 | 0x0E | 0x1014 | 선택적 |
| 성장하다 | 동작, 전환 또는 지능형 시스템 활동을 전달하는 동적 펄스 | 0x0E | 0x1015 | 선택적 |
| PencilContinuous | 사용자가 필기 도구로 연필을 선택할 때 연속적인 촉각 신호 | 0x0E | 0x100C | 선택적 |
| MarkerContinuous | 사용자가 잉킹 도구로 마커를 선택할 때 연속적인 촉각 신호 | 0x0E | 0x100D | 선택적 |
| ChiselMarkerContinuous | 사용자가 필기 도구로써 끌 마커/형광펜을 선택할 때 연속 진동 신호 | 0x0E | 0x100E | 선택적 |
| 연속 브러시 | 사용자가 잉킹 도구로 브러시를 선택할 때 연속적인 촉각 신호 | 0x0E | 0x100F | 선택적 |
| 연속 지우개 | 사용자가 잉킹 도구로 지우개를 선택할 때 지속적인 촉각 신호 | 0x0E | 0x1010 | 선택적 |
| SparkleContinuous | 멀티 컬러 브러시와 같은 특수 잉크 도구에 대한 연속 촉각 신호 | 0x0E | 0x1011 | 선택적 |
비고
필수는 아니지만 보다 완전한 사용자 환경을 제공하기 위해 다른 열거형 파형도 구현하는 것이 좋습니다.
모든 HID 규격 촉각 디바이스에는 None 및 Stop 이 모두 필요합니다. 서수 1과 2는 암시적으로 없음 및 중지로 설정됩니다. 파형 목록 또는 기간 목록에서 선언할 필요가 없습니다. 파형 목록 및 기간 목록은 서수 사용 범위(사용량/논리적 최소값 및 최대값)와 각 서수에 대해 반환되는 값을 통해 지원되는 파형을 선언하며, 지원되지 않는 서수에는 없음 을 사용합니다.
Press 및 Release 파형은 선택 사항이지만 지원되는 경우 다른 파형도 선택 사항이어야 합니다. 성공 및 오류도 마찬가지입니다.
기간 목록
기간 목록 사용량은 서수로 정렬된 파형 목록에 있는 지원되는 파형의 기간 모음을 나타냅니다. 파형 지속 시간 단위는 밀리초이고 지속 시간은 비연속 파형에 대해 0이 아닌 양의 값이어야 합니다. 파형이 연속된 경우(호스트에 의해 중지되거나 파형 차단 시간이 초과될 때까지 재생됨) 해당 기간은 0으로 정의됩니다.
None 및 Stop 은 기간이 0인 것으로 간주됩니다. 기간 목록에 선언할 필요가 없습니다.
촉각 출력 보고서
호스트는 출력 보고서에서 다음 사용 방법을 사용하여 촉각 피드백 이벤트를 Haptic Pen 디바이스에 전달합니다. 일부 사용은 Windows 호스트 구현과의 호환성을 위해 필수입니다.
| 회원 | Description | 페이지 | 아이디 | 필수/선택 |
|---|---|---|---|---|
| 수동 트리거 | 호스트에서 명시적 명령으로 실행하기 위한 파형 | 0x0E | 0x21 | 필수 |
| 강도 | 출력 - 수동 트리거 파형의 강도(백분율) | 0x0E | 0x23 | 선택적 |
| 반복 횟수 | 출력 - 초기 재생 후 수동 트리거 파형을 재생하는 횟수 | 0x0E | 0x24 | 선택적 |
| 재트리거 기간 | 출력 - 반복할 때 수동 트리거를 다시 트리거하기 전에 대기하는 시간 | 0x0E | 0x25 | 선택적 |
| 파형 차단 시간 | 차단되기 전에 수동 트리거 파형이 재생될 수 있는 최대 시간 | 0x0E | 0x28 | 선택적 |
수동 트리거
수동 트리거 사용은 파형 사용 ID를 직접 전달하지 않습니다. 대신 해당 값은 디바이스의 확장된 웨이브폼 테이블에 대한 서수입니다. 서수 1 은 필수 None (no-op) 파형용으로 예약되어 있으며 서수 2 는 중지 파형에 대해 예약되고 서수 3 이상은 디바이스의 파형 목록/기간 목록(파형 목록/기간 목록 메커니즘 참조)의 항목에 매핑됩니다. 여기서 서수 3은 목록의 첫 번째 항목에 해당하고 서수 4는 두 번째 파형에 해당합니다. 등등. 호스트는 암시적 서수 1 과 2를 보낼 수 있으며 서수 3 이상에서는 디바이스가 지원되는 것으로 보급한 항목에 해당하는 값만 보냅니다.
서수가 불연속 파형으로 확인되는 수동 트리거가 포함된 출력 보고서가 디바이스로 전송되면 디바이스는 출력 보고서에 포함된 추가 속성(강도, 반복 개수, Retrigger 기간)을 사용하여 지정된 파형 재생을 즉시 시작해야 합니다. 수동 트리거 서수가 연속 파형으로 확인되면 디바이스의 재량에 따라 재생이 시작됩니다(예: 스타일러스가 디스플레이와 접촉한다고 판단되는 경우).
비고
이 요구 사항은 HID 사양과 다릅니다. 일반적으로 수동 트리거를 통해 전송되는 모든 파형은 즉시 재생되어야 합니다. 그러나 Windows 촉각 펜 호스트 구현은 자동 트리거 지원을 구현하지 않으므로 디바이스는 불연속 파형과 연속 파형을 구분해야 합니다.
출력 보고서에 서수가 파형 중지 (서수 2)로 확인되는 수동 트리거가 포함된 경우 진행 중인 파형 재생을 중지해야 합니다. 출력 보고서에 서수가 필수 None (no-op) 파형(서수 1)으로 확인되는 수동 트리거가 포함된 경우, 디바이스는 새 파형을 시작해서는 안 되며 현재 재생 중인 파형의 상태를 변경해서도 안 됩니다. 이 보고서는 촉각 출력과 관련하여 무작동으로 취급되어야 합니다.
강도
강도 사용량은 파형에 적용할 최대 강도의 백분율을 나타냅니다. 이 값은 0~100% 사이여야 합니다. 100%는 최대 강도로 디바이스에 의해 파형이 트리거되고 0%는 촉각 트랜스듀서가 활성화되지 않음을 나타냅니다.
반복 횟수
반복 횟수 사용량은 파형을 반복하는 횟수를 나타냅니다. 0의 반복 횟수는 수동 트리거 파형이 한 번만 재생되어야 하며 반복되지 않음을 나타냅니다. 파형 컷오프 시간을 초과하면 불완전한 반복이 무시될 것으로 예상됩니다.
재트리거 기간
Retrigger 기간 사용량은 반복 수로 지정된 값에 따라 출력 보고서에서 수동 트리거 파형을 반복하기 전에 디바이스가 대기하는 시간을 나타냅니다. 이 값의 단위는 밀리초입니다. Retrigger 기간이 재생 중인 파형의 지속 시간보다 짧으면, Retrigger 기간에 표시된 시간에 파형을 중지하고 다시 시작해야 합니다.
파형 차단 시간
파형 컷오프 시간 사용량은 디바이스에서 수동 트리거 파형을 재생을 종료하기 전에 반복할 수 있는 최대 시간을 나타냅니다. 이 값은 디바이스에 대한 상수 값이며 설정된 기간이 없는 연속 파형과 여러 번 반복되도록 설정된 불연속 지속 시간이 있는 파형을 모두 포함합니다. 이 값의 단위는 밀리초입니다.
햅틱 시작 및 중지
아래 순서도는 펜의 촉각 신호를 구성, 지우기, 시작 및 중지해야 하는 시기를 설명합니다.
아래에 설명된 다양한 촉각 상태는 다음과 같습니다.
- 재생 중 : 펜이 촉각적 파형을 적극적으로 재생 중입니다.
- 일시 중지됨: 펜이 파형으로 구성되었지만 적극적으로 재생되지 않음
- 중지됨: 펜이 파형으로 구성되지 않고 적극적으로 아무 것도 재생하지 않습니다.
디지타이저와 관련하여 펜 상태는 Windows 펜 상태 참조하세요.
비고
펜이 범위를 벗어나면 촉각 구성을 지우는 것이 좋지만 필수는 아닙니다. 이는 아래 다이어그램에서 "펜: 범위 내; 촉각: 일시 중지됨" 상태에서 펜이 범위를 벗어날 때 나오는 두 개의 대체 경로를 통해 전달됩니다.
비고
호스트는 언제든지 비연속 파형 재생을 요청할 수 있습니다. 이 경우, 펜은 재생을 완료한 후 이전 상태로 돌아가야 합니다.
비고
호스트는 연속 파형만 구성해야 합니다. 불연속/비연속 파형은 수동으로만 트리거됩니다.
키보드 컬렉션(선택 사항)
HID 키보드 보고서를 통해 호스트에 대한 테일 엔드 단추 클릭을 보고할 수 있도록 하는 선택적 기능입니다.
테일 엔드 Bluetooth 단추를 구현하기 위해 디바이스는 호스트에 노출된 HID Bluetooth LE 키보드 디바이스를 통해 3개의 고유한 단추 동작에 해당하는 3가지 고유한 키보드 조합을 보고합니다. 작업 및 해당 키보드 조합은 아래에 설명되어 있습니다.
| Bluetooth 단추 동작 | 보고를 위한 키 조합 |
|---|---|
| 한 번 클릭 | WIN+F20 |
| 두 번 클릭 | WIN+F19 |
| 길게 누르기 | WIN+F18 |
펜 보관
Windows 10 버전 1903부터 Windows 호환되는 펜 저장을 통합하는 디바이스에 대한 알림을 지원합니다. 이 메커니즘은 제거 또는 교체되는 펜을 감지하고 한 쌍의 바로 가기 조합에 대한 해당 HID 키보드 보고서를 생성하는 하드웨어에 의존합니다. 도크 신호를 보내려면(펜이 보관함에 꽂혔을 때) WIN+CTRL+F20을 보고하고, 페독 신호를 보내려면(펜이 보관함에서 제거되었을 때) WIN+CTRL+F19를 보고합니다. 펌웨어 또는 드라이버로 구현할 수 있습니다.
이러한 도킹 취소/도킹 이벤트는 셸 잉크 작업 영역 메뉴를 가져오거나 해제합니다. Windows 10 버전 2004부터 Office는 모든 개발자가 보관 이벤트를 인식할 수 있도록 애플리케이션을 확장할 수 있게 해 주는 platform API를 사용하여 이러한 이벤트에 대응합니다. 펜이 도크에 있는지 여부를 쿼리할 수 없으며, 앱은 포그라운드에 있는 경우 제거 및 반환 이벤트에 대한 알림만 받습니다.
샘플 HID 리포트 디스크립터
다음 설명자는 모든 필수 및 선택적 사용을 지원합니다. 총 19개의 파형에 대해 17개의 파형 목록 항목(암시적 파형 1(없음) 및 2(중지 제외)에 대한 지원을 선언하며, 가장 긴 불연속 파형은 50ms입니다. 연속 파형의 지속 시간은 0입니다.
모든 논리 범위는 디바이스 지원에 따라 업데이트해야 합니다. 다른 수의 파형을 지원하려면 다음을 수행합니다.
- 수동 트리거 사용의 논리적 범위를 업데이트해야 합니다.
- 웨이브 폼 목록 및 기간 목록에 대한 사용 범위 및 보고서 수를 업데이트해야 합니다.
다른 최대 파형 길이를 지원하려면 다음 논리 범위를 업데이트해야 합니다.
- 재트리거 기간 (출력)
- 파형 차단 시간(출력)
- 기간 목록(기능)
05,0D, // Usage Page (Digitizers)
09,20, // Usage (Stylus)
A1,01, // Collection (Application)
85,40, // Report ID (64)
95,01, // Report Count (1)
75,20, // Report Size (32)
17,00,00,00,80, // Logical Minimum (-2147483648)
27,FF,FF,FF,7F, // Logical Maximum (2147483647)
09,5B, // Transducer Serial Number
81,02, // Input (Data,Var,Abs)
75,10, // Report Size (16)
15,01, // Logical Minimum (1)
27,FF,FF,00,00, // Logical Maximum (65535)
09,91, // Transducer Vendor ID
81,02, // Input (Data,Var,Abs)
05,0E, // Usage Page (Haptics)
09,01, // Usage (Simple Haptic Controller)
A1,02, // Collection (Logical)
85,41, // Report ID (65)
09,10, // Usage (Waveform List)
A1,02, // Collection (Logical)
05,0A, // Usage Page (Ordinal)
19,03, // Usage Minimum (0x03)
29,13, // Usage Maximum (0x13)
16,01,10, // Logical Minimum (4097)
26,FF,2F, // Logical Maximum (12287)
95,11, // Report Count (17)
75,10, // Report Size (16)
B1,02, // Feature (Data,Var,Abs)
C0, // End Collection ()
05,0E, // Usage Page (Haptics)
09,11, // Usage (Duration List)
A1,02, // Collection (Logical)
05,0A, // Usage Page (Ordinal)
19,03, // Usage Minimum (0x03)
29,13, // Usage Maximum (0x13)
35,00, // Physical Minimum (0)
45,32, // Physical Maximum (50)
66,01,10, // Unit (SiLinear, Seconds:1)
55,0D, // Unit Exponent (-3)
15,00, // Logical Minimum (0)
25,32, // Logical Maximum (50)
95,11, // Report Count (17)
75,08, // Report Size (8)
B1,02, // Feature (Data,Var,Abs)
C0, // End Collection ()
85,42, // Report ID (66)
95,01, // Report Count (1)
75,08, // Report Size (8)
35,00, // Physical Minimum (0)
45,00, // Physical Maximum (0)
65,00, // Unit (None)
55,00, // Unit Exponent (0)
15,01, // Logical Minimum (1)
25,13, // Logical Maximum (19)
09,21, // Usage (Manual Trigger)
91,02, // Output (Data,Var,Abs)
15,00, // Logical Minimum (0)
26,64,00, // Logical Maximum (100)
09,23, // Usage (Intensity)
91,02, // Output (Data,Var,Abs)
25,05, // Logical Maximum (5)
09,24, // Usage (Repeat Count)
91,02, // Output (Data,Var,Abs)
75,10, // Report Size (16)
46,E8,03, // Physical Maximum (1000)
66,01,10, // Unit (SiLinear, Seconds:1)
55,0D, // Unit Exponent (-3)
15,00, // Logical Minimum (0)
26,E8,03, // Logical Maximum (1000)
09,25, // Usage (Retrigger Period)
91,02, // Output (Data,Var,Abs)
36,E8,03, // Physical Minimum (1000)
46,88,13, // Physical Maximum (5000)
16,E8,03, // Logical Minimum (1000)
26,88,13, // Logical Maximum (5000)
09,28, // Usage (Waveform Cutoff Time)
91,02, // Output (Data,Var,Abs)
C0, // End Collection ()
C0 // End Collection ()